程序控制语句
- 程序的三种基本结构:顺序结构、选择结构、循环结构
- 程序文件分为脚本文件和函数文件
-
区分
- 脚本文件是可以在命令行窗口直接执行的文件,也叫作命令文件;
- 函数文件是定义一个函数,不能直接执行,而必须以函数调用的方式来调用它。
例:
创建脚本文件和函数文件(可用edit命令创建)
1顺序结构
- 按照数据出现的顺序进行处理
例:
线 段 A B , A ( 1 , 1 ) , B ( 4.5 , 4.5 ) , 求 A B 的 长 度 以 及 黄 金 分 割 点 C 的 坐 标 线段AB,A(1,1),B(4.5,4.5),求AB的长度以及黄金分割点C的坐标 线段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); %取模(abs函数:求实数的绝对值、复数的模、字符串的ASCII码值。)
disp(s)
disp(c)
1.1数据的输入
-
调用格式
-
A=input(提示信息,选项)
>>A=input('请输入变量A的值:')
请输入变量A的值:100 %运行提示键盘输入
A =
100
1.2数据的输出
-
调用格式
-
disp(输出项)
>>s='Hello World!';
s =
Hello World!
>>disp(s)
Hello World! %输出格式无变量的名字
1.3程序暂停
-
调用格式
-
pause(延迟秒数)
- 如果省略参数延迟秒数,则程序暂停,直到用户按任意键结束暂停
- 若要强行中止程序的运行,可使用ctrl+c命令
一个程序一般包括
- 输入原始数据
- 对原始数据进行处理
- 输出处理结果
2选择结构
又称为分支结构,是根据给定的条件是否成立来决定程序的执行流程
- if 选择结构
- switch 选择结构
2.1 if语句实现选择结构
2.1.1单分支if语句
格式
if 条件
语句组
end
- 条件:关系运算或逻辑运算来表结果是一个标量或者矩阵
1.当条件结果为标量时,非零表示条件成立,零表示条件不成立。
2.当条件结果为矩阵时,如果矩阵是非空矩阵,且不包含零元素,则条件成立,否则条件不成立。 - 语句组:一条或多条语句
2.1.2双分支if语句
格式
if 条件
语句组1
else
语句组2
end
例:
输入一个整数,若为奇数则输出其平方根,否则输出其立方根。
x = input('Please input a number:');
if rem(x,2) == 1 %取余 => rem(x,2)
s = sqrt(x);
else
s = x ^ (1/3); % => power(x,1/3)
end
disp(s);
2.1.3多分支if语句
格式
if 条件1
语句组1
else if 条件2
语句组2
···
else if 条件n
语句组n
end
例:
输入一个字符。
若为大写字母,则输出其对应的小写字母;
若为小写字母,则输出其对应的大写字母;
若为数字字符,则输出其对应数的平方;
若为其他字符,则原样输出。
x=input('请输入一个字符:','s'); %定义输入的字符为s
if x>='A'& x<='Z'
y=char(x+('a'-'A')); %lower(x) char函数把ASCII码矩阵转换为字符串矩阵
else if x>='a'& x<='z'
y=char(x-('a'-'A')); %upper(x)
else if x>='0'
y=(str2double(x))^2; %把字符串转换为数值
else
y=x;
end
end
end
disp(y)
2.2 swich语句实现选择结构
格式
switch 表达式
case 结果表1
语句组1
case 结果表2
语句组2
···
case 结果表n
语句组n
otherwise
语句表m
end
- switch表达式其值可以列举
- case结果表为switch表达式的取值,当取值有多个时,用单元数据表示
例:输入一个英文单词,判断其是否以元音字母开头
x=input('请输入一个英文单词:','s');
switch x(1)
case {'A','E','I','O','U','a','e','i','o','u'}; %多个结果组成一个单元数据
disp ('以元音字母开头');
otherwise
disp ('以辅音字母开头');
end
3循环结构
循环结构又称为重复结构:重复执行某些条件(循环体)
3.1 for语句实现循环结构
- 确定循环次数
格式
for 循环变量=表达式1(初):表达式2(步长):表达式3(终)/矩阵表达式
循环体语句
end
- 表达式2可以省略
说明:
- for语句针对向量的每一个元素执行一次循环体。向量有多少个元素,for语句就执行多少次循环体语句。
- 退出循环后,循环变量的值就是向量的最后一个元素值。
- 当向量为空时,循环体一次也不会执行。例如:k=1: -1:10就是一个空向量
例:
求Π的值(pai/4=1-1/3+1/5-1/7+…+(-1)^(n+1)/2n-1)
y=0;
g=1;
n=input('n=');
for i=1:n
f=g*1/(2*i-1);
y=y+f;
g=-g;
end
pai=4*y
%利用矩阵运算
n=input('n=');
x=1:2:(2*n-1);
y=(-1).^(2:n+1)./x; %y是一个矩阵
pai=4*sum(y) %sum向量求和
%定积分求Π/4
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
pai=4*sum(s)
%蒙特卡洛法
s=0
n=input('n=')
for i=1:n
x=rand(1)*2-1;
y=rand(1)*2-1;
if x^2+y^2<=1
s=s+1;
end
end
pai=s/n*4
3.2 while语句实现循环结构
- 循环次数不确定
格式
while 条件
循环语句体
end
例:
从键盘输入任何数,输入0时输入结束,求这些数的平均值和它们之和。
s=0;
n=0;
x=input('x=');
while x~=0
s=s+x;
n=n+1;
x=input('x=');
end
if n>0
mean=s/n;
end
s
mean
bread语句和continue语句
- break语句用来跳出循环体,结束整个循环。
- continue语句用来结束本次循环,接着进行下一次是否执行循环的判断。
例:
求[100, 200]之间第一个能被21整除的整数
for n=100:999
if rem(n,21)~=0;
continue;
end
disp(n)
break %跳出循环
end
3.3 循环的嵌套
- 如果一个循环结构的循环体又包含一个循环结构,就称为循环的嵌套,或称为多重循环结构。
例:筛选法求出某自然数范围内的全部素数
%寻找m以内的素数
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)
4函数文件的定义与调用
4.1函数文件的定义
-
格式
-
function 输出形参表=函数名(输入形参表)
注释说明部分
函数体语句
-
当有多个形参时,形参之间用逗号分隔,组成形参表。
-
当输出形参多于一个时,用方括号括起来,构成一个输出矩阵。
-
函数文件名通常由函数名再加上扩展名.m组成,函数文件名与函数名也可以不相同。当函数文件名与函数名不相同时,MATLAB将忽略函数名,调用该函数时使用函数文件名。建议函数文件名与函数名一致。
-
return语句表示结束函数的执行。通常也可以不使用return语句。
例:
编写函数文件,求半径为r的圆的面积和周长
function [ s,p ] = fcircle( r ) %fcircle为函数名
%fcircle 此处显示有关此函数的摘要
% 此处显示详细说明
s=pi*r*r;
p=2*pi*r;
end
4.2函数文件的调用
-
格式
- [输出实参表] = 函数名(输入实参表)
- 在函数调用时,函数输入输出参数称为实际参数,简称实参。
- 输入输出的实参应当与函数定义时的形参个数、顺序一致。函数调用时,先将实参传递给相应的形参,从而实现参数传递,然后再执行函数的功能。
[s,p]=fcircle(1)
s =
3.1416
p =
6.2832
4.3匿名函数
-
格式
- 函数句柄变量 = @(匿名函数输入参数)匿名函数表达式
函数句柄变量相当于这个匿名函数的别名。
利用函数句柄可以间接地调用这个函数,@是创建函数句柄的运算符
例:
创建一个函数,该函数的表达式为x²+y²,并求x=3, y=4时的函数值。
f=@(x,y)x^2+y^2
f(3,4)
ans =
25
除了可以给自定义的函数表达式创建函数句柄以外,还可以给已存在的函数创建函数句柄(包括内部函数和自定义函数)。
-
格式
- 函数句柄变量 = @函数名
h=@fcircle
h(1)
ans =
3.1416
5函数的递归调用
函数的嵌套调用
在一个函数的定义中,调用了其他函数,这就是函数的嵌套调用。
函数的递归调用
一个函数调用它自身称为函数的递归调用。
- 递归是把一个大型复杂的问题层层转化为一个与原问题相似的、规模较小的问题来求解
1.直接递归调用:在定义函数时直接调用这个函数本身
2.间接递归调用:通过嵌套调用其他函数,在其他函数中又调用这个函数本身来实现
例:利用函数的递归调用求n!
n=input('n=');
s=fcircle(n);
disp(s)
function f=fcircle(n)
if n<=1
f=1;
else
f=fcircle(n-1)*n;
end
end
6函数参数与变量的作用域
6.1函数参数的可调性
1.MATLAB在函数调用上有一个特点,就是函数所传递的参数数目是可调的,由于这个特点,同一个函数就可以完成多种功能。
2.在调用函数时,MATLAB有两个预定义变量,nargin和nargout。
- nargin记录调用这个函数时输入实参的个数
- nargout记录调用这个函数时输出实参的个数
clear; clc;
f1 = fout(10);
disp(f1);
f2 = fout(10, 10);
disp(f2);
f3 = fout(10, 10, 10);
disp(f3);
%%
function f = fout(a,b,c)
if nargin == 1
f = a;
else if nargin == 2
f = a + b;
else if nargin == 3
f = (a * b * c) / 3;
end
end
end
end
6.2全局变量和局部变量
- 局部变量是指程序中只在特定过程或函数中可以访问的变量。
- 变量的作用域是整个MATLAB工作空间,也就是全程有效,所有的函数都可以对它进行存取或修改。
-
定义格式
- global 变量名