第4章 程序设计与调试
第4章 程序设计与调试
4.1 全局变量
global var1 var2;
新建“函数 exga.m 文件”
function z=exga(y)
global X % 在函数exga(y)中声明了一个全局变量
z=X*y;
end
>> global X % 在基本工作空间中进行全局变量X的声明
>> X=3;
>> z=exga(2)
z =
6
>> whos global % 查看工作空间中的全局变量
Name Size Bytes Class Attributes
X 1x1 8 double global
4.2 M文件结构
| 文件内容 | 描述 |
|---|---|
| 函数定义行(只存在于函数文件中) | 定义函数名称,定义输入输出变量的数量、顺序 |
| H1行 | 对程序进行总结说明的一行 |
| help文本 | 对程序的详细说明,在调用help命令查询该M文件时和H1行一起显示在命令窗口中 |
| 注释 | 具体语句的功能注释、说明 |
| 函数体 | 进行实际计算的代码 |
4.3 程序流程语句
4.3.1 顺序语句
新建“脚本 test.m 文件”
a=3 % 定义变量a
b=5 % 定义变量b
c=a*b % 求变量a、b的乘积,并赋给c
>> test
a =
3
b =
5
c =
15
4.3.2 循环语句
4.3.2.1 for循环
for index=values
statements
end
新建“脚本 forloop1.m 文件”
for i=1:3
y(i)=cos(i)
end
>> forloop1
y =
0.5403
y =
0.5403 -0.4161
y =
0.5403 -0.4161 -0.9900
新建“脚本 forloop2.m 文件”
for i=1:3
for j=1:2
A(i,j)=i+j
end
end
>> forloop2
A =
2
A =
2 3
A =
2 3
3 0
A =
2 3
3 4
A =
2 3
3 4
4 0
A =
2 3
3 4
4 5
新建“脚本 forloop3.m 文件”
for v=[1 5 8 17]
disp(v)
end
>> forloop3
1
5
8
17
4.3.2.2 while循环
while expression
statements
end
sum=0; n=0;
while sum<=100
n=n+1;
sum=sum+n;
end
>> whileloop
>> disp(sprintf('\n 1+2+...+n>100最小的n值=%3.0f,其和=%5.0f',n,sum))
1+2+...+n>100最小的n值= 14,其和= 105
4.3.3 条件语句
4.3.3.1 if-elseif-else语句
if expressions;
statements;
elseif expressions;
statements;
elseif expressions;
statements;
...
else
statements;
end
\[设函数f(x)=\begin{cases} 1,-1 \le x \le 0 \\ 4x+1,0 < x \le 1 \\ x^2+4x,1 < x \le 2 \end{cases},画出f(x)关于x的图形。
\]
新建“脚本 ifelseif.m 文件”
x=linspace(-1,2,100);
for i=1:length(x)
if x(i)<=0
y(i)=1;
elseif x(i)<1
y(i)=4*x(i)+1;
else % 限定x≤2的部分
y(i)=x(i)^2+4*x(i);
end
end
plot(x,y)
4.3.3.2 switch-case-otherwise条件语句
switch switch_expression
case case_expression
statements
case case_expression
statements
...
otherwise
statements
end
新建“脚本 seitchcon.m 文件”
n=input('Enter a number:');
switch n
case -1
disp('negative one')
case 0
disp('zero')
case 1
disp('positive one')
otherwise
disp('other value')
end
>> switchcon
Enter a number:1 % 输入1
positive one
>> switchcon
Enter a number:0 % 输入0
zero
>> switchcon
Enter a number:3 % 输入3
other value
4.3.4 其他流程控制语句
4.3.4.1 continue
continue将控制传递给for或while循环的下一次循环,即结束本次循环,跳过循环体中尚未执行的语句,接着进行下一次是否执行循环的判断。continue仅在调用它的循环的主体中起作用,在嵌套循环中,continue仅跳过循环所发生的循环体内的剩余语句。
新建“脚本 continuea.m 文件”
fid=fopen('ifelseif.m','r');
count=0;
while ~feof(fid)
line=fgetl(fid);
if isempty(line) || strncmp(line,'%',1) || ~ischar(line)
continue
end
count=count+1;
end
“脚本 ifelseif.m 文件”如下:
x=linspace(-1,2,100);
for i=1:length(x)
if x(i)<=0
y(i)=1;
elseif x(i)<1
y(i)=4*x(i)+1;
else % 限定x≤2的部分
y(i)=x(i)^2+4*x(i);
end
end
plot(x,y)
>> continuea
>> disp(sprintf('%d lines',count));
11 lines
4.3.4.2 break
- break的作用是终止执行for或while循环,不执行循环中在break语句之后的语句。在嵌套循环中,break仅从它所发生的循环中退出并将控制传递给该循环end之后的语句。break是根据条件退出循环,其用法与continue用法类似,多与if语句配合使用以强制终止循环。
- 当break命令碰到空行时,将直接退出while循环。
- break语句是完全退出for或while循环;continue语句是跳过循环体中的其余指令,并开始下一次循环。
- break用于退出循环,是在for或while循环之内定义的;退出函数时要用return。
新建“脚本 breaka.m 文件”
% 求随机数序列之和
limit=0.8;
s=0;
while 1
tmp=rand;
if tmp>limit
break
end
s=s+tmp;
end
>> breaka
>> disp(sprintf('Sum of random number sequence: %d',s));
Sum of random number sequence: 1.555279e+00
>> breaka
>> disp(sprintf('Sum of random number sequence: %d',s));
Sum of random number sequence: 0
>> breaka
>> disp(sprintf('Sum of random number sequence: %d',s));
Sum of random number sequence: 1.576131e-01
>> breaka
>> disp(sprintf('Sum of random number sequence: %d',s));
Sum of random number sequence: 0
>> breaka
>> disp(sprintf('Sum of random number sequence: %d',s));
Sum of random number sequence: 4.853756e-01
4.3.4.3 return
return可是正在运行的函数正常退出,并返回调用它的函数继续运行,经常用于函数的末尾以正常结束函数的运行。当然,也可用在某条件满足时强行结束执行该函数。
4.3.5 人机交互命令
4.3.5.1 echo
%% 脚本式M文件
echo on % 显示其后所有执行的命令文件的指令
echo off % 不显示其后所有执行的命令文件的指令
echo % 在上述两种情况之间切换
%% 函数式M文件
echo filename on % 使filename指定的M文件的执行命令显示出来
echo filename off % 使filename指定的M文件的执行命令不显示
echo on all % 显示其后的所有M文件的执行指令
echo off all % 不显示其后的所有M文件的执行指令
4.3.5.2 error
error(msg) % 指出错误并显示错误消息msg
4.3.5.3 keyboard
%在M文件中加入keyword
>> test
K>>
4.3.5.4 pause
pause % 停止M文件的执行,按任意键继续执行
pause(n) % 中止执行程序n(单位为s)后继续,n是任意实数
pause on % 允许后续的pause命令中止程序的运行
pause off % 禁止后续的pause命令中止程序的运行
4.3.6 程序调试命令
| 命令 | 调用格式 | 功能 |
|---|---|---|
| dbstop | dbstop in file | 在M文件file的第一可执行代码行位置设置断点 |
| dbstop in file at location | 在M文件file的location指定位置代码行上设置断点 | |
| dbstop in file if exp | 当满足条件exp时,暂停运行程序。当发生错误时,条件exp可以是error;发生NaN或inf时,条件exp也可以是naninf或infnan | |
| dstop if condition | 在满足指定的condition(如error或naninf)的行位置处暂停执行 | |
| dbstop(b) | 用于恢复之前保存到b的断点。文件必须位于搜索路径中或当前文件夹中 | |
| dbclear | dbclear all | 清除所有M文件中的所有断点 |
| dbclear in file | 清除文件file第一可执行程序上的所有断点 | |
| dbclear in file at location | 删除在指定文件中指定位置设置的断点,关键字at和in为可选参数 | |
| dbclear if condition | 删除指定condition(如dbstop if error或dbstop if naninf)设置的所有断点 | |
| dbstatus | dbstatus | 列出所有有效断点,包括错误、捕获的错误、警告和naninfs |
| dbstatus file | 列出指定file文件中所有有效断点 | |
| dbstatus file -completenames | 为指定文件中的每个断点显示包含该断点的函数或文件的完全限定名称 | |
| dbstep | dbstep | 执行下一可执行代码行,跳过当前行所调用的函数中设置的任何断点 |
| dbstep in | 在下一个调用函数的第一可执行程序处停止运行 | |
| dbstep out | 将运行当前函数的其余代码并在退出函数后立即暂停 | |
| dbstep nlines | 执行nlines指定的可执行代码行数,然后停止 | |
| dbcont | dbcont | 执行所有行程序,直至遇到下一个断点、满足暂停条件、或到达文件尾为止 |
| dbquit | dbquit | 退出调试模式 |

浙公网安备 33010602011771号