讲解视频: 可以在bilibili搜索“MATLAB教程新手入门篇——数学建模清风主讲”。
switch翻译成中文为开关,switch语句是另一种实现条件语句的方法,其基本用法如下:
switch语句在运行时,会将开关表达式的值依次和各个 case后面的表达式的值判断是否相等,如果相等则为true,此时会执行该case中相应的语句;如果不相等则为false,此时会取下一个 case 后面表达式的值进行比较,直到出现true为止。如果所有case 后面表达式的值均与开关表达式的值不相等,则执行 otherwise 中对应的语句。
注意: 开关表达式的计算结果必须是一个数值标量或者是一个字符向量 / 字符串,不能是向量或者矩阵。 若为数值标量,则当case后面表达式中的值等于开关表达式的数值标量时为true;若为字符向量或字符串,则当case后面表达式中的字符向量/字符串和开关表达式的字符向量/字符串完全相同时为true。下面举两个例子帮助大家理解:
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
的计算方式。
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语句用的频率并不高。下面我们给出转换后的结果:
注意:比较两个字符串是否相同可以使用关系运算符==,也可以使用strcmp函数;而比较两个字符向量是否相同请使用strcmp函数。关于字符串的相关知识,我们会在后面的章节进行系统的讲解。
易错点:下面代码中n的值为多少时,MATLAB会输出成绩合格?
注意,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是在区间[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语句输出某一具体分数对应的等级。
以上是两种不同的思路对应的代码,它们都能解决这个问题。事实上使用
if
语句解决这个问题更为方便,
switch
语句可以转换成对应的
if
语句,大家课后可以自己尝试转换。
下一篇文章:
下一篇文章:
更多文章可点击下方合辑:
更多文章可点击下方合辑: