1.1. 程序结构
MATLAB有三种常用程序控制结构:顺序结构、选择结构和循环结构。任何复杂程序都可以由这三种基本结构组成。
1.1.1. 顺序结构
顺序结构是MATLAB语言程序的最基本的结构,是指按照程序中的语句排列顺序依次执行,每行语句是从左往右执行,不同行语句是从上往下执行。一般数据的输入和输出、数据的计算和处理程序都是顺序结构。
顺序结构的基本流程如图3-1所示,程序先执行语句A,然后执行语句B,最后执行语句C。
数据的输入
MATLAB语言要从键盘输入数据,用input函数:
(1)x=input('提示信息')
其中提示信息是字符串,用于提示用户输入什么样的数据,等待用户从键盘输入数据,赋值给变量x。
x=input('输入变量 x:')
输入变量 x:3
x = 3
执行该语句时,命令行窗口显示提示信息“输入变量 x:”,然后等待用户从键盘输入x的值。
MATLAB语言要从键盘输入数据,用input函数:
(2)str=input('提示信息','s')
其中该格式用于用户输入一个字符串,赋值给字符变量str。
>>str=input('what ''s your name?','s')
what 's your name?XuGuobao
str =XuGuobao
显示提示信息“what 's your name?”,等待用户从键盘输入字符变量str的值。
数据的输出
MATLAB命令窗口显示输出信息可以用函数disp,该函数调用格式如下:
disp('输出信息’)
其中,输出信息可以是字符串,也可以是矩阵信息。例如:
>>disp('What ''s your name? ')
disp('My name is XuGuobao')
What 's your name?
My name is XuGuobao
>> A=[1 2;3 4];
>>disp(A)
1 2
3 4
需要注意,用disp函数显示矩阵信息将不显示矩阵的变量名,输出格式更紧凑,没有空行。
【例】从键盘输入a、b、和c的值求解一元二次方程的根。
程序代码如下:
a=input('a=');
b=input('b=');
c=input('c='); %从键盘输入a、b和c的值
delt=b*b-4*a*c;
x1=(-b+sqrt(delt))/(2*a);
x2=(-b-sqrt(delt))/(2*a);
disp(['x1=',num2str(x1)]); %显示x1和x2的值
disp(['x2=',num2str(x2)]);
程序运行结果是:
>>
a=1
b=-5
c=6
x1=3
x2=2
1.1.2. 选择结构
MATLAB语言的选择结构是根据选定的条件成立或者不成立,分别执行不同的语句。选择结构有下面三种常用语句:
if语句、switch语句和try语句
- if语句
if语句有三种格式。
(1) 单项选择结构
单项选择语句格式如下:
if 条件
语句组
end
当条件成立时,执行语句组,执行完后继续执行end后面的语句,或条件不成立,则直接执行end后面的语句。单项选择程序结构流程图如图3-2所示。
【例】从键盘输入一个值x,判断当x>0时,计算 的值。
程序代码如下:
x=input('x:');
if x>0
y=sqrt(x);
disp(['y=',num2str(y)]);
end
程序运行结果是:
>>
x:2
y=1.4142
再一次运行程序,输入x=-2,程序结果是:
>>
x:-2
由上面程序结果可知,当条件不满足时,就直接执行end后面的语句。
(2)双项选择结构
双项选择语句格式如下:
if 条件1
语句组1
else
语句组2
end
当条件1成立时,执行语句组1,否则执行语句组2,完后继续执行end后面的语句。结构流程图如右图所示。
(2)双项选择结构
【例】从键盘输入一个值x,计算下面分段函数的值,并显示。
![5](C:\Users\Administrator\gitbook\Modeling\images\5.png)x=input('x:');
if x>0
y=2*x+1;
disp(['y=',num2str(y)]);
else
y=-2*x-1
disp(['y=',num2str(y)]);
end
%程序运行结果是:
>>
x:2
y=5
%当输入x=-2:
>>
x:-2
y=3
(3)多项选择结构
if 条件1
语句组1
else if 条件2
语句组2
else if条件m
语句组m
else
语句组n
End
当条件1成立时,执行语句组1,否则当条件2成立时,执行语句组2,以此类推,最后执行end后面的语句。
需要注意,if和end必须配对使用。结构流程图如右图所示。
【例】从键盘输入一个值x,用下面分段函数实现符号函数的功能。 程序代码如下
x=input('x:');
if x>0
y=1;
disp(['y=',num2str(y)]);
elseif x==0
y=0;
disp(['y=',num2str(y)]);
els
y=-1;
disp(['y=',num2str(y)]);
end
程序运行结果是:
>>
x:3
y=1
>>
x:-3
y=-1
>>
x:0
y=0
%若用符号函数sign验证,可以得到同样的结果:
>>sign(3)
ans =
1
>>sign(-3)
ans =
-1
>>sign(0)
ans =
0
2. switch语句
switch 表达式
case表达式1
语句组**1
case 表达式2
语句组**2
…
case 表达式m
语句组**m
otherwise
语句组**n
End
当表达式的值等于表达式m的值时,执行语句组m;当表达式的值不等于case所列表达式的值时,执行语句组n。需要注意,当任意一个case表达式为真,执行完语句组,直接执行end后面的语句。
【例】某商场对顾客所购商品总价打折,折扣率标准如下,从键盘输入顾客所购商品总价,计算打折后总价。
price=input('price:');
num=fix(price/500);
switch num
case 0
rate=0;
case 1
rate=5/100;
case {2,3}
rate=10/100;
case num2cell(4:9)
rate=15/100;
otherwise
rate=20/100;
end
discount_price=price*(1-rate)
format shortg
>>
price:499
discount_price = 499
>>
price:800
discount_price = 760
>>
price:1800
discount_price = 1620
>>
price:4800
discount_price = 4080
>>
price:6000
discount_price = 4800
- num2cell函数的功能是将数值矩阵转换为单元矩阵。
3. try语句
try
语句组1
catch
语句组2
end
try语句先试探执行语句组1,如果语句组1在执行过程中出错,则将错误信息赋值给系统变量lasterr,并转去执行语句组2。
【例】试用try语句,求函数
的值,自变量的范围:
,步长为pi/10。
x=0:pi/10:pi;
try
y=x*sin(x);
catch
y=x.*sin(x);
end
y
lasterr
>>
y =
0 0.0971 0.3693 0.7625 1.1951 1.5708 1.7927 1.7791 1.4773 0.8737 0.0000
ans =
% 错误使用 *
% 内部矩阵维度必须一致。
1.1.3. 循环结构
循环结构是MATLAB语言的一种非常重要的程序结构,是按照给定的条件,重复执行指定的语句。
有循环次数确定的for循环语句和循环次数不确定的while循环语句。
1.for循环语句
for 循环变量=表达式1:表达式2:表达式3
循环体语句
end
注:(1)表达式1为循环变量的初始值, 表达式2为步长,表达式3为终值;
(2)当步长为1时,省略表达式2;
(3)当步长为负值时,初值大于终值;
(4)循环体内不能对循环变量重新设置;
(5)for循环允许嵌套使用;
(6)for和end配套使用,且小写。
【例】利用for循环语句,验证当n等于1000和1000000时,下面式子的值。
n=input('n:');
tic
sum=0;
for i=1:n
sum=sum+(-1)^(i+1)/i;
end
sum
toc
程序运行结果如下:
>>
n:1000000
sum = 0.6931
% 时间已过 0.211798 秒。
MATLAB
是一种基于矩阵的语言,为了提高程序执行速度,也可以用向量的点运算来代替循环操作。
n=input('n:');
tic
i=1:n;
f=(-1).^(i+1)./i;
y=sum(f)
toc
%程序运行结果:
>>
n:1000000
y = 0.6931
% 时间已过 0.059535 秒。
【例】若一个整数等于它的各个真因子之和,则称该数为完数。利用for双重循环语句,求解[1,10000]之间的所有完数。
程序代码如下:
for n=1:10000
sum=0;
for i=1:n/2
if rem(n,i)==0 %rem函数是求余数,余数为0表示i为真因子
sum=sum+i; %求各真因子累加求和
end
end
if n==sum %判断是否完数
n
end
end
程序运行结果如下:
>>
n = 6
n = 28
n = 496
n = 8128
2. while循环语句
while循环语句是MATLAB语言一种重要的程序结构,是在满足条件下重复执行循环体内的语句,循环次数一般是不确定的。
while循环语句的格式如下:
while 条件表达式
循环体语句
end
其中:当条件表达式为真,就执行循环体语句,否则,就结束循环;
while和end匹配使用。
【例】所谓水仙花数是指一个三位数,各位数字之立方和等于该数本身,例如153=1^3+5^3+3^3,所以153是一个水仙数。试用while循环语句编程找出100~999之间所有水仙花数。
程序代码如下:
n=100;
while n<=999;
n1=fix(n/100); %求n的百位数字
n2=fix((n-fix(n/100)*100)/10); %求n的十位数字
n3=n-fix(n/10)*10; %求n的个位数字
if (n1^3+n2^3+n3^3==n)
disp(n);
end
n=n+1;
end
程序运行结果如下:
>>
153
370
371
407
1.1.4. 程序控制命令
MATLAB语言有许多程序控制命令,主要有pause暂停命令、continue继续命令、break中断命令和return退出命令等。
1. pause命令
pause命令可以使程序运行停止,等待用户按任意键继续,也可设定暂停时间。该命令调用格式如下:
pause %程序暂停运行,按任意键继续
pause(n) %程序暂停运行n秒后继续运行
2. continue命令
continue命令一般用于for或while循环语句中,与if语句配套使用,达到跳出本次循环,执行下次循环的目的。
sum=0;
for i=1:5
sum=sum+i;
if i<3
continue %当i<3时,不执行显示sum的值语句
end
sum
end
程序运行结果如下:
sum =
6
sum =
10
sum =
15
- break命令
break命令与if语句配套使用,终止循环,或跳出最内层循环。
- return命令
return命令一般用于直接退出程序,与if语句配套使用。
sum=0;
for i=1:100
sum=sum+i;
if sum>90 %当sum>90时,
break %终止循环
end
end
i
sum
程序运行结果如下:
i = 13
sum = 91
clear
clc
n=-2;
if n<0
disp('n is a negative number')
return; %直接退出程序
end
disp('n is a positive number')
程序运行结果如下:
n is a negative number