(转载)从0开始学matlab(第12天)—选择语句(if、switch、try/catch)

news2024/7/6 20:13:04
        选择结构可以使 MATLAB 选择性执行指定区域内的代码 ( 称之为语句块 blocks),而跳过其他区域的代码。选择结构在 MATLAB 中有三种具体的形式 :if 结构, switch 结构和try/catch 结构。

1 if 结构

1.1if语句的基本形式

                 if 结构的基本形式如下:
        其中 control expression 控制 if 结构的运算。如果 control_expr_1 的值非 0,那么程序将会执行语句块 1(block1) ,然后跳到 end 后面的第一个可执行语句继续执行。否则,程序将会检测 control_expr_2 的值,。如果 control_expr_2 的值非 0,那么程序将会执行语句块2(block2) ,然后跳到 end 后面的第一个可执行语句继续执行。如果所有的控制表达式(control expression) 均为 0 ,那么程序将会执行与 else 相关的语句块。
        在一个 if 结构中,可以有任意个 elseif 语句,但 else 语句最多有一个。只要上面每一个控制表达式均为 0,那么下一个控制表达式将会被检测。一旦其中的一个表达式的值非0 ,对应的语句块就要被执行,然后跳到 end 后面的第一个可执行语句继续执行。如果所有的控制表达式 (controlexpression) 均为 0 ,那么程序将会执行 else 语句。如果没有 else 语句,程序将会执行 end 后面的语句,而不执行 if 结构中的部分。
        注意 MATLAB if 结构中的关键字 end 与第二章中提到的返回已知下标最大值函数end 完全不同。 matlab 通过 end 在 M 文件中的上下文来区分开它的两个用途。在大多数情况下,控制表达式均可以联合关系运算符和逻辑运算符。正像我们在本章早些时侯学到的,当对应的条件为真时,关系运算和逻辑运算将会产生 1 ,否则产生 0。所以当一个运算条件为真时,运算结果为非 0 ,则对应的语句块,就会被执行。
        例如,一元二次方程的基本形式如下:
        其中 b ²- 4ac 是我们熟知的判别式,当 b²- 4ac>0 时,方程式有两个不同的实数根,当b²- 4ac=0,有两个相同的实数根,当 b²- 4ac<0 时,方程式有两个不同的复根。假设我们检测某一元二次根的情况,并告诉使用者这个方程有两个复根,还是两个相等的实根和两个不相等的实根。用伪代码这个结构的形式如下 :
        回忆一下,判断为真时,关系运算符将会返回一个非 0 值,从而导致对应语句的执行。为增加程序的可读性,在 if 结构中的语句块中最好缩进 2 3 个空格,而实际上没有必要。
好的编程习惯
if 结构体经常缩进 2 3 个空格,以增强程序的可读性。
        你可以在一行内写完一个完整的 if 结构,只需把结构的每一部分后面加上分号或逗号,所以下面的两个结构是等价的 :

        但是这种方式只适用于简单的结构 。

 1.2if语句的示例

        求一元二次方程的根
        设计并编写一个程序,用来求解一元二次方程的根。
        答案:
        我们将本章开头介绍的方法进行编程。
        1.陈述问题这个问题的陈述非常的简单,我们要求一元二次方程的根,不管它的根是实根还是复根,有一个根还是两个根。
        2.定义输入和输出,本程序的输入应为系数 a b c

输出量应为两个不相等的实数。两个相等的实数或两个复数。

        3.写出算法本程序可分为三大块,它的函数分别为输入,运算过程和输出。我们把每一个大块分解成更小的,更细微的工作。根据判别式的值,可能有三种计算途径,读取输入的数据、 计算出根、 输入出根 ,所以我们要用到有三种选项的 if 结构。产生的伪代码如下

        4.matlab代码如下

% 目的: 
% 此程序解出一元二次方程的根 
% 方程的形式为a*x^2 + b*x + c = 0。无论方程的根型如何,它都可以计算出答案。
% 
% 定义变量: 
% a --方程的x^2项系数 
% b --方程的x项系数 
% c --方程的常数项 
% discriminant --方程的判别式 
% imag_part --方程的虚部(对于复根) 
% real_part --方程的实部(对于复根) 
% x1 --方程的第一个解(对于实数根) 
% x2 --方程的第二个解(对于实数根) 
% 提示用户输入方程的系数 
disp ('此程序解出一元二次方程的根'); 
disp ('方程的形式为A*X^2 + B*X + C = 0。'); 
a = input('请输入A的系数: '); 
b = input('请输入B的系数: ');
c = input('请输入C的系数: '); 
%计算判别式 
discriminant = b^2 - 4 * a * c; 
%根据判别式的值,解方程的根 
if discriminant > 0 %方程有两个实数根 
 x1 = (-b + sqrt(discriminant)) / (2*a); 
 x2 = (-b - sqrt(discriminant)) / (2*a); 
 disp('此方程有两个实数根:'); 
 fprintf('x1 = %f\n', x1); 
 fprintf('x2 = %f\n', x2); 
elseif discriminant == 0 %方程有一个重根 
 x1 = ( -b ) / (2*a); 
 disp('此方程有两个相等的实数根:'); 
 fprintf('x1 = x2 = %f\n', x1); 
else %方程有复数根 
 real_part = (-b) / (2*a); 
 imag_part = sqrt( abs(discriminant)) / (2*a); 
 disp('此方程有复数根:'); 
 fprintf('x1 = %f + i %f \n',real_part, imag_part); 
 fprintf('x1 + %f - i %f \n', real_part, imag_part); 
end

        5.检测这个程序

        下一步,我们必须输入实数来检测这个程序。因这个程序有三个可能的路径。所以在我们确信每一人路径都工作正常之前,必须把这三个路径检测一遍。从式子 (3.2)中,我们可以有用下面的方法来验证程序的正确性。

        如果输入上面三个方程的系数得到对应的结果,则说明程序是正确的。运行结果:

1.3 关于 if 结构使用的注意事项

        if 结构是非常灵活的,它必须含有一个 if 语句和一个 end 语句。中间可以有任意个elseif 语句,也可以有一个 else 语句。联合它的这些特性,我们可以创建出我们需要的各种各样的选择结构。
        还有 if 语句是可以嵌套的。如果 if 结构完全是另一个 if 结构的一个语句块,我们就称两者为嵌套关系。下面是两个 if 语句的嵌套。

        MATLAB 翻译器经常把把已知的 end 语句和它最近的 if 语句联合在一起,所以第一个end 语句和 if y<0 最靠近,而第二个 end 与 if x>0 最接近。对于一个编写正确的程序,它能工作正常。但如果程序员编写出错误,它将会使编译器出现混淆性错误信息提示。例如,假设我们编写一个大的程序,包括如下的一个结构:  

        这个程序包括了三个嵌套的 if 结构,在这个结构中可能有上千行的代码。现在假设第一个 end 在编辑区域突然被删除,那么 MATLAB 编译器将会自动将第二个 end 与最里面的if (test3)结构联合起来,第三个 end 将会和中间的 if(test2)联合起来。当编译器翻译到达文件结束的时候,那将发现第一个 if(test1)结构将永远没有结束,然后编译器就会产生一个错误提示信息,即缺少一个 end。但是,它不能告诉你问题发生在什么地方,这就使我们必须回过头去看整个程序,来找问题。在大多数情况下,执行一个算法,即可以用多个 else if 语句,也可以用 if 语句的嵌套。在这种情况下,程序员可以选择他喜欢的方式。

1.4if语句的不同表达形式

        给出等级分数
        假设我们要编写一个程序,输入一个数值分数,输出等级分数,即是 A 级, B 级和 C 级
        用两种方式写出这个程序,第一种方式用多个 elseif 语句,第二种方式用 if 的嵌套。
        答案:
        (a)用多个 elseif 语句

 

if grade > 95.0 
 disp('The grade is A.'); 
elseif grade > 86.0 
 disp('The grade is B.'); 
elseif grade >76.0 
 disp('The grade is C.'); 
elseif grade > 66.0 
 disp('The grade is D.'); 
else 
 disp('The grade is F.'); 
end
(b) if 嵌套结构
if grade > 95.0 
 disp('The grade is A.');
else 
 if grade > 86.0 
 disp('The grade is B.'); 
 else 
 if grade > 76.0 
 disp('The grade is C.'); 
 else 
 if grade > 66.0 
 disp('The grade is D.'); 
 else 
 disp('The grade is F.'); 
 end 
 end 
 end 
end
        从上面的例子中,我们可以看到如果有多个选项的话,在一个 if 结构中用到多个 elseif 语句将会比 if 的嵌套结构简单的多。
好的编程习惯
对于有许多选项的选择结构来说,最好在一个 if 结构中使用多个 elseif 语句,尽量不用 if 的嵌套结构。

2 switch 结构

        switch 结构是另一种形式的选择结构。程序员可以根据一个单精度整形数,字符或逻辑表达式的值来选择执行特定的代码语句块。
        如果 switch_expr 的值与 case_expr_1 相符,那么第一个代码块将会被执行,然后程序将会跳到 switch 结构后的第一个语句。如果 switch_expr 的值与 case_expr_2 相符,那么第二个代码块将会被执行,然后程序将会跳到 switch 结构后的第一个语句。在这个结构中,用相同的方法来对待其他的情况。 otherwise 语句块是可选的。如果它存在的话,当switch_expr 的值与其他所有的选项都不相符时,这个语句块将会被执行。如果它不存在,且 witch_expr 的值与其他所有的选项都不相符,那么这个结构中的任何一个语句块都不会被执行。这种情况下的结果可以看作没有选择结构,直接执行 MATLAB 语言。如果说 switch_expr 有很多值可以导致相同代码的执行,那么这些值可以括在同一括号内,如下所示。如果这个 switch 表达式和表中任何一个表达式相匹配,那么这个语句块将会被执行。 

         switch_expr 和每一个 case_expr 既可以是数值,也可以是字符值。注意在大多情况下只有一个语句块会被执行。当一个语句块被执行后,编译器就会跳到 end 语句后的第一个语句开始执行。如果 switch 表达和多个 case 表达式相对应,那么只有他们中的第一个将会被执行。让我们看一个简单的关于 switch 结构的例子。下面的语句用来判断 1 10 之间的数是奇数还是偶数。它用来说明一系列的 case 选项值的应用和 otherwise 语块的应用。

switch (value) 
case {1, 3, 5, 7, 9}, 
 disp('这个值是奇数。'); 
case {2, 4, 6, 8, 10}, 
 disp('这个值是偶数。'); 
otherwise, 
 disp('这个值超出范围。'); 
end

3 try/catch 结构的应用

        try/catch 结构是选择结构的一种特殊形式,用于捕捉错误。一般地,当一个 MATLAB程序在运行时遇到了一个错误,这个程序就会中止执行。try/catch 结构修改了这个默认行为。如果一个错误发生在这个结构的 try 语句块中,那么程序将会执行 catch 语句块,程序将不会中断。它将帮助程序员控制程序中的错误,而不用使程序中断。
        当程序运行到 try/catch 语句块,在 try 语句块中的一些语句将会被执行。如果没有错误出现, catch 语句块将会被跳过。另一方面,如果错误发生在一个 try 语句块,那么程序将中止执行 try 语句块,并立即执行 catch 语句块。下面有一个包含 try/catch 结构程序。它能创建一个数组,并询问用户显示数组中的哪能一个元素。用户提供一个下标,那么这个程序将会显示对应的数组元素 try 语句块一般会在这个程序中执行,只有当 try 语句块执行出错, catch 语句块将会发生错误。
% 初始化数组
a = [1 -3 2 5]; 
try 
 % 尝试输出一个元素
 index = input('请输入要显示的元素的下标: '); 
 disp(['a(' int2str(index) ') = ' num2str(a(index))] );
catch 
 % 如果出现错误则执行下面的代码
 disp( ['非法下标: ' int2str(index)] ); 
end

 运行结果:

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/555951.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

菜鸡shader:L3三色环境光材质、阴影及光衰

三色环境光材质 先放上最终效果这里将环境光分为上中下三层&#xff0c;顶层是红色的&#xff0c;中间那层是绿色的&#xff0c;下层则是蓝色的。环境光遮蔽效果则是直接采样事先准备好的AO贴图。 首先是上层环境光&#xff1a; 这里我们只需要法线向量的第二个分量&#xf…

casbin基于RBAC模型实现权限管理

在casbin中权限都是基于匹配规则和访问控制模型实现的&#xff0c;除了上一章的ACL的实现方式&#xff0c;还有一个常用的访问控制模型RBAC。该模型带上了用户角色&#xff0c;基本满足大多数角色管理的系统。 在RBAC模型中多了一个角色的策略机制&#xff0c;其访问模型规则如…

消息中间件 - RabbitMQ篇之入门及进阶

这里写自定义目录标题 一. RabbitMQ简介1.1. 消息中间件1.1.1.什么是消息中间件1.1.2.消息中间件的传递模式1. 1.2.1 点对点1. 1.2.2 发布订阅模式 1.1.3 消息中间件种类1.1.4 消息中间件的作用 2. RabbitMQ介绍2.1.RabbitMQ的起源2.2.RabbitMQ的安装及简单使用 3. RabbitMQ的简…

Unity UI -- (6)增加Toggle和Slider

在前面的小节中&#xff0c;我们已经有了一个空的设置菜单。现在让我们来添加设置选项。 在本节最后&#xff0c;我们的设置菜单的样子参考如下&#xff1a; 添加一个音乐开关&#xff08;Toggle&#xff09; 现在让我们来增加一个toggle&#xff0c;让用户能够通过它来对场景的…

多功能语音芯片​NV040C的应用,为洗地机开辟新的应用领域

随着科技的快速发展&#xff0c;智能化和自动化已经成为了各个行业发展的主流趋势。传统的家庭洗拖工作日渐被各类洗地机、扫地机器人等取代&#xff0c;其中作为洗地机作为近几年家庭清洁的好物。近年来&#xff0c;不少洗地机厂商开始将语音芯片技术应用到产品中&#xff0c;…

多商户商城系统开发功能优势与选择技巧

电商行业的持续发展&#xff0c;让越来越多的商家企业开始选择入驻多商户商城&#xff0c;通过该系统不仅能够为消费者提供更加便捷良好的购物体验&#xff0c;而且也能够为企业提供一个高效稳定的电商平台&#xff0c;可以说是未来电商行业发展的重要趋势。那么多商户商城系统…

Milk -v 开发板烧录系统以及ssh连接

Milk -v 开发板烧录系统以及ssh连接 0. 前言1. 系统下载2. 驱动安装3. ssh连接 0. 前言 操作系统&#xff1a;Windows10 专业版 开发板&#xff1a;Milk -v 准备读卡器、内存卡、Typec 数据线 Milk-V开发板官方文档 到手后它的外形和宣传图片是一致的&#xff0c;但是更加的…

微信小程序云开发学习记录--1

目录 1.配置小程序项目 2. 云创建 3.新建云文件夹 4.数据库的建立和使用 5.增、删、改、查四种数据库基本操作 增加数据 查询数据 修改数据 删除数据 拿到微信小程序&#xff0c;首先可以先配置好自己的服务器或者是云环境&#xff0c;服务器的方法就不说了&#xff0…

前端实训——Day01

前言 学校最近开始实训周了&#xff0c;一上就是一个月&#xff0c;本来想在课上学点考研的东西的&#xff0c;但是无奈任务重&#xff0c;而且最后还能有点小奖励&#xff0c;就认真学了&#xff0c;再者说&#xff0c;html也挺重要的&#xff0c;学一学也不算浪费时间。 软…

Linux——安装tomcat并部署项目

目录 1、准备阶段 2、具体步骤 2.1、下载tomcat安装包 2.2、上传tomcat安装包 2.3、启动tomcat 2.4、访问页面 3、部署Maven项目至tomcat 3.1、打包Maven项目 3.2、上传打包后的war包至Linux 3.3、修改连接数据库配置文件中的ip 3.4、访问项目 3.5、直接访问ip访问…

Promise理解+ JS 的执行机制

做一道题,理解一下: function getPrinterList() {let res 初始setTimeout(() > {res 1},1000)return res }let res getPrinterList() console.log(res); //输出初始 在getPrinterList函数中,先分清同步异步. JS执行语句时,会区分同步异步,把所有的同步放在同步队列中,把…

【Python pymongo】零基础也能轻松掌握的学习路线与参考资料

Python pymongo是一款基于Python的MongoDB数据库的驱动程序&#xff0c;它提供了操作MongoDB数据库的接口和方法。学习Python pymongo可以帮助开发者更好地使用MongoDB数据库&#xff0c;从而实现更好的数据存储和管理。在这篇文章中&#xff0c;我们将介绍Python pymongo的学习…

chatgpt赋能Python-python_bin__

Python中的bin()方法&#xff1a;将数字转换为二进制字符串 Python中内置的bin()函数是一个非常有用的工具&#xff0c;它可以将一个整数转换成一个二进制字符串。这个函数非常简单易用&#xff0c;对于任何需要进行二进制操作的开发者来说都是一个必不可少的工具。 什么是二…

chatgpt赋能Python-python_bio包

Python Bio包&#xff1a;简介、功能和应用 Python Bio包是什么 Python Bio包是一套专门为生物信息学而设计的Python模块。它包含了许多优秀的工具和算法&#xff0c;可以帮助生物学家们解决各种生物问题。Python Bio包主要由五个子模块组成&#xff1a; Bio.Seq&#xff1a…

EXP-00026: conflicting modes specified

今天下午现场项目经理问了一个问题&#xff0c;直接上截图&#xff0c;问是不是客户端不兼容&#xff1f; C:\Users\Administrator>exp usr_jwc/Test#123192.16.50.100:1521/orcl ownerusr_jwc fully fileC:\ABCD20230521.dmp logC:\imp_ABCD20230521.log Export: Release…

day38_Servlet

今日内容 零、 复习昨日 一、Servlet 二、HTTP 三、HttpServlet 零、 复习昨日 见晨考 一、Servlet 1.1 介绍 javaweb开发,就是需要服务器接收前端发送的请求,以及请求中的数据,经过处理(jdbc操作),然后向浏览器做出响应. 我们要想在服务器中写java代码来接收请求,做出响应,我…

chatgpt赋能Python-python_aipspeech

Python Aipspeech介绍与优势分析 什么是Python Aipspeech&#xff1f; Python Aipspeech是一种基于Python编程语言的语音识别API&#xff0c;可以实现语音转文字、语音合成、语音唤醒等功能。它基于Aipspeech强大的语音识别引擎&#xff0c;可以实现高精度的语音识别&#xf…

香港VPS服务器如何屏蔽指定访客ip?

​  如果你是一个香港VPS服务器的管理员&#xff0c;你可能会遇到一些不良用户或者恶意攻击者&#xff0c;这些人会尝试通过不断的访问和攻击你的网站来破坏你的网站的运行。如何保护你的网站&#xff0c;你需要使用一些方法来屏蔽这些指定的访客IP。 首先&#xff0c;你需要…

某医院内部网络攻击分析案例

分析概要 分析概要从以下三点做介绍。 分析内容 NetInside网络流量分析设备采集的流量。 分析时间 报告分析时间范围为&#xff1a;2020-09-28 07:58:00-11:58:00&#xff0c;时长共计3小时。 分析目的 本报告主要分析目的&#xff1a;查找和定位存在可疑现象的主机、查…

当你学会这项python数据提取神器时,请做好升职准备!

一、什么是 jsonpath ● JsonPath 是一种信息抽取类库&#xff0c;是从 JSON 文档中抽取指定信息的工具&#xff0c;提供多种语言实现版本&#xff0c;包括&#xff1a;JavaScript、Python、PHP 和 Java。 *文末领10节自动化精品课* 二、特点 ● 只能提取 JSON 格式的数据 ●…