fbed99da

Продолжение вычислений после команды Interrupt[]



Пример 10..5. Продолжение вычислений после команды Interrupt[]


Функция IF

Как у большинства языков программирования, условные выражения задаются с помощью оператора или функции IF. Система Mathematica имеет функцию If, формы которой представлены ниже:

  • If [condition, t, f] — возвращает t, если результатом вычисления condition является True, и f, если результат равен False;
  • If [condition, t, f, u ]—то же, но дает и, если в результате вычисления condition не было получено ни True, ни False.
Следующий пример показывает создание программной процедуры с циклом Do, выход из которой реализуется с помощью функции I f и директивы прерывания Aborted! ]:



х := 1; Print["i x"];

Do[{If [i == 5, Abort[], None],

i += 1; x += 2*i; Print[i, " ", N[x]]},

{i, 1, 100}]

i x

2 5

3 11.

4 19.

5 29.

$Aborted

Return[x]

Return[1]

Тот же пример, но с применением директивы выхода из цикла Break [] в функции If показан ниже:

х := 1; Print["i x"];

Do[{If [i == 5, Break[], None],

i += 1; x += 2*i; Print[i, " ", N[x]]},

{i, 1, 100}]

i x

2 5.

3 11.

4 19.

5 29.

Return[x]

Return[29]

В данном случае никаких специальных сообщений о выходе из цикла не выдается. Функция If обеспечивает ветвление максимум по двум ветвям программы. Для ветвления по многим направлениям можно использовать древовидные структуры программ с множеством функций If. Однако это усложняет исходный текст программы.

Функции-переключатели

Для организации ветвления по многим направлениям в современных языках программирования используются операторы-переключатели. В системе Mathematica множественное ветвление организовано с помощью функций Which и Switch:

  • Which [testl, valuel, test2, value2,...] — вычисляет в порядке следования каждый из testi, сразу возвращая именно ту величину из valuei, которая относится к первому testi, давшему True;
  • Switch [expr, forml, valuel, form2, value2,...] — вычисляет селектор expr, затем сравнивает его последовательно с каждой из меток f ormi, вычисляя и возвращая то valuei, которое соответствует первому совпадению.
Приведем примеры работы функции which:

Whichtl == 2,1,2== 2, 2, 3 == 3, 3]

2

Which[l == 2, x, 2 == 2, у, 3 == 3, z]

y

Следующие примеры иллюстрируют работу функции Switch:

Switch[1, 1, а, 2, b, 3, с]

а

Switch[2, 1, а, 2, b, 3, с]

b

Switch[3, 1, а, 2, b, 3, с]

с

Switch[8, 1, а, 2, b, 3, с]

Switch[8,

1, а,

2, b,

3, с]

Обратите внимание на последний пример — при неверном задании первого параметра (селектора) просто повторяется запись функции.

Следующий пример показывает возможность выбора с применением вещественных значений селектора и меток:

Switch[8., 1.5, а, 2.5, b, 8., с]

с

Switch[1.5, 1.5, а, 2.5, b, 8., с]

а

Switch[8, 1.5, а, 2.5, b, 8., с]

Switch[8,

1.5, а,

2.5, b,

8., с]

Опять-таки, обратите внимание на последний пример — здесь использован селектор в виде целого числа 8, тогда как метка выбора — вещественное число 8. Выбор при этом не происходит, поскольку целочисленное значение 8 не является тождественным вещественной восьмерке.

Безусловные переходы

В целом, условные выражения в языке программирования системы Mathematica позволяют реализовать любой вид ветвления в программах. Однако иногда бывает полезно без лишних раздумий указать в программе явный переход к какой-либо ее части. Для этого используется оператор безусловного перехода Goto [tag]. который дает переход к тому месту программы, которое отмечено меткой Label [tag]. Возможны также формы Goto [expr] и Label [expr], где ехрr — вычисляемое выражение.

Применение оператора Goto иллюстрирует следующий пример:

(q = 2; Label[start]; Print[q]; q += 2;

If[q < 7, Goto[start]])

2

4

6

Здесь с помощью оператора Goto [start] организован цикл с возвратом на метку Label [start], действующий до тех пор, пока значение q меньше 7. При этом q меняется от начального значения 2 с шагом 2, причем добавление 2 к текущему значению q осуществляется укороченным оператором сложения q+=2.

Интересной особенностью языка программирования Mathematica является возможность создания переходов по значению вычисляемого выражения. Например, Goto [2+3] дает переход к метке Label [5] или даже Label [1+4], что видно из следующего примера:

Goto[2 + 3];

Print["ааааа"];

Label[1 + 4];

Print["bbbbb"]

bbbbb

Переходы, задаваемые выражениями, и метки, меняющие свой идентификатор, редко встречаются в обычных языках программирования, хотя они обеспечивают новые обширные и довольно необычные возможности по созданию программ с различными ветвлениями.

Для языка программирования системы Mathematica, ориентированного на безупречное и строгое структурное программирование, введение оператора Goto может расцениваться как отступничество от основополагающих идей структурного программирования. Поэтому на применение этого оператора в методах структурного программирования наложено табу. Тем не менее, этот оператор есть, а применять его или нет — дело пользователя.



Содержание раздела