目录
matlab和其它计算机编程语言一样,也提供了很多程序流程控制语句,例如数据的输入输出,顺序结构判断语句,分支语句,循环语句以及其它流程控制函数,接下来去学习它们。
考虑到这些语句使用M文件编写会更加简便明了,因此,涉及到判断语句,分支语句及循环语句的编写等,我都在M文件中编写。
在这篇文章所在专栏第一篇文章的矩阵学习中,我已经知道了M文件的创建:
因为除了分支语句,判断语句和循环语句的其它语句语法都比较简单,所以我还是在matlab的命令行窗口中编写语句。 等到了判断语句再用M文件编写语句。
一,数据的输入和输出
在matlab中,数据输入函数为input(python 的输入函数也是 input),以及输出函数disp(全写为 display:显示,陈列),这两个函数可以搭配着使用,如下,我使用input函数输入信息之后,再使用disp函数显示输入的信息(既可以输出字符串,也可以输出矩阵):
当使用disp函数显示矩阵时,不显示矩阵的名字,使得格式更加紧密,不留任何没意义的空行
之所以我即使没有使用disp函数,输出的矩阵也依旧紧密且没有空行,是因为我在之前的矩阵学习中使用了format compact命令将输出格式设置成了压缩格式,当我使用format loose命令之后,就会回到之前有多余空行的输出格式:
二,顺序结构
顺序结构是最简单的程序结构,系统在编译程序时,按照程序的物理位置顺序执行。这种程序的优点是容易编制,缺点是单一,能够实现的功能有限。例如
三,if判断语句
判断语句可以使程序中的一段代码只在满足一定条件时才执行。语法如下:
if 表达式
执行程序块
end
可以看到,在语句的结尾需要顶格写上“end”关键字表示该语句执行的范围到此结束,如果不加的话,程序会抛出一个错误,提示语法不正确。在生活的判断语句有:如果身上的钱足够,则买商品。如下:
当if判断语句的条件不满足时,不会输出执行语句块中的语句。而我想要在身上钱不够买一箱牛奶时,也能够输出提示:“无法买一箱牛奶,购物失败。”,因此,就可以使用用到“else”关键字,具体的语法如下:
if 表达式
执行程序块1
else
执行程序块2
end
再将之前的判断语句进行修改:
a=input("一箱纯牛奶价格:");
b=input("身上带着的钱:");
if(b>=a)
disp("可以买一箱牛奶,购物完成。")
else
disp("无法买一箱牛奶,购物失败。")
end
当前,实际上超市并不是只有牛奶,75元买不了一箱牛奶,但可以买其它零零散散的东西,例如两元一瓶的矿泉水可以整一波。所以,上述的语句还可以再加上elseif 关键字:
如下👇
四,switch分支语句
switch分支语句和if判断语句类似,都有判断的作用,但switch分支语句在处理多个条件时非常方便,可以提高代码的可读性和可维护性。其语法如下:
swith 需要判断的变量名
case 变量值1 % case可以使用 case {变量值1, 变量值2} 的形式来匹配多个值。
执行程序块1; % 如果需要判断的变量的值和变量值1相等,则执行这段程序块1。
case 变量值2
执行程序块2; % 如果需要判断的变量的值和变量值2相等,则执行这段程序块2。
case 变量值3
执行程序块3; % 如果需要判断的变量的值和变量值3相等,则执行这段程序块3。
otherwise
执行程序块; % 可选的部分,如果没有任何case匹配,则执行这段程序块。
end
例如,今天是周日,我将数字 7 赋值给变量n,使用switch分支语句去匹配并输出对应的字符串👇
n= 7;
switch n
case 1
disp('今天是周一。');
case 2
disp('今天是周二。');
case 3
disp('今天是周三。');
case 4
disp('今天是周四。');
case 5
disp('今天是周五。');
otherwise
disp('今天是周末(休息日)或是未知的一天');
end
再例如:
某商场对顾客所购买的商品实行打折销售,标准为:
- 小于200,没有折扣
- 200~500,5%折扣
- 500~1000,8%折扣
- 1000~2500,15%折扣
- 2500~5000,20%折扣
- 大于5000,25%折扣
输入商品的价格,求其实际销售的价格。
思路:
- 有折扣指的是便宜多少,比方说,5%折扣指的是在原价的基础上便宜5%,假设有一件原价为
元的商品,有5%折扣,使用折扣之后,该商品的售价为:
因此,5%折扣=便宜5%=打九五折 - 通过商场的活动可知,需要购买百元以上的商品才有资格参与折扣活动,因此,可以考虑先将商品整除100,让处理的数据量变小,方便处理。由于商品价格也有小于100的,当小于100的数整除100时,结果是浮点类型,例如,90/100=0.9;80/100=0.8;70/100=0.7......这些都不参与折扣活动,通过观察可以发现,不参与活动的除了小于200的整数,100+的商品/100=1.x(整数部分为1)还有整数部分为0的数,这个时候可以使用fix函数,fix 函数可以将数值的小数部分去掉,只保留整数部分:
>> help fix fix - 朝零四舍五入 此 MATLAB 函数 将 X 的每个元素朝零方向四舍五入为最近的整数。对于正方向的 X,fix 的行为与 floor 相同。对于负方向的 X,fix 的行为与 ceil 相同。 Y = fix(X)
于是在使用switch分支语句时,商品价格p低于200,case的变量值可以取到0和1,这个时候的折扣为0,使用变量d来存储。
p=fix(input('商品价格:\n')/100); switch p case {0,1} d=0;
- “ 200~500,5%折扣”,如果商品刚刚好500元,按照后面的(更大的)折扣计算。200~500,整除100的数分别为 2,3,4,因此case后的变量值为{2,3,4},对应的执行代码块为 折扣d =0.05; 或写成 d=5/100;
case {2,3,4} d=5/100;
- “500~1000,8%折扣”,这个区间的商品价格整除100之后会有5个数值,如果还是用前面的花括号和逗号来写,就有点麻烦,好在,在matlab中,有一个函数可以借用:
在 matlab中,num2cell 函数用于将数值数组转换为单元格数组。具体来说,num2cell 会将输入的数值数组中的每个元素转换为单个单元格。>> help num2cell num2cell - 将数组转换为相同大小的元胞数组 此 MATLAB 函数 通过将 A 的每个元素放置于 C 的一个单独元胞中,来将数组 A 转换为元胞数组 C。 C = num2cell(A) C = num2cell(A,dim)
这里我使用 num2cell(5:9),产生一个包含从 5 到 9 的数组,即 [5, 6, 7, 8, 9]。num2cell 将这个数组转换为单元格数组,每个元素放在一个单元格中。
之后我就可以放置在case后面,作为价格变量p的值,进行匹配。case num2cell(5:9) d=8/100;
- 剩下的“1000~2500,15%折扣”,“2500~5000,20%折扣”,和上面的第四步一样的操作就行。“大于5000,25%折扣”这一部分就用otherwise来执行。
最后的效果:
代码:
p=fix(input('商品价格:\n')/100);
switch p
case {0,1}
d=0;
case {2,3,4}
d=5/100;
case num2cell(5:9)
d=8/100;
case num2cell(10:24)
d=15/100;
case num2cell(25:49)
d=20/100;
otherwise
d=25/100;
end
disp(p*100*(1-d))
五,for循环语句
在matlab中,for语句调用的基本格式如下:
for 变量名=起始值:增量(也称步长):结束值
语句组(也称循环体);
end
循环语句在生活中应用很常见,例如,每天早上从家到公司,晚上从公司回到家;每天早晚的刷牙洗脸,和每日三餐,等等。我们所处的环境(或世界)就是一个巨大的循环体,不管是其它动植物的生存繁殖还是人类的工作活动,都会有循环的存在。
在进行数学运算时,也会遇到循环,例如,有限(或无限)循环小数,等比(或等差)序列求和,和对同一个运算进行多次重复执行,等等。
接下来使用for循环语句解决如下的数学问题:
1,求1+2+3+...+99+100的和
一开始要创建一个用来存储求和结果的变量s,并让它的初始值为0。
s=0;
for n=1:1:100
s=s+n;
end
disp(s)
当增量(也称步长) 为1时,可以省略步长,对应的代码修改如下:
六,while循环语句
while循环语句和for循环语句的功能一样,都是对同一个执行程序块重复执行。唯一不同就在于,while循环的循环次数不需要预先指定,该循环是否能够结束取决于循环体内的表达式什么时候能够让循环变量不满足循环条件。对应的语法如下:
%循环变量的值要提前设置。
while 含有循环变量的循环条件
执行程序块;
end
还是以求等差数列的和为例:
1,求1+3+5+...+97+99的和
因为差数列1+2+3+...+99+100的公差是1,所以能够很快的知道1+2+3+...+99+100共有 项,并能够用for循环语句来解决问题。
但这道题中公差(增量或步长)为2,不能很快知道该等差数列的项数,尽管可以用通项公式求出项数
,但不需要我们手动去算,直接使用while循环语句就行。如下👇
当循环变量n的值大于99时,循环结束。
s=0;
n=1;
while n<=99
s=s+n;
n=n+2;
end
disp(s)
因此可以看出,在循环次数不确定的情境下,while循环语句比for语句更方便。
如果有问题请在评论区留言或者是私信我,回复时间不超过一天。