3.1 顺序结构程序
1.程序三种基本结构
顺序解雇、选择结构、循环结构。
2.脚本文件和函数文件
脚本文件:可以在命令行直接执行的文件。
函数文件:定义一个函数,不可直接运行,必须以函数调用的方式来调用它。
3.文件的建立
(1)按钮实现文件的创建。
(2)用edit命令创建文件
>>edit test
会在当前文件夹创建test.m的文件并打开matlab编辑器,输入.m文件的内容并存盘文件就创建成功了。
Eg:分别建立脚本文件和函数文件,求乘积。
a.建立脚本文件:f1.m。
A=[1 2 3;4 5 6];
B=[1 2 ;3 4;5 6];
C=A*B
b.命令行运行脚本文件
c.建立函数文件f2.m
function C=f2(A,B)
C=A*B
d.命令行窗口调用函数文件
4.顺序结构
(1)数据的输入:A=input(‘提示信息’,输入类型)。
(2)数据的输出:disp(输出项)。多个内容用向量表示eg:disp([a,b,c])。
(3)程序的暂停:pause(延迟秒数)。强行终止程序可用Ctrl+C命令
3.2 用if语句实现选择结构
1.单分支if语句
(1)格式
if 条件 (标量:零表示不成立,反之成立;矩阵:含0元素或者矩阵为空则不成立,反之成立)
语句组(一条或者多条语句)
end
2.双分支if语句
(1)格式
if 条件
语句组1
else
语句组2
end
3.多分支if语句
(1)格式
if 条件 1
语句组1
elseif 条件2
语句组2
...
else
语句组n
end
eg:输入一个字符,若为大写字母,则输出对应的小写字母;如果为小写,则输出对应的大写字母;如果为数字,则输出对应数字的平方;若为其他,则原样输出。
a=input('请输入一个字符:','s');
if a>='a'&&a<='z'
disp(upper(a))
elseif a>='A'&&a<='Z'
disp(lower(a))
elseif a>='0'&&a<='9'
disp(str2double(a)^2)
else
disp(a)
end
3.3 用switch语句实现选择结构
1.switch语句的格式
(1)语法格式
switch 表达式
case 结果表1
语句组1
case 结果表2
语句组2
...
otherwise
语句组n
end
注意:switch表达式应该是其值可以列举的表达式;case当取值为多个时,用单元数据表示。例如:case {3,4,5}
Eg:输入一个英文单词,判断他是否以元音字母开头。
法一:switch语句
a=input('请输入英文单词:','s');
switch a(1)
case {'A','E','I','O','U','a','e','i','o','u'}
disp([a,'以元音字母开头'])
otherwise
disp([a,'以辅音字母开头'])
end
法二:字符串处理函数
a=input('请输入一个单词:','s');
if findstr('AEIOUaeiou',a(1))>0
disp([a,'该单词以元音字母开头'])
else
disp([a,'该单词以辅音字母开头'])
end
3.4 用for语句实现循环结构
1.for语句格式
for 循环变量=表达式1:表达式2:表达式3(冒号表达式)或者矩阵表达式
循环体语句
end
(1)for语句针对向量的每一个元素执行一次循环体。
(2)退出循环后,循环变量的值就是向量中最后的元素值for k=1:2:10。最后k的值为9。
2.循环体变量为矩阵表达式
遍历顺序:按列遍历,比如for k=[1 5;2 6;3 7;4 8] k=1 2 3 4 5 6 7 8
3.5 用while语句实现循环结构
1.while语句格式
while 条件
循环体语句
end
eg:从键盘输入若干数,当输入0时结束,求这些数的平均值和他们的和。
sum=0;
n=0;
x=input("Enter a number(end in 0):");
while x~=0
sum=sum+x;
n=n+1;
x=input("Enter a number(end in 0):");
end
if n>0
disp(sum)
average=sum/n
else
disp("Error")
end
2.流程转向语句
(1)break语句:终止循环
(2)continue语句:结束本次循环
Eg:求[100,200)之间第一个能被21整除的整数。
for n=100:200
if rem(n,21)~=0
continue
else
disp(n)
break
end
end
3.循环的嵌套
Eg:用筛选法求某自然数范围内的全部素数。
m=input("m=:");
for x=2:m
flag=1;%假设x是素数
for y=2:sqrt(x)
if rem(x,y)==0
flag=0;%x非素数
break
end
end
if flag==1
disp(x)
end
end
3.6 函数文件的定义与调用
1.函数文件的基本结构
(1)格式
function 输出形参表=函数名(输入形参表)
注释说明部分
函数体语句
(2)注意:当输入有多个形参时,用逗号分隔,形成形参表;当输出形参多于1个时,用方括号括起来,构成输出矩阵。
2.函数文件名和函数名
函数文件名通常由函数名+.m的扩展组成,函数文件名和函数名也可以不相同,此时matlab将忽略函数名,调用函数文件名,因此为了方便理解,通常相同。
3.函数的调用
(1)调用格式:输出实参列表=函数名(输入实参表)。
Eg:编写函数文件名,求半径为r的圆的周长和面积。
fcircle.m
function [s,p]=fcircle(r)
s=pi*r*r;
p=2*pi*r;
调用:
>> [s,p]=fcircle(3)
s =28.2743
p =18.8496
4.匿名函数
(1)格式
函数句柄变量=@(匿名函数输入参数)匿名函数表达式
多个参数用逗号分隔。
(2)调用
通过句柄调用
Eg:
>> f=@(x,y)x^2+y^2
f =
包含以下值的 function_handle:
@(x,y)x^2+y^2
>> f(3,4)
ans =
25
>>
(3)调用已定义函数
函数句柄变量=@函数名
Eg:>> h=@sin
h =包含以下值的 function_handle:
@sin
>> h(pi/2)
ans =1
eg:已知y=f(40)/(f(30)+f(20))
1.当f(n)=n+10ln(n*n+5)时,y的值?
2.当f(n)=1*2+2*3+...n*(n+1)时,y的值?
分别用匿名函数和函数文件定义f(n)
定义函数文件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^2+5);
y1=f1(40)/(f1(30)+f1(20))
y2=f2(40)/(f2(30)+f2(20))
运行:>> mf
y1 =0.6390
y2 =1.7662
3.7 函数的递归调用
1.斐波那契数列定义如下:f1=f2=1,fn=fn-1+fn-2。编写递归函数求斐波那契数列第n项,然后验证:f1^2+f2^2+...+fn^2=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)^2];
end
sum(F)
ffib(20)*ffib(21)
运行test.m文件
>> test
ans =74049690
ans =74049690
注意:实际上,递归通常会增加空间和执行时间的开销。因为每次递归调用都会在堆栈上保存一个新的函数调用信息(如参数和局部变量),这会占用更多内存。同时,每次调用都需要消耗时间来进行函数调用和返回操作。因此,递归一般比非递归的方法更耗资源。
3.8 函数参数与变量的作用域
1.函数参数的可调性
nargin------------>调用函数时,输入实参个数
nargout----------->调用函数时,输出实参个数
eg:建立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
运行test.m
>> fout=test(2)
fout =2
>> fout=test(2,3)
fout =5
>> fout=test(2,3,4)
fout =12
2.全局变量和局部变量
(1)局部变量:程序中只在特定过程或函数中可以访问的变量。
(2)全局变量:作用域是整个matlab工作区间,所有函数都可以对他进行存取和修改。
(3)定义全局变量:global 变量名1 变量名2
Eg:
建立函数wad.m
function f=wad(x,y)
global ALPHA BETA
f=ALPHA*x+BETA*y;
在命令窗口中输入命令:
>> global ALPHA BETA
>> ALPHA=1;
>> BETA=2;
>> s=wad(3,4)
s =11