Оператор ветвления if-elseif-else
ОСНОВЫ ПРОГРАММИРОВАНИЯ MATLAB
Краткие сведения о программировании в MATLAB[1]
Основные арифметические операции в MATLAB: сложение, вычитание, умножение , деление и возведение в степень. Операции умножения, деления и возведения в степень рассчитаны на работу с матрицами, поэтому при поэлементных операциях они записываются как .*, ./ и .^ (т.е. перед знаком операции ставится точка).
ОСНОВНЫЕ ОПЕРАТОРЫ
1.1. Оператор циклаfor
Оператор предназначен для выполнения заданного числа повторяющихся действий. Самое простое использование оператора for осуществляется следующим образом:
for count = start:step:final
команды MatLab
end
Здесь count - переменная цикла, start - ее начальное значение, final - конечное значение, а step - шаг, на который увеличивается count при каждом следующем заходе в цикл. Цикл заканчивается, как только значение count становится больше final. Переменная цикла может принимать не только целые, но и вещественные значения любого знака
Пример
% программа построения семейства кривых
x = [0:pi/30:2*pi];
for a = -0.1:0.02:0.1
y = exp(-a*x).*sin(x);
hold on
plot(x, y)
end
Примечание. Редактор М-файлов автоматически предлагает расположить операторы внутри цикла с отступом от левого края. Используйте эту возможность для удобства работы с текстом программы.
Циклы for могут быть вложены друг в друга, при этом переменные вложенных циклов должны быть разными.
Цикл for оказывается полезным при выполнении повторяющихся похожих действий в том случае, когда их число заранее определено. Обойти это ограничение позволяет более гибкий цикл while.
Оператор цикла while
Рассмотрим пример на вычисление суммы, похожий на пример из предыдущего пункта. Требуется найти сумму ряда для заданного x(разложение в ряд ):
.
Сумму можно накапливать до тех пор, пока слагаемые являются не слишком маленькими, скажем больше по модулю Циклом for здесь не обойтись, так как заранее неизвестно число слагаемых. Выход состоит в применении цикла while, который работает, пока выполняется условие цикла:
while <условие цикла>
команды MatLab
end
В данном примере условие цикла предусматривает, что текущее слагаемое больше . Для записи этого условия используется знак больше (>). Текст файл-функции mysin, вычисляющей сумму ряда, приведен в следующем листинге.
Листинг файл-функции mysin, вычисляющей синус разложением в ряд
function S = mysin(x)
% Вычисление синуса разложением в ряд
% Использование: y = mysin(x), -pi<x<pi
S = 0;
k = 0;
while abs(x.^(2*k+1)/factorial(2*k+1))>1.0e-10
S = S + (-1)^k*x.^(2*k+1)/factorial(2*k+1);
k = k + 1;
end
Обратите внимание, что у цикла while, в отличие от for, нет переменной цикла, поэтому пришлось до начала цикла k присвоить нуль, а внутри цикла увеличивать k на единицу.
Условие цикла while может содержать не только знак >. Для задания условия выполнения цикла допустимы также другие операции отношения, приведенные в табл. 1.
Таблица 1. Операции отношения
Обозначение | Операция отношения |
== | Равенство |
< | Меньше |
> | Больше |
<= | Меньше или равно |
>= | Больше или равно |
~= | Не равно |
Задание более сложных условий производится с применением логических операторов. Например, условие состоит в одновременном выполнении двух неравенств и , и записывается при помощи логического оператора and
and(x >= -1, x < 2)
или эквивалентным образом с символом &
(x >= -1) & (x < 2)
Логические операторы и примеры их использования приведены в табл. 2.
Таблица 2. Логические операторы
Оператор | Условие | Запись в MatLab | Эквивалентная запись |
Логическое "И" | и | and(x < 3, k == 4) | (x < 3) & (k == 4) |
Логическое "ИЛИ" | Or(x == 1,x == 2) | (x == 1) | (x == 2) | |
Отрицание "НЕ" | not(a == 1.9) | ~(a == 1.9) |
При вычислении суммы бесконечного ряда имеет смысл ограничить число слагаемых. Если ряд расходится из-за того, что его члены не стремятся к нулю, то условие на малое значение текущего слагаемого может никогда не выполниться и программа зациклится. Выполните суммирование, добавив в условие цикла while файл-функции mysin ограничение на число слагаемых:
while (abs(x.^(2*k+1)/factorial(2*k+1))>1.0e-10)&(k<=10000))
или в эквивалентной форме
while and(abs(x.^(2*k+1)/factorial(2*k+1))>1.0e-10), k<=10000)
Организация повторяющихся действий в виде циклов делает программу простой и понятной, однако часто требуется выполнить тот или иной блок команд в зависимости от некоторых условий, т.е. использовать ветвление алгоритма.
Условный оператор if
Условный оператор if позволяет создать разветвляющийся алгоритм выполнения команд, в котором при выполнении определенных условий работает соответствующий блок операторов или команд MatLab.
Оператор if может применяться в простом виде для выполнения блока команд при удовлетворении некоторого условия или в конструкции if-elseif-else для написания разветвляющихся алгоритмов.
Пусть требуется вычислить выражение . Предположим, что вычисления выполняются в области действительных чисел и требуется вывести предупреждение о том, что результат является комплексным числом. Перед вычислением функции следует произвести проверку значения аргумента x, и вывести в командное окно предупреждение, если модуль x не превосходит единицы. Здесь необходимо применение условного оператора if, применение которого в самом простом случае выглядит так:
if условие
команды MatLab
end
Если условие выполняется, то реализуются команды MatLab, размещенные между if и end, а если условие не выполняется, то происходит переход к командам, расположенным после end. При записи условия используются операции, приведенные в табл. 1.
Файл-функция, проверяющая значение аргумента, приведена в следующем листинге. Команда warning служит для вывода предупреждения в командное окно.
Листинг файл-функции Rfun, проверяющей значение аргумента
function f = Rfun(x)
% вычисляет sqrt(x^2-1)
% выводит предупреждение, если результат комплексный
% использование y = Rfun(x)
% проверка аргумента
if abs(x)<1
warning('результат комплексный')
end
% вычисление функции
f = sqrt(x^2-1);
Теперь вызов Rfun от аргумента, меньшего единицы, приведет к выводу в командное окно предупреждения:
>> y = Rfun(0.2)
результат комплексный
y =
0 + 0.97979589711327i
Файл-функция Rfun только предупреждает о том, что ее значение комплексное, а все вычисления с ней продолжаются. Если же комплексный результат означает ошибку вычислений, то следует прекратить выполнение функции, используя команду error вместо warning.
Оператор ветвления if-elseif-else
В общем случае применение оператора ветвления if-elseif-else выглядит следующим образом:
if условие 1
команды MatLab
elseif условие 2
команды MatLab
elseif условие 3
команды MatLab
. . . . . . . . . . .
elseif условие N
команды MatLab
else
команды MatLab
end
В зависимости от выполнения того или иного из N условий работает соответствующая ветвь программы, если не выполняется ни одно из N условий, то реализуются команды MatLab, размещенные после else. После выполнения любой из ветвей происходит выход из оператора. Ветвей может быть сколько угодно или только две. В случае двух ветвей используется завершающее else, а elseif пропускается. Оператор должен всегда заканчиваться end.
Пример использования оператора if-elseif-else приведен в следующем листинге.
function ifdem(a)
% пример использования оператора if-elseif-else
if (a == 0)
warning('а равно нулю')
elseif a == 1
warning('а равно единице')
elseif a == 2
warning('а равно двум')
elseif a >= 3
warning('а, больше или равно трем')
else
warning('а меньше трех, и не равно нулю, единице, двум')
end
1.5. Оператор ветвленияswitch
Для осуществления множественного выбора или ветвления может применяться оператор switch.Он является альтернативой оператору if-elseif-else. В общем случае применение оператора ветвления switch выглядит следующим образом:
switch switch_выражение
case значение 1
команды MatLab
case значение 2
команды MatLab
. . . . . . . . . . .
case значение N
команды MatLab
case {значение N+1, значение N+2, …}
команды MatLab
. . . . . . . . . . . .
case {значение NM+1, значение NM+2,…}
otherwise
команды MatLab
end
В данном операторе сначала вычисляется значение switch_выражения (это может быть скалярное числовое значение либо строка символов). Затем это значение сравнивается со значениями: значение 1, значение 2, …, значение N, значение N+1, значение N+2, …, значение NM+1, значение NM+2,… (которые также могут быть числовыми либо строковыми). Если найдено совпадение, то выполняются команды MatLab, стоящие после соответствующего ключевого слова case. В противном случае выполняются команды MatLab, расположенные между ключевыми словами otherwise и end.
Строк с ключевым словом case может быть сколько угодно, но строка с ключевым словом otherwise должна быть одна.
После выполнения какой-либо из ветвей происходит выход из switch, при этом значения, заданные в других case не проверяются.
Применение switch поясняет следующий пример:
function demswitch(x)
a = 10/5 + x
switch a
case -1
warning('a = -1')
case 0
warning('a = 0')
case 1
warning('a = 1')
case {2, 3, 4}
warning('a равно 2 или 3 или 4')
otherwise
warning('a не равно -1, 0, 1, 2, 3, 4')
end
>> x = -4
demswitch(x)
a =
1
warning: a = 1
>> x = 1
demswitch(x)
a =
6
warning: a не равно -1, 0, 1, 2, 3, 4
1.6. Оператор прерывания циклаbreak
При организации циклических вычислений следует заботиться о том, чтобы внутри цикла не возникло ошибок. Например, пусть задан массив x, состоящий из целых чисел, и требуется сформировать новый массив y по правилу y(i) = x(i+1)/x(i). Очевидно, что задача может быть решена при помощи цикла for. Но если один из элементов исходного массива равен нулю, то при делении получится inf, и последующие вычисления могут оказаться бесполезными. Предотвратить эту ситуацию можно выходом из цикла, если текущее значение x(i) равно нулю. Следующий фрагмент программы демонстрирует использование оператора break для прерывания цикла:
for x = 1:20
z = x-8;
if z==0
break
end
y = x/z
end
Как только переменная z принимает значение 0, цикл прерывается.
Оператор break позволяет досрочно прервать выполнение циклов for и while. Вне этих циклов оператор break не работает.
Если оператор break применяется во вложенном цикле, то он осуществляет выход только из внутреннего цикла.
ПОСТРОЕНИЕ ГРАФИКОВ
Простой пример построения двух графиков в одном графическом окне:
x = [0:0.1:7];
f = exp(-x);
subplot(1, 2, 1)
plot(x, f)
g = sin(x);
subplot(1, 2, 2)
plot(x, g)
Пример построения семейства кривых в одном окне
%программа для построения семейства кривых
x = [0:pi/30:2*pi];
for a = -0.1:0.02:0.1
y = exp(-a*x).*sin(x);
hold on
plot(x, y)
end