程序设计教学PPT M文件.ppt
M文件,所谓M文件就是由matlab语言编写的可在matlab语言环境下运行的程序源代码文件。Matlab语言中的M文件可分为命令式(script)和函数式(function)两种形式。M文件可在matlab的程序编辑器中编写,也可在其他的文本编辑器中编写,并以“.m”为扩展名加以保存。命令式文件 命令式文件就是命令行的简单叠加,matlab会自动按顺序执行文件中的命令。值得注意的是,命令式文件在运行过程中可以调用matlab工作域内所有的数据,而且所产生的所有变量均为全局变量。,回到本章目录,M文件就是由matlab语言编写的可在matlab语言环境下运行的程序源代码文件。Matlab语言中的M文件可分为命令式(script)和函数式(function)两种形式。M文件可在matlab的程序编辑器中编写,也可在其他的文本编辑器中编写,并以“.m”为扩展名加以保存,这类文件的第一行必须是一特殊字符function开始,格式为:function y1,y2,=fun(x1,x2,)fun是函数名,x1,x2,是输入变量,y1,y2,是输出变量。,M文件,M文件建立方法:1.在MATLAB中,点:FileNew M-file 2.在编辑窗口中输入程序内容 3.点File Save,存盘,M文件名必须 与函数名一致.,MATLAB的应用程序也以M文件保存.存储函数式M文件时文件名要与主函数名相一致。,回到本章目录,第一行:函数声明行,function y=dfw1(r,p)res=r(1);p0=p(1);y=-sum(res);,输出参数,函数名,输入参数,函数名要遵守Matlab变量名的命名规则,M函数存盘时的文件名与函数名相同。,从函数返回的惟一信息包含在输出参数中,要确保函数中包含一条给输出参数赋值的语句。,回到本章目录,函数式文件:function abcd(a,b)c=a+bd=b-a保存为abcd.m在工作窗口中调用:a=2;b=3,4,5,6;abcd(a,b)c=5 6 7 8d=1 2 3 4c%结果是什么?,命令式文件:a=2;b=3 4 5 6;c=a+b;d=b-a;保存为:abcd.m在工作窗口中调用:abcd%文件名即可 cc=5 6 7 8 dd=1 2 3 4,回到本章目录,函数变量及变量作用域 M文件的变量主要有输入变量、输出变量及函数内部变量。输入变量相当于函数的入口数据,是一个函数操作的主要对象。函数的作用就是对输入变量进行加工以实现一定的功能。函数的输入变量为形式参数,即只是传递变量的值而不是变量的地址,函数对输入变量的一切的操作和修改如果不依靠输出变量传出的话,将不会影响工作空间 中该变量的值。matlab语言提供了函数nargin来控制输入变量的个数,即可以实现不定参数输入的操作。例如:在函数test1中,如果调用过程时只提供一个输入变量,则求该输入变量的模;如果是两个输入变量,则求两个输入变量的和,回到本章目录,%如果调用过程时只提供一个输入变量,则求该输入变量%的模;如果是两个输入变量,则求两个输入变量的和function c=test1(a,b)if nargin=1 c=norm(a);elseif nargin=2 c=a+b;end在工作窗口调用:a=2 3 4a=2 3 4 test1(a)ans=5.3852 b=3;test1(a,b)ans=5 6 7,回到本章目录,同时,matlab语言还提供了另一个针对输入变量的函数varargin。该函数可以实现不定数目输入变量的函数的程序设计。此时,对函数的一切输入变量均将存储在以varargin命名的单元型数组中。例:在函数test2中,实现如下功能:通过使用函数varargin,用户可以输入任意多个学生的 数学、英语及语文的成绩,然后求各科目的平均值。程序如下:,回到本章目录,function mathavg,englishavg,chineseavg=test2(varargin)s=length(varargin);%求数组的长度mathsum=0;englishsum=0;chinesesum=0;for j=1:s mathsum=mathsum+vararginj(1);englishsum=+vararginj(2);chinesesum=+vararginj(3);endmathavg=mathsum/s;englishavg=englishsum/s;chineseavg=chinesesum/s;思考:此函数如何调用。,回到本章目录,与输入变量相对应,matlab语言对输出变量也提供了相应的函数,如nargout、varargout等。具体的使用与函数nargin和varargin相似。下面给出一个综合应用示例。示例函数test3中,综合使用了函数nargin、nargout、narargin、narargout等,函数目的是求各学生(总数不确定)的个人平均成绩,以及指定科目的平均成绩等。,函数test2的调用:90,89,60分别表示数学、英语、语文的成绩 a,b,c=test2(90,89,60,79,89,66,99,98,100)a=89.3333b=32.6667c=33.3333思考:如果多个学生的成绩是同一科目的成绩放在一个数组中,如何修改test2函数。,回到本章目录,function vararout=test3(lessons,varargin)inputnum=nargin;lessonnum=length(lessons);outputnum=nargout;for i=1:lessonnum switch lessons(i)case math vararout1=sum(varargin1:inputnum(1);case english vararout2=sum(varargin1:inputnum(2);case chinese vararout3=sum(varargin1:inputnum(3);endendfor i=1:inputnum varargouti+3=sum(varargini(:);end,回到本章目录,在matlab中,函数内部定义的变量除特殊声明外均为局部变量。如果需要使用全局变量,则应当使用命令global定义,而且在任何使用该全局变量的函数中都应加以定义,在命令窗口中也不例外。注意:变量之间必须以空格分隔,而不能用逗号分隔。示例:,function avgs=test4(A)global s ss%定义全局变量m,n=size(A);for i=1:m s(i)=sum(A(i,:);endss=sum(s);avgs=ss/(m*n);,调用test4:a=4 3 5;6 7 8;3 5 7;1 3 4;test4(a)ans=4.6667 global s ss ssss=56 ss=12 21 15 8,回到本章目录,子函数与局部函数 Matlab中也可以定义子函数,用来扩充函数的功能。在函数文件中题头定义的函数为主函数,而在函数体内定义的其他函数均被视为子函数。子函数只能为主函数或同一主函数下的其他的子函数所调用。示例:,function c=test(a,b)%主函数c=test1(a,b)*test2(a,b);function c=test1(a,b)%子函数1c=a+b;function c=test2(a,b)%子函数2c=a-b;,回到本章目录,局部函数与子函数的区别是:局部函数可以被其父目录下的所有函数所调用,而子函数则只能被其所在M文件的主函数所调用;在函数编辑的结构上,局部函数与一般的函数文件的编辑相同,而子函数则只能在主函数文件中编辑。,回到本章目录,程序设计的辅助函数 用户交互函数 键盘输入函数包括函数input及keyboard。函数input用于提示用户输入指定参数的值,调用格式:var=input(提示性语句)其中,“提示性语句”将给出相应的提示信息以告知用户输入的对象,在这种调用过程中,用户可以有键盘输入任何的可计算的表达式或已赋值的当前工作空间中的变量名,而且返回至变量var中的值也是数值型,所有的输入以回车键加以确认。,回到本章目录,第一种调用格式:a=input(input examplen)input example1+4a=5 ischar(a)ans=0,第二种调用格式:b=input(input examplen,s)input example1+4b=1+4 ischar(b)ans=1,函数input的另一种调用格式:var=input(提示性语句,s)以该格式调用时,input函数将视用户键盘输入的一切字符为字符型赋予变量var,而不对其进行任何计算。在提示型语句中可以用“n”来控制显示时的换行。例如:,回到本章目录,另一种输入函数为keybroad,该函数出现在M文件中时,将终止程序的运行,此时用户可以查看运算过程中各变量的值必要时也可进行适当的干涉及编辑。同时该函数在matlab语言中均可应用,直到键入return并回车,这时程序返回中断处,继续执行其余代码。matlab也提供了一种中断函数pause,其调用格式:pause(n)该命令的作用是中断程序运行并等待n秒。如果不带参数,则程序无限期中断,直到用户在键盘上键入任意键。,回到本章目录,流程控制语句,Matlab语言的流程控制语句主要有for、while、if-else-end和switch-case这四种语句。for语句 for循环语句是流程控制语句中的基础,使用该循环语句可以以指定的次数重复执行循环体内的语句。for循环语句的调用形式:for 循环控制变量=(可以是已定义的向 量,也可在for循环语句中定义)循环体 end,回到本章目录,for i=1:4%初始值:步长:终值(步长默认为1)for j=4:-1:1H(i,j)=1/(i+j-1);endend结果:HH=1.0000 0.5000 0.3333 0.2500 0.5000 0.3333 0.2500 0.2000 0.3333 0.2500 0.2000 0.1667 0.2500 0.2000 0.1667 0.1429,回到本章目录,while语句 while循环语句与for循环语句不同的是,前者是以条件的满足与否来判断循环是否结束的,而后者则是以执行次数是否达到指定值来判断的。while循环语句的一般形式:while 循环体 end 循环判断语句为某种形式的逻辑判断表达式。当表达式的值为真时就执行循环体内的语句;否则退出。当循环判断语句为矩阵时,当且仅当所有的矩阵元素非零时,逻辑表达式的值为真。例如:,回到本章目录,n=0;while 2n 100 n=n+1;end,从例子中可以看出while循环语句与for循环语句是有异曲同工之处的。但是两者还是有区别的,for循环语句一般适用于已知到循环次数,而不知道循环运算目标的问题;while循环语句则一般适用于已知循环运算目标,而循环次数未知的问题。break语句:当程序流程运行至该命令时,则不论循环控制变量是否满足循环判断语句,均将退出当前循环,执行循环后的其他语句。continue命令:当程序流程运行至该命令时,会忽视其后的循环体操作转而执行下一层的循环。,回到本章目录,例.计算级数:S=1+2+22+23+263=,法二:s=0;i=0;while i64 s=s+2i;i=i+1;end,法一:S=0;for i=0:63 S=S+2I;end,法三:n=0:1:63;S=sum(2.n),回到本章目录,例.用while循环语句编写一个计算1000以内的Fibonacci数(斐波那契数列,后一个数等于前面两个数的排列,如:1,1,2,3,5,8,13,21,34,55,89,144):f=1 1;i=1;while f(i)+f(i+1)1000 f(i+2)=f(i)+f(i+1);i=i+1;end f=1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987,回到本章目录,if-else-end语句 if-else-end语句的一般形式:if 逻辑值为“真”时执行语句 else 逻辑值为“假”时执行语句 end例如:if a=1 a=a+1;else a=a+2;end,回到本章目录,例.计算分段函数值,程序如下:,x=input(请输入x的值:);if x=10 y=cos(x+1)+sqrt(x*x+1);else y=x*sqrt(x+sqrt(x);end y请输入x的值:,y=47.1893,12,回到本章目录,在程序设计中,也常碰到需要进行多重逻辑选择的问题,这时可以采用if-else-end语句的嵌套形式:if 逻辑值1为“真”时执行语句 elseif 逻辑值2为“真”时执行语句 elseif else 当以上所有的逻辑值均为“假”时执行语句 end,回到本章目录,比较大小:a=3;b=6;if ab max=a;elseif a=b max=两数相等 else max=b;end disp(最大值为:,num2str(max),解读这段程序:a=10000;n=0;z=1;while z an=n+1;if mod(n,2)=1 continueendz=2n-1;if isprime(z)%是否质数 break endend,回到本章目录,switch-case语句 switch-case语句是用于解决多分支判断选择的问题。switch-case语句的一般表达形式:switch case 选择判断值1 选择判断语句1case 选择判断值2 选择判断语句2otherwise 判断执行语句end,回到本章目录,例如:code=1switch code case-1 disp(error);case 0 disp(write in English);case 1 disp(write in Chinese);otherwise disp(write in French);end结果:write in Chinese,注意:在matlab语言中,即使有多条case判断语句为真,也只执行所遇到的第一条为真的语句。不必像C语句那样,在每条case语句后加上break语句防止继续执行后面为真的case条件语句。,回到本章目录,