1、第3章 MATLAB程序设计 3.1 M文件 3.2函数文件 3.3程序控制结构 3.4 程序举例 3.5 程序调试,matlab的程序设计, matlab语言称为第四代编程语言,程序简洁、可读性很强而且调试十分容易。是matlab重要组成部分。,3.1 M文件1、m文件简介 用户如想灵活应用matlab去解决实际问题,充分调用matlab的科学技术资源,就需要编辑m文件 由MATLAB命令语句构成的程序文件称作M文件,它将m作为文件的扩展名。 编辑m文件可使用各种文本编辑器。,M文件可分为两种:主程序和子程序。 主程序 (也称主程序文件): 一般是由用户为解决特定的问题而编制的程序。子程序
2、(称为函数文件):它必须由其它M文件来调用。函数文件往往具有一定的通用性,并且可以进行递归调用。,M文件的结构 主程序文件的格式特征如下:,(1)有关程序的功能、使用方法等内容的注释。主程序前面的若干行通常是程序的注释,每行以“”开始。 (2)程序的主体。 (3)整个程序应按MATLAB标识符的要求起文件名,并加上后缀m。,2 M文件的建立与打开 1)建立新的M文件为建立新的M文件,启动MATLAB文本编辑器有3种方法:(1) 菜单操作。 (2) 命令操作。 命令窗中输入edit (3) 命令按钮操作。,2)打开已有的M文件也有3种方法:(1) 菜单操作。(2) 命令操作。命令窗口输入命令:e
3、dit 文件名,则打开指定的M文件。(3) 命令按钮操作。,对主程序文件的运行方式通常有两种: 在MATLAB的命令窗口中运行:在MATLAB的命令窗中键入此程序的文件名后,系统就开始执行文件中的程序; 在编辑窗口中运行:通过编辑窗口打开所要运行的文件,然后再运行。主程序文件中的语句可以对MATLAB工作空间中的所有数据进行运算操作。,3、matlab文件的类型,数据文件 .matmat文件是matlab以标准二进制格式保存的数据文件,可将工作空间中有用的数据变量保存下来。mat文件的生成和调用是由函数save和load完成的。,2. m文件用MATLAB语言编写的程序,称为M文件。m文件的语
4、法类似于c语言,但又有其自身特点。它只是一个简单的ASCII码文本文件,执行程序时逐行解释运行程序,matlab是解释性的编程语言。M文件可以根据调用方式的不同分为两类:独立的m文件 称命令文件(Script File)可调用m文件 称函数文件(Function File) 两者主要区别:【重要】 (1). 命令文件 简单的m文件命令文件实际上是一串指令的集合,与在命令窗口逐行执行文件中的所有指令,其结果是一样的。没有输入输出参数。 (2) 变量 (3) 运行方式,命令文件包括两部分:注释文件和程序文件 %RANK Number of linearly independent rows or
5、columns. % K = RANK(X) is the number of singular values of X % that are larger than MAX(SIZE(X) * NORM(X) * EPS. % K = RANK(X,tol) is the number of singular values of X that % are larger than tol.% Copyright (c) 1984-94 by The MathWorks, Inc.s = svd(x); if (nargin = 1)tol = max(size(x) * max(s) * ep
6、s; end r = sum(s tol);,(2).matlab内置函数文件matlab自定义的函数文件称内置函数文件调用内置函数的方法:使用函数名并给出相应的入口、出口参数即可。例如:sin.m函数用type sin查不到。得到:sin is a built-in function.调用格式:y=sin(2*x)实际应用中:x=0:2*pi/180:2*pi;y=sin(2*x)plot(x,y),又如 sqrt(x) 求x的平方根abs(x) 求x的绝对值det(a) 求行列式的值等等。matlab拥有大量的内置数学函数,供我们在数值运算和符号运算中调用。 (3). 函数m文件 需要输入
7、变量,返回输出变量matlab用户可以根据需要编辑自己的m文件,它们可以像库函数一样方便的调用,从而极大地扩展了matlab 的能力。,对于某一类特殊问题,如创建了许多m函数文件,则可形成新的工具箱。 这种用matlab语言创建定义新的matlab函数的功能,正体现了matlab语言强大的扩展功能。,函数文件是用来定义子程序的。它与主程序文件的主要区别有三点: (1)由function起头,后跟的函数名必须与文件名相同; (2)有输入输出变元(变量),可进行变量传递; (3)除非用global声明,程序中的变量均为局部变量,不保存在工作空间中。 通常,函数文件由以下部分构成:函数定义行;H1行
8、;%函数帮助文本;函数体;注释。,函数m文件的格式:function 返回变量=函数名(输入变量)注释说明语句段程序语句段 特定规则: 函数m文件第一行必须以单词function作为引导词,必须遵循如下形式:function =()m文件的文件名必须是 .m。 程序中的变量均为局部变量,不保存在工作空间中。其变量只在函数运行期间有效。 Return语句可以省略,函数可嵌套调用,注意:当函数具有多个输出变量时,则以方括号括起;当函数具有多个输入变量时,则直接用圆括号括起。例如:functionx,y,zsphere(theta,phi,rho)。当函数不含输出变量时,则直接略去输出部分或采用空方
9、括号表示。,函数调用 函数调用的一般格式是:输出实参表=函数名(输入实参表)【注意】函数调用时各实参出现的顺序、个数,应与函数定义时形参的顺序、个数一致,否则会出错。函数调用时,先将实参传递给相应的形参,从而实现参数传递,然后再执行函数的功能。,例3-1 编写函数文件求半径为r的圆的面积和周长。 1、首先建立函数文件fcircle.m如下: function s,p=fcircle(r) %CIRCLE calculate the area and perimeter of a circle of radii r %r 圆半径 %s 圆面积 %p 圆周长 s=pi*r*r; p=2*pi*r;
10、,2、在MATLAB的命令窗口输入以下命令并调用该函数文件。 clear; y=input(Input radii:); s,p=fcircle(y) 3、输出情况:Input radiis:3s =28.2743p =18.8496,例3-1 分别建立命令文件和函数文件,将华氏温度f转换为摄氏温度c, c=5/9(f-32)。 程序1: S1:先建立命令文件并以文件名f2c.m存盘。clear; %清除工作空间中的变量f=input(Input Fahrenheit temperature:);c=5*(f-32)/9 S2: 在MATLAB的命令窗口中输入f2c,将会执行该命令文件,执行情
11、况为:Input Fahrenheit temperature:73c =22.7778,程序2: 1: 首先建立函数文件f3c.m。 function c=f3c(f) c=5*(f-32)/9 2: 然后在MATLAB的命令窗口输入以下命令并调用该函数文件。 clear; y=input(Input Fahrenheit temperature:);x=f3c(y) 3: 输出情况为: Input Fahrenheit temperature:70 c =21.1111 x =21.1111,(4). 系统文件s函数用于描述系统运动的专用函数,是特殊的 m 文件。s 函数有3类: 由sim
12、ulink结构图自动创建 可用c语言程序设计mex文件 直接定义 用函数m文件编写s函数一旦创建,即可在框图中使用,也可在文件中调用。,S函数的调用格式sys, x0=sfunction( t, x, u, flag)S函数与函数m文件类似,只是输入、输出变量是限定的。,系统状态,状态初值,用户定义的系统,当前时刻,当前状态值,当前输入值,标志量,3.2 程序控制结构 3.2.1 顺序结构 1数据的输入 从键盘输入数据,则可以使用input函数来进行,该函数的调用格式为:A=input(提示信息,选项); 其中提示信息为一个字符串,用于提示用户输入什么样的数据。如果在input函数调用时采用s
13、选项,则允许用户输入一个字符串。例如,想输入一个人的姓名,可采用命令: xm=input(Whats your name?,s);,2数据的输出MATLAB提供的命令窗口输出函数主要有disp函数,其调用格式为disp(输出项) 其中输出项既可以为字符串,也可以为矩阵。,例3-2 输入x,y的值,并将它们的值互换后输出。程序如下:x=input(please input x:);y=input(please input y:);z=x;x=y;y=z;disp(x);disp(y);,3.2.2 选择结构 1if语句在MATLAB中,if语句有3种格式。(1) 单分支if语句:if 条件语句组
14、end 当条件成立时,则执行语句组,执行完之后继续执行if语句的后继语句,若条件不成立,则直接执行if语句的后继语句。注意:语句中的end是决不可少的,没有它,在逻辑表达式为0时,就找不到继续执行程序的入口。,(2) 双分支if语句:if 条件语句组1else语句组2end当条件成立时,执行语句组1,否则执行语句组2,语句组1或语句组2执行后,再执行if语句的后继语句。,2switch语句switch语句根据表达式的取值不同,分别执行不同的语句,其语句格式为:switch 表达式case 表达式1语句组1case 表达式2语句组2case 表达式m语句组motherwise语句组nend,P6
15、9,【例3-6】 某商场对顾客所购买的商品实行打折销售,标准如下(商品价格用price来表示): price200 没有折扣200price500 3%折扣500price1000 5%折扣1000price2500 8%折扣2500price5000 10%折扣5000price 14%折扣 输入所售商品的价格,求其实际销售价格。,程序如下: price=input(请输入商品价格); switch fix(price/100) case 0,1 %价格小于200rate=0;case 2,3,4 %价格大于等于200但小于500rate=3/100;case num2cell(5:9) %
16、价格大于等于500但小于1000rate=5/100;case num2cell(10:24) %价格大于等于1000但小于2500rate=8/100;case num2cell(25:49) %价格大于等于2500但小于5000rate=10/100;otherwise %价格大于等于5000rate=14/100; end price=price*(1-rate) %输出商品实际销售价格,3.2.3 循环结构 1for语句 for语句的格式为:for 循环变量=表达式1:表达式2:表达式3循环体语句end 其中表达式1的值为循环变量的初值,表达式2的值为步长,表达式3的值为循环变量的终值
17、。步长为1时,表达式2可以省略。,与while语句不同的是,它循环执行一组语句的执行次数是确定。其关键字包括for、end、break等,功能:把语句组A(亦称为循环体)反复执行N次。循环次数N为:N1+(终值-初值)/增量,例- 利用for 语句求1!+2!+3!+4!+5!(思考),注意: (1)For循环不能用For循环内重新赋值循环变量n来终止。 (2)在For循环内接受任何有效的MATLAB数组。 (3) for循环可按需要嵌套。与其它的编程语言类似,for语句可以嵌套使用。 (4) 当有一个等效的数组方法来解给定的问题时,应避免用For循环。 (5) 为了提高处理的速度,在For循
18、环(While循环)被执行之前,应预先分配数组。,例- 利用for 语句求1!+2!+3!+4!+5! sum=0;for i=1:5pdr=1;for k=1:ipdr=pdr*k;endsum=sum+pdr;end,【例3-8 】 一个三位整数各位数字的立方和等于该数本身则称该数为水仙花数。输出全部水仙花数。程序如下:for m=100:999m1=fix(m/100); %求m的百位数字m2=rem(fix(m/10),10); %求m的十位数字m3=rem(m,10); %求m的个位数字if m=m1*m1*m1+m2*m2*m2+m3*m3*m3disp(m)endend,【例3-
19、9】 已知 ,当n=100时,求y的值。 P72 Y=1+1/3+1/5+1/(2*n-1)程序如下: y=0; n=100; for i=1:ny=y+1/(2*i-1); end y,在实际MATLAB编程中,采用循环语句会降低其执行速度,所以前面的程序通常由下面的程序来代替:n=100; k=1:2:2*n-1; y=sum(1./k); y,for语句更一般的格式为:for 循环变量=矩阵表达式循环体语句end执行过程是依次将矩阵的各列元素赋给循环变量,然后执行循环体语句,直至各列元素处理完毕。,【例3-10】 写出下列程序的执行结果。s=0;a=12,13,14;15,16,17;1
20、8,19,20;21,22,23;for k=as=s+k;enddisp(s);,2while语句while语句的一般格式为:while (条件)循环体语句end其执行过程为:若条件成立,则执行循环体语句,执行后再判断条件是否成立,如果不成立则跳出循环。,执行次数不确定,而是决定于一些逻辑条件。其关键字包括while、end、break等,例3-11 从键盘输入若干个数,当输入0时结束输入,求这些数的平均值和它们之和。 程序如下: sum=0; cnt=0; val=input(Enter a number (end in 0):); while (val=0)sum=sum+val;cnt
21、=cnt+1;val=input(Enter a number (end in 0):); end if (cnt 0)summean=sum/cnt end,3break语句和continue语句与循环结构相关的语句还有break语句和continue语句。它们一般与if语句配合使用。 break语句用于终止循环的执行。当在循环体内执行到该语句时,程序将跳出循环,继续执行循环语句的下一语句。 continue语句控制跳过循环体中的某些语句。当在循环体内执行到该语句时,程序将跳过循环体中所有剩下的语句,继续下一次循环。,例3-12 求100,200之间第一个能被21整除的整数。 程序如下: f
22、or n=100:200if rem(n,21)=0continueendbreak end n,4循环的嵌套如果一个循环结构的循环体又包括一个循环结构,就称为循环的嵌套,或称为多重循环结构。【例3-13】 若一个数等于它的各个真因子之和,则称该数为完数,如6=1+2+3,所以6是完数。求1,500之间的全部完数。 for m=1:500s=0;for k=1:m/2if rem(m,k)=0s=s+k;endendif m=sdisp(m);end end,小 结,本节主要介绍了matlab语言程序设计基础。matlab 编程简单,容易掌握。通过学习,应能编写简单程序,实验3 M文件及程序调
23、试 (2学时) 1、目的要求 掌握M文件、函数及程序调试方法与应用。 2、主要实验仪器及材料 微型计算机、Matlab7.0教学版。 3、掌握要点 掌握M文件、函数的编写格式及程序调试,重点是编写M函数实现具体应用。a. 掌握命令文件的建立和运行b. 掌握函数文件的建立和调用c. 掌握命令文件和函数文件的区别 4、实验内容 (1) 分别用M文件、M函数实现 ; (2) 在matlab下调试自己所写的程序; (3) 对方法进行总结; 5、完成实验报告,编程实现: 1、编写一个函数文件,计算一个球的体积。2、分别用命令文件和函数文件实现下题(1)Y3时的最大的n值(2)与(1)的n值对应的y的值,
24、实验4 MATLAB的程序流程设计 (2学时) 1、目的要求 掌握MATLAB的程序流程设计方法与应用。 2、主要实验仪器及材料 微型计算机、Matlab7.0教学版。 3、掌握要点 掌握Matlab语言设计流程。a. 掌握M文件的建立与打开操作b. 掌握程序控制结构(输入,输出,选择,循环) 4、实验内容 (1)、运用matlab的if-else-end、for-end、while-end、swicth-case等流程模式进行简单的程序设计; (2)、完成实验报告;,实验内容: 1、输入一个百分制成绩,要求输出成绩等级,A,B,C,D,E.其中90-100分为A,80-89为B,70-79为C,60-69分为D,60分以下为E。要求: (1)分别用if和switch语句实现 (2)输入百分制成绩后要判定成绩的合理性,对不合理的成绩要做出出错信息。,