Contents
clc;clear all;
第二章 M文件程序设计
M文件
f2c.m
一,程序控制结构
1.顺序结构
1)数据的输入input
% x = input('whats your name ', 's')
2)数据的输出disp 输出字符串或者矩阵
% A = 'Hello ,Tom' ;% disp(A)%% a = [1 2 3;4 5 6 ; 7 8 9 ] ;% disp(a)%% % 输入x,y的值,并将他们的值置换后输出% x = input('请输入x矩阵');% y = input('请输入y矩阵');% z = x;% x = y;% y = z;% disp(x);% disp(y);
3)程序的暂停 pause Ctrl+C 延迟的秒数.
% pause(2)
2.选择结构
1)IF语句
% 单分支语句% x = 0.6% if fix(x) == x% disp(x)% end % 双分支if语句% P = input('请输入P的值');% if P>5% A = zeros(1,10)% else% A = ones(1,10)% end % 多分支if语句% disp('解方程ax^2+bx+c=0,请输入参数')% a = input('a=');% b = input('b=');% c = input('c=');% derta = b*b -4*a*c;% x = [((-b+sqrt(derta))/(2*a)),(-b-sqrt(derta))/(2*a)];% disp(['方程',num2str(a),'x^2+',num2str(b),'x+',num2str(c),'=0的根为:']);% disp(['x1=',num2str(x(1)),',x2=',num2str(x(2))]);
2)switch 语句 | 结构体 | 结构体元素引用 | 空格blanks(n) | num2str 数字转换为字符串.
% switch 表达式% case 表达式1% 语句组1% case 表达式2% 语句组2% ...% otherwise% 语句组n% end% 用switch结构来实现学生成绩管理% switch里的case的表达式可以是数字,矩阵,字符串.% matlab中的的结构体的组成.% 结构体的元素的引用.%clear;for i=1:10; a{i} = 89+i; b{i} = 79+i; c{i} = 69+i; d{i} = 59+i;end;% a = [90] [91] [92] [93] [94] [95] [96] [97] [98] [99]%% b = [80] [81] [82] [83] [84] [85] [86] [87] [88] [89]%% c = [70] [71] [72] [73] [74] [75] [76] [77] [78] [79]%% d = [60] [61] [62] [63] [64] [65] [66] [67] [68] [69]c = [d,c];% c = [60] [61] [62] [63] [64] [65] [66] [67] [68] [69] [70] [71] [72] [73] [74] [75] [76] [77] [78] [79]Name = { 'Jack','Marry','Peter','Rose','Tom'};Mark = { 72 83 56 94 100 };Rank =cell(1,5); %生成一维矩阵 为空: Rank = [] [] [] [] []S = struct('Name',Name,'Marks',Mark,'Rank',Rank);for i = 1:5 switch S(i).Marks case 100 S(i).Rank = '满分'; case a S(i).Rank = '优秀'; case b S(i).Rank = '良好'; case c S(i).Rank = '及格'; otherwise S(i).Rank = '不及格'; endenddisp(['学生姓名 ',' 得分 ',' 等级 ']);disp('')for i=1:5; disp([S(i).Name,blanks(6),num2str(S(i).Marks),blanks(6),S(i).Rank]);end
学生姓名 得分 等级 Jack 72 及格Marry 83 良好Peter 56 不及格Rose 94 优秀Tom 100 满分
3)try语句
% try% 语句组1% catch% 语句组2% end% A = [1 2 3;4 5 6];% B = [7 8 9;10 11 12];% try% C1 = A*B% catch% C2 = A.*B% end% lasterr %Last error message
3.循环结构
1)for语句
% for 循环变量 = 表达式1:表达式2:表达式3% 循环体语句% end% for 循环变量 =矩阵表达式% 循环体语句% end% %输出1个3位数,各位数的立方和等于该数本身.% for m = 100:1:999% m1 = 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*m3% disp(m)% end% end% 已知y=1+1/2^2+...+1/n^2 ,当n为100时,求y的值.% y = 0;% n = input('输入n的值,求y:');% for i = 1:n% y = y+1/i/i ;% end% disp(['当n为',num2str(n),'时,y=',num2str(y)])% n=200;% i = 1:n^2;% y = sum(1./i)% 求矩阵各行元素之和% s = 0;% a = [12 13 14; 15 16 17; 18 19 20;21 22 23]% for k = a% s = s+k;% end% disp(s);
2)while语句
% while(条件)% 循环体语句% end% 从键盘输入若干个数,当输入0时结束输入,求这些数的平均值和它们之和.% sum = 0;% count = 0;% val = input('输入一个数,(以0结束输入)');% while (val ~= 0)% sum = sum + val;% count = count + 1;% val = input('输入一个数,(以0结束输入)');% end% if (count>0)% disp([blanks(6),'总和为',num2str(sum)]);% disp([blanks(6),'平均值为',num2str(sum/count)]);% end
3)break语句和continue语句
% continue语句控制跳过循环体的某些语句.% break 语句跳过当前循环体.% a = 3;b = 6;% for i = 1:3% b = b+1% if i<2 %当if条件满足时,程序不再执行continue后面的语句,而是开始下一次的循环.% continue %continue语句常用于循环体中,与if语句一起使用.% end% a = a+2% end% a = 3;b = 6;% for i = 1:3% b = b+1% if i>2 % 当if条件不满足时,程序执行a = a +2;% break % 当if条件满足时,程序执行循环体,跳出循环体.% end% a = a+2% end
4)循环的嵌套
% 若一个数等于它的各个真因子之和,则称之为完数.如6 = 1+2+3;所以6是完数.求[1,500]之间的完数.% 求某个数的因子,然后累加,比较后输出.% for m = 1:500% s = 0;% for k = 1:m/2% if rem(m,k) == 0% s = s+k;% end% end% if m == s% disp(m);% end% end
二,函数文件
1)函数文件的基本结构
编写函数文件求半径为r的圆的面积和周长. [s,p] = fcircle(10)
[s,p] = fcircle(10)
s = 314.1593p = 62.8319
2)函数调用
% 利用函数文件,实现指教坐标(x,y)和极坐标(\rho,\theta)%函数fcircle.m% x = input ('输入直角坐标x:');% y = input ('输入直角坐标y:');% [rho,theta] = tran(x,y);% disp(['{\rho} = ',num2str(rho)]);% disp(['{\theta} = ',num2str(theta)]);% 利用函数的递归调用,求n!% % 函数factor.m% s = 0;% for i = 1:5% s = s + factor(i);% end% s% % 函数factor.m调用% s = 0;% n = input ('请输入n,以求n的阶乘.n=');% for i = 1:n% s = s + factor(i);% end% disp([num2str(n),'!=',num2str(s)])
3)全局变量和局部变量
% 全局变量示例% % 函数wadd.m% global alpha beta% alpha = 1;% beta = 2;% s = wadd(1,2)
三.案例分析
% % 用筛选法求某自然数范围内的全体素数.% m = input('m=');% p = 1:m;% p(1) = 0;% for i = 2:sqrt(m)% for j = 2*i:i:m% p(j) = 0% end% end% n = find(p~=0)% p(n)%% m = input('m=');% p =2:m ;% for i = 2:sqrt(m)% n = find(rem(p,i) == 0 & p ~= i); %如果p对i取余为0,并且p不等于i% p (n) = [];% end% p% % 设f(x) = exp(0.5x)*sin(x+pi/6) ,求s = [0,3*pi]f(x)dx.% %----------------------------------------------------% a = 0;% b = 3*pi;% n = 10000;% h = (b-a)/n;% x =a; s = 0;% f0 = exp(-0.5*x)*sin(x+pi/6);% for i=1:n% x = x +h;% f1 = exp(-0.5*x)*sin(x+pi/6); %更新f1% s = s +(f0+f1)*h/2; %求小矩阵的值.累加.% f0=f1; %更新f0% end% s% %----------------------------------------------------% a = 0;% b = 3*pi;% n =1000;% h = (b-a)/n;% x = a:h:b;% f = exp(-0.5*x).*sin(x+pi/6); %求图形上的各点.% for i =1:n% s(i) = (f(i)+f(i+1))*h/2; %求小梯形的面积.% end% s = sum (s) %累加求积分值.% %----------------------------------------------------% % 斐波拉契数列% n = input('求斐波拉契数列的第n项,n=');% resultFFIB = ffib(n)