4.1.2 switch-case-otherwise-end语句(MATLAB入门课程)

专栏 / 4.1.2 switch-case-otherwise-end语句(MATLAB入门课程)

4.1.2 switch-case-otherwise-end语句(MATLAB入门课程)

2023年11月07日 13:56 --浏览 · --点赞 · 数学建模学习交流
粉丝: 22.1万 文章: 95

讲解视频: 可以在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 语句,大家课后可以自己尝试转换。


下一篇文章:


更多文章可点击下方合辑:

MATLAB教程合辑