![]() | ![]() | ![]() |
Обработка
и индикация ошибок
При
работе с системой Maple 7 надо строго придерживаться правил корректного ввода
выражений и иных объектов Maple-языка, называемых синтаксисом языка. Однако, как
гласит русская пословица, не ошибается только тот, кто ничего не делает. Даже
у опытного пользователя возможны ошибки в ходе ввода выражений и задания алгоритмов
вычислений.
Алгоритмические,
но синтаксически корректные ошибки часто могут не распознаваться системой. Например,
если в выражении a*sin(x) вы вместо аргумента х взяли аргумент
b, то есть записали a*sin(b), то
такую ошибку Maple 7 распознать не может, ибо синтаксически как
a*sin(x), так и a*sin(b) абсолютно корректны. Если
вы перепутаете синус с косинусом и запишете a*cos(x), то
такая ошибка также не будет распознана.
ПРИМЕЧАНИЕ
Ошибки в записи выражений, описывающих те или иные алгоритмы вычислений, не нарушающие синтаксическую корректность, системой Maple 7 не распознаются. Контроль за такими ошибками целиком лежит на пользователе.
Приведем
еще один характерный пример ошибки, которую Maple 7 не может распознать. Вводя
выражение X/Y*Z, мы можем предположить, что это означает
X/(Y*Z). Однако в Maple 7 приоритет операций деления и
умножения одинаков. Поэтому Maple 7 вначале делит X на
Y, а затем полученный результат умножает на Z:
Ошибки такого рода
называют семантическими. Если бы мы не проверили вывод с помощью оператора вычисления
предыдущего выражения (%), то эта ошибка осталась бы нераспознанной.
Выявление и устранение семантических ошибок выполняется на этапе отладки вычислений
и программ.
ПРИМЕЧАНИЕ
Используйте блокировку вычислений с помощью знака двоеточия только в том случае, когда вы абсолютно уверены в правильности записи выражения. Иначе вы можете не заметить вкравшейся в вычисления серьезной ошибки.
В нашем
примере мы получили бы верный результат, заключив выражение Y*X
в круглые скобки. Как обычно, они предназначены для задания явного приоритета
выполнения операций — в нашем случае вначале будет вычислено выражение в скобках
(Y*Z), а затем уже X будет поделено
на это выражение:
Но вернемся к ситуации
с синтаксическими ошибками, которые система Maple 7 распознает с помощью встроенного
в нее синтаксического анализатора. Например, если вы задали неправильное имя функции,
то это будет опознано синтаксическим анализатором и вычисления не будут выполняться.
Maple 7 просто повторит выражение в строке вывода:
В этом
примере вместо имени функции sin введено ошибочное имя
son. Maple воспринимает его как некую введенную пользователем
функциональную зависимость и потому просто повторяет запись и не выводит сообщение
об ошибке. А вот другая ситуация — имя функции sin введено
верно, но вместо десятичной точки при задании вещественного числа 1.0 использована
запятая:
В данном случае Maple 7 «знает»,
что работа идет с его встроенной функцией синуса, которая должна иметь единственный
аргумент. Задание (1,0) означает, что растяпа-пользователь ввел вместо вещественного
числа два целочисленных числа, разделенных запятой. Этого синтаксический анализатор
Maple 7 стерпеть уже не смог, и он отреагировал выдачей сообщения об ошибке (на
экране дисплея оно имеет малиновый цвет). Исправьте ошибку, и синус единицы будет
благополучно вычислен:
А вот еще одна типичная
ситуация — в последовательности выражений опущен знак-разделитель (двоеточие или
точка с запятой):
Тут Maple 7 не только
реагирует на ошибку, но и пытается подсказать, что именно пропущено. Более того,
маркер ввода в виде мигающей вертикальной черточки будет помещен на место ошибки
и вы сможете тут же устранить ошибку. Правда, подсказки не всегда точны — в нашем
случае явно пропущен разделитель в виде двоеточия, a Maple 7 сообщает о пропуске
точки с запятой. Впрочем, откуда системе знать, хотим мы вывести результат операции
Y:=4 сразу (для этого нужен разделитель в виде точки с
запятой) или откладываем на потом (с помощью символа двоеточия).
Вот еще один пример характерной ошибки — три знака * подряд:
Здесь Maple 7 подсказывает,
что один оператор * надо убрать — два знака
* подряд означают вполне законный вариант оператора — возведение в степень.
При этом маркер ввода вновь указывает место ошибки. Проанализируйте следующие
простые примеры:
В этом примере Maple
7 вначале вычисляет функцию синуса, затем производит возведение в степень и лишь
потом операцию умножения. Впрочем, такой приоритет операций принят практически
во всех системах компьютерной математики и в языках программирования.
Некоторые пользователи версии системы Maple V R5 наблюдали, что русская буква
«я» в конце программного комментария (он вводится после символа #)
вела к зависанию программы, что требовало ее перезагрузки. В Maple 7 этот недостаток
устранен:
> #Буква "я" в конце комментария уже не вызывает зависания
>
Позже, при описании программирования в Maple 7, мы опишем более развитые средства контроля над допускаемыми пользователем ошибками. Пока же ограничимся приведенными 'Выше сведениями, полезными уже в начале диалога с системой.
![]() | ![]() | ![]() |
|