目录
顺序结构程序
程序和程序设计
1 程序
程序是用某种计算机能够理解并且能够执行的语言来描述的解决问题的方法和步骤。
2 程序设计的流程
程序的三种基本结构
1顺序结构
2选择结构
3循环结构
脚本文件和函数文件
脚本文件是可在命令行窗口直接执行的文件,也叫命令文件。
函数文件是定义一个函数,不能直接执行,而必须以函数调用的方式来调用它。
文件的建立
可以用命令按钮创建文件。
也可以在命令行窗口输入edit命令建立文件。例如建立一个test.m文件。
edit test
顺序结构
数据的输入
A=input(提示信息,选项);
MATLAB官方文档-input.
A=input(’请输入变量A的值:’);
请输入变量A的值:
数据的输出
disp(输出项);
s='Hello,World';
disp(s)
He11o,World
a=[1,2,3;4,5,6];
disp(a)
123456
程序的暂停
pause(延迟秒数)
若要强行中止程序的运行可使用Ctr1+C命令
输入原始数据–>对原始数据进行处理–>输出处理结果
例1 有一线段AB,A的坐标为(1,1),B的坐标为(4.5,4.5),求AB的长度,以及黄金分割点C的坐标。
a=input('a=');
b=input('b=');
c=a+0.618*(b-a);
s=abs(a-b);
disp(s)
disp(c)
用if语句实现选择结构
什么是选择结构
选择结构又称为分支结构,是根据给定的条件是否成立来决定程序的执行流程。
可以用if语句实现选择结构,也可以用switch语句实现选择结构。
单分支if语句
语句格式:
if条件1
语句组1
elseif条件2
语句组2
elseif条件m
语句组m
else
语句组n
end
双分支if语句
语句格式:
if条件
语句组1
else
语句组2
end
多分支if语句
语句格式:
if条件1
语句组1
elseif条件2
语句组2
elseif条件m
语句组m
else
语句组n
end
例1 输入一个整数,若为奇数则输出其平方根,否则输出其立方根。
x=input('请输入x的值:');
if rem(x,2)==1
y=sqrt(x);
else
y=x^(1/3);
end
y
例2 输入一个字符,若为大写字母,则输出其对应的小写字母;若为小写字母,则输出其对应的大写字母;若为数字字符则输出其对应数的平方,若为其他字符则原样输出。
c=input('请输入一个字符:','s');
if c>='A' && c<='Z'
disp(lower(c))%输出其对应的小写字母
elseif c>='a' && c<='z'
disp(upper(c))%输出其对应的大写字母
elseif c>='0' && c<='9'
disp(str2double(c)^2)
else
disp(c)
end
用switch语句实现选择结构
switch表达式
case结果表1
语句组1
case结果表2
语句组2
case结果表m
语句组m
otherwise
语句组n
end
注意:当任意一个分支的语句执行完后,整个switch语句执行完毕。整个过程只会执行一个语句组。
switch表达式应该是一个其值可以列举的表达式。
case结果表为switch表达式的取值,当取值有多个时,用单元数据表示。
例1 输入一个英文单词,判断它是否以元音字母开头。
c=input('请输入一个单词:','s');
switch c(1)
case {'A','E','I','O','U','a','e','i','o','u'}
disp([c,'以元音字母开头']);
otherwise
disp([c,'以辅音字母开头']);
end
c=input('请输入一个单词:','s');
if findstr(c(1),'AEIOUaeiou')>0
disp([c,'以元音字母开头']);
else
disp([c,'以辅音字母开头']);
end
例2 PM2.5是指大气中直径小于或等于2.5微米的可入肺颗粒物,是衡量空气质量的重要指标。假定空气质量等级以PM2.5数值划分为6级。 PM2.5数值在[0,35)空气质量为优,[35,75)为良,[75,115)为轻度污染,[115,150)为中度污染,[150,250)为重度污染,大于等于250为严重污染。编写程序,输入PM2.5数值,输出空气质量等级。
g=input('请输入PM2.5值:');
switch fix(g)
case num2cell(0:34) %num2cell函数:将数值矩阵转化为单元矩阵
disp('空气质量优');
case num2cell(35:74)
disp('空气质量良好');
case num2cell(75:114)
disp('空气质量轻度污染');
case num2cell(115:149)
disp('空气质量中度污染');
case num2cell(150:249)
disp('空气质量重度污染');
otherwise
disp('空气质量严重污染');
end
用for语句实现循环结构
for 循环变量=表达式1:表达式2:表达式3 %初值:步长:终值
循环体语句 %重复执行的语句
end
for语句针对向量的每一个元素执行一次循环体。
for k=[1,3,2,5]
end
% 循环四次
退出循环之后,循环变量的值就是向量中最后的元素值。
for k=1:2:10
end
% k=9
当向量为空时,循环体一次也不执行。
for k=1:-2:10
k
end
%一次也不执行
计算圆周率π。
(1)利用无穷级数展开式求π的近似值。
π
4
=
1
−
1
3
+
1
5
−
1
7
+
.
.
.
+
(
−
1
)
n
+
1
1
2
n
−
1
\frac{\pi}{4} =1-\frac{1}{3}+\frac{1}{5}-\frac{1}{7}+...+(-1)^{n+1} \frac{1}{2n-1}
4π=1−31+51−71+...+(−1)n+12n−11
这是求n个数之和的累加问题,可用以下递推式来描述:
y
i
=
y
i
−
1
+
f
i
(
y
0
=
0
)
y_{i}=y_{i-1}+f_i(y_0=0)
yi=yi−1+fi(y0=0)
前i项的和等于前i-1项的和加上第i项
可用以下赋值语句来实现。
y
=
y
+
f
y=y+f
y=y+f
其中累加项f的符号可用以下赋值语句来实现(每循环一次反号一次)。
g
=
−
g
g=-g
g=−g
累加项f就可用以下赋值语句来实现。
f
=
g
/
(
2
∗
i
−
1
)
f=g/(2*i-1)
f=g/(2∗i−1)
y=0;
g=-1;
n=input('n=?');
for i=1:n
g=-g;
y=y+g/(2*i-1);
end
p i = 4 ∗ y pi=4*y pi=4∗y
用向量求和的方法实现程序:
n=input('n=?');
x=1:2:(2*n-1);
y=(-1).^(2:n+1)./x;
pai=sum(y)*4
(2)利用定积分的近似值求π的近似值。
设
f
(
x
)
=
1
−
x
2
d
x
f(x)=\sqrt{1-x^2dx}
f(x)=1−x2dx
求
π
4
=
∫
0
1
f
(
x
)
d
x
\frac{\pi}{4}=\int_0^{1}{f(x)dx}
4π=∫01f(x)dx即求四分一单位圆的面积。
a=0;
b=1;
n=input('n=?');
h=(b-a)/n;
x=a:h:b;
f=sqrt(1-x.*x);
s=[];
for k=1:n
s1=(f(k)+f(k+1))*h/2;
s=[s,s1];
end
pi=4*sum(s)
(3)利用蒙特卡洛法求π的近似值。
在正方形内随机投点,设点落在圆内的概率为P。
P
=
π
/
4
P=\pi/4
P=π/4
π
=
4
P
\pi=4P
π=4P
P=落在圆内的点数/所投点的总数所投的点落在圆内的充要条件是
x
2
+
y
2
≤
1
x^2+y^2≤1
x2+y2≤1
s=0;
n=input('n=?');
for i=1:n
x=rand(1);
y=rand(1);
if x*x+y*y<=1
s=s+1;
end
end
pi=s/n*4
for语句更一般的格式为:
for循环变量=矩阵表达式
循环体语句
end
执行过程是依次将矩阵的各列元素赋给循环变量,然后执行循环体语句,直到各列元素处理完毕循环结束。
用while语句实现循环结构
while语句
格式:
while条件
循环体语句%循环判断条件
end
while语句多用于循环次数不确定的情况,而对于循环次数确定的情况,使用for语句更方便。
针对不同情况可以选择不同的循环语句,但从功能上讲两种循环语句可以相互替代。
break语句和continue语句
break语句用来跳出循环体,结束整个循环。
continue语句用来结束本次循环,接着进行下一次是否执行循环的判断。
循环的嵌套
如果一个循环结构的循环体又包括一个循环结构,就称为循环的嵌套,或称为多重循环结构。处于内部的循环叫做内循环,处于外部的循环叫做外循环。
例1 从键盘输入若干个数,当输入0时结束输入,求这些数的平均值和它们之和。
msum=0;
n=0;
x=input('Enter a number (end in 0):');
while x~=0
msum=msum+x;
n=n+1;
x=input('Enter a number (end in 0):');
end
if n>0
msum
mean=msum/n
end
例2 求[100,200]之间第一个能被21整除的整数。
for n=100:200
if rem(n,21)~=0
continue
end
n
break
end
例3 用筛选法求某自然数范围内的全部素数。
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)
函数文件的定义与调用
函数文件的基本结构
function输出形参表=函数名(输入形参表)
注释说明部分
函数体语句
当输出形参多于一个时,应该用方括号括起来,构成一个输出矩阵。
函数文件名通常由函数名再加上扩展名.m组成,函数文件名与函数名也可以不相同。当函数文件名与函数名不相同时,MATLAB将忽略函数名,调用时使用函数文件名。
return语句表示结束函数的执行。通常,在函数文件中也可以不使用return语句,那么被调用函数执行完成后会自动返回。
函数调用
调用格式:
[输出实参表]=函数名(输入实参表)
匿名函数
基本格式:
函数句柄变量=@(匿名函数输入参数)匿名函数表达式
函数句柄变量=@函数名
例1 编写函数文件,求半径为r的圆的面积和周长。
function [s,p]=fcircle(r)
s=pi*r*r;
p=2*pi*r;
例2 已知=(40)/((30)+(20))
①当()=+10 ln(^2+5)时,的值是多少。
②当()=1×2+2×3+3×4+⋯+×(+1)时,的值是多少。
分别用匿名函数和函数文件定义函数()。
第②问的函数文件f2.m。
function f=f2(n)
f=0;
for k=1:n
f=f+k*(k+1);
end
脚本文件mf.m。
f1=@(n) n+10*log(n*n+5);
y1=f1(40)/(f1(30)+f1(20))
y2=f2(40)/(f2(30)+f2(20))
函数的递归调用
函数的嵌套调用
如果在一个函数的定义中调用了其他函数这就是函数的嵌套调用。
函数的递归调用
一个函数调用它自身称为函数的递归调用。
function f=fact(n)
...
fact(n-1)
...
递归把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解。
(1)直接递归调用
(2)间接递归调用
例1 利用函数的递归调用,求n!。
函数文件fact.m如下:
function f=fact (n)
if n<=1
f=1;
else
f=fact (n-1)*n; %递归调用求(n-1)!
end
在脚本文件a.m中调用函数文件fact.m,求n!。
n=input('Please input n=');
s=fact (n);
disp(s)
例2 Fibonacci数列定义如下:
f1=1
f2=1
fn=fn-1+fn-2 (n>2)
编写递归调用函数求Fibonacci数列的第n项,然后调用该函数验证Fibonacci数列的如下性质:
f
1
2
+
f
2
2
+
f
3
2
+
…
…
+
f
n
2
=
f
n
×
f
n
+
1
f_1^2+f_2^2+f_3^2+……+f_n^2=f_n×f_{n+1}
f12+f22+f32+……+fn2=fn×fn+1
首先建立函数文件ffib.m。
function f=ffib(n)
if n>2
f=ffib(n-1)+ffib(n-2);
else
f=1;
end
建立程序文件test.m。
F=[];
for k=1:20
F=[F,ffib(k)*ffib(k)];
end
sum(F)
ffib(20)*ffib(21)
函数参数与变量的作用域
函数参数的可调性
nargin:输入实参的个数
nargout:输出实参的个数
全局变量与局部变量
局部变量:在程序中只在特定过程或函数中可以访问的变量。
全局变量:所有的函数都可以对它进行存取和修改。
全局变量定义格式:
global变量名
例1 利用nargin和nargout建立函数文件test.m。
function fout=test(a,b,c)
if nargin==1
fout=a;
elseif nargin==2
fout=a+b;
elseif nargin==3
fout=(a*b*c)/2;
end
例2 利用全局变量建立函数文件wad.m。
function f=wad(x,y)
global ALPHA BETA
f=ALPHA*x+BETA*y;%求权
课程链接:《科学计算与MATLAB语言》