MATLAB程序的流程控制.ppt
复习:复习:Matlab 编程编程q Matlab 编程简介u Matlab 作为一种广泛应用于科学计算的工具软件,不仅具有强大的数值计算、符号计算、矩阵运算能力和丰富的绘图功能,同时也具有和 C、FORTRAN 等高级语言一样进行程序设计。u 在 Matlab 程序设计中,要充分利用 Matlab 数据结构的特点,提高编程效率。u 利用 Matlab 的程序控制功能,可以将有关 Matlab 命令编成程序存储在一个文件中(M 文件),然后在命令窗口中运行该文件,Matlab 就会自动依次执行文件中的命令,直到全部命令执行完毕。q 用 Matlab 语言编写的程序称为 M 文件。q M 文件是由若干 Matlab 命令组合在一起构成的,它可以完成某些操作,也可以实现某种算法。事实上,Matlab 提供的内部函数以及各种工具箱,都是利用 Matlab 语言开发的 M 文件。用户也可以结合自己的工作需要,开发自己的程序或工具箱。q M 文件根据调用方式的不同可以分为两类:u Script:脚本文件/命令文件 u Function:函数文件 M 文件文件q M 文件以.m 为扩展名。q M 文件是一个文本文件,可以用任何文本编辑器来建立和编辑,通常使用 Matlab 自带的 M 文件编辑器。M 文件的建立与打开文件的建立与打开q 新建一个 M 文件u 菜单操作(File New M-File)u 命令操作(edit M 文件名)u 命令按钮(快捷键)q 打开已有的 M 文件u 菜单操作 (File Open)u 命令操作(edit M 文件名)u 命令按钮 (快捷键)u 双击 M 文件 u 在命令窗口中输入 f2cs,即可执行该 M 文件。例:编写一个命令文件将华氏温度转化为摄氏温度命令文件举例命令文件举例clear;%清除当前工作空间中的变量f=input(Please input Fahrenheit temperature:);c=5*(f-32)/9;fprintf(The centigrade temperature is%gn,c);u 新建一个 M 文件 f2cs.m,内容如下:命令文件运行后,文件中所产生的所有变量都驻所有变量都驻留在留在 Matlab 当前工作空间当前工作空间,可以用 whos 查看。function 输出形参列表输出形参列表=函数名函数名(输入形参列表输入形参列表)%注释说明部分注释说明部分(可选可选)函数体语句函数体语句(必须必须)u 第一行为第一行为引导行引导行,表示该,表示该 M文件是函数文件文件是函数文件u 函数名的命名规则与变量名相同函数名的命名规则与变量名相同(必须以字母开头必须以字母开头)u 当当输出形参输出形参多于一个时,用多于一个时,用方括号方括号括起来括起来u 函数必须是一个函数必须是一个单独的单独的 M文件文件u 函数函数文件名必须与函数名一致文件名必须与函数名一致u 以以百分号百分号开始的语句为开始的语句为注释语句注释语句函数文件函数文件q 函数文件由函数文件由 function 语句引导语句引导例例1 编写函数文件求半径为编写函数文件求半径为r的圆的面积和周长。的圆的面积和周长。函数文件如下:函数文件如下:function s,p=fcircle(r)%calculate the area and perimeter of a circle of radii r%r,s,p分别为圆的半径、面积以及周长分别为圆的半径、面积以及周长s=pi*r*r;p=2*pi*r;q 函数调用的一般格式函数调用的一般格式输出实参列表输出实参列表=函数名函数名(输入实参列表输入实参列表)u 函数调用时,函数调用时,实参的顺序实参的顺序应与函数定义时的应与函数定义时的形参的顺形参的顺序序一致。一致。u 函数可以函数可以嵌套调用嵌套调用,即一个函数可以被其它函数调用,即一个函数可以被其它函数调用,甚至可以被它自身调用,此时称为甚至可以被它自身调用,此时称为递归调用递归调用。u 函数所传递的参数具有可调性,函数所传递的参数具有可调性,Matlab 用两个永久变用两个永久变量量 nargin 和和 nargout 分别记录调用该函数时的输入实分别记录调用该函数时的输入实参和输出实参的个数。参和输出实参的个数。函数调用函数调用q 程序控制结构有三种:程序控制结构有三种:顺序结构顺序结构、选择结构选择结构和和循循环结构环结构。任何复杂的程序都由这三种基本结构组成。任何复杂的程序都由这三种基本结构组成.u 顺序结构顺序结构M文件程序的流程控制文件程序的流程控制l 按排列顺序依次执行各条语句,直到程序的最后。l 这是最简单的一种程序结构,一般涉及数据的输入输出、数据的计算或处理等。例例:A=input(Please input A:)u 数据的输入:inputA=input(提示信息提示信息)l 其中 提示信息 为字符串,l 该命令要求用户输入 A 的值(可以是数或字符串)数据输入数据输入 inputA=input(提示信息提示信息,s)注:注:此时输入的字符串不要加单引号!l 如果是输入字符串,也可以使用下面的方法name=input(Whats your name?,s)例例:disp(X)输出变量 X 的值的值,可以是数值矩阵或字符串 B=1 2 3;4 5 6;7 8 9;disp(B)数据输出数据输出 dispu 数据的输出:disp A=Hello,Tom!;disp(A)例例:例例 求一元二次方程求一元二次方程ax2+bx+c=0的根。的根。程序如下程序如下:function x=myfun3(a,b,c)a=input(请输入系数请输入系数a:);b=input(请输入系数请输入系数b:);c=input(请输入系数请输入系数c:);d=b*b-4*a*c;x=(-b+sqrt(d)/(2*a),(-b-sqrt(d)/(2*a);disp(x1=,num2str(x(1),x2=,num2str(x(2);数据输出数据输出 fprintffprintf(fid,format,variables)按指定的格式将变量的值输出到指定的文件u 数据的输出:fprintfl fid 为文件句柄,若缺省,则将变量的值输出到屏幕上l format 用来指定数据输出时采用的格式,常见的有%d(整数整数)%e(实数:采用科学计数法形式实数:采用科学计数法形式)%f(实数:采用浮点数形式实数:采用浮点数形式)%g(由系统自动选取上述两种格式之一由系统自动选取上述两种格式之一)%s(输出字符串输出字符串)l format 中还可以使用一些特殊格式,如:n(换行换行)t(制表符制表符)b(退格退格)(反斜杆反斜杆)%(百分号百分号)数据输出数据输出 fprintf a=Hello;b=2.4;c=100*pi;fprintf(a=%s,b=%f,c=%en,a,b,c)例例:l format 中的输出格式要与输出变量一一对应l 可以没有输出变量 fprintf(Today is Mondayn)例例:选择结构选择结构 是根据给定的条件成立或不成立,分别执行不同的语句。Matlab 用于实现选择结构的语句有 if 语句和 switch 语句。选择结构选择结构l 单分支结构if expression(条件)条件)statements(语句组)语句组)endif 条件语句条件语句if expression(条件)条件)statements1(语句组语句组1)else statements2(语句组语句组2)endl 双分支结构if expression1(条件1)statements1(语句组1)elseif expression2(条件2)statements2(语句组2).elseif expressionm(条件m)statementsm(语句组m)else statements(语句组)endl 多分支结构if 条件语句条件语句n例:编写函数,计算例:编写函数,计算nfunction y=myfun4(x)nn=length(x);nfor i=1:nnif x(i)1 y(i)=x(i)2;nelseif x(i)-1 y(i)=1;nelse y(i)=3+2*x(i);nendnendl 根据表达式的不同取值,分别执行不同的语句。switch expression(表达式)表达式)case value1(表达式表达式1)statement1(语句组语句组1)case value2(表达式表达式2)statement2(语句组语句组2).case valuem(表达式表达式m)statementm(语句组语句组m)otherwise statement(语句组)语句组)endswitch 语句语句l Matlab 首先计算 expression 的值,然后将它依次与各个 case 指令后的检测值进行比较,当比较结果为真时,就执行相应的语句组,然后跳出 switch 结构。l switch 后面的表达式 expression 的值可以是一个标量或字符串。switch 语句语句l otherwise 指令可以不出现。l 如果所有的比较结果都为假,则执行 otherwise 后面的语句组,然后跳出 switch 结构。n例例 某商场对顾客所购买的商品实行打折销售,标准如下某商场对顾客所购买的商品实行打折销售,标准如下(商品价格用商品价格用price来表示来表示):n price200 没有折扣没有折扣n 200price500 3%折扣折扣n 500price1000 5%折扣折扣n 1000price2500 8%折扣折扣n 2500price10000为止为止.fnum(1)=1;fnum(2)=1;i=2;while fnum(i)0)sum mean=sum/cntendu break 和 continuel break 语句用于终止循环的执行,即跳出最内层循环 l continue 语句用于结束本次循环,进行下一次循环 l break 和 continue 一般与 if 语句配合使用其它流控制语句其它流控制语句u returnl return 语句用于退出正在运行的脚本或函数,通常用在函数文件中。程序如下:程序如下:for n=100:200if rem(n,21)=0 continueendbreak;End;n%n/21的余数不等于的余数不等于0则则继续下一次循环继续下一次循环,即即for循环循环:n继续加继续加1,直到余数直到余数等于零等于零,跳出跳出continue循环体循环体例例 求求100,200之间之间第一个第一个能被能被21整除的整数。整除的整数。n=105%函数文件函数文件 myfun5.mfunction f=myfun5(n)if(n=1)f=1;else f=n*myfun5(n-1);end%main.m%计算计算 s=1!+2!+3!+4!+5!%clear;s=0;for i=1:5 s=s+myfactor(i);endfprintf(s=%g n,s)例:利用函数的递归调用计算例:利用函数的递归调用计算 n!递归函数举例递归函数举例 函数所传递的参数具有可调性,函数所传递的参数具有可调性,Matlab 用两个永久变量用两个永久变量 nargin 和和 nargout 分别记录调用该函数时的输入实参分别记录调用该函数时的输入实参和输出实参的个数。和输出实参的个数。参数的可调性举例参数的可调性举例function out=ex4argin(a,b)if(nargin=1)out=a;elseif(nargin=2)out=a*b;endfunction p,q=ex4argout(a,b)if(nargout=1)p=a+b;elseif(nargout=2)p=a+b;q=a-b;endq 函数通过函数通过输入和输出参数输入和输出参数与其它与其它 M 文件进行数据传递。文件进行数据传递。q 当函数调用完毕后,该函数文件中定义的所有局部变量当函数调用完毕后,该函数文件中定义的所有局部变量都将被释放,即都将被释放,即全部被清除全部被清除。q 如果在若干个如果在若干个 M文件中,文件中,都把某个变量定义为全局变量都把某个变量定义为全局变量,则这些函数将公共使用这一变量则这些函数将公共使用这一变量。所有函数都可以对它进所有函数都可以对它进行存取和修改操作。行存取和修改操作。q 函数文件中的变量都是函数文件中的变量都是局部局部的,即一个函数文件中定义的,即一个函数文件中定义的变量不能被另一个函数文件或其它的变量不能被另一个函数文件或其它 M 文件使用。文件使用。全局变量与局部变量全局变量与局部变量q 定义全局变量是定义全局变量是 M文件间传递信息的一种手段。文件间传递信息的一种手段。l 变量名列表中的各个变量变量名列表中的各个变量用空格隔开用空格隔开,不能用逗号!,不能用逗号!全局变量给函数间的数据传递带来了方便,但却破坏全局变量给函数间的数据传递带来了方便,但却破坏了函数对变量的封装,降低了程序的可读性,因而了函数对变量的封装,降低了程序的可读性,因而在在结构化程序设计中,全局变量是不受欢迎的结构化程序设计中,全局变量是不受欢迎的。特别是。特别是当程序较大,子程序较多时,全局变量将个程序调试当程序较大,子程序较多时,全局变量将个程序调试和维护带来不便,故不提倡使用全局变量。和维护带来不便,故不提倡使用全局变量。global 变量名列表变量名列表全局变量的定义全局变量的定义l 在使用全局变量的所有在使用全局变量的所有M文件中,都要对其所使用的全文件中,都要对其所使用的全局变量进行定义。局变量进行定义。程序示例程序示例%ex4global.mclear;global a ba=1;b=3;y=mysquaresum(a,b);fprintf(a=%g,b=%g n,a,b);z=myproduct(a,b);fprintf(a=%g,b=%gn,a,b);%mysquaresum.mfunction square_sum=mysquaresum(x,y)square_sum=x2+y2;a=x+y;%myproduct.mfunction product=myproduct(x,y)global aproduct=x*y;a=x+y;子函数子函数u 函数文件中可以含有一个或多个子函数函数文件中可以含有一个或多个子函数u 子函数由子函数由 function 语句引导语句引导u 主函数必须位于最前面,子函数出现的次序任意主函数必须位于最前面,子函数出现的次序任意u 子函数只能被主函数和位于同一个函数文件中的其它子子函数只能被主函数和位于同一个函数文件中的其它子函数调用函数调用u 除了用除了用 global 定义的全局变量外,子函数中的变量都定义的全局变量外,子函数中的变量都是局部变量,子函数与主函数及其它子函数之间通过输入、是局部变量,子函数与主函数及其它子函数之间通过输入、输出参数进行数据传递输出参数进行数据传递q 调用一个函数时,调用一个函数时,Matlab 会首先检查该函数是否为一个会首先检查该函数是否为一个子函数。子函数。子函数子函数function avg,med=mysubfun(x)%主函数主函数 n=length(x);avg=mean(x,n);med=median(x,n);function a=mean(x,n)%子函数,计算平均值子函数,计算平均值a=sum(x)/n;function m=median(x,n)%子函数,计算中值子函数,计算中值x=sort(x);if rem(n,2)=1 m=x(n+1)/2);else m=(x(n/2)+x(n/2+1)/2;end编程练习编程练习q 编写一个使用循环计算编写一个使用循环计算 n!的函数。的函数。u 当输入一个参数时,计算它的平方u 当输入两个参数时,计算它们的平方的和u 当输入参数超过三个时,输入错误信息,并返回q 编写一个函数,要求实现以下功能:编写一个函数,要求实现以下功能:首先由计算机随机产生一个 1,100 之间的一个整数,然后由用户猜测所产生的这个数。根据用户猜测的情况给出不同的提示,如果猜测的数大于产生的数,则显示 High,小于则显示 Low,等于则显示 You win!,同时退出游戏。用户最多有 7 次机会。编程练习编程练习u 猜数游戏