Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Красавин Компютерныы практикум в среде МатЛаб 2015

.pdf
Скачиваний:
218
Добавлен:
12.11.2022
Размер:
9.22 Mб
Скачать

2.5. При помощи функции rand создайте квадратную матрицу размера 10 10 из случайных чисел. Найдите сумму всех элементов матрицы, которые больше 0.5. Определите положение этих элементов в матрице.

31

3

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

3.1. If

Операторы ветвления присутствуют практически во всех языках программирования и позволяют создавать алгоритмы, в которых при определенных условиях выполняются одни группы операторов, а при других условиях – другие группы операторов.

Оператор if определяет, будут ли операторы, входящие в его структуру, выполнены в ходе работы программы. Структура оператора if выглядит следующим образом:

if condition operators

end

condition в этой структуре является условием, определяющим выполнение или невыполнение группы операторов operators; оно может принимать одно из двух логических значений: true или false. Когда алгоритм в процессе работы доходит до строки, содержащей оператор ветвления if, сначала проверяется выполнение условия condition. Если условие имеет значение true, алгоритм переходит к выполнению операторов operators, входящих в структуру оператора ветвления; если условие имеет значение false, алгоритм переходит к выполнению операторов, следующих за оператором end, указывающим на конец структуры операторы ветвления, и выполнение операторов operators таким образом в этом случае не осуществляется.

32

Пример 3.1.

if number < 0 number = 0

end

В приведенном коде число number сравнивается с нулем, и если оно меньше нуля, то переменная number получает новое значение – 0. Введем в командном окне MatLab следующие строки:

number = -1 if number < 0

number = 0 end

В результате выполнения этих операторов в командном окне появится результат:

number = 0

Поменяем начальное значение number и введем следующее:

number = 1

if number < 0 number = 0

end

В результате выполнения этих операторов в командном окне не появится сообщений, так как условие number < 0 в данном случае принимает значение false, и оператор number = 0 не выполняется.

3.2. If-else, elseif

Если в алгоритме необходимо предусмотреть ветвление на два и более варианта, применяются операторы if-else, elseif.

Структура оператора if-else выглядит следующим образом:

if condition operators1

else operators2

end

33

Вначале проверяется условие condition. Если оно имеет значение true, выполняется группа операторов operators1, после чего выполняется переход на оператор end, и выполнение оператора if-else заканчивается. Если же оно имеет значение false, то выполняется группа операторов operators2, после чего выполняется переход на оператор end.

Пример 3.2.

if a == 0

disp('a равно нулю') % вывод сообщения на экран else

disp('a не равно нулю') end

Структуры if-else могут быть вложенными друг в друга.

Пример 3.3. Рассмотрим кусочно-непрерывную функцию, определяемую следующим выражением:

1,если

1;

,если 1

2;

4,если

2.

При помощи оператора if такая функция может быть задана следующим образом:

if x < -1 y = 1;

end

if x >= -1 && x <= 2 % при проверке условий логические операторы И

(&) и ИЛИ (|) пишутся дважды

y = x^2; end

if x > 2 y = 4;

end

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

если в ходе работы кода окажется, что

, т.е. будет выполнено первое

условие, необходимость проверять остальные

условия отпадет, и обработка двух

1

оставшихся структур if превратится в потерю времени. Код можно сделать более быстрым при помощи операторов if-else:

34

if x < -1 y = 1;

else

% в это ответвление алгоритм заходит, только если x >= -1 if x <= 2

y = x ^2; else

% если алгоритм зашел в это ответвление, то x > 2 y = 4;

end end

В приведенном примере были использованы две if-else структуры, одна внешняя и одна вложенная.

В примере 3.3 алгоритм был оптимизирован при помощи использования двух конструкций if-else вместо трех конструкций if. Этот алгоритм можно реализовать третьим способом, воспользовавшись оператором MatLab elseif:

if condition1 operators1

elseif condition2 operators2

elseif condition3 operators3

% может быть сколько угодно разветвлений else

operatorsn % ветвь, в которую алгоритм заходит, если ни одно из предыдущих условий не выполнено

end

В этой структуре алгоритм последовательно проверяет условия condition1, condition2, condition2, ... до тех пор, пока не найдет условия, имеющего значение true. В этом случае выполнится группа операторов, соответствующих этому условию, после чего произойдет переход на оператор end, означающий окончание структуры elseif. Если же все условия имеют

35

значение false, выполнится группа операторов operatorsn, отвечающая оператору else, после чего произойдет переход на оператор end. При использовании структуры elseif оператор end употребляется только один раз. В примере 3.4 показано, как можно переписать код из примера 3.3 с помощью структуры elseif. Пример 3.5 демонстрирует использование этой структуры для проверки того, является ли введенный аргумент скаляром, вектором или матрицей.

Пример 3.4.

if x < -1 y = 1;

elseif x <= 2 y = x^2;

else

y = 4; end

Пример 3.5.

function typ = findtyp(inp)

[r, c] = size(inp); % определение размера переменной inp; в переменную r заносится число строк inp, в переменную c – число столбцов

if r == 1 && c == 1 typ = 'скаляр';

elseif r == 1 || c == 1 typ = 'вектор';

else

typ = 'матрица'; end

end

36

Задания

3.1. Упростить код:

if num > 100 num = 100;

else

num = num; end

3.2. Упростить код:

if val >= 10

disp ('Too much!') elseif val < 10

disp ('Too low!') end

3.3. Написать функцию, которая получает два входных

аргумента ,

и формирует вектор, содержащий все целые числа,

лежащие между

и (независимо от того, какое из них больше).

3.4.Написать функцию, у которой один входной аргумент. Если этот аргумент – вектор-строка или вектор-столбец, то функция должна возвратить также вектор-строку или вектор-столбец, но с обратным порядком элементов (использовать встроенные функции fliplr и flipud). Если же входной аргумент – скаляр или матрица, то ничего не предпринимать и возвратить исходный аргумент.

3.5.Написать функцию makematrix, которая в качестве входных аргументов получает две вектор-строки, при этом длины у этих вектор-строк могут быть различны и заранее неизвестны. Из этих вектор-строк функция должна сделать матрицу с двумя строками, содержащую входные вектор-строки. Если длина вектор-

37

строк различна, необходимо дополнить недостающие элементы нулями, например:

vec1 = [2 3 4 5]; vec2 = [1 4 7 9 8 6]; makematrix(vec1,vec2) ans =

2 3 4 5 0 0

1 4 7 9 8 6

38

4

Циклы

4.1. For

Оператор for используется в том случае, если необходимо повторить выполнение некоторых операторов программы, и при этом заранее известно, сколько раз необходимо сделать это повторение. Цикл с использованием оператора for имеет следующий общий вид:

for loopvar = ini : step : fin operators

end

Переменная loopvar называется переменной цикла, она меняется от начального значения ini до конечного значения fin с шагом step. Признаком завершения цикла является оператор end. При первом выполнении цикла переменная loopvar принимает значение ini, и выполняются операторы operators, которые в общем случае могут зависеть от значения loopvar. После этого значение переменной цикла увеличивается на величину шага step и становится ini + step, и вся последовательность действий повторяется. На следующем шаге значение переменной цикла становится ini + 2*step, и так далее до тех пор, пока значение переменной цикла не превысит fin. Если значение loopvar превысило значение fin, то операторы внутри цикла не выполняются, и программа переходит к выполнению операторов, следующих за оператором конца цикла end.

Пример 4.1.

for i = 0:50:200 fprintf('%3d\n',i)

end

39

В данном случае в теле цикла for имеется только один оператор fprintf, обеспечивающий вывод переменной цикла i в соответствии с форматом, указанным строкой %3d\n. Этот формат означает, что число i будет отображено в целочисленном формате тремя символами (3d), после чего произойдет переход на новую строку (\n). Результатом выполнения цикла будет появление на экране следующей записи:

0

50

100

150

200

Пример 4.2. Оператор for удобно использовать для вычисления сумм и произведений. Например, сумма всех простых чисел от 1 до 1000 может быть найдена при помощи следующего цикла:

total = 0

for k = 1:999 % цикл по всем натуральным числам от 1 до 999 if(isprime(k)) % проверка является ли k простым числом

total = total + k; % если k – простое число, то аргумент оператора if принимает логическое значение true, и выполняются операторы внутри условия if: число total увеличивается на k

end

 

end

% отображение суммы на экране

disp(total)

В результате выполнения этого цикла получаем результат: 76127.

Приведенный цикл можно записать эффективнее, если использовать возможность MatLab, в качестве переменной цикла указывать не диапазон значений переменной, а элементы вектора:

total = 0

for k = primes(999) total = total + k;

end disp(total)

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

Цикл for нужно использовать для вычисления сумм в сложных случаях, в простых ситуациях эффективнее пользоваться поэлементными операциями или оператором sum. Например, приведенный выше код можно оптимизировать:

40

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