Maple 9.5/10 в математике, физике и образовании - Владимир Дьяконов
Шрифт:
Интервал:
Закладка:
Простейшую конструкцию разветвляющихся программ в Maple-языке программирования задает оператор if или оператор условного выражения:
if <Условие сравнения> then <Элементы>
|elif <Условие сравнения> then <Элементы>|
|else <Элементы>|
fi;
В вертикальных чертах | | указаны необязательные элементы данной конструкции. Следующие два вида условных выражений чаще всего используются на практике:
if <Условие> then <Элементы 1> fi — если Условие выполняется, то исполняются Элементы 1, иначе ничего не выполняется;
if <Условие> then <Элементы 1> else <Элементы 2> fi — если Условие выполняется, то исполняются Элементы 1, иначе исполняются Элементы 2.
В задании условий используются любые логические конструкции со знаками сравнения (<, <=, >, >=, =, <>) и логические операторы and, or и not, конструкции с которыми возвращают логические значения true и false.Рассмотрим следующий простой пример (файл р2):
> х:=-5:
> if х<0 then print(`Negative`) fi;
Negative> x:=1:
> if x<0 then print(`Negative`) fi;
В этом примере анализируется значение х. Если оно отрицательно, то с помощью функции вывода print на экран выводится сообщение «Negative». А вот если х неотрицательно, то не выводится никакого сообщения. В другом примере если х неотрицательно, то выводится сообщение «Positive»:
> х:=-5:
> if х<0 then print(`Negative`) else print(`Positive`) fi;
Negative> x:=1:
> if x<0 then print(`Negative`) else print(`Positive`) fi;
PositiveПриведем еще один пример, показывающий особую форму задания конструкции if-then-else-fi:
> х:=-5:
> `if` (х<0, print(`Negative`),print(`Positive`));
Negative> x: =1:
> `if` (x<0, print(`Negative`),print(`Positive`));
PositiveВ этой конструкции вида
`if `(Условие, Выражение1, Выражение2)
если Условие выполнятся, то будет исполнено Выражение1, в противном случае будет исполнено Выражение2. Ввиду компактности записи такая форма условного выражения нередко бывает предпочтительна, хотя она и менее наглядна. На рис. 10.3 представлено применение данной конструкции для моделирования трех типов сигналов.
Рис. 10.3. Применение конструкции с функцией if для моделирования сигналов
К сожалению, функции на базе конструкции if не всегда корректно обрабатываются функциями символьной математики. Поэтому надо тщательно контролировать полученные в этом случае результаты.
10.2.2. Циклы for и while
Зачастую необходимо циклическое повторение выполнения выражения заданное число раз или до тех пор, пока выполняется определенное условие. Maple имеет обобщенную конструкцию цикла, которая задается следующим образом:
|for <name>| | from <expr1>| |to <expr3>| |bу <expr2>| |while <expr4>|
do <statement sequence> od;
Здесь name — имя управляющей переменной цикла, expr1, expr2 и expr3 — выражения, задающие начальное значение, конечное значение и шаг изменения переменной name, expr4 — выражение, задающее условие, пока цикл (набор объектов между словами do и od) будет выполняться.
В ходе выполнения цикла управляющая переменная меняется от значения expr1 до значения expr2 с шагом, заданным expr3. Если блок by <expr2> отсутствует, то управляющая переменная будет меняться с шагом +1 при expr1<expr2. Это наглядно поясняет следующий пример:
> for i from 1 to 5 do print(i) od;
1 2 3 4 5В нем выводятся значения переменной i в ходе выполнения цикла. Нетрудно заметить, что она и впрямь меняется от значения 1 до значения 5 с шагом +1 Следующий пример показывает, что границы изменения управляющей переменной можно задать арифметическими выражениями:
> for i from 7/(2+5) to 2+3 do print(i) od;
1 2 3 4 5А еще один пример показывает задание цикла, у которого переменная цикла меняется от значения 1 до 10 с шагом 2:
> for i from 1 to 10 by 2 do print(i) od;
1 3 5 7 9В этом случае выводятся нечетные числа от 1 до 9. Шаг может быть и отрицательным:
> for i from 9 to 1 by -2 do print(i) od;
9 7 5 3 1Следует отметить, что expr1>expr2 задать заведомо невыполнимое условие, например, expr1>expr2 и положительное значение шага, то цикл выполнятся не будет. В цикл можно прервать с помощью дополнительного блока while <expr4>. Цикл с таким блоком выполняется до конца или до тех пор, пока условие expr4 истинно:
> for i from 1 to 10 by 2 while i<6 do print(i) od;
1 3 5Таким образом, конструкция цикла в Maple-языке программирования вобрала в себя основные конструкции циклов for и while. Есть еще одна, более специфическая конструкция цикла:
|for <name>| |in <expr1>| | while <expr2>| do <statement sequence> od;
Здесь expr1 задает список значений, которые будет принимать управляющая переменная name. Цикл будет выполняться, пока не будет исчерпан список и пока выполняется условие, заданное выражением expr2. Следующий пример иллюстрирует сказанное:
> for i in [1,2,5,-1,7,12] do print(i) od;
1 2 5 -1 7 12> for i in [1,2,5,-1,7,12] while i>0 do print(i) od;
1 2 5В цикле этого вида управляющая переменная может меняться произвольно.
10.2.3. Вложенные циклы и задание с их помощью матриц
Циклы могут быть вложенными. Это иллюстрирует следующий пример, создающий единичную матрицу на базе заданного массива М:
> M:=array(1..3,1..3);
М:=array(1..3, 1..3, [])> for i to 3 do for j to 3 do M[i,j]:=0; if i=j then M[i,j]:=1 fi; od od;
> evalm(M);
Однако по образцу этого примера читатель может задавать другие, нужные ему, матрицы.
Этот пример имеет не более чем познавательное значение, поскольку дня создания такой матрицы Maple имеет функции identity, с помощью которой функция array позволяет сразу создать единичную матрицу:
> array(1..3,1..3,identity);
10.2.4. Упрощенная конструкция циклов
В заключение отметим, что возможна упрощенная частная конструкция цикла типа while:
while expr do statseq od;
Здесь выражения statseq выполняются, пока выполняется логическое условие expr. Пример такого цикла:
> n:=1;
n:=1> while n<16 do n:=2*n od;
n:=2 n:=4 n:=8 n:=16В этом примере идет удвоение числа n с начальным значением n=1 до тех пор, пока значение n меньше 16.
10.2.5. Операторы пропуска и прерывания циклов
Иногда бывает нужным пропустить определенное значение переменной цикла. Для этого используется оператор next (следующий). Приведенный ниже пример иллюстрирует применение оператора next в составе выражения if-fi для исключения вывода значения i=-2:
> for i in [1,2,3,-2,4] do if i=-2 then next else print(i) fi od;
1 2 3 4Другой оператор — break — прерывает выполнение фрагмента программы (или цикла) Его действие поясняет слегка модифицированный предшествующий пример:
> for i in [1,2,3,-2,4] do if i=-2 then break else print(i) fi od;
1 2 3В данном случае при значении i=-2 произошло полное прекращение выполнения цикла. Поэтому следующее значение 4 переменной i присвоено не было и это значение на печать не попало.
Любой из операторов quit, done или stop обеспечивает также прерывание выполнения текущей программы (в частности цикла), но при этом окно текущего документа закрывается.
10.3. Процедуры и процедуры-функции
10.3.1. Простейшие процедуры
Процедурой называют объект программы, имеющий самостоятельное значение и выполняющий одну или несколько операций. Процедуры являются важнейшим элементом структурного программирования и служат средством расширения возможностей системы Maple пользователем.
Каждая процедура имеет свое уникальное имя и список параметров (он может быть пустым). Процедуры вызываются так же как встроенные функции — указанием их имени со списком фактических параметров. При этом просто процедуры обычно не возвращают каких-либо значений после своего исполнения, хотя могут присваивать значения входящим в них переменным. Процедуры-функции в ответ на обращение к ним возвращают некоторое значение. Они как бы являются новыми функциями, задаваемыми пользователем. Описанные ранее функции пользователя фактически являются процедурами-функциями с несколько упрощенной структурой.