流程控制
条件语句
if 语句
基本的 if 语句用于条件执行:
if condition
# 条件为真时执行
end
示例
x = 10
if x > 0
disp("x 是正数")
end
# 条件表达式
score = 85
if score >= 60
disp("及格")
end
if-else 语句
使用 else 子句处理条件为假的情况:
if condition
# 条件为真时执行
else
# 条件为假时执行
end
示例
x = -5
if x >= 0
disp("x 是非负数")
else
disp("x 是负数")
end
# 判断奇偶
n = 7
if mod(n, 2) == 0
disp("偶数")
else
disp("奇数")
end
if-elseif-else 语句
使用 elseif 处理多个条件:
if condition1
# condition1 为真时执行
elseif condition2
# condition1 为假,condition2 为真时执行
elseif condition3
# 前面的条件都为假,condition3 为真时执行
else
# 所有条件都为假时执行
end
示例
score = 85
if score >= 90
grade = "A"
elseif score >= 80
grade = "B"
elseif score >= 70
grade = "C"
elseif score >= 60
grade = "D"
else
grade = "F"
end
disp("成绩等级:" + grade)
# 判断数的符号
x = 0
if x > 0
disp("正数")
elseif x < 0
disp("负数")
else
disp("零")
end
嵌套 if 语句
x = 10
y = 20
if x > 0
if y > 0
disp("x 和 y 都是正数")
else
disp("x 是正数,y 不是正数")
end
else
disp("x 不是正数")
end
逻辑运算符组合条件
x = 15
# 使用 && (逻辑与)
if x > 10 && x < 20
disp("x 在 10 到 20 之间")
end
# 使用 || (逻辑或)
if x < 0 || x > 100
disp("x 超出正常范围")
end
# 使用 ! (逻辑非)
if !(x == 0)
disp("x 不为零")
end
for 循环
for 循环用于重复执行代码块指定的次数:
for variable = expression
# 循环体
end
基本用法
# 循环 1 到 10
for i = 1:10
disp(i)
end
# 指定步长
for i = 0:2:10
disp(i) # 输出: 0, 2, 4, 6, 8, 10
end
# 递减循环
for i = 10:-1:1
disp(i) # 从 10 倒数到 1
end
遍历向量
# 遍历向量元素
vec = [1 4 9 16 25]
for val = vec
disp(val)
end
# 使用索引访问
for i = 1:length(vec)
disp("vec(" + num2str(i) + ") = " + num2str(vec(i)))
end
累加求和
# 计算 1 + 2 + ... + 100
sum = 0
for i = 1:100
sum = sum + i
end
disp("和为:" + num2str(sum)) # 5050
# 计算阶乘
n = 10
factorial = 1
for i = 1:n
factorial = factorial * i
end
disp(num2str(n) + "! = " + num2str(factorial))
嵌套循环
# 生成乘法表
for i = 1:9
for j = 1:9
product = i * j
disp(num2str(i) + " × " + num2str(j) + " = " + num2str(product))
end
end
# 生成矩阵
n = 5
A = zeros(n, n)
for i = 1:n
for j = 1:n
A(i, j) = i + j
end
end
while 循环
while 循环在条件为真时重复执行:
while condition
# 循环体
end
基本用法
# 计数循环
i = 1
while i <= 10
disp(i)
i = i + 1
end
# 累加到达阈值
sum = 0
i = 1
while sum < 100
sum = sum + i
i = i + 1
end
disp("累加到 " + num2str(i-1) + " 时超过 100")
迭代直到收敛
# 牛顿法求平方根
x = 2
guess = 1
tolerance = 1e-6
while abs(guess * guess - x) > tolerance
guess = (guess + x / guess) / 2
end
disp("sqrt(" + num2str(x) + ") ≈ " + num2str(guess))
条件等待
# 模拟等待条件满足
count = 0
threshold = rand() * 10
while count < threshold
count = count + 1
disp("计数: " + num2str(count))
end
disp("达到阈值!")
break 语句
break 用于立即退出循环:
在 for 循环中使用
# 查找第一个大于 50 的平方数
for i = 1:100
square = i * i
if square > 50
disp("第一个大于 50 的平方数是 " + num2str(square))
break
end
end
# 查找素数
n = 29
is_prime = 1
for i = 2:sqrt(n)
if mod(n, i) == 0
is_prime = 0
break
end
end
if is_prime
disp(num2str(n) + " 是素数")
else
disp(num2str(n) + " 不是素数")
end
在 while 循环中使用
# 累加到首次超过目标值
sum = 0
i = 1
target = 100
while 1 # 无限循环
sum = sum + i
if sum > target
disp("累加到 " + num2str(i) + " 时超过 " + num2str(target))
break
end
i = i + 1
end
在嵌套循环中使用
break 只退出最内层循环:
# 查找矩阵中第一个负数的位置
A = [1 2 3; 4 -5 6; 7 8 9]
found = 0
for i = 1:size(A, 1)
for j = 1:size(A, 2)
if A(i, j) < 0
disp("找到负数在 (" + num2str(i) + ", " + num2str(j) + ")")
found = 1
break
end
end
if found
break
end
end
continue 语句
continue 用于跳过本次循环的剩余部分,继续下一次循环:
跳过特定值
# 只处理奇数
for i = 1:10
if mod(i, 2) == 0
continue # 跳过偶数
end
disp("处理奇数:" + num2str(i))
end
# 跳过负数
data = [-2, 5, -1, 8, -3, 10]
for val = data
if val < 0
continue # 跳过负数
end
disp("正数:" + num2str(val))
end
过滤条件
# 计算非零元素的和
vec = [1, 0, 3, 0, 5, 0, 7]
sum = 0
count = 0
for val = vec
if val == 0
continue
end
sum = sum + val
count = count + 1
end
avg = sum / count
disp("非零元素的平均值:" + num2str(avg))
在嵌套循环中使用
# 打印非对角线元素
A = [1 2 3; 4 5 6; 7 8 9]
for i = 1:size(A, 1)
for j = 1:size(A, 2)
if i == j
continue # 跳过对角线元素
end
disp("A(" + num2str(i) + "," + num2str(j) + ") = " + num2str(A(i,j)))
end
end
try/catch 异常处理
使用 try/catch 捕获运行时错误,避免程序崩溃:
try
# 可能出错的代码
...
catch e
# e 是包含错误信息的结构体
# e.message - 错误消息字符串
disp("捕获到错误:" + e.message)
end
基本用法
% 捕获除零错误(或其他运行时错误)
try
x = 1 / 0
disp("结果:" + num2str(x)) # Inf,实际不会报错
catch e
disp("出错了:" + e.message)
end
# 捕获索引越界
A = [1 2 3]
try
val = A(10) # 越界索引
catch e
disp("索引错误:" + e.message)
end
catch 变量包含错误详情
try
result = sqrt(-1) # 对矩阵标量取平方根不是错误
# 触发一个明确的错误:
A = [1 2; 3 4]
x = A(10, 1) # 行索引越界
catch e
# e 是结构体,有如下字段:
disp(e.message) # 错误消息
# e.identifier # 错误标识符(预留字段)
end
嵌套 try/catch
function result = safeDivide(a, b)
result = nan
try
if b == 0
error("除数不能为零")
end
result = a / b
catch e
fprintf("safeDivide 出错:%s\n", e.message)
end
end
r1 = safeDivide(10, 2) # 5
r2 = safeDivide(10, 0) # nan,并打印错误信息
注意:TimeoutError(执行超时)和 MemoryLimitError(内存超限)是系统级错误,无法被用户的 try/catch 捕获,会直接传递给宿主程序。
综合示例
示例1:查找素数
# 找出 1 到 100 之间的所有素数
disp("1 到 100 之间的素数:")
for n = 2:100
is_prime = 1
# 检查是否能被 2 到 sqrt(n) 之间的数整除
for i = 2:sqrt(n)
if mod(n, i) == 0
is_prime = 0
break
end
end
if is_prime
disp(n)
end
end
示例2:斐波那契数列
# 生成斐波那契数列的前 20 项
n = 20
fib = zeros(1, n)
fib(1) = 1
fib(2) = 1
for i = 3:n
fib(i) = fib(i-1) + fib(i-2)
end
disp("斐波那契数列前 " + num2str(n) + " 项:")
disp(fib)
示例3:猜数字游戏
# 简化的猜数字游戏
target = randi(100) # 1 到 100 的随机数
max_tries = 10
found = 0
disp("我想了一个 1 到 100 之间的数字")
for try = 1:max_tries
# 这里简化为随机猜测
guess = randi(100)
if guess == target
disp("猜对了!数字是 " + num2str(target))
found = 1
break
elseif guess < target
disp("第 " + num2str(try) + " 次猜测 " + num2str(guess) + " 太小了")
else
disp("第 " + num2str(try) + " 次猜测 " + num2str(guess) + " 太大了")
end
end
if !found
disp("很遗憾,次数用完了。正确答案是 " + num2str(target))
end
示例4:矩阵元素统计
# 统计矩阵中的正数、负数和零的个数
A = [1 -2 0 4; -3 5 0 -1; 2 0 3 -4]
positive = 0
negative = 0
zeros_count = 0
for i = 1:size(A, 1)
for j = 1:size(A, 2)
if A(i, j) > 0
positive = positive + 1
elseif A(i, j) < 0
negative = negative + 1
else
zeros_count = zeros_count + 1
end
end
end
disp("正数个数:" + num2str(positive))
disp("负数个数:" + num2str(negative))
disp("零的个数:" + num2str(zeros_count))