Процедурное программирование
11.3. Функции прерывания и продолжения циклов
Процессом выполнения циклов, заданных любым из обозначенных выше способов, можно управлять: принудительно их завершать, пропускать итерации, приостанавливать и возобновлять. Именно для целей управления циклами предназначены функции, описанные в данном пункте.
Функция Abort[] принудительно прекращает выполнение цикла и в качестве результата выдаёт сообщение Aborted.
Функция Break[] осуществляет выход из тела цикла, в котором она задана, и возвращает значение Null. Ячейка Out со значением Null при этом не генерируется.
Функция Continue[] инициирует переход к следующей итерации текущего цикла.
Функция Return[] прерывает выполнение цикла и возвращает Null, а заданная с аргументом Return[expr] возвращает значение выражения expr.
В. П. Дьяконов в своей книге [2, с. 127] называет такие функции директивами-функциями.
На рис. 11.13 проиллюстрировано использование перечисленных функций прерывания и продолжения циклов. Мы задали цикл Do, который на каждом шаге печатает номер этого шага. В примере In[1] мы вышли из тела цикла при помощи Break[], как только номер шага превысил число 2: выходная ячейка не была сгенерирована вовсе. В In[2] мы прервали при помощи Abort[] выполнение нашего цикла, как только номер шага превысил число 2: в выходной ячейке возникло сообщение Aborted. В In[3] мы прервали при помощи Return["some message"] выполнение нашего цикла, как только номер шага превысил число 2 и результатом вывели некоторое сообщение some message. В In[4] в процессе выполнения цикла мы перескочили шаги с третьего по восьмой, ничего не выводя на экран, при помощи Continue[].
Ещё одна функция прерывания Interrupt[] при обращении к ней в процессе выполнения цикла инициирует вмешательство пользователя: выдаётся диалоговое окно, в котором предлагает осуществить некоторый набор действий, например, продолжить выполнение цикла либо прервать его — см. пример на рис. 11.14.
Подробней о функциях прерывания и продожения циклов см. в книге В. П. Дьяконова [2, с. 127–128].
11.4. Безусловные переходы
В своей совокупности описанные выше операторы циклов и условий позволяют осуществить любое ветвление вычислений. Однако порой оказывается гораздо проще в явном виде указать программе, к какой области кода следует перейти в данный момент. Осуществляется это при помощи оператора безусловного перехода Goto[mark]. Этот оператор всегда действует в связке с другой встроенной функцией Label[mark], которая отмечает место программы, к которому осуществляется переход.
В примере на рис. 11.15 задан простейший цикл, реализованный с помощи оператора безусловного перехода. Он выводит на экран значение некоторого выражения x до тех пор, пока оно не превысит значение 10.
Подробней о задании безусловных переходов см. книгу В. П. Дьяконова [2, с. 131].
Ключевые термины
Составными называются выражения с заголовком CompoundExpression, представляющие собой следующие друг за другом и разделённые знаком " ; " более простые выражения.
Условный оператор (оператор ветвления) — это конструкция языка программирования, обеспечивающая выполнение определённой команды (набора команд) только при условии истинности некоторого логического выражения, либо выполнение одной из нескольких команд (наборов команд) в зависимости от значения некоторого выражения.
Цикл — это разновидность управляющей конструкции в языках программирования высокого уровня, предназначенная для организации многократного исполнения набора инструкций.
Краткие итоги
В данной лекции мы познакомились с основами процедурного стиля программирования на языке программирования Mathematica. В частности при помощи условных операторов мы научились ветвить процесс вычислений в зависимости от выполнения заданных условий. Мы научились в компактной форме задавать многократно выполняемые однотипные вычисления при помощи циклов, а также инициировать выполнение вычислений в требуемой части программы при помощи безусловных переходов. Мы познакомились с встроенными функциями Mathematica позволяющими управлять процессом выполнения циклов в частности и ходом вычислений в целом. Мы познакомились с правилами хорошего тона при написании программ.
Вопросы
- Какие конструкции языка программирования Mathematica называются условными операторами? Назовите основные условные операторы Mathematica.
- Как задаётся условный оператор If? Опишите алгоритм его работы.
- В каких случаях применяется условный оператор Which? Как он задаётся? Опишите алгоритм его работы.
- В каких случаях применяется оператор Switch? Как он задаётся? Опишите алгоритм его работы.
- Какой условный оператор используется при задании кусочных математических функций? Как он задаётся?
- Какие конструкции языка программирования Mathematica называются циклами? Назовите основные условные операторы Mathematica.
- Какие выражения Mathematica называются составными? Какой заголовок они имеют?
- Какой оператор цикла автоматизирует задание составных выражений? Каким образом он задаётся?
- Как задаётся оператор цикла While? Опишите алгоритм его работы. В чём заключается отличие между операторами While и NestWhile?
- Как задаётся оператор цикла For? Опишите алгоритм его работы.
- Какие задачи выполняют функции Abort[], Break[], Continue[], Return[], Interrupt[]?
- Какой оператор позволяет осуществлять безусловные переходы в тексте программы? В связке с какой функцией он работает?
Упражнения
- В настоящей лекции при знакомстве с условными операторами мы рассматривали задачу положении точки на координатной плоскости. Имелись следующие исходные данные о положении точки: модуль задающего её радиус-вектора отличен от нуля, была задана величина угла наклона радиус-вектора к оси абсцисс.
В настоящем задании создайте пользовательскую функцию двух переменных, определяющую, к какому квадранту координатной плоскости принадлежит или на какой координатной оси лежит точка, если заданы её декартовы координаты.
- Создайте пользовательскую функцию, дублирующую действие заданной встроенной функции. При выполнении задания используйте функцию Piecewise.
- Единичная шаговая функция UnitStep, которая будучи заданной в виде UnitStep[x] возвращает 0 для x<0 и 1 для x\ge0.
- Единичная треугольная функция UnitTriangle, которая будучи заданной в виде UnitTriangle[x] возвращает 1-|x| для |x|<1 и 0 в остальных случаях.
- Единичная прямоугольная функция UnitBox, которая будучи заданной в виде UnitBox[x] возвращает 1 для |x|<1/2 и 0 в остальных случаях.
- Сигнум-функция Sign, которая будучи заданной в виде Sign[x] возвращает -1, 0 или 1, если x принимает отрицательное, нулевое или положительное значения соответственно.
- Выполните задание 4 лекции 10 сего курса, пользуясь полученными в настоящей лекции навыками работы с условными операторами и операторами циклов, а именно: задайте пользовательскую функцию, которая преобразует строку, содержащую только буквы латинского алфавита, в список, элементами которого являются номера этих букв в алфавите.
- Создайте пользовательскую функцию typefunc одного аргумента arg со следующим назначением. Если аргумент arg является символом или числом, то typefunc должна возвращать тип arg. Если аргумент arg является списком, то typefunc должна возвращать также список, элементами которого являются типы элементов исходного списка arg.
- Создайте пользовательские функции, дублирующие действие встроенных функций нахождения факториала Factorial и двойного факториала Factorial2. В теле пользовательской функции должен содержаться хотя бы один из операторов циклов.
- Латинский квадратом называется квадратная матрица порядка n, заполненная n различными символами таким образом, чтобы ни в одной строке и ни в одном столбце не было повторяющихся символов. Выполните следующее задание, которое даёт Е. М. Воробьём в книге [1, с. 176], а именно определите пользовательскую функцию, которая порождала бы случайным образом латинский квадрат заданного порядка.