Красавин Компютерныы практикум в среде МатЛаб 2015
.pdf2.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
