Вплоть до
появления 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 <-- 0 и отметьте его целиком.
Стрелка служит оператором присваивания в теле программы, вводитя
клавишей { (открывающая фигурная скобка) или выбором
кнопки со срелкой с панели.
- Создайте
новую строку программы (вставка вертикальной черты) при помощи
кнопки Add Line ( клавиша -] (закрывающая
квадратная скобка)). На экране появится вертикальная черта и пустая
ячейка.
- Выполните
щелчок на кнопке for, чтобы ввести оператор цикла. Перед
символом принадлежности введите переменную i, а после него -
промежуток изменения переменной 1..n. В находящейся ниже
ячейке введите присваивание s <- s+i. Программа готова.
Ниже в таблице
приведены операторы, находящиеся на кнопках панели программирования.
Команды панели 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
будет возвращаться значение 0
при любом х < 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 — неверный размер вектора.
Сообщения об ошибках кратки,
но их анализ не вызывает особых затруднений. Заметим, что приведенный список
содержит далеко не все ошибки, а лишь наиболее распространенные.
Оставьте свой комментарий
Авторизуйтесь, чтобы задавать вопросы.