MATLAB 条件语句

决策结构要求程序员应指定一个或多个要由程序评估或测试的条件,如果确定条件为真,则应指定要执行的一个或多个语句,如果条件为真,则可以选择要执行的其他语句。条件确定为假。

以下是大多数编程语言中常见的典型决策结构的一般形式:

flowchart TD
    start[Start] --> condition{condition}
    condition -->|condition is true| conditional_code[conditional code]
    conditional_code --> end[End]
    condition -->|condition is false| end

1. if 语句

if 语句是最基本的条件语句,用于在条件为真时执行特定的代码块。

基本语法

1
2
3
4
if condition
% 当条件为真时执行的代码
statements
end

代码示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
% 示例1:简单的数值比较
x = 10;
if x > 5
disp('x 大于 5');
end

% 示例2:判断数字的正负性
number = -3.5;
if number > 0
disp('这是一个正数');
end
if number < 0
disp('这是一个负数');
end
if number == 0
disp('这是零');
end

% 示例3:字符串比较
name = 'MATLAB';
if strcmp(name, 'MATLAB')
disp('欢迎使用 MATLAB!');
end

2. if-else 语句

if-else 语句提供了两个执行路径:当条件为真时执行一个代码块,当条件为假时执行另一个代码块。

基本语法

1
2
3
4
5
6
7
if condition
% 条件为真时执行
statements1
else
% 条件为假时执行
statements2
end

代码示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
% 示例1:判断奇偶数
num = 15;
if mod(num, 2) == 0
fprintf('%d 是偶数\n', num);
else
fprintf('%d 是奇数\n', num);
end

% 示例2:成绩等级判定
score = 85;
if score >= 60
disp('及格');
else
disp('不及格');
end

% 示例3:温度判断
temperature = 25;
if temperature > 30
disp('天气很热');
else
disp('天气还好');
end

3. if-elseif-else 语句

当需要测试多个条件时,可以使用 elseif 来创建多分支结构。

基本语法

1
2
3
4
5
6
7
8
9
10
11
12
13
if condition1
% 条件1为真时执行
statements1
elseif condition2
% 条件2为真时执行
statements2
elseif condition3
% 条件3为真时执行
statements3
else
% 所有条件都为假时执行
statements4
end

代码示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
% 示例1:详细的成绩等级判定
score = 88;
if score >= 90
grade = 'A';
elseif score >= 80
grade = 'B';
elseif score >= 70
grade = 'C';
elseif score >= 60
grade = 'D';
else
grade = 'F';
end
fprintf('分数: %d, 等级: %s\n', score, grade);

% 示例2:季节判断
month = 7;
if month >= 3 && month <= 5
season = '春季';
elseif month >= 6 && month <= 8
season = '夏季';
elseif month >= 9 && month <= 11
season = '秋季';
else
season = '冬季';
end
fprintf('第%d月是%s\n', month, season);

% 示例3:BMI指数判断
weight = 70; % kg
height = 1.75; % m
bmi = weight / (height^2);

if bmi < 18.5
category = '体重过轻';
elseif bmi < 25
category = '正常体重';
elseif bmi < 30
category = '超重';
else
category = '肥胖';
end
fprintf('BMI: %.2f, 分类: %s\n', bmi, category);

4. switch 语句

switch 语句用于基于变量的值执行不同的代码块,特别适合处理多个离散值的情况。

基本语法

1
2
3
4
5
6
7
8
9
10
switch expression
case value1
statements1
case value2
statements2
case {value3, value4, value5}
statements3
otherwise
statements4
end

代码示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
% 示例1:星期几的判断
day = 3;
switch day
case 1
dayName = '星期一';
case 2
dayName = '星期二';
case 3
dayName = '星期三';
case 4
dayName = '星期四';
case 5
dayName = '星期五';
case {6, 7}
dayName = '周末';
otherwise
dayName = '无效的日期';
end
fprintf('第%d天是%s\n', day, dayName);

% 示例2:计算器功能
a = 10;
b = 5;
operation = '+';

switch operation
case '+'
result = a + b;
fprintf('%.2f + %.2f = %.2f\n', a, b, result);
case '-'
result = a - b;
fprintf('%.2f - %.2f = %.2f\n', a, b, result);
case '*'
result = a * b;
fprintf('%.2f * %.2f = %.2f\n', a, b, result);
case '/'
if b ~= 0
result = a / b;
fprintf('%.2f / %.2f = %.2f\n', a, b, result);
else
disp('除数不能为零');
end
otherwise
disp('不支持的运算符');
end

% 示例3:字符串匹配
color = 'red';
switch lower(color)
case {'red', 'crimson', 'scarlet'}
disp('这是红色系');
case {'blue', 'navy', 'azure'}
disp('这是蓝色系');
case {'green', 'lime', 'forest'}
disp('这是绿色系');
otherwise
disp('未知颜色');
end

MATLAB 循环语句

循环语句允许我们重复执行一段代码,直到满足某个条件为止。MATLAB提供了几种不同类型的循环结构来满足不同的编程需求。

1. for 循环

for 循环用于已知循环次数的情况,是最常用的循环结构之一。

基本语法

1
2
3
4
5
6
7
8
9
10
for variable = start:step:end
% 循环体
statements
end

% 或者遍历数组/向量
for variable = array
% 循环体
statements
end

代码示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
% 示例1:基本的数值循环
disp('1到10的数字:');
for i = 1:10
fprintf('%d ', i);
end
fprintf('\n');

% 示例2:指定步长的循环
disp('0到20的偶数:');
for i = 0:2:20
fprintf('%d ', i);
end
fprintf('\n');

% 示例3:递减循环
disp('倒计时:');
for i = 10:-1:1
fprintf('%d ', i);
end
disp('发射!');

% 示例4:遍历数组
numbers = [2, 4, 6, 8, 10];
sum_total = 0;
for num = numbers
sum_total = sum_total + num;
end
fprintf('数组元素的和: %d\n', sum_total);

% 示例5:嵌套循环 - 打印乘法表
disp('九九乘法表:');
for i = 1:9
for j = 1:i
fprintf('%d×%d=%d\t', j, i, i*j);
end
fprintf('\n');
end

% 示例6:处理矩阵
matrix = [1, 2, 3; 4, 5, 6; 7, 8, 9];
disp('原矩阵:');
disp(matrix);

% 将所有元素乘以2
for i = 1:size(matrix, 1)
for j = 1:size(matrix, 2)
matrix(i, j) = matrix(i, j) * 2;
end
end
disp('乘以2后的矩阵:');
disp(matrix);

2. while 循环

while 循环在条件为真时重复执行代码块,适用于不确定循环次数的情况。

基本语法

1
2
3
4
5
while condition
% 循环体
statements
% 通常需要修改条件中的变量
end

代码示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
% 示例1:基本的while循环
count = 1;
while count <= 5
fprintf('第%d次循环\n', count);
count = count + 1;
end

% 示例2:求数字的阶乘
n = 5;
factorial = 1;
i = 1;
while i <= n
factorial = factorial * i;
i = i + 1;
end
fprintf('%d的阶乘是: %d\n', n, factorial);

% 示例3:猜数字游戏(模拟版)
target = 42;
guess = 0;
attempts = 0;
guesses = [25, 50, 40, 42]; % 模拟用户猜测
guess_index = 1;

while guess ~= target && guess_index <= length(guesses)
guess = guesses(guess_index);
attempts = attempts + 1;

if guess < target
fprintf('猜测 %d: 太小了!\n', guess);
elseif guess > target
fprintf('猜测 %d: 太大了!\n', guess);
else
fprintf('猜测 %d: 恭喜你猜对了!\n', guess);
end

guess_index = guess_index + 1;
end
fprintf('总共用了 %d 次猜测\n', attempts);

% 示例4:斐波那契数列
n = 10;
a = 0;
b = 1;
count = 1;
fprintf('斐波那契数列的前%d项:\n', n);
fprintf('%d ', a);

while count < n
fprintf('%d ', b);
temp = a + b;
a = b;
b = temp;
count = count + 1;
end
fprintf('\n');

% 示例5:数值收敛判断
x = 2;
tolerance = 1e-6;
max_iterations = 100;
iteration = 0;

fprintf('使用牛顿法求sqrt(2):\n');
while iteration < max_iterations
x_new = 0.5 * (x + 2/x);
error = abs(x_new - x);

fprintf('迭代 %d: x = %.8f, 误差 = %.2e\n', iteration+1, x_new, error);

if error < tolerance
fprintf('收敛成功!\n');
break;
end

x = x_new;
iteration = iteration + 1;
end

3. 循环控制语句

3.1 break 语句

break 语句用于立即退出循环。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
% 示例1:寻找第一个大于50的平方数
for i = 1:20
square = i^2;
if square > 50
fprintf('第一个大于50的平方数是 %d^2 = %d\n', i, square);
break;
end
end

% 示例2:在while循环中使用break
sum_val = 0;
i = 1;
while true % 无限循环
sum_val = sum_val + i;
if sum_val > 100
fprintf('当i=%d时,累加和首次超过100,和为%d\n', i, sum_val);
break;
end
i = i + 1;
end

3.2 continue 语句

continue 语句用于跳过当前迭代的剩余部分,直接进入下一次循环。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
% 示例1:打印1到10中的奇数
disp('1到10中的奇数:');
for i = 1:10
if mod(i, 2) == 0
continue; % 跳过偶数
end
fprintf('%d ', i);
end
fprintf('\n');

% 示例2:计算正数的平均值
numbers = [5, -2, 8, -1, 3, 0, 7, -4];
positive_sum = 0;
positive_count = 0;

for num = numbers
if num <= 0
continue; % 跳过非正数
end
positive_sum = positive_sum + num;
positive_count = positive_count + 1;
end

if positive_count > 0
average = positive_sum / positive_count;
fprintf('正数的平均值: %.2f\n', average);
else
disp('没有正数');
end

4. 复杂循环应用示例

4.1 质数判断和生成

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
% 生成1到100之间的所有质数
disp('1到100之间的质数:');
primes = [];

for num = 2:100
is_prime = true;

% 检查是否为质数
for i = 2:sqrt(num)
if mod(num, i) == 0
is_prime = false;
break;
end
end

if is_prime
primes = [primes, num];
end
end

fprintf('找到 %d 个质数:\n', length(primes));
for i = 1:length(primes)
fprintf('%d ', primes(i));
if mod(i, 10) == 0 % 每10个数换行
fprintf('\n');
end
end
fprintf('\n');

4.2 矩阵操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
% 创建一个随机矩阵并找出最大值的位置
matrix = rand(5, 5) * 100;
matrix = round(matrix);

disp('随机矩阵:');
disp(matrix);

max_val = -inf;
max_row = 0;
max_col = 0;

% 遍历矩阵找最大值
for i = 1:size(matrix, 1)
for j = 1:size(matrix, 2)
if matrix(i, j) > max_val
max_val = matrix(i, j);
max_row = i;
max_col = j;
end
end
end

fprintf('最大值 %d 位于第 %d 行第 %d 列\n', max_val, max_row, max_col);

4.3 数值分析应用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
% 使用梯形法则计算定积分
% 计算 f(x) = x^2 在 [0, 1] 上的积分
a = 0; % 下限
b = 1; % 上限
n = 1000; % 分割数
h = (b - a) / n;

% 函数定义
f = @(x) x.^2;

% 梯形法则
integral_approx = (f(a) + f(b)) / 2;
for i = 1:n-1
x = a + i * h;
integral_approx = integral_approx + f(x);
end
integral_approx = integral_approx * h;

% 理论值
integral_exact = 1/3;

fprintf('数值积分结果: %.6f\n', integral_approx);
fprintf('理论值: %.6f\n', integral_exact);
fprintf('误差: %.6f\n', abs(integral_approx - integral_exact));

总结

MATLAB的条件语句和循环语句为程序提供了强大的控制流功能:

条件语句

  • if 语句:处理简单条件判断
  • if-else 语句:提供二选一的执行路径
  • if-elseif-else 语句:处理多条件分支
  • switch 语句:适合处理离散值的多分支选择
  • 这些条件语句之间可以互相嵌套,包括与下面的循环语句

循环语句

  • for 循环:适用于已知循环次数的情况
  • while 循环:适用于条件驱动的循环
  • breakcontinue:提供循环控制的灵活性