
4.3 程序结构
对于一般的程序设计语言来说,程序结构大致可以分为顺序结构、循环结构与分支结构3种。MATLAB程序设计语言也不例外,但是要比其他程序设计语言好学得多,因为其语法不像C语言那样复杂,并且具有功能强大的工具箱,使得它成为科研工作者及学生最易掌握的软件之一。下面将分别就上述3种程序结构进行介绍。
4.3.1 顺序结构
顺序结构是最简单、最易学的一种程序结构,它由多个MATLAB语句顺序构成,各语句之间用分号“;”隔开(若不加分号,则必须分行编写),程序执行时也是按照由上至下的顺序进行的。

例4-14:方程求根运算。
本实例求解一元二次方程ax2+bx+c=0的解,根据公式推导,根据定义a、b、c的值,求2x2+3x+4=0的解。
解:MATLAB程序如下。


例4-15:矩阵除法运算。
本实例求解矩阵的左除和右除。
解:MATLAB程序如下。

4.3.2 循环结构
在利用MATLAB进行数值实验或工程计算时,用得最多的便是循环结构了。在循环结构中,被重复执行的语句组称为循环体。常用的循环结构有两种:for-end循环与while-end循环。下面分别简要介绍相应的用法。
for-end循环
在for-end循环中,循环次数一般情况下是已知的,除非用其他语句提前终止循环。这种循环以for开头,以end结束,其一般形式如下。

其中,“表达式”通常为形如m:s:n(s的默认值为1)的向量,即变量的取值从m开始,以间隔s递增一直到n,变量每取一次值,循环便执行一次。事实上,这种循环在上一节就已经用到了。下面来看一个特别的for-end循环示例。

例4-16:创建一个10阶Hilbert矩阵。
解:MATLAB程序如下。

while-end循环
如果不知道所需要的循环到底要执行多少次,那么就可以选择while-end循环。这种循环以while开头,以end结束,其一般形式如下。

其中,“表达式”即循环控制语句,一般是由逻辑运算或关系运算及一般运算组成的表达式。若表达式的值非零,则执行一次循环,否则停止循环。这种循环方式在编写某一数值算法时用得非常多。一般来说,能用for-end循环实现的程序也能用while-end循环实现,如下例所示。

例4-17:函数求和运算。
利用while-end循环求解。
解:MATLAB程序如下。
1)编写名为qiuhe.m的M文件。

2)在命令行窗口中运行,结果如下。

4.3.3 分支结构
这种程序结构也叫选择结构,即根据表达式值的情况来选择执行哪些语句。在编写较复杂的算法时一般都会用到此结构。MATLAB编程语言提供了3种分支结构:if-else-end结构、switch-case-end结构和try-catch-end结构。其中较常用的是前两种。下面分别介绍这3种结构的用法。
if-else-end结构
这种结构也是复杂结构中最常用的一种分支结构,具有以下3种形式。
1.形式1

说明 若表达式的值非零,则执行if与end之间的语句组,否则直接执行end后面的语句。

例4-18:请求未处理文本输入。
解:MATLAB程序如下。
1)编写名为domore.m的M文件。

2)在命令行窗口中运行,结果如下。

2.形式2

说明 若表达式的值非零,则执行语句组1,否则执行语句组2。通过M文件,画出下列分段函数所表示的曲面。

例4-19:矩阵变换。
本实例编写一个分段函数的程序。

解:MATLAB程序如下。
1)编写名为example的M文件。

2)在命令行窗口中运行,结果如下。



3.形式3

说明 程序执行时先判断表达式1的值,若非零则执行语句组1,然后执行end后面的语句,否则判断表达式2的值,若非零则执行语句组2,然后执行end后面的语句,否则继续上面的过程。如果所有的表达式都不成立,则执行else与end之间的语句组n。

例4-20:将随机矩阵中小于0.5的元素替换为0。
解:MATLAB程序如下。

switch-case-end结构
一般来说,这种分支结构也可以由if-else-end结构实现,但那样会使程序变得更加复杂且不易维护。switch-case-end分支结构一目了然,而且更便于后期维护。这种结构的形式如下。

其中,switch后面的“变量或表达式”可以是任何类型的变量或表达式。如果变量或表达式的值与其后某个case后的常量表达式的值相等,就执行这个case和下一个case之间的语句组,否则执行otherwise后面的语句组n+1;执行完一个语句组,程序便退出该分支结构,执行end后面的语句。下面来看一个这种结构的例子。

例4-21:方法判断。
本实例编写一个使用方法判断的程序。
解:MATLAB程序如下。
1)编写名为mm6的M文件。

2)在命令行窗口中运行,结果如下。


例4-22:乘积评定。
编写一个学生成绩评定函数,要求若该生考试成绩在85~100之间,则评定为“优秀”;若在70~84之间,则评定为“良好”;若在60~69之间,则评定为“及格”;若在60分以下,则评定为“不及格”。
解:MATLAB程序如下。
1)首先建立名为grade_assess.m的函数文件。


2)构造一个姓名名单以及相应的分数,来看一下程序的运行结果。


try-catch-end结构
有些MATLAB参考书中没有提到这种结构,因为上述两种分支结构足以处理实际中的各种情况。但是这种结构在程序调试时很有用,因此在这里简单介绍一下这种分支结构。其一般形式如下。

在程序不出错的情况下,这种结构只有语句组1被执行;若程序出现错误,那么错误信息将被捕获,并存放在lasterr变量中,然后执行语句组2;若在执行语句组2的时候,程序又出现错误,那么程序将自动终止,除非相应的错误信息被另一个try-catch-end结构捕获。下面来看一个例子。

例4-23:矩阵的串联。
利用try-catch-end结构调试程序,显示无法垂直串联矩阵的原因。
解:MATLAB程序如下。

在利用MATLAB编程解决实际问题时,可能要提前终止for与while等循环结构,有时还可能要显示必要的出错或警告信息、显示批处理文件的执行过程等,而这些特殊要求的实现就需要用到本节所要讲述的程序流程控制命令,如break命令、pause命令、continue命令、return命令、echo命令、error命令与warning命令等。

例4-24:查看内存。
显示函数的执行过程。
解:MATLAB程序如下。
