Вплоть до появления 7 версии системы MathCAD возможности программирования в них были крайне ограниченными. Фактически MathCAD позволяла реализовать лишь линейные программы, в основе которых лежит понятие функции. Функция if и ранжированные переменные в отдельных случаях могли заменить условные выражения и циклы, но с серьезными ограничениями. Отсутствовала возможность задания завершенных программных модулей.
|  | Эти возможности в расширенном варианте появились в MathCAD 7.0 Pro и имеются в описываемой версии MathCAD 2001 PRO. Они сосредоточены в наборной панели программных элементов Programming (показана на рисунке), включаемой кнопкой на панели Math. |
Отметим, что возможность составлять программы реализована только в версии Professional. Все эти MathCAD-программы с точки зрения программиста представляют собой подпрограммы-функции, которые могут возвращать в качестве результата число, вектор или матрицу. Функции могут вызывать сами себя (рекурсивно определенные функции) или другие подпрограммы-функции, определенные выше в том же MathCAD-документе.
Эти подпрограммы-функции составляются так же, как и определения функций. Рассмотрим простой пример вычисления суммы: Sum(n)=1+2+3+..+n:
Задайте сначала имя функции Sum, вслед за которым введите список параметров (n) и оператор присваивания :=
Введите начальное значение s и отметьте его целиком. Стрелка служит оператором присваивания в теле программы, вводитя клавишей { (открывающая фигурная скобка) или выбором кнопки со срелкой с панели.
Создайте новую строку программы (вставка вертикальной черты) при помощи кнопки Add Line ( клавиша -] (закрывающая квадратная скобка)). На экране появится вертикальная черта и пустая ячейка.
Выполните щелчок на кнопке for, чтобы ввести оператор цикла. Перед символом принадлежности введите переменную i, а после него - промежуток изменения переменной 1..n. В находящейся ниже ячейке введите присваивание s . Программа готова.
Ниже в таблице приведены операторы, находящиеся на кнопках панели программирования.
| Команды панели Symbolic (символы) |
| Команда | Функция | Пример |
| Add Line | Добавляет новую строку под/над (зависит от выделения) текущей строкой. | |
|  | Присваивание значения локальной переменной. |  |
| if | Условный оператор (оператор ветвления)if; условие должно стоять после if, а оператор, который исполняется, если выполнено заданное условие,- перед if. |  |
| otherwise | Обозначает оператор, который должет быть исполнен, если условие оператора if не выполняется. |  |
| for | Цикл for; за ключевым словом for следует переменная-счетчик, а после символа принадлежности вводится промедуток изменения этой переменной. Внутренние операторы цикла сдвинуты немного вправо. |  |
| while | Цикл while;внутренние операторы цикла будут исполняться до тех пор, пока будет истинным условие, следующее за ключевым словом while. Пример показыветприменение цикла для нахождения нулей функции методом касательных Ньютона. |  |
| break | Служит для преждевременного завершения цикла, чтобы, например, избежать зацикливания или слишком продолжительных вычислений. |  |
| continue | Служит для преждевременного завершения текущей итерации цикла; сам цикл при этом продолжается. |  |
| retutn | Преждевременное завершение программы; указанное в ячейке значение будет возвращено. |  |
| on error | Если при вычислении выражения expr2 возникла ошибка, вычисляется выражение expr1. |  |
![]()
Add Line - создает и при необходимости расширяет жирную вертикальную линию, справа от которой в шаблонах задается запись программного блока;
- символ локального присваивания (в теле модуля);
if - условная инструкция;
for - инструкция задания цикла с фиксированным числом повторений;
while - инструкция задания цикла типа "пока" (цикл выполняется, пока выполняется некоторое условие);
otherwise - инструкция иного выбора (обычно применяется с if);
break - инструкция прерывания;
continue - инструкция продолжения;
return - инструкция возврата;
оn error - инструкция обработки ошибок.
Инструкция Add Line
Инструкция Add Line выполняет функции расширения программного блока. Расширение фиксируется удлинением вертикальной черты программных блоков или их древовидным расширением. Благодаря этому в принципе можно создавать сколь угодно большие программы.
Оператор внутреннего присваивания
Оператор выполняет функции локального внутреннего присваивания. Например, выражение х 123 присваивает переменной х значение 123. Локальный характер присваивания означает, что такое значение переменной х сохраняется только в теле программы. За пределами тела программы значение переменной х может быть неопределенным либо равным значению, которое задается операторами локального: = или глобального = присваивания вне программного блока.
Не следует путать оператор внутреннего присваивания с оператором символьного вывода , у которого стрелка направлена в другую сторону. Эти операторы решают совершенно разные задачи.
Условная инструкция if
ператор if является оператором условного выражения. Он задается в виде:
Выражение if Условие
Если Условие выполняется, то возвращается значение Выражения. Совместно с этим оператором часто используются инструкция прерывания break и инструкция иного выбора otherwise.
Инструкция for
Инструкция for служит для организации циклов с заданным числом повторений. Он записывается в виде:
for Var Nmin.. Nmax
Эта запись означает, что если переменная Var меняется с шагом + 1 от значения Nmin до значения Nmax, то выражение, помещенное в шаблон, будет выполняться. Переменную счетчика Var можно использовать в выражениях программы.
Инструкция while
Инструкция while служит для организации циклов, действующих до тех пор, пока выполняется некоторое Условие. Эта инструкция записывается в виде:
while Условие
Выполняемое выражение записывается в расположенное ниже место ввода..
Инструкция otherwise
Инструкция иного выбора otherwise обычно используется совместно с оператором if. Это поясняет следующая программная конструкция:
f (x): = 1 if х0 возвращает 1, если х О
-1 otherwise возвращает -1 во всех иных случаях
Инструкция break
Инструкция break вызывает прерывание работы программы всякий раз, когда она встречается. Чаще всего она используется совместно с оператором условного выражения if и операторами циклов while и for, обеспечивая переход в конец тела цикла.
Инструкция continue
Инструкция continue используется для продолжения работы после прерывания программы. Обычно она применяется совместно с операторами задания циклов while и for, обеспечивая возвращение в точку прерывания и продолжение вычислений.
Инструкция return
Инструкция return прерывает выполнение программы и возвращает значение операнда, стоящего следом за ней. Например, в приведенном ниже случае
return 0 if x
будет возвращаться значение 0 при любом х
Инструкция on error
Инструкция on error позволяет создавать процедуры обработки ошибок. Эта инструкция задается в виде:
Выражение_1 on error Выражение_2
Если при выполнении Выражения_1 возникает ошибка, то выполняется Выражение_2. С инструкцией on error связана функция error, которая обычно используется для возврата текстового сообщения об ошибке.
Примеры программ.
Условный оператор if и оператор otherwise.Рассмотрим пример программного блока, вычисляющего факториал с использованием рекурсии
|  | В данном примере 1 возвращается, только если n=0 или n=1. Обратите внимание на задание некольких условий - со знаком плюс, каждое условие в скобках. В остальных случаях, учитывая формулу n!=n*(n-1)!, вызывается fakt(n-1) и умножается на n. При помощи функции error можно вывести сообщение об ошибке при неправильном вводе аргумента. |
Для демонстрации работы цикла for рассмотрим ту же задачу, но вычисление факториала осуществим при помощи цикла.
|  | Если n=0 или n=1, возвращается 1, в противном случае при помощи цикла for вычисляется произведение n!=1*2*3...*n. Вычисленное последним значение pвозвращается автоматически. |
| В следующем примере при помощи алгоритма Евклида определяется наибольший общий делитель. Для реализации алгоритма используется цикл с ключевым словом while |  |
Прерывание цикла при помощи операторов break и continue. Оператор return .Первый пример - релизация метода касательных Ньютона для определения нулей функции. На основе начального значения x вычисляется новое улучшенное значение x, расположенное ближе к искомому нулю функции. При этом итерации повторяются до тех пор, пока значение функции не станет меньше заданной точности (в примере 10-6).
|  | При помощи оператора return организовано завершение программы в нужный момент. В данном примере если число итераций больше или равно 10, то происходит прерывание программы и выдается сообщение о том, что слишком много итераций. Здесь также отслеживаются случаи, когда производная в знаменателе близка к нулю и выдается об этом сообщение. |
| Кроме ключевого слова break имеется ключевое слово continue с похожей функцией. В то время как break прерывает цикл и осуществляет переход к следующему за циклом оператору, continue прерывает выполнение только текущей итерации. В примере справа ключевое слово continue используется для выявления всех нулей функции на заданном интервале. При этом в примере производится разбиение интервала на n равных подинтервалов и ищутся те из них, на которых функия меняет знак. При обнаружении такого поинтервала вызывается функия, реализующая метод касательных Ньютона, с начальным значением, находящимся в середине подинтервала. |  |
Обратите внимание, по завершении работы программы выдается вектор значений.
Ниже приводится программа, вычисляющая коэффициенты Фурье функции, причем в результате выдается матица значений: нулевая по счету строка содержит коэффициенты Аn, а первая - коэффициенты Bn. Для выделения этих коэффициентов выдавемая матрица транспонируется и из нее выбирается нулевой столбец для коэффициентов Аn, и первый - для Bn.

Обработка ошибок в программных модулях
На рисунке показано применение операторов on error и return, а также действие функции error, задающей вывод надписи в желтом прямоугольнике при активизации мышью выражения, содержащего ошибку.
В этих примерах надо обратить внимание на два момента. Первый — возможность применения оператора on error вне программного блока для задания функции y (x) =sin (x)/x с исключительным значением 1 при х=0.

Таким образом, инструкция on error фактически играет роль процедуры обработки ошибок. Она позволяет создавать программные модули, защищенные от грубых ошибок.
Задание программных модулей позволяет реализовать любые специальные приемы программирования и может служить мощным средством расширения системы путем задания новых функций.
Следует также отметить, что система MathCAD допускает расширение путем включения в нее новых функций, написанных на языке Си или Си++.
При выполнении вычислений возможны ошибки. Система выводит сообщения об ошибках, закрашивая ошибочные имена идентификаторов в ярко-красный цвет
Ниже представлен список основных сообщений об ошибках:
array size mismatch — несоответствие размера массива;
cannot be defined — не может быть определено;
cannot take subscript — не содержит верхних (нижних) индексов, definition stack overflow — переполнение стека определений;
did not find solution — решение не найдено;
dimension to non real power — размерность массива — не целое число;
domain error — ошибка области определения;
duplicate — дублирование;
equation too large — слишком большое выражение;
error in constant — ошибка в константе;
error in list — ошибка в списке;
error in solve block — ошибка в блоке;
file error — ошибка в файле;
file not found — файл не найден;
illegal array operation — неверная операция с массивом;
illegal context — неверный контекст;
illegal factor — неверный множитель;
illegal function name — неверное имя функции;
illegal ORIGIN — неверное употребление ORIGIN;
illegal range — неправильный диапазон;
illegal tolerance — некорректная точность аппроксимации;
incompatible units — несовместимые единицы;
index out of bounds — индекс вне границ;
interrupted — решение прервано;
invalid order — неверный порядок;
list too long — длинный входной список;
misplased comma — неуместная запятая;
missing operand — пропущенный операнд;
missing operator — пропущенный знак операции;
must be 3-vector — должен быть трехмерный вектор;
must be array — должен быть массив;
must be dimensionless — должен быть безразмерным;
must be increasing — должен быть возрастающим;
must be integer — должен быть целым;
must be nonzero — должен быть ненулевым;
must be positive — должен быть положительным;
must be range — должен быть диапазон;
must be real — должен быть вещественным;
must be scalar — должен быть скаляром;
must be vector — должен быть вектором;
nested solve block — следующий блок решения;
no matching Given — нет соответствующего Given;
no scalar value — нескалярная величина;
not a name — не является именем;
not converging — не конвертируется;
only one array allowed — допустим только один массив;
overflow — переполнение;
significance lost — потеряны значащие цифры;
singularity — деление на нуль;
stack overflow — переполнение стека;
subscript too large — слишком большой нижний индекс;
too few arguments — слишком мало аргументов;
too few constraints — слишком мало ограничений;
too few elements — слишком мало элементов;
too few subscripts — мало нижних индексов;
too large to display — слишком велико, чтобы быть отображенным;
too many arguments — слишком много аргументов;
too many constraints — слишком много ограничений;
too many points — слишком много точек;
too many subscripts — слишком много индексов;
undefindet — не определено;
unmatched parenthesis — дисбаланс скобок;
wrong size vector — неверный размер вектора.
Сообщения об ошибках кратки, но их анализ не вызывает особых затруднений. Заметим, что приведенный список содержит далеко не все ошибки, а лишь наиболее распространенные.
7