octave结构化程序设计流程结构
一、条件转移结构
基本形式:
f 条件表达式
语句段
end
执行流程:若表达式条件成立,执行语句段,否则跳过语句段的执行。
若需要多条件转移,一般是三个或以下:
if 条件表达式1
语句段1
elseif 条件表达式2
语句段2
else
语句段3
end
注意事项:if或else中的语句无需{}包围
一组if语句必须以end结尾
1 function y = ifSam() 2 x = input('please input x:'); 3 y = 0; 4 if x < 0 5 y = -1; 6 elseif x == 0 7 y = 0; 8 else 9 y = 1; 10 end
也可以直接输入上述语句执行,为了方便,我封装成了函数而已,以下也都一个做法。
二、开关结构,多分支结构,通常多过3个
基本形式:
switch 开关表达式
case 表达式1
语句段1
case 表达式2
语句段2
…
case 表达式n
语句段n
oterwise
语句段n+1
end
执行流程:根据开关表达式的结果,与接下来的一系列case后的表达式1...n比较,任一条件满足,则执行对应的语句段;若没有符合的表达式,则执行otherwise下的语句段n+1
注意事项:开关表达式只能是标量或字符串
case中的语句段后不需要break,执行完自动退出,若多个case的语句段一样,可以用{}将借个表达式包括,用逗号隔开即可
otherwise中的语句段是case所有语句段的保险语句,不能省略。切记,不要混用成c语言中的default了
1 function switchSam() 2 g = input('please input grade: ', 's'); 3 4 switch (g) 5 case{'a', 'A'} 6 disp('85~100'); 7 case{'b', 'B'} 8 disp('70~84'); 9 case{'c', 'C'} 10 disp('60~69'); 11 case{'d', 'D'} 12 disp('< 60'); 13 otherwise 14 disp('input error!') 15 end
三、循环结构for和while,前者用于提前已知循环的次数的循环结构,后者通常用于无法提前预知循环的次数的循环结构中
基本形式:
for 循环变量 = v %v通常为行向量 while 条件表达式
语句段 语句段
end end
执行流程:for循环执行时,每次从v中取一个数值,执行一次语句段;
再次从v中取一个数值,并再次执行语句段;
直到v中的数据全部被取完为止。for循环停止执行
while循环执行,先行判断条件表达式是否成立;
若成立,则执行语句段,除非是需要死循环,否则,语句段中一定会包含让条件表达式变化的语句;
再次判断while后的条件表达式,若成立,则像上一步一样继续执行;
直至到while后面的表达式不成立,则跳出循环,结束循环。
注意事项:绝大多数的循环都可以同时用for和while实现,根据需要自己选择
无论是for还是while中都可以加入break和continue语句,前者是退出整个循环,continue则是退出当次的循环
1 function resul = forSam(init, n) 2 for i = 1 : n 3 resul = init^2 - 1; 4 init = resul; 5 end
1 function resul = whileSam(init, n) 2 while n > 0 3 resul = init^2 - 1; 4 %init = resul; %每次不输出init>的结果 5 init = resul %每次输出中间结>果 6 n = n - 1; 7 end
这两种循环都是可以的,开心就好,随意选择。
四、试探结构
基本形式:
try
语句段1
catch
语句段2
end
执行流程:先行执行语句段1,若没有出现错误,跳过语句段2;
执行语句段1出现错误,执行语句段2
注意事项:提供了一种错误的捕获机制
1 function trySam() 2 var1 = rand(3, 4); 3 var2 = magic(5); 4 try 5 var1 * var2; 6 disp(var1 * var2); 7 catch 8 disp(var1); 9 disp(var2); 10 end
代码第5行是将矩阵相乘,但是var1和var2不满足相乘条件,但是依旧吧第8 9行执行了
1 function val = trySamV2(a) 2 index = input('input the element index: '); 3 4 try 5 %disp(int2str(a(index))); 6 disp(a(index)); 7 catch 8 disp('out of range!'); 9 end
向量下标越界也能自动处理了