1-2 Моделирование / Matlab. Практический подход. Самоучитель
.pdfГлава 9. Символьные вычисления
print(Unquoted," - не знаю такого цвета") end_case
У функции GetColor() один аргумент – предполагается, что он числовой. Основу кода функции составляет оператор выбора case, в котором проверяется значение аргумента функции. Если аргумент равен 1, командой print(Unquoted,"1 - означает КРАСНЫЙ") выводится сообщение
1 – означает КРАСНЫЙ. Первым аргументом функции print() передается инструкция Unquoted, которая означает, что при отображении сообщения в области вывода его не нужно заключать в двойные кавычки. Чтобы после вывода сообщения работа оператора выбора завершалась, после команды с функцией print() указана инструкция break.
На заметку
Последовательность команд в MuPAD разделяется точкой с запятой (то есть ;).
Для значений аргумента функции 2 и 3 также предусмотрены свои сообщения. Каждый из соответствующих блоков заканчивается инструкцией break – в силу той же причины, что и для первого блока. Блок otherwise выполняется, если не найдено ни одно совпадение. В этом случае командой print(NoNL,x) выводится значение аргумента, переданного функции GetColor() при вызове. Инструкция NoNL в аргументах функции print() означает, что после вывода соответствующего сообщения переход к новой строке не выполняется.
На заметку
Ключевое слово NoNL является аббревиатурой от No New Line (означает нет новой строки).
Следующей командой print(Unquoted," – не знаю такого цвета") к выведенному числовому значению (мы предполагаем, что числовому) добавляется текстовое сообщение.
На заметку
Поскольку блоком otherwise оператор выбора завершается, нет необходимости указывать в конце этого блока инструкцию break.
На рис. 9.36 показано рабочее окно среды MuPAD с кодом функции
GetColor().
Примеры вызова функции GetColor() с разными числовыми аргументами (в диапазоне натуральных значений от 1 до 4) представлены на рис. 9.37.
391
Самоучитель Matlab
Рис. 9.36. Программный код функции с оператором выбора case
Рис. 9.37. Результат вызова функции GetColor()
392
Глава 9. Символьные вычисления
Еще одна функция, в которой использован оператор выбора case, представлена в документе на рис. 9.38.
Рис. 9.38. В функции TestNumber() использован оператор выбора case
Программный код этой функции приведен ниже:
TestNumber:=x-> case x
of 1 do of 2 do of 3 do of 5 do of 8 do
print(Unquoted,"Это число Фибоначчи!"); break
of 6 do
393
Самоучитель Matlab
print(Unquoted,"Совершенное число: 6=1+2+3 и 6=1*2*3"); break
otherwise
print(Unquoted,"Ничего интересного!") end_case
Особенность этого кода состоит в том, что он содержит пустые блоки ofdo – то есть блоки, которые не содержат команд для выполнения. Такой подход используется, если одни и те же действия нужно выполнять для нескольких значений проверяемого выражения. Что касается функции TestNumber(), то у нее один аргумент, который проверяется на предмет принадлежности к последовательности Фибоначчи.
На заметку
Последовательность Фибоначчи формируется так. Первые два числа последовательности равны 1, а каждое следующее равно сумме двух предыдущих. Таким образом, получаем числа 1, 1, 2, 3, 5, 8, 13, 21 и так далее.
Для нас интерес представляют числа в пределах первого десятка. В этом диапазоне к последовательности Фибоначчи имеют отношение числа 1, 2, 3, 5 и 8. Именно эти значения проверяются в начальных of-do блоках оператора выбора. Все эти блоки, кроме блока, соответствующего значению 8, пустые – то есть не содержат команд для выполнения. Поэтому если имеет место совпадение в одном из таких пустых блоков, сразу выполняются команды первого непустого блока – в данном случае блока для значения аргумента 8. Благодаря этому для значений 1, 2, 3, 5 и 8 аргумента функции TestNumber() выполняются одни и те же команды. А именно командой print(Unquoted,"Это число Фибоначчи!") выводится сообщение
Это число Фибоначчи!, а затем благодаря инструкции break работа оператора выбора (а с ним и все функции) завершается.
Отдельно обрабатывается значение аргумента 6. Число 6 – так на-
зываемое совершенное. Совершенные числа |
имеют особенность – |
он равны сумме своих делителей (чисел, на |
которые делится чис- |
ло). Делителями числа 6 являются числа 1, 2 и 3. Сумма этих чисел также равна 6. Если аргумент функции TestNumber() равен 6, командой print(Unquoted,"Совершенное число: 6=1+2+3 и 6=1*2*3") выводится сообщение о том, что число 6 - совершенное. Во всех прочих случаях появляется сообщение Ничего интересного!. На рис. 9.39 приведен фрагмент документа с примерами вызова функции TestNumber().
Стоит обратить внимание на то, как обрабатывается символьный аргумент функции (то есть аргумент, которому не присвоено числовое значение). В этом случае в силу очевидных причин реализуется otherwise-блок оператора выбора.
394
Глава 9. Символьные вычисления
Рис. 9.39. Результат вызова функции TestNumber()
Помимо условных операторов, важное место в программировании занимают операторы цикла, которые позволяют многократное повторение определенных действий. В MuPAD используются операторы цикла for, while и repeat. Рассмотрим каждый из этих операторов.
Синтаксис вызова оператора цикла for следующий:
for переменная from значение_1 to значение_2 step значение_3 do команды
end_for
Выполняется оператор цикла for следующим образом. Индексная переменная, указанная после ключевого слова for, последовательно пробегает значения от значение_1 (указано после ключевого слова from) до значения (не превышая значения) значение_2 (указано после ключевого слова to) с приращением на каждом шаге, равном значение_3 (указано после ключевого слова step). При каждом фиксированном значении индексной переменной выполняются команды, размещенные после ключевого слова do
идо окончания тела оператора цикла (инструкция end_for).
На заметку
Шаг приращения (инструкция step) указывать не обязательно. В этом случае индексная переменная изменяется на единицу. Если изменение индексной переменной в процессе выполнения оператора цикла уменьшается, вместо инструкции to используют инструкцию downto.
395
Самоучитель Matlab
Рассмотрим следующий программный код, в котором использован оператор цикла for при определении функции, которой вычисляются числа Фибоначчи:
Fib:=n->( a:=1; b:=1;
for k from 3 to n do b:=a+b;
a:=b-a; end_for; b)
У функции Fib() один аргумент, который определяет номер числа в последовательности Фибоначчи. Поскольку основу тела функции составляют несколько команд, все они объединены в один блок, для чего эти команды заключаются в круглые скобки. Первыми двумя командами переменным a и b присваиваются единичные значения. Эти переменные "помнят" текущие значения предпоследнего и последнего чисел в последовательности. После этого запускается оператор цикла. Его индексная переменная пробегает значения от 3 (первое и второе числа уже "вычислены" – это начальные значения переменных a и b) до n (аргумент функции Fib()). В теле оператора цикла выполняются две команды. Командой b:=a+b вычисляется новое значение для числа в последовательности. После этого в переменную a необходимо записать то значение, что было записано (до выполнения команды b:=a+b) в переменной b. Сделать это можно с помощью команды a:=b-a. Таким образом, после выполнения одной итерации в операторе цикла вычисляется новое число в последовательности и, как и на начальном этапе, в переменной a записано предпоследнее (на данный момент) значение в последовательности, а в переменной b – последнее. После выполнения оператора цикла в переменную b будет записано число в последовательности с порядковым номером n. Чтобы переменная b возвращалась как результат, она указывается последней командой в последовательности команд, определяющих код функции Fib(). Документ с кодом этой функции представлен на рис. 9.40.
Пример использования этой функции приведен в документе на рис. 9.41.
Здесь тоже использован оператор цикла for. В рамках этого оператора индексная переменная пробегает значения от 1 до 20. При фиксированном значении индексной переменной с помощью функции Fib() вычисляется число с соответствующим индексом в последовательности Фибоначчи, и вычисленные числа отображаются в одной строке.
396
Глава 9. Символьные вычисления
Рис. 9.40. Документ с кодом функции Fib()
Рис. 9.41. Использование функции Fib()
На заметку
Для того чтобы между числами добавлялся пробел, помимо команды print(NoNL,Fib(i)) использована еще и команда print(NoNL," ").
В результате в строке отображаются первые двадцать чисел последовательности Фибоначчи.
На заметку
Существует еще одна популярная форма оператора цикла, которая используется при переборе значений из некоторого множества. Синтаксис вызова оператора цикла в этом случае имеет такой вид:
397
Самоучитель Matlab
for переменная in множество_значений do команды
end_for
В этом случае последовательно перебирается множество значений. На каждом итерационном шаге переменная принимает очередное значение из множества значений.
Синтаксис вызова оператора while имеет следующий вид:
while условие do
команды end_while
Оператор выполняется следующим образом. Сначала проверяется условие. Если условие истинное, выполняются команды в теле оператора while. Затем снова проверяется условие. Если условие истинно, выполняются команды, и так далее. В документе на рис. 9.42 приведен пример кода, в котором вычисляются числа Фибоначчи, но в отличие от предыдущего случая здесь использован оператор while.
Рис. 9.42. Вычисление чисел Фибоначчи с помощью оператора while
Нами использовался следующий код:
a:=1:
b:=1:
i:=2:
print(NoNL,a);
398
Глава 9. Символьные вычисления
print(NoNL," "); print(NoNL,b); while i<20 do b:=a+b:
a:=b-a: print(NoNL," "); print(NoNL,b); i:=i+1: end_while:
Переменные a и b, в которые будут записываться числа Фибоначчи, а также индексная переменная i, получают свои начальные единичные значения. Текущие единичные значения переменных a и b отображаются в области вывода. После этого запускается оператор цикла while, в котором и происходят все основные события. В операторе проверяется условие i<20. В теле оператора цикла while командами b:=a+b и a:=b-a вычисляется очередное число в последовательности Фибоначчи. Далее в области вывода отображается вновь вычисленное число, после чего командой i:=i+1 вычисляется новое итерационное значение.
На заметку
Начальное значение индексной переменной i равно 2. На момент присваивания значения переменной i известно два числа (единичные значения переменных a и b) из последовательности. В операторе цикла после вычисления нового числа последовательности значение переменной i увеличивается на единицу. Таким образом, перед проверкой условия i<20 в операторе while значение переменной i указывает количество уже вычисленных чисел в последовательности. Поэтому вычисления продолжаются до тех пор, пока количество вычисленных чисел меньше двадцати. Другими словами, будет вычислено двадцать чисел из последовательности Фибоначчи.
На рис. 9.43 показан документ, в котором та же задача решается с помощью оператора repeat.
По сравнению с предыдущим случаем изменения кода минимальные:
a:=1:
b:=1:
i:=2:
print(NoNL,a); print(NoNL," "); print(NoNL,b); repeat
b:=a+b: a:=b-a:
print(NoNL," "); print(NoNL,b);
399
Самоучитель Matlab
Рис. 9.43. Вычисление чисел Фибоначчи с помощью оператора repeat
i:=i+1:
until i>=20 end_repeat:
Общий синтаксис вызова оператора repeat напоминает синтаксис вызова оператора while, но условие проверяется после выполнения команд тела цикла, а истинность условия означает завершение оператора:
repeat
команды
until условие end_repeat
Выполняется оператор так: сначала выполняются команды, затем проверяется условие. Чтобы оператор repeat продолжил работу, необходимо, чтобы условие было ложным. Если условие истинно, работа оператора repeat заканчивается.
Помимо блоков команд, содержащих условные операторы и операторы цикла, в документах MuPAD можно создавать процедуры – именованные блоки программного кода, которые можно вызывать по имени. Синтаксис объявления процедуры такой:
имя_процедуры:=proc(аргументы) local локальные_переменные; begin
команды end_proc
400