Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Glava_2a70_2014.doc
Скачиваний:
5
Добавлен:
01.07.2025
Размер:
5 Мб
Скачать
☆

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

К операторам ветвления относятся условный оператор if и оператор переключения switch, которые позволяют создать такие алгоритмы, в ко-

торых при заданных условиях выполняются те или иные блоки команд.

Рассмотрим условный оператор if, использующий ключевые слова if (если), else (иначе), elseif (иначе если), end (конец всей конструкции).

Наиболее простой синтаксис применения оператора if имеет вид:

if условие

Инструкции

end

где условие – произвольное выражение (чаще всего включающее в себя операции сравнения и логические операции), истинность или ложность которого понимается как отличие от нуля или равенство нулю (заметим, что в логических выражениях в системе MATLAB допускается использование массивов, причем в тех случаях, когда значением таких выражений является массив истинность условия наступает, когда истинны (не равны нулю) все элементы массива, ну а если хотя бы один элемент такого массива отличен от нуля, то условие считается ложным, ложным условие считается и при использовании пустого массива).

При выполнении простейшего фрагмента программы

A=[1 2; 3 0];

if A

b=1;

else

b=2;

получим, что переменная b примет значение 2, в силу того, что матрица A содержит один нулевой элемент, в результате чего все условие считается ложным. Отметим, что запись типа if A по своему действию полностью эквивалентна записи if A~=0 и записи if all(A(:)).

Если заданное условие является истинным, то Инструкции выполняются, если же условие является ложным, то Инструкции не выполняются, и программа переходит к выполнению команд, расположенных после слова end. Набор выполняемых инструкций всегда должен завершиться оператором end. В более общем случае синтаксис оператора if следующий:

if условие_1

Инструкции_1

elseif условие_2

Инструкции_2

elseif условие_3

Инструкции_3

...

else

Инструкции

end

Поясним, что в такой конструкции может быть много ветвей с ключевым словом elseif, при этом если справедливо условие условие_1, то выполняется набор команд Инструкции_1, если справедливо условие условие_2, то выполняется набор команд Инструкции_2 и т.д. Если же все эти условия оказываются ложными, то выполняются команды, расположенные после слова else. Отметим, что с одной стороны число ветвей elseif неограниченно, с другой – ветви elseif могут отсутствовать вовсе. Рассмотренный условный оператор завершается ключевым словом end.

Покажем, как используется конструкция if...else...elseif...end на примере простейшей файл-программы temperature (сохраненной в файле temperature.m):

function temperature(t)

if(t<=0)

disp('Морозная погода')

elseif and(t>0, t<=10)

disp('Холодная погода')

elseif and(t>10, t<=18)

disp('Прохладная погода')

elseif and(t>18, t<=25)

disp('Теплая погода')

else

disp('Жаркая погода')

end

Работоспособность приведенной файл-функции несложно проверить, задавая произвольные значения температуры в качестве аргумента функции temperature. Так, например, будем иметь:

>> temperature(-30)

Морозная погода

>> temperature(5)

Холодная погода

>> temperature(11)

Прохладная погода

>> temperature(21)

Теплая погода

>> temperature(27)

Жаркая погода

Рассмотренный оператор break не работает вне циклов for и while. В соответствующих случаях нужно использовать оператор return. Так, например, последний применяется совместно с условными операторами в теле файл-функций для реализации досрочного завершения функции и выхода из нее. В качестве характерного примера приведем файл-функцию factorial вычисления факториала целого положительного числа (сохраненную в файле factorial.m):

function res=factorial(n)

res=1;

if n==1

return

else

for i=2:n

res=res.*i;

end

end

Если входной параметр данной функции равен единице, то оператор return осуществляет досрочный выход из функции ввиду того, что правильный результат (res=1;) уже сформирован.

Если оператор return не используется, нормальное завершение функции наступает по исчерпании всех инструкций, размещенных в теле функции.

Нередко условные операторы совместно с оператором break, размещаемые внутри цикла, используются для досрочного выхода из цикла. Более того, иногда такое условие и вовсе является единственным, например:

prod=1; i=1;

while 1

prod=prod.*i

i=i+1;

if i>9

break

end

end

Очевидно, что в данном примере цикл без команды break, работающей совместно с условным оператором if, был бы бесконечным. Таким образом, цикл оказывается конечным, в результате выполнения фрагмента программы будет возвращено значение произведения целых чисел от единицы до девяти (факториал девяти).

Алгоритмы, в которых должен осуществляться множественный выбор, можно реализовать посредством оператора переключения switch, который является эффективной альтернативой использованию оператора if. Ниже представлен синтаксис переключателя switch (аналогом последнего в языке программирования FORTRAN является конструкция SELECT CASE):

switch выражение

case значение_1

Инструкции

case значение_2

Инструкции

case {значение_3, значение_4,...}

Инструкции

...

otherwise

Инструкции

end

В данной конструкции, прежде всего, вычисляется значение выражения выражение (это может быть скалярное числовое значение либо строка символов). Далее это значение сравнивается со значениями значение_1, значение_2, значение_3, значение_4 и т.д. (которые могут быть числовыми либо строковыми). Если найдено совпадение, то выполняются Инструкции, стоящие после соответствующего ключевого слова case. В противном случае выполняются Инструкции, расположенные между ключевыми словами otherwise и end. Строк со словом case может быть сколько угодно, но строка с ключевым словом otherwise должна быть одна. Конструкция {значение_3, значение_4,...} означает, что в строке с ключевым словом case может находиться массив ячеек (в таком случае оператор case будет истинным, если значение выражения выражение совпадает с любым из значений этого массива ячеек).

Заметим, что в случае, когда выражение представляет собой строку символов, соответствующий оператор case будет истинным, если функция вида strcmp(выражение,значение) возвращает значение 1 (истина).

Следует указать на важную особенность переключателя switch в языке программирования MATLAB: если в переключателе switch выполнена одна из ветвей, то остальные ветви этого переключателя выполняться не будут, поэтому никакие дополнительные операторы, позволяющие избежать выполнения других ветвей в данном случае не требуются (в отличие, например, от языков программирования C/C++).

Приведенная ниже файл-программа seasons (сохраненная в файле seasons.m) демонстрирует работу переключателя switch:

switch lower(s)

case{'декабрь','январь','февраль'}

disp('Время года - зима')

case{'март','апрель','май'}

disp('Время года - весна')

case{'июнь','июль','август'}

disp('Время года - лето')

case{'сентябрь','октябрь','ноябрь'}

disp('Время года - осень')

otherwise

disp('Неизвестное время года')

end

Представленная программа позволяет определить, к какому времени года относится месяц, заданный в качестве значения переменной s (поясним, что функция lower(s) преобразовывает все символы заданной текстовой строки s к строчным). Если переменной s присвоить число либо строковое значение, которое не является названием месяца, то программа распознает его как неизвестное время года. Например, имеем:

>> s='август';

>> seasons

Время года - лето

>> s='ОктЯбрЬ';

>> seasons

Время года - осень

>> s='апрель';

>> seasons

Время года - весна

>> s='январь';

>> seasons

Время года - зима

>> s='125';

>> seasons

Неизвестное время года

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]