第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 顺序语句

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

4.3.2.1 for循环结构

新建“脚本 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

4.3.2.2 while循环结构

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

4.3.3.1 if条件语句流程图

\[设函数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.1 ifelseif语句示例

4.3.3.2 switch-case-otherwise条件语句

switch switch_expression
	case case_expression
		statements
	case case_expression
		statements
	...
	otherwise
		statements
end

4.3.3.2 switch条件语句流程图

新建“脚本 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

  1. break的作用是终止执行for或while循环,不执行循环中在break语句之后的语句。在嵌套循环中,break仅从它所发生的循环中退出并将控制传递给该循环end之后的语句。break是根据条件退出循环,其用法与continue用法类似,多与if语句配合使用以强制终止循环。
  2. 当break命令碰到空行时,将直接退出while循环。
  3. break语句是完全退出for或while循环;continue语句是跳过循环体中的其余指令,并开始下一次循环。
  4. 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 退出调试模式
posted @ 2026-01-12 09:03  Zhuye_inking  阅读(24)  评论(0)    收藏  举报