流程控制

条件语句

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))