-
1 文档
-
2 视频
-
3 PPT
-
4 小测试
同其他计算机语言一样,Matlab提供了通过判断来控制程序流的语句。对于任何功能程序,均可由顺序、循环和选择三种基本结构组合实现。下面分别介绍。
if语句称为条件分支语句。
1.单分支if语句
最简单的选择结构语句,其基本格式为:
if 表达式
语句组
end
说明:表达式多为关系或逻辑表达式。执时该语句时,判断表达式的逻辑性,如果表达式为真(非零),就执行if和end之间的语句组;如果表达式为假(零),就跳过语句组。
2.双分支if语句
Matlab还提供了双分支if语句结构。其基本格式为:
if 表达式
语句组1
else
语句组2
end
说明:执时该语句时,判断表达式的逻辑性,如果表达式为真(非零),则执行语句组1;如果表达式假(为零),则执行语句组2。
3.多分支if语句
当有三个或更多的选择时,可采用if语句的嵌套,也可以采用多分支if语句。其基本格式为:
if 表达式1
语句组1
elseif 表达式2
语句组2
…
elseif 表达式n
语句组n
else
语句组n+1
end
说明:执时该语句时,首先判断表达式1,若为真,则执行语句组1,执行完后,跳出该选择结构,继续执行end 后的语句;当表达式1的值为假时,跳过语句组1,进而判断表达式2,若为真,则执行语句组2,然后继续执行end 后的语句;如果表达式2的值也为假,则跳过语句组2,继续判断表达式3,如此下去,若所有表达式都为假,则执行else后的语句组n+1,再执行end后的语句。else语句可以缺省。
[例2-3]统计数组中奇数与偶数数据的个数。
enum=0; % enum用于保存偶数个数
onum=0; %onum用于保存奇数个数
znum=0; %znum用于保存零的个数
n=fix(rand(1,100)*100);
for i=1:100
if rem(n(i),2)==0 %除以2的余数为0是偶数
enum=enum+1;
elseif rem(n(i),2)==1
onum=onum+1;
else
znum=znum+1;
end
end
switch语句是多分支选择语句。switch语句的基本格式为:
switch 开关表达式
case 情况表达式1
语句组1
case情况表达式2
语句组2
…
case情况表达式n
语句组n
otherwise
语句组n+1
end
说明:
1. 首先计算开关表达式的值,然后将该值与case后的情况表达式进行比较,如果与其中之一相等则执行情况表达式后的语句组,执行完后跳到end,执行end后续语句,不再继续比较。
2. 当开关表达式的值不等于任何一个情况表达式时,程序将执行otherwise后的语句组。
3. 开关表达式只能是标量或字符串,情况表达式可以是标量、字符串或元胞数组,如果情况表达式是元胞数组时,开关表达式与元胞数组中的所有元素比较,只要开关表达式与元胞数组某个元素相等,就执行其后的语句组。
[例2-4] 编写计算学生绩点程序。
for i=1:10 % 产生四个元胞数组,每个元胞数组十个元素。
a{i}=89+i;
b{i}=79+i;
c{i}=69+i;
d{i}=59+i;
end;
x=rand(1,10)*100;y=round(x); % 随机产生10位同学百分成绩
%randint(1,10,[50,99]) % 随机产生10位同学50-99分之间成绩
for i=1:10
switchy(i)
case a
mark(i)=4;
caseb
mark(i)=3;
case c
mark(i)=2;
case d
mark(i)=1;
otherwise
mark(i)=0;
end;
end
disp(y);disp(mark);
while语句是条件循环语句,在条件(多为关系表达式)控制下重复执行,直到条件不成立为止。while循环的一般形式是:
while 表达式
语句组
end
说明:先计算表达式的值,如果非零,语句组就执行一次;执行完毕再次计算表达式的值,如果仍然非零,语句组就再执行一次;如此循环,直到表达式的值为零。如果表达式的值总是非零,该循环将永远进行(即死循环),程序设计时一定要避免。
[例2-5] 已知
,求n大于多少时,级数和与
差值小于0.01。
ssum=0; %存放结果
n=1; %记录次数
while abs(ssum-pi*pi/8)>0.01
ssum=ssum+1./((2*n-1).^2)
n=n+1;
end
disp(n)
[例2-6] 角谷猜想,输入任意整数n,若它是偶数,则用2除,若是奇数,则乘3再加1,按此法则重复运算,最终结果是1,编写函数实现。
function c=collatz(n)
%角谷猜想
c=n;
while n>1
ifrem(n,2)==0
n=n/2;
else
n=3*n+1;
end
c=[cn];
end
在命令窗口调用函数,结果如下。
>> collatz(13)
ans =
13 40 20 10 5 16 8 4 2 1
for语句为指定次数的循环语句,通常情况下,循环条件是有规律变化的,通常把循环条件初值、终值和变化步长放在循环语句的开头,这种形式就是for语句的循环结构。for循环的一般形式是:
for 循环变量名=表达式1:表达式2:表达式3
语句体
end
说明:
1. 其中表达式1的值是循环变量的初值,表达式2的值是循环步长,表达式3的值是循环变量的终值。
2. 不能通过在循环体内给循环变量重新赋值来终止for循环。
m=0;
for n=1:7
x(n)=sin(n*pi/10);
n=5;
m=m+1;
end
运行结束m结果等于7,说明语句“n=5;”并不影响循环变量的值。
3. for语句被执行之前,预先为诸如输出变量等分配内存空间,可以提高程序运行效率。
x=zeros(1,10)
for n=1:10
x(n)=sin(n*pi/10);
end
disp(x)
4. 当有一个等效数组方法能解决给定问题,应避免用for循环。
n=1:10;
x(n)=sin(n*pi/10)
5. for循环可以接收数组。
sum=zeros(3,1);
for n=magic(3)
sum=sum+n;
end;
6. 循环可以嵌套,任一种循环语句的循环体部分都可以包含另一个循环语句,多重循环嵌套的层数可以是任意的。处于内部的循环叫做内循环,处于外部的循环叫做外循环。在设计多重循环时,要特别注意内、外循环之间的关系,以及语句放置次序,不要搞错。
for m=1:3
forn=1:4
a(m,n)=m*n;
end
end
[例2-7]计算1-100中所有素数的和。
clear;close all;
sum=2;
ss=0; % 标记,没有被整除
l=[2]; %变量l用于存放素数
for n=3:100
for m=2:fix(sqrt(n))
if rem(n,m)==0
ss=1;
break;
else
ss=0;
end
end
if ss==1
continue;
else
sum=sum+n;
l=[l n];
end
end
disp('素数和'),disp(sum)
disp('素数是'),disp(l)
1. continue语句
continue语句用于控制for循环或while循环跳过某些执行语句,当出现continue语句时,则跳过循环体中所有剩余的语句,继续下一次循环,即结束本次循环。
2. break语句
break语句用于终止for循环或while循环的执行。在循环体内遇到break语句时,则退出循环体,继续执行循环体外的下一个语句,即终止循环。在嵌套循环中,break往往存在于内层的循环中。
3. try语句
Matlab提供了try语句,这是一种试探性执行语句。语句格式为:
try
语句组1
catch
语句组2
end
说明:先试探性执行语句组1,如果语句组1在执行过程中出现错误,则将错误信息赋给lasterr变量,并转去执行语句组2。这种试探性执行语句是其他高级语言所没有的。例如执行如下命令。
try
x
catch
x=100
end
如果原工作空间中不存在x变量,错误提示信息将保存在lasterr中,并执行catch后语句,产生x变量,赋值为100。在提示符>>后输入lasterr,显示结果如下:
>> lasterr
ans =
未定义函数或变量 'x'。
当内存中有x变量时,再执行上面的try-catch-end语句,不会产生新的lasterr,也不会改变原来x的值。
4. input语句
input是输入语句,其语句格式为:
result = input(prompt)
str = input(prompt,'s')
说明:该语句执行时,“控制权”交给键盘,待输入结束,按回车键,“控制权”交还给Matlab。
prompt是提示用的字符串,第一种格式用于键入数值、字符串等数据;第二种格式不管键入什么总以字符串的形式赋给变量str。例如:
>>x=input('please input a number:')
please input a number:
光标停留在冒号后,等待用户输入数据,回车后,数据赋给x。如果未输入任何字符,按回车键,则返回一个空矩阵。又例如:
>> x=input('please input a string:\n','s')
please input a string:
'\n'字符串代表换行,光标将出现在“please input a string:”的下一行开头,即使此时输入的是数值,x也是“char”类型。
5. disp语句
disp是输出语句,其语句格式为:
disp(变量名)
例如:
>> disp(23+454-29*15);disp(1:10)
42
1 2 3 4 5 6 7 8 9 10
>> disp('this is astring')
this is a string
6. keyboard语句
此语句停止文件的执行并将控制权交给键盘,此时命令窗口的提示符变成“K>>”,用户可以从键盘输入各种Matlab命令,仅当用户输入return语句,“控制权”才交还给程序。
7. pause语句
此语句用来暂时停止程序运行。其常用格式如下:
pause
pause(n)
pause on
pause off
说明:(1)pause暂时停止程序执行,按任意键继续;(2)pause(n),表示暂停n秒后继续执行程序;(3)pause on表示允许后续的pause、pause(n)语句执行,pause off表示禁止后续的pause、pause(n)语句执行,一般程序调试时,设置pause on,而程序调试成功后,设置为pause off。
8. return语句
return语句使所在函数结束执行,返回调用它的代码段,否则只有待整个被调用文件执行完后,才会转出。
下面应用控制结构语句再举几例。
[例2-8]利用二分法编程实现求
在区间[0,3]上的根。
a=0;
fa=-1;
b=3;
fb=1;
while b-a>eps*b
x=(a+b)/2;
fx=x^3-2*x-5;
if sign(fx)==sign(fa)
a=x;fa=fx;
else
b=x;fb=fx;
end
end
disp(x)
[例2-9] 如果一个n位正整数恰好等于它的n位上数字的n次方之和,则称该数是n位自方幂数,其中,三位自方幂数又称水仙花数,四位自方幂数又称玫瑰花数。求1000以内的水仙花数。
h=0;t=0;b=0;
for n=100:999
h=floor(n/100);
t=floor((n-100*h)/10);
b=n-100*h-10*t;
ifn==h^3+t^3+b^3
disp(n);
end
end
从程序运行结果可知,水仙花数有153,370,371,407。同法可求玫瑰花数。
[例2-10] 编写递归函数输出斐波那契数列,f(2)=1,f(3)=2,当n>2时,
。
function f=dgdg(n)
if n==2
f=1; return;
end
if n==3
f=2; return;
end;
f=dgdg(n-1)+dgdg(n-2);
递归算法是一种直接或者间接地调用自身算法的过程。在计算机编写程序中,递归算法对解决一大类问题是十分有效的,它往往使算法的描述简洁而且易于理解。在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口,递归算法解题通常显得很简洁,但递归算法解题的运行效率较低,递归次数过多容易造成栈溢出,所以一般不提倡用递归算法设计程序。
[例2-11] 冒泡法排序
function result=maopao(a)
n=length(a);
for i=1:n
swap=0;
for j=1:n-1
if a(j)>a(j+1)
temp=a(j);
a(j)=a(j+1);
a(j+1)=temp;
swap=1;
end
end
if (~swap)
break;
end
end
result=a;

