《MATLAB基础及应用》课件 第3章 流程控制语句_第1页
《MATLAB基础及应用》课件 第3章 流程控制语句_第2页
《MATLAB基础及应用》课件 第3章 流程控制语句_第3页
《MATLAB基础及应用》课件 第3章 流程控制语句_第4页
《MATLAB基础及应用》课件 第3章 流程控制语句_第5页
已阅读5页,还剩55页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

MATLAB基础及应用曹敦虔编著第3章流程控制语句本章学习重点掌握内容:MATLAB分支语句MATLAB循环语句MATLAB函数MATLAB程序运行计时与优化第3章流程控制语句3.1if语句3.2switch语句3.3while语句3.4for语句3.5函数3.6程序运行计时3.7养成良好的编程习惯3.1if语句分支结构也称选择结构.有时程序需要根据一定的条件来决定执行哪些指令,这就需要用到分支结构.MATLAB有两个分支语句:if语句和switch语句.if语句功能全面,不管是简单的还是复杂的分支流程,if语句都能实现,所以应用最为广泛.3.1if语句if语句的语法格式1:if

(条件表达式)

语句组end此格式用于实现单分支语句.如果条件表达式为true,则执行语句组;否则不执行.false条件表达式语句组true单分支语句流程图3.1if语句例3.1输入一个日期,求该日期是当年的第几天.基本思路:假设年、月、日分别为y、m、d,首先计算该日期的前几个月的总天数,即1月,2月,⋯,m−1月的天数之和,再加上d即可.2月的天数与当年是否是闰年有关,若是闰年则为29天,若不是闰年则为28天.3.1if语句monthdays=[312831303130313130313031];date=input('请输入日期(格式[年月日]):');if(mod(date(1),4)==0&&mod(date(1),100)~=0||mod(date(1),400)==0)monthdays(2)=29;%闰年2月份天数为29enddays=sum(monthdays(1:date(2)-1))+date(3);disp(['是当年第',num2str(days),'天']);3.1if语句if语句的语法格式2:if

(条件表达式)

语句组1else

语句组2end格式2用于实现二分支语句.如果条件表达式为true,则执行语句组1;否则执行语句组2.truefalse语句组2语句组1条件表达式二分支语句流程图3.1if语句例3.2输入一个数,如果该数大于等于0,则输出1,否则输出−1.x=input('请输入一个数:');if(x>=0)y=1;elsey=-1;endy3.1if语句if语句的语法格式3:if

(条件表达式1)

语句组1elseif(条件表达式2)

语句组2⋯else

语句组end格式3用于实现多分支语句.如果条件表达式1为true,则执行语句组1;否则判断条件表达式2,如果为true,则执行语句组2;依次判断各个elseif后面的条件表达式,如果为true,则执行对应的语句组;如果所有的条件表达式都为false,则执行else后面的语句组.3.1if语句条件表达式1truefalse语句组2语句组1条件表达式2语句组n条件表达式n其他语句组⋯truetruefalsefalse多分支语句流程图3.1if语句例3.3使用if语句实现输入一个分数,按分数输出其等级.x=input('请输入一个分数:');if(x>=90)y='优';elseif(x>=80)y='良';elseif(x>=70)

y='中';elseif(x>=60)y='及格';elsey='不及格';enddisp(y);3.1if语句在if语句中,如果条件表达式的值是一个数组,则只有当数组的所有元素的值都为true时,该条件才算为true,否则只要有其中一个元素为false,则该条件为false.x=[1,5,8];if(x>=5)%x>=5的结果是[0,1,1]y=1;elsey=0;endyy=03.2switch语句switch语句适合应用于等待判断的变量只取少数可能的值的情况,不同的取值执行不同的流程.3.2switch语句switch语句的语法格式:switch(表达式)

case

常量1

语句组1

case

常量2

语句组2...

otherwise

其它语句组end执行过程:计算表达式的值,按顺序依次判断表达式的值与case后面的常量是否相等,如果相等,则执行相应的语句组.如果都不相等,则执行otherwise后面的语句,其执行过程与多分支的if语句类似.一般来说,由于要判断表达式是否与某个常量相等,所以switch只适合用在表达式的值为整数、字符等离散值的情况.3.2switch语句例3.4使用switch语句实现输入一个分数,按分数输出其等级.基本思路:由于switch语句只能判断有限种情形,所以不能直接使用原始分数来判断,这里先将百分制分数变成十分制,分值为0,1,⋯,10共11种情形,然后再进行判断.3.2switch语句x=input('请输入一个分数(百分制):');switch(floor(x/10))%将百分制转换成十分制

case10y='优';

case9y='优';

case8y='良';

case7y='中';

case6y='及格';

otherwisey='不及格';enddisp(y);3.3while语句当某些运算需要重复多次执行时,可以使用循环结构来实现.使用循环可以简化程序,提高效率.MATLAB的循环语句有两个,while语句和for语句.while语句适合用在循环次数事先无法确定,需要根据某个条件是否成立来决定还要不要继续执行循环体的情形.while循环也称为当型循环.3.3while语句while语句的语法格式:while(条件表达式)

语句组end执行过程:当条件表达式为true时,执行语句组,结束后又判断条件表达式是否为true,如果为true,则执行语句组.重复这个过程,直到条件表达式为false时结束条件表达式语句组falsetrue3.3while语句例3.5输入两个正整数,求其最大公约数.基本思路:求两个数m和n的最大公约数可以用“辗转相除法”,方法如下:(1)如下m<n,则交换m和n的值;(2)计算m除以n的余数,记为r;(3)令m=n,n=r;(4)如果r=0,则m为最大公约数,结束.否则转到(2).3.3while语句x=input('请输入两个正整数(格式[x,y]):');if(x(1)<x(2))%如果x(1)<x(2)则交换x(1)和x(2)x([12])=x([21]);end%使用辗转相除法计算最大公约数r=1;while(r~=0)r=mod(x(1),x(2));x(1)=x(2);x(2)=r;enddisp(['最大公约数是',num2str(x(1))]);3.4for语句for语句是遍历型循环,类似于C#中的foreach语句.语法格式:for

循环变量

=数组

语句组end执行过程:如果数组是一个一维数组,则循环变量依次取数组中的每一个元素,每取一个就执行一次语句组.总执行次数就是数组元素个数.如果数组是一个二维数组,则循环变量依次取数组中的每一列,每取一列就执行一次语句组.总执行次数就是数组的列数.3.4for语句例3.6输入一个正整数n,输出其所有因子.基本思路:依次判断1,2,⋯,n,如果是n的因子,则输出.n=input('请输入一个正整数:');f=[];fori=1:n

if(mod(n,i)==0)f=[fi];

endenddisp([num2str(n),'的因子为',num2str(f)]);3.4for语句

3.4for语句x=input('请输入一个正整数:');f=true;if(x<=1||x~=2&&mod(x,2)==0)%1、2以及2的倍数单独处理

f=false;endfori=3:2:floor(sqrt(x))

if(mod(x,i)==0)f=false;

endendif(f)disp([num2str(x),'是素数']);elsedisp([num2str(x),'不是素数']);end3.4for语句例3.8求2~n之间的所有素数.方法一,对2~n之间的每一个整数依次使用上面的方法进行判断,如果是素数,则输出.3.4for语句n=input('请输入一个正整数:');y=[];forx=1:nf=true;

if(x<=1||x~=2&&mod(x,2)==0)f=false;

end

fori=3:2:floor(sqrt(x))

if(mod(x,i)==0)f=false;

end

end

if(f)y=[y,x];

endendy

综合应用实例综合应用实例n=input('请输入一个正整数:');y=2:n;

%y是待判断的整数i=1;N=floor(sqrt(n));while(y(i)<=N)b=false(size(y));%生成一个与y同维的全false数组

%使用y(i)来筛除所有y(i)的倍数

forj=i+1:length(y)

if(mod(y(j),y(i))==0)b(j)=true;%如果y(j)是y(i)的倍数,则设置b(j)=1

end

endy(b)=[];%将不是素数的整数从y中删除

i=i+1;endy综合应用实例值得一提的是,MATLAB有很多本身具有“循环”功能的运算符和函数,很多循环语句可以使用这些运算符和函数来代替,代码非常简洁,并且运算速度更快.例如:计算1+2+3+⋯+100,如果使用循环语句来实现,程序如下:s=0;fori=1:100s=s+i;end下面的代码也可以实现同样的功能:s=sum(1:100);综合应用实例

t=linspace(0,2*pi);plot(cos(t),sin(t));%画圆axis([-11-11]);%设置显示范围axisequal

%设置坐标比例为等比例holdonn=200;%总投点数m=0;fori=1:nx=2*rand(1)-1;%随机点x坐标

y=2*rand(1)-1;%随机点y坐标

if(x*x+y*y<1)%如果随机点在圆内

m=m+1;%计数器增1plot(x,y,'b.');

elseplot(x,y,'r.');

endendholdoffS=4*m/n%计算面积程序一:t=linspace(0,2*pi);plot(cos(t),sin(t));axis([-11-11]);axisequal;holdon;n=200;x=2*rand(n,1)-1;%生成n个随机x坐标y=2*rand(n,1)-1;%生成n个随机y坐标c=x.*x+y.*y<1;%根据坐标生成0-1数组,在圆内的点对应1,圆外的点对应0m=sum(c);%统计1的个数,即落在圆内的点数plot(x(c),y(c),'b.',x(~c),y(~c),'r.');holdoffS=4*m/n程序二:综合应用实例例3.10如图所示,多圆体是由多个圆组成的一个复合体,多个圆可能重叠,其周长是各圆露在外面部分的弧长之和.假设已知多圆体中各圆的中心坐标和半径,求该多圆体的周长.

x=[1231.52.4];%圆心x坐标y=[011.232.5];%圆心y坐标r=[24351];%圆的半径%画圆t=0:0.1:2*pi;fori=1:length(x)u=x(i)+r(i)*cos(t);v=y(i)+r(i)*sin(t);

%圆周上的点plot(u,v);holdonenda=cumsum(r);%对圆的半径进行累加a=a/a(end);

%归一化,构造轮盘赌选择的刻度m=0;%初始化计算器n=1000;%总投点数fori=1:nq=find(rand(1)<a,1);%随机选择一个圆

theta=2*pi*rand(1);%产生一随机数

u=x(q)+r(q)*cos(theta);v=y(q)+r(q)*sin(theta);

b=(u-x).^2+(v-y).^2<r.^2;b(q)=false;

if(any(b))%判断随机点是否在某个圆内

plot(u,v,'go');

elsem=m+1;plot(u,v,'ro');

endendm*sum(2*pi*r)/naxisequal;holdoff;3.5函数函数是一段相对封闭独立的程序段,用于完成一个特定的功能.函数有输入(函数参数)和输出(返回值),在调用函数时,只需要知道函数名(或函数句柄)、函数参数以及返回值即可,不需要知道其内部结构.使用函数可以大大提高代码的可重用性,只需要定义一次,就可以多次调用.MATALB的大部分内置功能和工具箱都是以函数的形式存在的.MATLAB有两种函数定义方式:匿名函数和M函数.匿名函数是一种临时函数,一般在其定义的后面进行调用;M函数是以文件的形式存储在磁盘文件中,只要存放在搜索路径下或当前文件夹下,所有程序都可调用.3.5函数1.匿名函数语法格式:函数句柄

=@(参数表)函数表达式匿名函数是一种轻量级的函数,方便快捷,适合用于函数体简单,能够用一个表达式表示的函数.一般是在需要使用它的时候定义,也只在该程序内使用,不在多个程序之间共享.由于匿名函数没有函数名,所以只能使用函数句柄来调用.3.5函数例3.11绘制函数y=xsin(x),x∈[−10,10]的图形.f=@(x)x.*sin(x);%定义匿名函数x=linspace(-10,10);%对区间进行均匀剖分y=f(x);%对每一个分点,计算函数值plot(x,y);%根据数据点(x,y)画图y=xsin(x)的图形3.5函数2.M函数M函数是定义在独立M文件中的函数,与一般的M程序文件不同的是,M函数以关键字function开始,有输入参数和函数值(返回值).M函数的函数名必需与文件名相同,并符合变量名命名规则.语法格式:function[函数值列表]=函数名(形式参数列表)函数体end3.5函数例3.12使用M函数定义f(x)=xsin(x).在编辑器中输入下面程序,并保存为f.m.定义好f(x)后就可以在命令行或其它程序使用该函数了.functiony=f(x)y=x.*sin(x);end3.5函数说明:M函数通常用于实现一个相对完整的功能.当遇到return语句或最后一条语句时,M函数的执行过程结束,此时函数值列表中的变量取值就是函数值(返回值).值得注意的是,MATLAB允许有多个函数值.M函数属于共享函数,一旦定义好了,所有程序都可以调用.但要求M函数文件存放在MATLAB的工作目录下,或者在MATLAB搜索路径下.M函数具有独立的内部工作空间,函数外部的程序代码是无法访问函数内部的变量的,M函数与外部交换数据一般是通过函数参数(输入)和函数值(输出)来进行.也可以使用全局变量在M函数和外部代码之间共享数据.相比M程序文件,使用M函数可以在一定程度上提高程序的运行效率.MATLAB在执行一般的M程序文件时,每次执行都会重新加载到内存,这部分的开销比较大.而如果是M函数,多次调用时只需要加载一次即可.3.5函数

functiony=myPiecewise1(x)%分段函数%x标量,自变量%y标量,与x对应的函数值if(x<=0)y=0;elseif(x<=1)y=2*x;elsey=2;endend3.5函数上面的函数只能接受标量作为参数,也就是说一次只能计算一个函数值,这与MATLAB的数组运算习惯不相符,为此修改如下:functiony=myPiecewise2(x)%分段函数%x数组,自变量%y数组,与x对应的函数值y=zeros(size(x));fori=1:numel(x)

if(x(i)>0&&x(i)<=1)y(i)=2*x(i);

elseif(x(i)>1)y(i)=2;

endendend3.5函数也可以使用向量化运算来实现这个过程,这种方式更加符合MATLAB的习惯.这种方式的一般格式是:(条件1).*(表达式1)+(条件2).*(表达式2)+⋯+(条件n).*(表达式n)functiony=myPiecewise3(x)%分段函数%x数组,自变量%y数组,与x对应的函数值y=(0<x&x<=1).*(2*x)+(1<x).*2;3.5函数函数直接或间接调用函数本身,则称该函数为递归函数。如果一个问题可以通过求解该问题的更小规模问题来求解,那么这个问题就可以使用递归法来求解.例如要求解an,可以通过求解an−1,an−2,⋯来求解,那么这个问题就可以使用递归法来求解.如果只使用an−1则称为单递归,如果使用了an−1和an−2则称为双递归,以此类推.递归法可以通过递归函数来实现.3.5函数例3.14使用递归法求两个数的最大公约数.functiona=gcd(a,b)if(a<b)t=a;a=b;b=t;endif(b~=0)a=gcd(b,mod(a,b));%调用函数自身end3.5函数

functionf=fibnacci(n)%递归法求斐波那契数列%n整数%f斐波那契数列的第n项if(n<=2)f=1;elsef=fibnacci(n-1)+fibnacci(n-2);%递归end3.5函数例3.16汉诺塔问题.相传在古印度圣庙中,有一种被称为汉诺塔(Hanoi)的游戏.该游戏是在一块铜板装置上,有三根杆(编号A、B、C),在A杆自下而上、由大到小按顺序放置n(n≥3)个金盘.游戏的目标:把A杆上的金盘全部移到C杆上,并仍保持原有顺序叠好.操作规则:每次只能移动一个盘子,并且在移动过程中三根杆上都始终保持大盘在下,小盘在上,操作过程中盘子可以置于A、B、C任一杆上.这个问题使用递归法求解.算法描述为:以C盘为中介,从A杆将1至n−1号盘移至B杆;将A杆中剩下的第n号盘移至C杆;以A杆为中介;从B杆将1至n−1号盘移至C杆.3.5函数functionhanoi(n,A,B,C)%求解汉诺塔问题%n盘子个数%A盘子原来所在的柱子%B中介柱子%C目标柱子if(n==1)disp([A,'-->',C]);elsehanoi(n-1,A,C,B);disp([A,'-->',C]);hanoi(n-1,B,A,C);end3.5函数值得一提的是,虽然递归函数比较简单,但是其运行效率是比较低的,尤其是出现多递归的时候,效率显著降低.如果存在非递归方式能够实现,建议尽量采用非递归方式.

例如,非递归的求fibnacci数列的函数如下:functionf=fibnacci2(n)%求斐波那契数列的非递归实现%n整数%f斐波那契数列的第n项if(n<=2)f=1;elsef1=1;f2=1;

fori=3:nf=f1+f2;f1=f2;f2=f;%更新

endend3.5函数MATLAB允许在调用M函数时实际参数少于形式参数,并在M函数内部使用nargin来获取实际参数个数,然后根据实参个数做相应处理,常用于为函数参数提供默认值.还可以使用nargout获取实际输出参数个数,以便针对不同的调用方式返回不同的结果.另外,借助varargin、varargout还可以更灵活地处理参数和返回值.3.5函数例3.18定义函数,对区间[a,b]进行n等分,默认a=0,b=1,n=50.functionx=IntervalDivision(a,b,n)%对区间[a,b]进行n等分%[a,b]待划分的区间%n等分数%x等分点if(nargin<1),a=0;end

%当实际参数少于1个时,置a=0if(nargin<2),b=1;end

%当实际参数少于2个时,置b=0if(nargin<3),n=50;end%当实际参数少于3个时,置n=50h=(b-a)/n;%小区间宽度x=a:h:b;%生成等分点,共有n+1个分点,与linspace(a,b,n+1)等价3.6程序运行计时在编写程序时,经常要分析一段代码的运行时间,比较程序的多种实现方式,以提高代码质量.如何计算一段代码的运行时间呢?MATLAB提供了多种计时方式,使用tic、toc命令;使用cputime命令;使用etime、clock命令;使用探查器.3.6程序运行计时tic和toc函数协同工作以测量经过的时间.tic开始计时,而toc结束计时,并保存

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论