В программировании есть два основных инструмента для управления потоком исполнения:

  • Ветвление ⇙⇘: позволяет запускать разный код в зависимости от условия (операторы 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 

Два последних примера показывают, что в задачах наивный подход не всегда является даже самым простым. В этих задачах излишним было бы перебирать все трехзначные числа, выделять из них цифры и сравнивать их между собой.