在编写程序时,有时我们需要根据不同的条件执行不同的命令。举个例子,b站上有许多电影需要开通会员后才能观看完整的内容。在这种情况下,b站后台会自动检查观众是否是会员用户,如果是会员,则允许他们观看整个电影,否则只允许试看几分钟。这个过程可以用右侧的流程图来表示,图上有左右两个分支。
在MATLAB中,我们将介绍两种条件语句:if-elseif-else-end语句和switch-case-otherwise-end语句,它们可实现分支结构。其中前者更为通用,能够满足多种条件判断的需求,因此常用于实际编程中。无论使用哪种条件语句,其核心思想都是一样的:首先判断给定的条件是否满足,然后根据判断结果(true或false)执行相应的命令。
因此,条件语句也可以被称为条件判断语句或判断语句,它们在程序中扮演着至关重要的角色,帮助我们实现不同情况下程序的灵活控制和处理。
if、elseif、else和end是MATLAB中的四个关键字,在第二章中我们强调过:不能定义与MATLAB关键字同名的变量。这四个关键字就构成了我们要学的第一种条件语句,后续我们将其简称为if语句。
易错点:elseif关键字中间不能加空格,不能写成else if,这和C、Java等语言不同。
注意:在使用if语句时,if和end这两个关键字是无论如何都不能省略的。有很多新手在使用MATLAB时都会漏掉end这个关键字,导致后续无论输入什么命令MATLAB都没有反应,而elseif和else可以根据自己的需要来决定是否添加。
下面我们先看一个完整的if语句的示例(假设有四个分支),其对应的流程图见右侧:
注意,这里的语句1、语句2、语句3和语句4最终只能有一个被执行。如果表达式1成立(通常表达式返回一个逻辑值,值为逻辑值1则表示成立),则执行语句1,后面的表达式都不用判断,它们对应的语句也都不会被执行;如果表达式1不成立,则会接着判断表达式2是否成立,如果表达式2成立则会执行语句2,否则会接着判断表达式3是否成立,如果表达式3成立则会执行语句3,如果表达式3也不成立则会执行语句4。
我们举一个具体的例子:计算分段函数
你可以将这个分段函数想象成如下场景:给定一个同学的成绩(假设为整数),输出这个同学的等级。等级规则如下:90至100分为1级、80至89分为2级、60至79分为3级、低于60分为4级;如果成绩小于0分或者大于100分,则代表成绩输入有误,此时等级为0。
那么,应该怎样用MATLAB表示这个分段函数呢?不熟练的同学可以先画一个流程图,其对应的MATLAB代码如右侧所示:
上面代码中有一些要说明的点:
(1)判断x是否位于[90,100]这个区间时,不能写成90<=x<=100,MATLAB不支持这种连续的判断。因此我们将其拆分成两个条件:x>=90 && x<=100。这里用的是具有短路功能的逻辑与运算符&&,这样判断效率会更高。
(2)if只能有一个,但elseif可以有多个,它们后面都需要跟上相应的判断条件。只有在if后面的条件不满足时,才会判断elseif后面的条件是否成立。
(3)else后面不能加上条件,当if和elseif后面的条件全部都不满足时,才会执行else对应的语句。
(4)不需要在if、elseif、else和end所在的行的最后面添加冒号或者分号。
另外,假设我们不考虑输入有误的情况,即确保x的取值范围在0至100之间时,我们可以对if和elseif后面的判断条件进行简化。显然,可以去掉if后面的x<=100,因为x的取值范围已经固定了;elseif后面的条件也能被简化,以第一个为例,原来代码中的判断条件写的是x>=80 && x<90,实际上我们可以直接写成x>=80,这是因为只有当前面的判断条件都不成立时才会到达当前的判断条件,而前面的判断条件不成立时意味着x<90。类似地,第二个elseif后面的条件都能简化成x>=60,下面给出简化后的代码:
前文提到过:使用if语句时,if和end这两个关键字是无论如何都不能省略的,而elseif和else可以根据自己的编程需要来决定是否添加。下面我们来举两个例子:
(1)给定包含2个元素的行向量a,请使用if语句对向量a中的元素按照从小到大的顺序排序,并将排序后的向量保存为变量sort_a。例如a = [5,3],那么sort_a = [3,5]。
我们只需要判断一次:如果a中第一个位置的元素比第二个位置的元素大,那么就调换它们的位置并将结果赋值给sort_a;如果a中第一个位置的元素小于等于第二个位置的元素则不用调换,直接将a赋值给sort_a即可,这时候就不需要用到elseif关键字了;当然,如果你非要用elseif,一定要在后面跟上条件,这时候可以省去else关键字,这样做的优点是让判断条件更加清楚,缺点是要多敲一点代码。
如果你的编程思维很清晰的话,使用左侧的代码会更加简洁,更推荐大家用左侧的代码。
(2)给定一个包含2个元素的行向量a,请对向量a中的元素按照从小到大的顺序排序,将排序后的结果直接赋值到a上,不需要使用新的向量保存排序结果。
此时我们可以省去else:如果a中第一个位置的元素比第二个位置的元素大,那么就调换它们的位置并将结果重新赋值给a;否则说明不用调换,a还是原来的,即if后面的条件不成立时,我们什么事情都不用做,else可以不写。
下面我们专门介绍一下if和elseif后面的表达式,在前面的例题中,表达式实际上就是判断条件,该判断条件通常是第三章学过的关系运算(例如==、~=、>=)和逻辑运算(例如&、&&、||、|、~),因此运算结果要么是逻辑值1(true),要么是逻辑值0(false)。例如a(1)>a(2)、x>=80 && x<90。事实上,if和elseif后面的表达式也支持其他运算,例如算术运算,其计算结果可以是一个数值常数,不一定非要是逻辑值1或者0。为什么可以这样?第三章介绍逻辑运算时讲过:MATLAB会将非零数值视为逻辑1,将数值零视为逻辑0进行运算。例如:3&5返回逻辑1,-4&0返回逻辑0。这里也是类似的:如果if和elseif后面表达式的计算结果为非零数值,就会被当成逻辑值1(true);如果计算结果为数值零,则会被当成逻辑值0(false). 当然,我们在实际编程时很少用到这种情况,大家只需要了解背后的原理即可。
另外有同学可能在if或elseif后面放上了一个数值向量或者矩阵,这时候只有当这个向量或者矩阵中的所有元素都是非零元素时,才会被当成逻辑值1(true)。
思考题:修改上面的代码使得:当矩阵x中至少有一个元素为非零元素时,就会被当成逻辑值1(true)。(答案:将if后面的x改成any(x(:))或者any(any(x))即可)
小技巧:利用智能缩进整理代码。俗话说人靠衣装马靠鞍,代码也是这样。在编程时,优秀的程序员都会注重代码的布局,即代码的缩进、留白等。好的布局会让代码更容易被理解。细心的同学已经发现了,前面的代码例子中,我在if、elseif和else下方的语句开头增加了缩进,这些缩进能让代码整体结构更加清晰,如果不加缩进的话是下面左侧的样子。当你觉得你的代码看着很不整齐时,你可以选中你的代码,然后按快捷键“ctrl+i”,这样MATLAB会自动帮你整理代码,看起来效果也会好很多。
我们通过一个经典例题来理解if的嵌套,所谓if的嵌套,是指在if、elseif或者else下方的语句中又出现了if语句(一定要注意:每个if都要有配套的end)。
例题:已知a、b和c是三个互不相等的常数,请使用if语句找出a、b和c三个数的最大值。(注意,这里是练习条件语句,请不要使用max函数直接求最大值)
如果使用原来的思路,我们需要找到各种可能情况并进行多次判断,流程图和代码如下:
注意:a>b且a>c涵盖了表中前两种排序的情况;c>b且c>a则涵盖了表中第三种和第四种排序的情况;如果都不满足则只剩下表中最后两种排序的情况,此时最大值为b.
a = 5; b = 8; c = 3; % 随便编一组数据测试
if a > b && a > c
Max = a; % 不要命名为小写的max,否则和内置函数重名了
elseif c > b && c > a
Max = c;
else
Max = b;
end
Max
下面我们换一种思路,我们判断的流程图如下:
从上图可以看出:我们首先判断a和b的大小关系,然后根据第一次的判断结果分别进行条件判断,因此出现了嵌套的情况。根据上述流程图可编写下面的代码:
if a>b
if a>c % 此时a>b且a>c
Max=a;
else % 此时a>b且c>a
Max=c;
end % a>c前面的那个if配套的end,通过缩进可以看出
else % 此时a<b
if b>c % 此时a<b且b>c
Max=b;
else % 此时a<b且b<c
Max=c;
end % b>c前面的那个if配套的end,通过缩进可以看出
end % 最上方的if配套的end
Max
免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删