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

1-2 Моделирование / Matlab. Практический подход. Самоучитель

.pdf
Скачиваний:
763
Добавлен:
31.01.2021
Размер:
12.72 Mб
Скачать

Глава 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