4.3 MATLAB的控制流(1)
MATLAB平台上的控制流结构包括顺序结构、if-else-end分支结构、switch-case结构、try-catch结构、for循环结构和while循环结构,这6种结构的算法及使用与其他计算机编程语言十分类似,有编程基础的读者可以很快掌握。
4.3.1 顺序结构
顺序结构是MATLAB程序中最基本的结构,表示程序中的各操作是按照它们出现的先后顺序执行的。顺序结构可以独立使用构成一个简单的完整程序,常见的输入、计算、输出三部曲的程序就是顺序结构。在大多数情况下,顺序结构作为程序的一部分,与其他结构一起构成一个复杂的程序,如分支结构中的复合语句、循环结构中的循环体等。
例4-2:计算圆的面积。该程序的语句顺序就是输入圆的半径r,计算S=π·r·r,输出圆的面积S。试着在MATLAB中编写求解圆面积的顺序结构的程序。
在MATLAB命令行窗口中运行指令edit,调出MATLAB的程序编辑器,系统即新建一个默认名为Untitled的M文件,在输入区输入下述代码(见图4-2):
r = 5; % 定义变量r,并赋值 S = pi * r * r; % 计算圆的面积 fprintf('半径为%d的圆的面积为%f\n',r,S);
图4-2 输入程序
单击“编辑器”选项卡→“文件”面板中的“保存”按钮,并以ex4_2为名称保存。
单击“运行”面板中的“运行”按钮运行该M文件,即可在命令行窗口中得到结果:
半径为5的圆的面积为78.539816
4.3.2 if-else-end分支结构
if-else-end指令为程序流提供了一种分支结构,该结构的形式根据实际情况的不同而不同,主要有以下几种。
(1)若判决条件expression为真,则执行命令组,否则跳过该命令组。具体的调用格式如下:
if expression commands end
(2)若可供选择的执行命令组有两组,则采用如下结构:
if expression % 判决条件 commands1 % 判决条件为真,执行命令组1,并结束此结构 else commands2 % 判决条件为真,执行命令组2,并结束此结构 end
(3)若可供选择的执行命令组有n(n > 2)组,则采用如下结构:
if expression1 % 判决条件 commands1 % 判决条件expression1为真,执行命令组1,并结束此结构 elseif expression2 commands2 % 判决条件expression1为假,expression2为真,执行命令组2,并结束此结构 …… else commandsn % 前面所有的判决条件均为假,执行commandsn,并结束此结构 end
例4-3:if-else-end分支结构的简单运用示例。
创建M文件并命名为ex4_3.m,利用M文件编辑器在M文件中输入:
Rand_a = rand(1) % 创建一个随机数Rand_a if Rand_a > 0.5 Rand_b = Rand_a % 如果Rand_a大于0.5,那么创建变量Rand_b并等于Rand_a else Rand_b = 1 - Rand_a % 如果Rand_a小于0.5,那么创建变量Rand_b并等于1 - Rand_a end
运行M文件,得到结果:
Rand_a = 0.0975 Rand_b = 0.9025
例4-4:已知符号函数
使用if语句判断当给定变量x的值时,相应的函数值y。
创建M文件并命名为ex4_4.m,利用M文件编辑器在M文件中输入:
x = input('请输入x的值:'); if(x > 0) y = 1; elseif(x == 0) y = 0; else y = -1; end disp(y)
调用该文件分别输入不同的x值(此处输入6),运行程序,得到结果:
>> ex4_4 请输入x的值:6 1
4.3.3 switch-case结构
switch语句执行基于变量或表达式值的语句组,关键字case和otherwise用于描述语句组。只执行第一个匹配的情形。用到switch则必须用end与之搭配。switch-case的具体语法结构如下:
switch value % value为需要进行判决的标量或字符串 case test1 command1 % 如果value等于test1,执行command1,并结束此结构 case test2 command2 % 如果value等于test2,执行command2,并结束此结构 …… case testn commandn % 如果value等于testn,执行commandn,并结束此结构 otherwise commands % 如果value不等于前面所有值,执行commands,并结束此结构 end
说明:
(1)switch-case结构的调用格式保证了至少有一组指令组将会被执行。
(2)switch指令之后的表达式value应为一个标量或一个字符串。当表达式为标量时,比较命令为表达式 == 检测值i;而当表达式为字符串时,MATLAB将会调用字符串函数strcmp来进行比较,即strcmp(表达式,检测值i)。
(3)case指令之后的检测值不仅可以是一个标量或一个字符串,还可以是一个元胞数组。如果检测时是一个元胞数组,则MATLAB将会把表达式的值与元胞数组中的所有元素进行比较。如果元胞数组中有某个元素与表达式的值相等,MATLAB则认为此次比较的结果为真,从而执行与该次检测相对应的命令组。
例4-5:switch-case结构的简单运用示例。
创建M文件并命名为ex4_5.m,利用M文件编辑器在M文件中输入:
num = input("请输入一个数字:"); switch num case 1 data = 'Monday' % 如果num = 1,则定义data = 'Monday' case 2 data = 'Tuesday' % 如果num = 1,则定义data = 'Tuesday' case 3 data = 'Wednesday' % 如果num = 1,则定义data = 'Wednesday' case 4 data = 'Thursday' % 如果num = 1,则定义data = 'Thursday' case 5 data = 'Friday' % 如果num = 1,则定义data = 'Friday' case 6 data = 'Saturday' % 如果num = 1,则定义data = 'Saturday' case 7 data = 'Sunday' % 如果num = 1,则定义data = 'Sunday' otherwise data = 'None!!!' % 如果num不等于上面所有值,则定义data = 'None!!!' end
运行M文件,得到结果:
>> ex4_5 请输入一个数字:5 data = 'Friday'
例4-6:求任意底数的对数函数值y = lognx。
打开Editor(M文件编辑器),编写程序如下:
clear n = input( 'Enter the value of ''n'': '); x = input( 'Enter the value of ''x'': '); switch(n) case 1 errordlg('出错'); case 2 y=log2(x); case exp(1) y=log(x); case 10 y=log10(x); otherwise y=log10(x)/log10(n); end disp(y)
将该脚本M文件命名为ex4_6.m。调用该文件,分别输入不同的n值和x值,运行程序,输出结果:
>> ex4_6 Enter the value of 'n': 2 Enter the value of 'x': 62 5.9542 >> ex4_6 Enter the value of 'n': 1 Enter the value of 'x': 20 函数或变量 'y' 无法识别。 出错 ex4_6 (line 16) disp(y)
当n=1时,输入x值后,出现错误对话框,如图4-3所示。
图4-3 错误对话框
注意:与多分支的if语句相比,switch语句主要用于条件多且单一的情况,典型的应用情况是数学中的分段函数。此外,两者各有优缺点,如表4-4所示。
表4-4 if语句和switch语句的比较