switch翻译成中文为开关,switch语句是另一种实现条件语句的方法,其基本用法如下:
switch语句在运行时,会将开关表达式的值依次和各个 case后面的表达式的值判断是否相等,如果相等则为true,此时会执行该case中相应的语句;如果不相等则为false,此时会取下一个 case 后面表达式的值进行比较,直到出现true为止。如果所有case 后面表达式的值均与开关表达式的值不相等,则执行 otherwise 中对应的语句。
注意:开关表达式的计算结果必须是一个数值标量或者是一个字符向量/字符串,不能是向量或者矩阵。若为数值标量,则当case后面表达式中的值等于开关表达式的数值标量时为true;若为字符向量或字符串,则当case后面表达式中的字符向量/字符串和开关表达式的字符向量/字符串完全相同时为true。下面举两个例子帮助大家理解:
season = randi([1,4]) % 季节
switch season
case 1
disp("第一季度为春季");
case 2
disp("第二季度为夏季");
case 3
disp("第三季度为秋季")
otherwise
disp("第四季度为冬季")
end
season是在区间[1,4]上随机生成的一个整数,用来表示季节。switch后面的开关表达式就是season这个数值标量,程序会按照从上到下的顺序依次判断season和case后面的数值是否相等,若相等则执行对应的语句。若season取值为4,则和case后面的数值均不相等,此时程序会执行otherwise后面的语句。
注意:MATLAB中的单引号和双引号表示的文本有一定的区别,使用单引号引起来被称为字符向量,例如'abc',而双引号引起来的被称为字符串,例如"abc"。
上面代码中我们用到了disp函数(来自单词display),它可以将文本、数值等显示到MATLAB的窗口,disp语句是否以分号;结尾不会影响结果的输出。
例2:a和b是在区间[1,10]上随机生成的两个整数,我们希望根据变量way表示的字符串决定对a和b的计算方式。
a = randi(10)
b = randi(10)
way = "乘法";
switch way
case "加法"
disp(a+b)
case "减法"
disp(a-b)
case "乘法"
disp(a*b)
case "除法"
disp(a/b)
otherwise
disp("你的输入有误")
end
switch后面的开关表达式就是way表示的字符串,程序会按照从上到下的顺序依次判断way和case后面的字符串是否相同,若相同则执行对应的语句。例如way等于“乘法”,则程序会先判断第一个case,第一个case为“加法”,字符串不相同,则会继续判断第二个case,第二个case的字符串和way的字符串也不同,则会判断第三个case,此时字符串一致,程序会执行disp(a*b)这一行语句,假设a为5、b为3,则会在窗口输出15。
易错点:和if语句一样,switch语句必须以end结束,千万不能漏写!
在if语句中,有时候我们会不写elseif和else关键字,而switch语句也可以不写case和otherwise这两个关键字。另外我们也可以将上面两个例子转换成if语句,因此在实际使用中,switch语句用的频率并不高。下面我们给出转换后的结果:
season = randi([1,4]) % 季节
if season == 1
disp("第一季度为春季")
elseif season == 2
disp("第二季度为夏季")
elseif season == 3
disp("第三季度为秋季")
else
disp("第四季度为冬季")
end
a = randi(10)
b = randi(10)
way = "乘法";
% 使用strcmp函数比较字符串是否相同
if strcmp(way, "加法")
disp(a + b)
elseif strcmp(way, "减法")
disp(a - b)
elseif strcmp(way, "乘法")
disp(a * b)
elseif strcmp(way, "除法")
disp(a / b)
else
disp("你的输入有误")
end
注意:比较两个字符串是否相同可以使用关系运算符==,也可以使用strcmp函数;而比较两个字符向量是否相同请使用strcmp函数。关于字符串的相关知识,我们会在后面的章节进行系统的讲解。
易错点:下面代码中n的值为多少时,MATLAB会输出成绩合格?
n = randi([0,100]) % n是区间[0,100]上的随机整数,表示成绩
switch n
case n >= 60
disp("成绩合格")
otherwise
disp("成绩不合格")
end
注意,case后面n>=60是一个判断语句,返回的逻辑值要么为逻辑1,要么为逻辑0。如果n等于0,此时n>=60的计算结果为逻辑0,此时MATLAB会认为开关表达式对应的n和case表达式计算的结果相等,此时会输出成绩合格;当n取值为[1,59]时,n>=60的计算结果为逻辑0,和n不相等,此时会运行otherwise中的语句,即输出成绩不合格;当n取值大于等于60时,n>=60的计算结果为逻辑1,和n也不相等,此时也会运行otherwise中的语句,输出成绩不合格。综上所述,当且仅当n等于0时才会输出成绩合格,这和我们想要看到的结果完全不同。那么如何修改代码能使得结果正确呢?答案:只需要将switch n改成switch true或者switch 1即可。
switch语句还有另外一种用法,这种用法用到了我们还没正式学过的元胞数组(Cell Array),这里先简单了解下,后面章节会详细介绍元胞数组的知识点。元胞数组和普通的数值矩阵不同,元胞数组中的元素可以是不同类型、不同大小的数据。我们之前学过的数值矩阵中的元素是使用中括号[]括起来的,而元胞数组中的元素是使用大括号{}括起来的。例如{25, 15, [6, 3]}是有三个元素的元胞数组,{"abc", [1,2; 3,4]}是有两个元素的元胞数组。
case后面的表达式可以是一个元胞数组,如果switch后面开关表达式的值和case元胞数组中的至少一个元素相同,则为true. 下面我们来看一个具体的例子:
month = randi([1,12]) % 农历对应的月份
switch month
case {1,2,3}
season="春天";
case {4,5,6}
season="夏天";
case {7,8,9}
season="秋天";
otherwise
season="冬天";
end
disp(season)
month是在区间[1,12]上随机生成的一个整数,用来表示农历月份。case后面现在换成了使用大括号括起来的元胞数组,如果month取值为1、2或者3,则会执行第一个case对应的语句,此时季节变量season为春天;若取值为4、5或者6,则为夏天;以此类推。
补充:{1,2,3}可通过向量[1,2,3]转换而来,对应的函数是num2cell,即{1,2,3}等价于num2cell([1,2,3]).
再来看一个输出成绩等级的例子。若n表示考试成绩(假设n为0至100的整数,不考虑输入错误的情况),其中90~100分等级为A,80~89分等级为B,70~79分等级为C,60~69分等级为D,60分以下不及格,请使用switch语句输出某一具体分数对应的等级。
n = 81;
switch true % 也可以写成switch 1
case n >= 90
disp("A")
case n >= 80
disp("B")
case n >= 70
disp("C")
case n >= 60
disp("D")
otherwise
disp("不及格")
end
n = 81;
switch fix(n/10) % 丢掉小数部分取整
case {9, 10}
disp("A")
case 8
disp("B")
case 7
disp("C")
case 6
disp("D")
otherwise
disp("不及格")
end
以上是两种不同的思路对应的代码,它们都能解决这个问题。事实上使用if语句解决这个问题更为方便。
免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删