Структурное программирование

Оператор ветвления

Оператор ветвления выполняет фрагмент кода только при выполнении некоторого условия. В самом простом виде оператор ветвления в MATLAB записывается следующим образом:

if a < 10
    x = 1;
end

Переменной x будет присвоено значение 1, если значение переменной a будет меньше 10. Если необходимо выполнить определенный код в случае невыполнения условия, то оператор if можно записать в следующем виде

if a < 10
    x = 1;
    z = 5;
else
    x = 2;
    z = 10*x;
end

При наличии нескольких условий и нескольких фрагментов кода, исполняемых при выполнении этих условий, используется следующая структура оператора ветвления

if a < 10 
    x = 1;
elseif a > 20
    x = 2;
else 
    x = 3;
end

В результате выполнения этого кода переменная x будет равна 1 если a меньше 10, 3 – если a больше 20 и 2 если а будет принадлежать интервалу от 10 до 20.

В выражениях-условиях могут применятся логические операторы И (&&), ИЛИ ( ), НЕ (~):
if a >= 10 && a <= 20 
    x = 3;
elseif a > 20
    x = 2;
else 
    x = 1;
end

Цикл for

Цикл for позволяет заданное количество раз выполнить фрагмент кода. В MATLAB цикл for определяется при помощи ключевого слова for, обозначающего заголовок цикла и end, обозначающего окончание выполняемого в цикле блока кода.

Следующий код

for i = 1:10
    fprintf('%i - %3.1f', i, cos(i/2.0))
end

выведет на таблицу значений аргумента и функции \(\cos i/2\) для \(i\) изменяющегося в диапазоне от 1 до 10 с шагом 1 (1:10), как указано в заголовке цикла

  1   0.9
  2   0.5
  3   0.1
  4  -0.4
  5  -0.8
  6  -1.0
  7  -0.9
  8  -0.7
  9  -0.2
 10   0.3

Переменная \(i\) в приведённом примере называется переменной-интератором. Эта переменная принимает значения в соответствии с заданной последовательностью (от 1 до 10).

В заголовке цикла в качестве ‘источника’ значений для переменной-итератора может быть матрица строка. Например, результат работы следующего примера будет точно таким же, как и у предыдущего

a = 1:10;
for i = a
    fprintf('%i - %3.1f', i, cos(i/2.0))
end

Если в качестве источника используется матрица, то переменная-итератор будет принимать значений столбцов этой матрицы. В результате работы следующего кода

a = [1 2 3; 4 5 6];
for i = a
    i
end

цикл выполнится 3 раза и переменна \(i\) будет принимать значения [1; 4], [2; 5] и [3; 6].

В MATLAB следует избегать использования циклов. Использование циклов приводит к снижению скорости выполнения кода. Где это возможно, циклы следует заменять матричными операциями.

Рассмотрим для примера код, который вычисляет количество четных чисел в случайно последовательности

a = round(rand(1,10)*20);

В цикле for переменная el последовательно принимает значения элементов из матрицы-строки a. В теле цикла определяется остаток от деления элемента последовательности на 2, и если этот остаток равен 0 (число четное), то этот элемент добавляется к переменной-сумматору s. После выхода из цикла переменная s будет содержать сумму чётных элементов матрицы строки a.

s = 0;
% перебираем все значения из массива a
% следующая строка читается как "ДЛЯ каждого элемента el из a"
for el = a
    %  ЕСЛИ остаток деления на 2 равен нулю, то el это 
    %  чётное число и его добавляем в сумматор
    if mod(el,2) == 0
       s = s + el;
    end
end
s

Этот код можно заменить одной строкой

s = sum(a(mod(a,2)==0))

Результатом работы выражения mod(a,2)==0 является логическая матрица-строка, равная по форме исходной матрице-строке a, в логической матрице на местах четных элементов матрицы a стоят 1 (ИСТИНА), на местах остальных элементов нули

>> mod(a,2)==0

ans =
  1×10 logical array
   1   1   0   0   1   1   0   0   1   1

этот результат используется в качестве индекса оператора () для извлечения четных элементов из матрицы a

>> a(mod(a,2)==0)

ans =
     6    14     2    10    12     4

далее определяется сумма всех извлеченных элементов при помощи функции sum.

Цикл while (пока)

Цикл while используется при необходимости выполнения фрагмента кода (тела цикла), пока выполняется некоторое условие. Предположим, что необходимо вычислить сумму первой последовательной цепочки четных чисел заданной матрицы-строки

% Последовательность
a = [2 4 8 3 2 5 6 7];
% Сумматор
s = 0;
% Начальное значение индекса числа в массиве a
i = 1;
% Если i-ое число четное И (&&) его номер не больше 8 (количество элементов в массиве а)
while mod(a(i),2)==0 && i <= numel(a)
    % ТО добавляем это число в сумматор
    s = s + a(i);
    % переходим к следующему индексу (увеличиваем на 1)
    % иначе цикл станет бесконечным
    i = i + 1;
end

После ключевого слова while в заголовке цикла указывается логическое выражение. Цикл будет выполнятся до тех пор, пока результатом этого выражения будет ИСТИНА. Цикл while может не выполниться ни одного раза, если при входе в цикл результатом логического выражения будет ЛОЖЬ.


© 2023. All rights reserved.

Powered by Hydejack v9.1.6