1、第5章 程序设计,主要内容,一、编辑M文件 二、程序流程语句 三、子函数,一、编辑M文件,1.生成一个M文件的编辑窗口: 菜单操作:从MATLAB主窗口的File菜单中 选择New菜单项,再选择M-file命令 (2) 命令操作:在MATLAB命令窗口输入命令edit (3) 命令按钮操作。单击MATLAB主窗口工具栏 上的New M-File命令按钮,屏幕上将出现MATLAB 文本编辑器窗口, 输入M文件的内容并存盘。,用MATLAB语言编写的程序,称为M文件.,2打开已有的M文件,(1) 菜单操作:从MATLAB主窗口的File菜单 中选择Open命令,则屏幕出现Open对话框, 在Ope
2、n对话框中选中所需打开的M文件。在文 档窗口可以对打开的M文件进行编辑修改,编 辑完成后,将M文件存盘。(2) 命令操作:在MATLAB命令窗口输入命 令:edit 文件名,则打开指定的M文件。(3) 命令按钮操作:单击MATLAB主窗口工 具栏上的Open File命令按钮,再从弹出的对 话框中选择所需打开的M文件。,3. 两种M文件,M文件包含两种:,(2)函数文件:可以有输入输出变量,在文件中定义用户所需要的函数, 当某些程序使用该函数时即可调用该函数。,(1)命令执行文件:没有参数的输入和输出,在文件中赋予了一些命令, 通过对这些命令的执行, 用户能完成某些计算.,(1)命令执行文件,
3、文件名为plotsin.m: %plot trigonmetric curve clear; %清除工作空间中的变量 x=0:pi/20:2*pi; plot(x,sin(x); hold on plot(x,cos(x);,在命令窗口中输入文件名plotsin回车,就会 建立一个图形窗口,并在窗口中画出sin和 cos曲线,并在workspace窗口中产生变量 x。,(2)函数文件,函数文件可以有输入和输出参数,并且函数文件的文件名和函数名必须同名。 函数文件由function语句引导,其基本结构为:,function 输出参数表=函数名(输入参数表) 注释行 函数体,说明: (1)函数文件
4、必须以function开始,用 来标识此文件是函数文件。 (2)使用%作为注释符,只作用于本行 。若注释有多行,则每行都要以%开头。 (3)命令窗口中执行该函数,也可以被其 他文件或函数调用,但需注意路径。 (4)function后紧跟的注释,就是使用 help命令查看的内容。,例:计算n的阶乘,文件名为fact.m function output=fact(n) %FACT Calculate factorial of a %given positive integer %Format: fact(n),return factorial %of n. output=1; for i=1:no
5、utput=output*i; end,4.函数调用,(1). 函数调用的一般格式是: 输出实参表=函数名(输入实参表)要注意的是,函数调用时各实参出现的顺 序、个数,应与函数定义时形参的顺序、个 数一致,否则会出错。函数调用时,先将实 参传递给相应的形参,从而实现参数传递, 然后再执行函数的功能。,例 利用函数文件,实现直角坐标(x,y)与极坐标(,)之间的转换。,tran.mfunction rho,theta=tran(x,y) rho=sqrt(x*x+y*y); theta=atan(y/x);,rh,th=tran(3,4) rh =5 th =727/784,(2) 嵌套和递归调
6、用,(2.1)嵌套调用 Matlab中,在函数文件的题头定义的函数 称为主函数,而在内部定义的其他函数均被 视为子函数。 子函数只能为主函数或同一主函数下其他子 函数所调用。,(2.2)递归调用 一个函数调用它自身称为函数的递归调用。,例:嵌套调用 testfunction.m,function c=testfunction(a,b) %主函数 %计算平方差:a2-b2=(a-b)(a+b) c1=test1(a,b)*test2(a,b);function c1=test1(a,b) c1=a+b;function c2=test2(a,b) c2=a-b;, test(1,2),ans =
7、-3, test(3,4),ans = -7, help test,主函数 计算平方差:a2-b2,例 利用函数的递归调用,求n!。,factor.mfunction f=factor(n) if n=1f=1; elsef=factor(n-1)*n; end,(3)函数参数的可调性,在调用函数时,MATLAB用两个永久变量 nargin和nargout分别记录调用该函数时 的输入实参和输出实参的个数。只要在函数 文件中包含这两个变量,就可以准确地知道 该函数文件被调用时的输入输出参数个数, 从而决定函数如何进行处理。,例: narginexp.m,function fout=charray
8、(a,b,c) if nargin=1fout=a; elseif nargin=2fout=a+b; elseif nargin=3fout=(a*b*c)/2; end,narginexp(23) narginexp(2,3) narginexp(2,3,4),5.M文件中的变量,局部变量:是在函数内部定义的变量,其作用域 仅在本函数,即只对函数内部有效。当函数 执行时,局部变量存储在临时工作空间中, 当函数被执行完毕后,局部变量从临时工作 空间中释放。,全局变量:使用命令global来定义,其作用域是所 有的函数,即可以被所有函数调用。可以在 命令窗口中定义,也可以在一个函数中定义 或修
9、改。但要注意不要随便修改全局变量的 值,否则可能会产生意想不到的错误。,例:文件addmn.m,function output = addmn(m,n) %calculate the sum of m and n. %m and n may be vector,digitor %matrix output= m + n;此文件中的m和n为局部变量。,例:文件addmng.m,function output = addmng(m,n) %calculate the sum of m , n and the global val g. global g g = 1; output= m + n +
10、 g;,此文件中的g为全局变量,定义时不能直接 赋值,否则出错。,在命令窗口中可以调用: addmng(1,2),ans=4,例:文件addmngg.m,如果在程序内部不给全局变量赋值,则要在命令窗口中赋值 function output = addmngg (m,n) %calculate the sum of m , n and the global val g. global g output= m + n + g;,在命令窗口中,如下操作: global g %此语句必须要 g=1 addmngg(1,2),全局变量已经赋值后,在其后所有的调用 中,其值均不变;如果有更改,则后续的使
11、用处也更改。,在命令窗口中查询全局变量的值的方法: 先声明全局变量,然后再查询。例如: global g g,二、程序控制结构,1.顺序结构 2.循环结构 3.选择结构,1.顺序结构,1)直接赋值语句格式:变量名赋值表达式,2)函数调用赋值语句 格式:返回变量列表函数名(输入参数列表),x=0:pi/2:2*pi; %结尾有分号,没有输出 y=sin(x) %结尾没有分号,有输出,X=pascal(4); L,U,P=lu(X),3)输入输出数据,输入数据可用input函数 格式为:A=input(“提示信息”);A=input(“提示信息”,s);,输出数据可用disp函数,其调用格式为di
12、sp(输出项) 其中输出项既可以为字符串,也可以为矩阵.,例:求一元二次方程ax2 +bx+c=0的根,inputexp.m 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);,4)程序的暂停与中止,暂停程序的执行: pause(延迟秒数) 如果省略延迟时间,直接使用pause,则将 暂停程序,直到用户按任一键后程序继续执 行。,强行中止程序的运行可使用Ctrl+C命令.,2.选择
13、结构,(1)if语句,(2)switch语句,(3)try语句,(1)if语句,if 逻辑表达式 执行语句 end,if 逻辑表达式1执行语句1 elseif 逻辑表达式2执行语句2 else执行语句n end,if 逻辑表达式执行语句1 else执行语句2 end,例:testif1.m,n=5; m=6; for i=1:nfor j=1:mif i=ja(i,j)=1;elseif i=2*ja(i,j)=2;elsea(i,j)=0;endend end,例:testif2.m,注:如果条件表达式是一个逻辑数组,则只有所有元素都为真时,条件才为真。 A = 1,0;2,3; B = 1
14、,1;3,4; if A = Bflag = 1; elseif A Bflag = 2; elseif A end,(2)switch语句,格式: switch 开关表达式 case 表达式1 语句组1 case 表达式2, 表达式3,表达式k %有一个为真,就执行。 语句组2 otherwise 语句组n end,例:,某商场对顾客所购买的商品实行打折销售, 标准如下(商品价格用price来表示): price200 没有折扣200price500 3%折扣500price1000 5%折扣1000price 8%折扣输入所售商品的价格,求其实际销售价格。,switchexp.m,clea
15、r; price=input(请输入商品价格:); switch fix(price/100) case 0,1rate=0;case 2,3,4rate=3/100;case num2cell(5:9)rate=5/100;otherwiserate=8/100; end price=price*(1-rate),5:9 5 6 7 8 9,num2cell(5:9) 56789,%取整,matlab取整函数,(1)fix(x) : 截尾取整 (2)floor(x):不超过x 的最大整数 (3)ceil(x) : 大于x 的最小整数 (4)round(x):四舍五入取整,x=-3.12,sw
16、itchifexp.m,clear; price=input(输入商品价格:); if price=200 end price=price*(1-rate),逻辑与 & 逻辑或 | 逻辑非 ,(3)try语句,语句格式为: try语句组1 catch语句组2 end,try语句先试探性执行语句组1,如果语句组1 在执行过程中出现错误,则将错误信息赋给 保留的lasterr变量,并转去执行语句组2。,例 从键盘输入矩阵A和B,可乘则输出乘积,不可乘则返回A、B及出错信息.,clear; A=input(Matrix A=); B=input(Matrix B=); tryC=A*B catchA
17、Bdisp(lasterr) end,3.循环结构,Matlab提供了两种循环结构,分别是forend和whileend,(1) forend结构 用于循环次数已经确定的情况。 以for开始,以end结束。,格式:for 循环变量=起始值:步长:终止值循环体end,for循环注意事项:,()步长的缺省值是1。步长可以在正 实数或负实数范围内任意指定,对于正数, 循环变量的值大于终止值时,循环结束;对 于负数,循环变量的值小于终止值时,循环 结束。,()for和end语句中间的所有语句会自动缩进;,()for循环可以嵌套使用;,()不能通过内部对循环变量重新赋值 而进行反复的循环或停止循环;,(
18、)循环中可以使用break(跳出本层循环体),continue(结束本次循环).,例1:一个三位整数各位数字的立方和等于该数本身则称该数为水仙花数。输出全部水仙花数。,clear; %testfor1.m for m=100:999m1=fix(m/100); m2=rem(fix(m/10),10); m3=rem(m,10); if m=m1*m1*m1+m2*m2*m2+m3*m3*m3disp(m)end end,rem(m,n) m对n求余,例2:若一个数等于它的各个真因子之和,则称该数为完数,如6=1+2+3,所以6是完数。求1,500之间的全部完数。,for m=1:500s=0
19、; for k=1:m/2if rem(m,k)=0s=s+k;endendif m=sdisp(m);end end,testfor2.m,例3:testfor3.m,如果循环变量等于一个矩阵,执行过程是依次 将矩阵的各列元素赋给循环变量,然后执行循 环体语句,直至各列元素处理完毕。 x=1:2:6;3:5z=0;for i=xiz=z+iend,例4:testfor4.m,x=1:2:20; n=length(x); for i=1:n x(i)=1/x(i); i=n; end format rat disp(x),%循环体中改变循环变量, %不影响循环执行,即无效.,在实际MATLAB
20、编程中, 采用循环语句 会降低其执行速度, 能不用尽量不用!,x=1:2:20; x=1./x,数据输出格式控制format,缺省时:为默认短格式方式与format short相同 format short 短格式方式,显示5位定点十进制数。 format long 长格式方式,显示15位定点十进制数。 format short g /format long g当数据大于1000或小于1时便会以科学记 数法显示(-e),若想坚持用整数部分加小数 部分的格式来显示,就要再后边加 g,数据输出格式控制format,format hex 十六进制格式方式 format bank 银行格式。按元、角、
21、分(小数点后具有两位)的固定格式 format + +格式,以,和空格分别表示中的正数,负数和零元素 format short e 短格式e方式,显示5位浮点十进制数 format long e 长格式e方式,显示15位浮点十进制数,数据输出格式控制format,format rat 分数格式形式。用有理数逼近显示数据。如 pi显示为355/113。 format loose 松散格式。数据之间有空行。 format compact 紧凑格式。数据之间无空行。 vpa(date,n) 将数据date以n位有效数字显示。,例5:testfor5.m,如果必须使用for循环,可以预先分配数组.,x
22、=1:2:20; n=length(x); for i=1:n x(i)=1/x(i); i=n; end format rat disp(x),x=1:2:20; n=length(x); z =zeros(n); for i=1:nz (i)=1/x(i); end format rat disp(z),例6:break和continue的用法,breakexp.my=-2:1; f=0; for j=1:length(y) if(y(j)=0)break;endf=1; end f,continueexp.m y=-2:1; f=0; for j=1:length(y) if(y(j)=
23、0)continue;endf=1; end f,(2)whileend结构,若事先不能确定循环次数,使用while循环,格式:while 条件表达式循环体语句组end,若表达式为真,则执行循环体的内容, 执行后再判断表达式是否为真,若为假则跳 出循环体,向下继续执行,否则继续执行循 环体.,testwhile.m从键盘输入若干个数,当输入0时结束输入,求这些数的平均值和它们之和。,sum=0; count=0; val=input(Enter a number (end in 0):); while (val=0)sum=sum+val; count=count+1;val=input(Enter a number (end in 0):); end if (count 0) summean=sum/count end,