Операторы цикла и условные операторы
Поможем в ✍️ написании учебной работы
Поможем с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой

Язык 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, просмотров: 301.