MATLAB入门教学:switch-case语句应用

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语句解决这个问题更为方便。


免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删

QR Code
微信扫一扫,欢迎咨询~

联系我们
武汉格发信息技术有限公司
湖北省武汉市经开区科技园西路6号103孵化器
电话:155-2731-8020 座机:027-59821821
邮件:tanzw@gofarlic.com
Copyright © 2023 Gofarsoft Co.,Ltd. 保留所有权利
遇到许可问题?该如何解决!?
评估许可证实际采购量? 
不清楚软件许可证使用数据? 
收到软件厂商律师函!?  
想要少购买点许可证,节省费用? 
收到软件厂商侵权通告!?  
有正版license,但许可证不够用,需要新购? 
联系方式 155-2731-8020
预留信息,一起解决您的问题
* 姓名:
* 手机:

* 公司名称:

姓名不为空

手机不正确

公司不为空