条件语句 -- 北太天元学习8
条件语句
算法的三种基本结构是顺序结构,循环结构 和 分支结构。北太天元学习2
讲了顺序结构(这个没有强调,就是按照顺序一个一个地执行语句), 北太天元5和7讲
循环结构(for循环和while循环)。 这个短文,我们讲分支结构.
分支实现的方式包括 if条件语句和 switch条件语句. 条件语句也被称为选择语句.

if语句的形式是“如果A,那么B”。在北太天元中,基本的if语句如下所示:
if 逻辑表达式
特定代码段
end
只有当逻辑表达式为true时,才运行if 和 end 圈定的特定代码段.
通常,当逻辑表达式为假时,我们希望执行一些不同的操作。在这种情况下,我们可能需要
if-else语句, 如下所示:
if 逻辑表达式
特定代码段A
else
特定代码段B
end
如果逻辑表达式为true,则执行特定代码段A。如果逻辑表达式不为真,那么
则执行特定代码段B。
例如,我们在命令行窗口输入如下的代码
if pi > 2
disp("pi > 2 是真的");
else
fprintf("pi > 2 是假的\n");
end
得到的输出是
1x1 string
"pi > 2 是真的"
这是因为 pi > 2 返回的是 true, 北太天元执行disp("pi >2 是真的")这个语句。
如果要编写一个具有两种以上可能性的条件语句,我们可能需要在if和else中间
插入一个或者多个elseif, 例如
if 逻辑表达式1
特定代码段A
elseif 逻辑表达式2
特定代码段B
elseif 逻辑表达式3
特定代码段C
else
特定代码段D
end
对于本例,如果 逻辑表达式1 为真,则执行特定代码段A。否则,如果逻辑表达式2为真,
则执行特定代码段B。如果逻辑表达式1和逻辑表达式2都为false,并且逻辑表达式3为true,
则执行特定代码段C。如果这些逻辑表达式中没有一个为真则执行特定代码段D。请注意,这个例子中特定代码段A、B、C和D中有且仅有一个会被执行到.
此外,最后一个else语句不是必须的。如果没有else和后面的特定代码段D,那么在前面的逻辑表达式1,2,3都是假的时候,北太天元就什么都不做,直接去执行与if配对的 end 之后的语句。
条件语句有一个很重要的应用就是用在for循环或while循环中,当满足某个条件的时候,
选择使用关键词 break 或者 return 来跳出循环。
信息下面的代码段取1到10之间的每个数字,并显示它是否能够被2、3或者5整除
然而,如果这个数字可以被其中多个整除,那么它只显示它是可被其中最小的一个整除。
例如,如果i是6,那么它将显示它可以被2整除,虽然它也能被3整除,但是没有被检查到.
n=10;
for i=2:n
if rem(i, 2) == 0
disp([num2str(i), '可被2整除']);
elseif rem(i, 3) == 0
disp([num2str(i), '可被3整除']);
elseif rem(i, 5) == 0
disp([num2str(i), '可被5整除']);
else
break;
end
end
请注意,内置函数disp命令有一个参数,它的参数是是一个char matrix,
这个char matrix 实际上只有一行,是一个char行向量,
[num2str(i), '可被2整除'] 这里的逗号前后都是char向量, 然后
被连接成了一个更长的char向量。 numstr也是一个内置函数,把一个数转成char mat.
当存在许多个条件时,还可以使用switch语句,而且此时switch代码阅读起来更加简单。
假设我们有一个开关变量,希望根据这个变量的值运行不同的代码段。
每个变量的每个特定值称为一个case。 switch语句的样式如下:
swithc s %开关变量
case A
特定代码段A
case B
特定代码段B
case {C1,C2,C3} % 用{ } 把C1,C2,C3做成case的集合
特定代码段C
otherwise
特定代码段D
end
如果开关变量s的值匹配了 A 那么执行特定代码段A后程序不再检查别的case,直接跳到
与switch配对的end后的语句执行。 case 后面的值可以是一个值的集合,开关变量s
的值如果在这个集合中,例如对于 case {C1,C2,C3} ,在前面s与A和B都不匹配的时候,
只要 s == C1 或者 s==C2或者s==C3成立,则执行 特定代码段C, 前面所有的case都不匹配,
执行otherwise关键词之后的特定代码段D. 这里的otherwise 语句不是必须的,
如果没有otherwise 语句,则前面的case如果都不匹配,那么北太天元什么都不干,
直接跳到与switch配对的end后面的语句去执行。
看看下面这段代码输出的是什么?
name = 'Jack' ;
switch name
case {'Rose', 'Jack'}
fprintf("My name is Rose or Jack\n");
case 'Jack'
fprintf("My name is Jack\n");
end
答案:是输出 "My name is Rose or Jack", 原因是在 Jack 与 {'Rose', 'Jack'}中的'Jack'
匹配,执行了 fprintf("My name is Rose or Jack\n"); 之后就跳到end之后了, 不会
再检查 case 'Jack' 是否匹配。
