第二章 M文件程序设计,matlab

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 = \'不及格\';
    end
end
disp([\'学生姓名 \',\' 得分  \',\' 等级 \']);
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.1593


p =

   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)

Published with MATLAB® 7.10

f2c.m

clc;

clear;

F= input(\'输入华氏温度F:\');

C = 5*(F-32)/9;

disp(\'华氏温度F为\')

disp(F)

disp(\'转换为摄氏温度C是\')

disp(C)

factor.m

function f = factor(n)

if n<=1

f = 1;

else

f = factor(n-1)*n;

end

fcircle.m

function [s,p] = fcircle(r)

% CIRCLE calculate the zrea and perimeter of a circle of radir r

% r 圆半径

% s 圆面积

% p 圆周长

s = pi*r*r;

p = 2*pi*r;

% lookfor perimeter

% fcircle - CIRCLE calculate the zrea and perimeter of a circle of radir r

ffib.m

function f =ffib(n)

if n >2

f = ffib(n-1) + ffib(n-2);

else

f =1;

end

tran.m

%% tran.m

function [rho,theta] = tran(x,y)

rho = sqrt (x*x+y*y);

theta = atan (y/x);

wadd.m

function f = wadd(x,y)

global alpha beta

f = alpha*x+beta*y;

F:\matlab\work\TongXingYuanLi\Chapter2\type>