В программировании есть два основных инструмента для управления потоком исполнения:
- Ветвление ⇙⇘: позволяет запускать разный код в зависимости от условия (операторы
if
иswitch
) - Цикл ⟲: обеспечивает повторное выполнение кода (
for
,while
).
Ветвление ⇙⇘
Общая форма оператора if
в Matlab
if condition
truth_actions
% ...
end
Если условие (condition
) истинно (true
), тогда выполняются соответсвующие выражения (truth_actions
)
if condition
truth_actions
else
falsity_actions
end
Иначе (else
) выполняются выражения соответсвующие ложности условия: falsity_actions
Пример. Если оценка студента больше или равна 3 напечатать ‘Зачет’ иначе напечатать ‘Незачет’:
%% Cтудент хорошо учился
grade = 4
if grade >= 3
disp('Зачет');
else
disp('Незачет');
end
grade =
4
Зачет
%% Cтудент плохо учился
grade = 2
if grade >= 3
disp('Зачет');
else
disp('Незачет');
end
grade =
2
Незачет
Оператор elseif
Если решение исполнения того или иного кодового блока зависит от выполнения ряда последовательных условий если (if
), иначе-если (elseif
), иначе (else
), тогда общая форма такой конструкции выглядит следующим образом:
if condition1
statements1
elseif condition2
statements2
else
statements3
end
где statements<i>
- это одно или множество выражений, которые выполнятся в случае истинности условия condition<i>
и ложности предыдующих условий condition1 ... condition<i-1>
.
Пример. Если оценка студента равна 2 напечатать ‘Плохо’, иначе если оценка студента равна 3 напечатать ‘Удовлетворительно’, иначе если оценка студента равна 4 напечатать ‘Хорошо’, иначе напечатать отлично
%% Cтудент хорошо учился
grade = 4
if grade == 2
disp('Плохо');
elseif grade == 3
disp('Удовлетворительно');
elseif grade == 4
disp('Хорошо');
else
disp('Отлично');
end
grade =
4
Хорошо
%% Cтудент плохо учился
grade = 2
if grade == 2
disp('Плохо');
elseif grade == 3
disp('Удовлетворительно');
elseif grade == 4
disp('Хорошо');
else
disp('Отлично');
end
grade =
2
Хорошо
Пример вложенных условий
if i == 1
if j == 1
disp('i = j = 1');
else
disp('i = 1, j ~= 1');
end
end
if i == 1
if j == 1
disp('i = j = 1');
else
disp('i = 1, j ~= 1');
end
else
disp('i ~= 1');
end
При любых значениях i
и j
для каждой из программ выполняется только один из disp
.
Пример Пусть \(n\) условий исчерпывают все возможные случаи, например \(x < 2, x = 2 , x > 2\). Тогда вызов операторов, соответсвующих каждому из случаев, можно запрограммировать двумя способами.
if x < 2
disp(1);
end
if x = 2
disp(2);
end
if x > 2
disp(3);
end
if x < 2
disp(1);
elseif x == 2
disp(2);
else
disp(3);
end
Во втором способе не делаются лишние проверки, но первый способ наглядней.
Пример. Избыточные записи
if a == c
b = true;
else
b = false;
end
Вместо следует писать:
b = a == c;
Аналогично:
if b == true
do_something();
end
Вместо следует писать:
if b
do_something();
end
Составные условие. Логическое И (&&
)
Пример. Если средний балл студента за семестр больше или равен 3 и оценка студента за экзамен больше или равна 3 напечатать ‘Зачет’ иначе напечатать ‘Незачет’
%% Cтудент хорошо учился и сдал экзамен
semester_average = 4
final_exam = 3
if (semester_average >= 3) && (final_exam >= 3)
disp('Зачет');
else
disp('Незачет');
end
semester_average =
4
final_exam =
3
Зачет
%% Cтудент хорошо учился, но не сдал экзамен
semester_average = 4
final_exam = 2
if (semester_average >= 3) && (final_exam >= 3)
disp('Зачет');
else
disp('Незачет');
end
semester_average =
4
final_exam =
2
Незачет
Составные условие. Логическое ИЛИ (||
)
Пример. Если средний балл студента за семестр меньше 3 или оценка студента за экзамен меньше 3 напечатать ‘Незачет’ иначе напечатать ‘Зачет’
%% Cтудент хорошо учился и сдал экзамен
semester_average = 4
final_exam = 3
if (semester_average < 3) || (final_exam < 3)
disp('Незачет');
else
disp('Зачет');
end
semester_average =
4
final_exam =
3
Зачет
%% Cтудент хорошо учился, но не сдал экзамен
semester_average = 4
final_exam = 2
if (semester_average < 3) || (final_exam < 3)
disp('Зачет');
else
disp('Незачет');
end
semester_average =
4
final_exam =
2
Незачет
Логические операции. Логическое отрицание (~
)
Если оценка студента не равна 2 напечатать ‘Зачет’ иначе напечатать ‘Незачет’
%% Cтудент хорошо учился
grade = 4
if ~(grade == 2)
disp('Зачет');
else
disp('Незачет');
end
grade =
4
Зачет
%% Cтудент плохо учился
grade = 4
if ~(grade == 2)
disp('Зачет');
else
disp('Незачет');
end
grade =
2
Незачет
%% Часто можно избежать применение логического отрицания
grade = 3
if grade ~= 2
disp('Зачет');
else
disp('Незачет');
end
grade =
3
Зачет
Оператор switch
Является альтернативой множественным операторам if
-elseif
-else
.
Позволяет сделать код более читаемым, особенно при наличии множества условий.
Общая форма выглядит следующим образом:
switch expression
case value1
statements1
case value2
statements2
% ... дополнительные случаи ...
otherwise
statementsN
end
Пример. Если оценка студента равна 2 напечатать ‘Плохо’ иначе если оценка студента равна 3 напечатать ‘Удовлетворительно’ иначе если оценка студента равна 4 напечатать ‘Хорошо’ иначе напечатать ‘Отлично’.
grade = 4
switch grade
case 2
disp('Плохо');
case 3
disp('Удовлетворительно');
case 4
disp('Хорошо');
otherwise
disp('Отлично');
end
grade =
4
Зачет
Пример. Определим выходной ли сегодня?
today = 'Воскресенье';
switch today
case {'Понедельник', 'Вторник', 'Среда', 'Четверг', 'Пятница'}
disp('Это будний день.');
case {'Суббота', 'Воскресенье'}
disp('Это выходной.');
otherwise
disp('Недействительный день.');
end
Общий пример:
input_value = 'B'; % Пример входных данных
switch input_value
case {'A', 'B', 'C'} % Множество значений A, B и C.
disp('Входное значение - A, B или C.'); % Если принадлежит мн-ву
case {'D', 'E'}
disp('Входное значение - D или E.');
otherwise
disp('Входное значение - что-то другое.');
end
Циклы ⟲
Общая форма оператора for
for element = vector
perform_action
end
Для каждого элемента (element
) вектора (vector
) выполняется некоторое действие (perform_action
).
Простой пример использования for
for i = 1:3
disp(['Итерация: ' num2str(i)]);
end
Итерация: 1
Итерация: 2
Итерация: 3
Пример 1. Вычислить сумму чисел \(1 + 3 + 5 + 7 + 9\)
sum = 0;
for n = 1:2:9
sum = sum + n;
end
sum
sum =
25
Пример 2. По заданному целому неотрицательному значению \(n\) и вещественному значению \(x\) требуется вчсилить \(x^n\).
p = 1;
for i = 1:n
p = p * x;
end
p
Пример 3. По заданному целому неотрицательному значению \(n\) требуется вычислить \(n!\)
f = 1;
for i = 1:n
f = f * i;
end
f
Пример 4. По заданному натуральному значению \(n\) требуется вычислить
\[1 - \frac{1}{2} + \frac{1}{3} - \frac{1}{4} + \ldots \pm \frac{1}{n}\]k = 1;
s = 1;
for i = 2:n
% В переменной k храним знак очередного слагаемого
k = -k;
s = s + k / i;
end
Пример 4. По заданному натуральному значению \(n\) и вещественному значению \(x\) требуется вычислить \(x + x^2 + x^3 + \ldots + x^n\)
s = 0; z = 1;
for i = 1:n
z = z * x; % в переменной z - очередное слагаемое
s = s + z;
end
Замечание. В MATLAB, если переменная используется как индекс в цикле for
, то она присваивается текущему окружению, при этом перезаписывая любую другую переменную с таким же именем.
i = 100;
for i = 1:3
...
end
i
i =
3
Оператор повторения while
Пример. Вычислить сумму чисел \(1 + 3 + 5 + 7 + 9\).
sum = 0;
n = 1;
while n <= 9
sum = sum + n;
n = n + 2;
end
sum
sum =
25
Досрочное завершение цикла
Существует два способа досрочного завершения цикла for
:
continue
прерывает текущую итерациюbreak
прерывает выполнение всего циклаfor
Пример. Вычислить сумму чисел \(1 + 3 + 5 + 7 + 9\).
sum = 0;
for n = 1:2:100
sum = sum + n;
if n == 9
break;
end
end
sum
sum =
25
Пример с использованием и break
и continue
.
for i = 1:10
if i < 3
continue; % Пропускает оставшуюся часть текущей итерации цикла
end
disp(i); % Выводит значение i
if i >= 5
break; % Выходит из цикла
end
end
3
4
5
Вложенные циклы
Рассмотрим задачи, в которых внутри одного цикла реализован другой цикл.
Пример 1. Для заданного натурального числа \(n\) требуется найти все такие тройки натуральных чисел \(a, b, c\), что \(a + b + c = n\).
n = 4;
for a = 1:n-2
for b = 1:n-a-1
c = n - a - b;
fprintf("%d+%d+%d=%d\n", a, b, c, n);
end
end
1+1+2=4
1+2+1=4
2+1+1=4
Пример демонстрирует сокращение количество вложенных циклов.
Пример 2. Требуется распечатать все трехзначные числа, в которых есть две одинаковые цифры.
for j = 1:9
for i = 0:9
for k = 0:9
if (j == i) || (j == k) || (i == k)
disp([j, i, k]);
end
end
end
end
Если порядок выводимых чисел не важен, то эту задачу можно решить и более эффективно.
for j = 1:9
disp([j 0 0]);
disp([j j 0]);
disp([j 0 j]);
for i = 0:9
disp([i i j]);
disp([j i i]);
disp([i j i]);
end
end
Пример 3. Требуется распечатать все трехзначные числа, в которых вторая цифра больше первой, а третья больше второй.
for i = 1:7
for j = i+1:8
for k = j+1:9
disp([i j k]);
end
end
end
Два последних примера показывают, что в задачах наивный подход не всегда является даже самым простым. В этих задачах излишним было бы перебирать все трехзначные числа, выделять из них цифры и сравнивать их между собой.