1、复习:Matlab 编程,Matlab 编程简介,Matlab 作为一种广泛应用于科学计算的工具软件,不仅具有强大的数值计算、符号计算、矩阵运算能力和丰富的绘图功能,同时也具有和 C、FORTRAN 等高级语言一样进行程序设计。,在 Matlab 程序设计中,要充分利用 Matlab 数据结构的特点,提高编程效率。,利用 Matlab 的程序控制功能,可以将有关 Matlab 命令编成程序存储在一个文件中(M 文件),然后在命令窗口中运行该文件,Matlab 就会自动依次执行文件中的命令,直到全部命令执行完毕。,用 Matlab 语言编写的程序称为 M 文件。,M 文件是由若干 Matlab
2、命令组合在一起构成的,它可以完成某些操作,也可以实现某种算法。事实上,Matlab 提供的内部函数以及各种工具箱,都是利用 Matlab 语言开发的 M 文件。用户也可以结合自己的工作需要,开发自己的程序或工具箱。,M 文件,M 文件以 .m 为扩展名。,M 文件是一个文本文件,可以用任何文本编辑器来建立和编辑,通常使用 Matlab 自带的 M 文件编辑器。,M 文件的建立与打开,在命令窗口中输入 f2cs,即可执行该 M 文件。,例:编写一个命令文件将华氏温度转化为摄氏温度,命令文件举例,命令文件运行后,文件中所产生的所有变量都驻留在 Matlab 当前工作空间,可以用 whos 查看。,
3、function 输出形参列表=函数名(输入形参列表) % 注释说明部分(可选) 函数体语句(必须),第一行为引导行,表示该 M文件是函数文件函数名的命名规则与变量名相同 ( 必须以字母开头 )当输出形参多于一个时,用方括号括起来函数必须是一个单独的 M文件函数文件名必须与函数名一致以百分号开始的语句为注释语句,函数文件,函数文件由 function 语句引导,例1 编写函数文件求半径为r的圆的面积和周长。函数文件如下: function s,p=fcircle(r) % calculate the area and perimeter of a circle of radii r % r ,
4、s ,p分别为圆的半径、面积以及周长 s=pi*r*r; p=2*pi*r;,函数调用的一般格式,输出实参列表=函数名(输入实参列表),函数调用时,实参的顺序应与函数定义时的形参的顺序一致。 函数可以嵌套调用,即一个函数可以被其它函数调用,甚至可以被它自身调用,此时称为递归调用。函数所传递的参数具有可调性,Matlab 用两个永久变量 nargin 和 nargout 分别记录调用该函数时的输入实参和输出实参的个数。,函数调用,程序控制结构有三种:顺序结构、选择结构和循环结构。任何复杂的程序都由这三种基本结构组成.,顺序结构,M文件程序的流程控制,数据的输入:input,数据输入 input,
5、disp(X),输出变量 X 的值,可以是数值矩阵或字符串, B=1 2 3; 4 5 6; 7 8 9; disp(B),数据输出 disp,数据的输出:disp,例 求一元二次方程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);,数据输出 fprintf,format
6、 中还可以使用一些特殊格式,如:,n ( 换行 ) t ( 制表符 ) b ( 退格 ) ( 反斜杆 ) % ( 百分号 ),数据输出 fprintf, a=Hello; b=2.4; c=100*pi; fprintf(a=%s,b=%f,c=%en,a,b,c),例:,format 中的输出格式要与输出变量一一对应,可以没有输出变量,选择结构 是根据给定的条件成立或不成立,分别执行不同的语句。Matlab 用于实现选择结构的语句有 if 语句和 switch 语句。,选择结构,单分支结构,if expression (条件)statements (语句组) end,if 条件语句,if e
7、xpression1 (条件1)statements1(语句组1) elseif expression2 (条件2)statements2(语句组2). . elseif expressionm (条件m)statementsm(语句组m) elsestatements(语句组) end,多分支结构,if 条件语句,例:编写函数,计算,function y=myfun4(x) n=length(x); for i=1:n if x(i)1 y(i)=x(i)2; elseif x(i)-1 y(i)=1; else y(i)=3+2*x(i); end end,根据表达式的不同取值,分别执行不
8、同的语句。,switch expression (表达式)case value1 (表达式1)statement1(语句组1)case value2 (表达式2)statement2(语句组2). .case valuem (表达式m)statementm(语句组m)otherwisestatement (语句组) end,switch 语句,Matlab 首先计算 expression 的值,然后将它依次与各个 case 指令后的检测值进行比较,当比较结果为真时,就执行相应的语句组,然后跳出 switch 结构。,switch 后面的表达式 expression 的值可以是一个标量或字符串。
9、,switch 语句,otherwise 指令可以不出现。,如果所有的比较结果都为假,则执行 otherwise 后面的语句组,然后跳出 switch 结构。,例 某商场对顾客所购买的商品实行打折销售,标准如下(商品价格用price来表示): price200 没有折扣200price500 3%折扣500price1000 5%折扣1000price2500 8%折扣2500price5000 10%折扣5000price 14%折扣输入所售商品的价格,求其实际销售价格。,price=input(请输入商品价格); switch fix(price/100) case 0,1 %价格小于20
10、0rate=0;case 2,3,4 %价格大于等于200但小于500rate=3/100;case num2cell(5:9) %价格大于等于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) %输出商品实际销售价格,循环结构 是按照给定的条件,重复执行指定的语句。Matlab 用于实现
11、循环结构的语句有 for 语句和 while 语句,循环结构,for variable=expressionstatement(循环体) end,循环变量,表达式 expression 可以是行向量,也可以是矩阵,for 循环,clear; y=0; n=100; for k=1:ny=y+1/(2*k-1); end,例 一个三位整数各位数字的立方和等于该数本身则称该数为水仙花数。输出全部水仙花数。程序如下:for m=100:999 m1=fix(m/100); %求m的百位数字 m2=rem(fix(m/10),10); %求m的十位数字 m3=rem(m,10); %求m的个位数字 i
12、f m=m1*m1*m1+m2*m2*m2+m3*m3*m3 disp(m) end end,循环语句可以嵌套使用,while 循环,while expression (条件)statement(循环体) end,如果预先就知道循环的次数,则可以采用 for 循环;否则,如果预先无法确定循环的次数,则可以使用 while 循环。,while 循环举例,例 生成斐波那契数列,直到a(i)10000为止.fnum(1)=1;fnum(2)=1;i=2; while fnum(i)=10000 fnum(i+1)=fnum(i-1)+fnum(i); i=i+1; end; fnum,例 从键盘输入
13、若干个数,当输入0时结束输入,求这些数的平均值和它们之和. sum=0; cnt=0; val=input(Enter a number (end in 0):); while (val=0)sum=sum+val;cnt=cnt+1;val=input(Enter a number (end in 0):); end if (cnt 0)summean=sum/cnt end,break 和 continue,break 语句用于终止循环的执行,即跳出最内层循环 continue 语句用于结束本次循环,进行下一次循环 break 和 continue 一般与 if 语句配合使用,其它流控制语
14、句,程序如下: for n=100:200 if rem(n,21)=0continue end break; End; n,%n/21的余数不等于0则 继续下一次循环, 即for 循环: n继续加1, 直到余数 等于零, 跳出continue循环体,例 求100,200之间第一个能被21整除的整数。,n = 105,% 函数文件 myfun5.m function f=myfun5(n) if (n=1)f=1; elsef=n*myfun5(n-1); end,% main.m % 计算 s=1!+2!+3!+4!+5! % clear; s=0; for i=1:5s=s+myfacto
15、r(i); end fprintf( s=%g n,s),例:利用函数的递归调用计算 n!,递归函数举例,函数所传递的参数具有可调性,Matlab 用两个永久变量 nargin 和 nargout 分别记录调用该函数时的输入实参和输出实参的个数。,参数的可调性举例,function out=ex4argin(a,b) if (nargin=1)out=a; elseif (nargin=2)out=a*b; end,function p,q=ex4argout(a,b) if (nargout=1)p=a+b; elseif (nargout=2)p=a+b; q=a-b; end,函数通过输
16、入和输出参数与其它 M 文件进行数据传递。,当函数调用完毕后,该函数文件中定义的所有局部变量都将被释放,即全部被清除。,如果在若干个 M文件中,都把某个变量定义为全局变量,则这些函数将公共使用这一变量。所有函数都可以对它进行存取和修改操作。,函数文件中的变量都是局部的,即一个函数文件中定义的变量不能被另一个函数文件或其它 M 文件使用。,全局变量与局部变量,定义全局变量是 M文件间传递信息的一种手段。,变量名列表中的各个变量用空格隔开,不能用逗号!,全局变量给函数间的数据传递带来了方便,但却破坏了函数对变量的封装,降低了程序的可读性,因而在结构化程序设计中,全局变量是不受欢迎的。特别是当程序较
17、大,子程序较多时,全局变量将个程序调试和维护带来不便,故不提倡使用全局变量。,global 变量名列表,全局变量的定义,在使用全局变量的所有M文件中,都要对其所使用的全局变量进行定义。,程序示例,% ex4global.m clear; global a b a=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.m function square_sum=mysquaresum(x,y) square_sum=x2
18、+ y2; a=x+y;,% myproduct.m function product=myproduct(x,y) global a product=x*y; a=x+y;,子函数,函数文件中可以含有一个或多个子函数子函数由 function 语句引导主函数必须位于最前面,子函数出现的次序任意子函数只能被主函数和位于同一个函数文件中的其它子函数调用除了用 global 定义的全局变量外,子函数中的变量都是局部变量,子函数与主函数及其它子函数之间通过输入、输出参数进行数据传递,调用一个函数时,Matlab 会首先检查该函数是否为一个子函数。,子函数,function avg, med = my
19、subfun(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) = 1m = x(n+1)/2); elsem = (x(n/2)+x(n/2+1)/2; end,编程练习,编写一个使用循环计算 n! 的函数。,当输入一个参数时,计算它的平方当输入两个参数时,计算它们的平方的和当输入参数超过三个时,输入错误信息,并返回,编写一个函数,要求实现以下功能:,首先由计算机随机产生一个 1,100 之间的一个整数,然后由用户猜测所产生的这个数。根据用户猜测的情况给出不同的提示,如果猜测的数大于产生的数,则显示 High ,小于则显示 Low ,等于则显示 You win!,同时退出游戏。用户最多有 7 次机会。,编程练习,猜数游戏,