Язык ML имеет специальные управляющие конструкции, которые позволяют задавать последовательность выполнения команд в программах. Такие конструкции называются операторами управления и задаются с помощью ключевых слов. Это операторы цикла for и while, условный оператор if и оператор переключения (выбора) switch … case. Синтаксис и выполняемые действия этих операторов аналогичны соответствующим операторам известных языков программирования. Область действия каждой конструкции ограничивается словом end. MATLAB допускает вложенность операторов.
Оператор цикла с параметром
Оператор цикла позволяет описывать действия, которые выполняются фиксированное количество раз.
for <параметр цикла>=<начальное значение>:<шаг>:<конечное значение>
<операторы>
End
Для досрочного прерывания цикла, используется оператор break.
Если шаг изменения параметра цикла равен 1, то его можно не указывать. Параметры цикла, их начальное и конечное значения и шаг изменения, могут быть целого и вещественного типа.
Например, требуется вычислить значения у=x2 для всех х на отрезке от 1 до 10 c шагом равным 3.
>>for x=1:3:10
y=x^2
end
Результат выполнения данного оператора:
y =
1
y =
16
y =
49
y =
100
Или вычислим значения у для всех х на отрезке от 0.1 до 1 c шагом равным 0.5.
>> for x=0.1:0.5:1
y=x^2
end
В результате получили:
y =
0.0100
y =
0.3600
Везде, где возможно, в ML следует использовать не циклы, а векторные и матричные операции (т.к. это быстрее).
Пусть требуется составить вектор из 5 нечетных чисел натурального ряда. В ML решать эту задачу можно 3 способами:
· Первый способ - использовать оператор цикла
>> for i =1:5
x(i)=2*i-1
end
На экране получим:
x =
1
x =
1 3
x =
1 3 5
x =
1 3 5 7
x =
1 3 5 7 9
Этот способ очень неэффективен по времени, т.к. память не выделяется сразу под весь массив, а при каждой итерации цикла заново создается вектор х с размерностью на единицу большей, чем на предыдущем шаге, что и приводит к большим затратам времени. Это показывает распечатка результов.
· Второй способ - сформировать вектор из нулей х=zeros(1,5), а потом заполнить его значениями.
>> x=zeros(1,5)
x =
0 0 0 0 0
>> for i=1:5
x(i)=2*i-1
end
В результате получим:
x =
1 0 0 0 0
x =
1 3 0 0 0
x =
1 3 5 0 0
x =
1 3 5 7 0
x =
1 3 5 7 9
В данном случае мы заранее определили размер вектора, в который записываются результаты работы цикла. Этот способ несколько быстрее первого.
· Третий способ - можно сформировать два вектора:
вектор i =1:5 и вектор х=2* i -1
>> i=1: 5
i =
1 2 3 4 5
>> x=2*i-1
x =
1 3 5 7 9
В данном случае применяются векторные операции вместо использования циклов, и этот способ самый быстрый.
Чтобы повысить эффективность работы программы, следует иметь в виду следующее правило: везде, где возможно, заменять фрагменты программы, содержащие циклы for и while на матричные операции или матричные функции. Это объясняется тем, что скорость выполнения матричных и векторных операций выше.
Если нельзя обойтись без циклов, то можно заставить их выполняться быстрее, если следовать правилу: создавать заранее каждый вектор, в который требуется записывать результат работы цикла.
Оператор цикла с предусловием
Данный оператор позволяет запрограммировать цикл, в котором количество повторений зависит от выполнения некоторого условия.
while <логическое выражение, задающее условие продолжения цикла>
<операторы>
End
Сформируем вектор нечетных чисел:
>>x=zeros(1, 5)
>> i=1;
>> while i<=5
x(i)=2*i-1;
i=i+1;
end;
x =
1 3 5 7 9
Как видим, такой способ получения последовательности нечетных чисел тоже возможен, но он также является неэффективным, т. е. медленным.
Найти наибольшее число, факториал которого< 150.
>>echo on
%нахождение наибольшего числа, факториал, которого меньше 150
>>i=1;
f=1;
while f<150
i=i+1;
f=f*i;
end
disp(i-1)
на экране получим:
5
или можно воспользоваться встроенной функцией:
>> i=1;
while prod(1:i)<150
i=i+1;
end;
disp(i-1)
на экране получим:
5
Условный оператор
Условный оператор позволяет организовать ветвления в программе и имеет следующую синтаксическую конструкцию:
if (<логическое выражение1>)
<операторы>
[ elseif (<логическое выражение2>)
<операторы>
elseif (<логическое выражение3>)
<операторы>
…]
[ else
<операторы>]
End
В этой конструкции может быть произвольное количество вложений ветвей elseif или их может не быть вовсе.
Пусть необходимо по введенной с клавиатуры температуре воздуха охарактеризовать погоду. Введем следующий текст:
>> t=input('введи температуру')
if (t<0)
s='мороз'
elseif and(t>0,t<=10)
s='холодно'
elseif and(t>10,t<=20)
s='тепло'
else
s='жарко'
end
В результате выполнения этих команд получим на экране:
введи температуру (например, ввели -4) -4
t =
-4
s =
мороз
Логическое выражение может быть записано и в такой форме:
(t>0)&(t<=10)
Оператор переключения (выбора)
Если необходимо сделать множественный выбор, можно воспользоваться оператором переключения, синтаксическая конструкция которого приведена ниже.
Switch <ключевое выражение>
Case { <список значений1}
<операторы>
Case {<список значений2>}
<операторы>
…….
[ Otherwise
<операторы>]
End
Сначала вычисляется значение ключевого выражения. Затем это значение ищется в списках значений. Если совпадение найдено, то выполняются операторы соответствующего блока, в противном случае выполняются операторы, стоящие после ключевого слова otherwise .
Пусть необходимо по введенному с клавиатуры номеру месяца вывести название времени года. Ниже приведены команды, позволяющие решить эту задачу.
>>n=input('введи номер месяца : ')
switch n
case {1,2,12}
disp('зима')
case {3,4,5}
disp('весна')
case {6,7,8}
disp('лето')
case {9,10,11}
disp('осень')
otherwise
disp('ошибка')
end
На экране получим:
введи номер месяца : 11
n =
11
осень
Дата: 2019-02-02, просмотров: 306.