Матросов А.В. Maple 6. Решение задач высшей математики и механики (1185909), страница 59
Текст из файла (страница 59)
Созданный объект исключительного состояния присваивается глобальной переменной 1авгекергзоп в виде последовательности выражений, а также для совместимости с предыдушими версиями Мар[е глобальной переменной 1авгеггог присваиваются фактические параметры оператора еггог. Сообщение об ошибке печатается в виде: Егг:ог, (1п имя процедуры) текст сообщения Текст сообщения представляет строку сообшений с полставленными в нее значениями переменных, заданных в списке параметров оператора ог. Если процедура не имеет имени, то вместо имени процедуры печатается "цпхпо и", если ошибка сгенерирована на верхнем уровне, то часть сообшения в круглых скобках вообше не печатается, как было в наших двух предыдуших примерах выполнения оператора еггог.
Обычно в процедурах выход с генерацией сообщения об ошибке используется при дополнительной проверке типов параметров. Иногда стандартных и структурированных типов не достаточно для проверки передаваемых в процедуру параметров. Например, если необходимо преобразовать входной список числовых значений в список, элементами которого являются списки, состоящие из пар последовательных элементов исходного списка, то общее число элементов исходного списка должно быть г(етным.
Осушествить такую проверку допустимыми типами Мар[е не представляется возможным. Одно из решений показано в примере 5.2]. М~вй~~!(~~,',~~~[~~~МФ!~1М[[~[[)[[й][[[4й$4 Ф4В(~[~~[[а~~ФиМкй' > ра1гъ1вг:=ргос(Ь::11вп(пцщег1с)) 1оса1 1,пг и:=пора (1 ) г 11 Егер(п,2)=1 Сьев еггог "Список должен иметь четное число элементов, "имеет Ъ1", епб 11г [вея([1.[2*1 †],1.(2*1]],1=1..п/2)] епг[ ргос: > ра1гъ1вг([1,3,2,0,3])г Еггог, (1п раьг11вп) Список должен иметь четное число элементов, имеет 5 > раагььвг([1,3,2,0,5,б])' [[],3~,[2,0],[5,6Н В процедуре можно "поймать" ошибку с помощью конструкции сгу-сагсп, заключив в нее блок операторов, в котором может быль сгенерирована ошибка.
Она имеет следуюший синтаксис: Глава о. Основы прог ммирования в Мар)е осу блок проверяемых операторов сассп строка ошибки : блок операторов Гапа11у блок завершающих операторов епс) псу Когда вычисление доходит до блока сту, то начинается последовательное выполнение операторов из блока проверяемых операторов.
Если в результате их выполнения не сгенерировано никакой ошибки, то выполняются операторы завершаюшего блока г1па11у, если он задан, иначе управление передаЕтСя ОПЕратОру, СЛЕдуЮШЕМу За ОПЕратОрОМ епб псу. Если при выполнении проверяемых операторов будет сгенерирована ошибка, то их лальнейшее выполнение немедленно прекрашается, а строка сообщения созданного объекта исключительного состояния сравнивается со строкой ошибки во всех операторах пасса блока ссу.
Если соответствие найдено, то выполняется соответствуюший блок операторов, заланный после двоеточия (:) в соответствующем блоке сассп. Если соответствия не найде- НО, тО ВЫПОЛНяЮтСя ОПЕратОрЫ бЛОКа Гвпа 1у, а ИСКЛЮЧИТЕЛЬНОЕ СОСтОяНИЕ регенерируется вне блока сту. В блоке пасса через запятую может быть задано несколько строк ошибок тогда операторы этого блока выполняются при возникновении любой из перечисленных ошибок. Если строка ошибки вообще отсутствуе~, то такой блок свесь "ловит" все возникающие при выполнении проверяемых операторов ошибки. Пример 5.22 схематично демонстрирует технику создания "ловушек" для ОШИбКИ.
В ПрОцЕдурЕ Меепос)А() ГЕНЕрИруЕтСя ОбЪЕКт ИСКЛЮЧИТЕЛЬНОГО СО- стояния со строкой ъалты' в случае, если значение фактического параметра больше нуля. В блоке осу осушествляется ее вызов, а единственный блок сассп предназначен для отлавливания ошибки глты этой процедуры и вызова другого метода. Конечно, это очень примитивный пример, но он дает представление о технике вылавливания ошибок. Лф~!Щ$~~4ф~~~й~)з)(~46~Ф~ФЗЩ > МепьобА:=ргос(х::ппшесьс) пб х>0 сьеп еггос 5ВА1Ь" е1ве аЬв(х) епб 15; епб ргос: > Мевьооас=рсос(х::плаехас) -х епб ртос: > хс=50с с ту хеап1С:=МееподА(х) с Часть 1.
Основы Мар!е свгсв "ГЛ1Ь": геви1сг=иегьог)В)х) епг) Ггуг гезий;= -50 Замечание Если при выполнении блока ггу ошибка отловлена, то Мар1е не печатает ника- кого сообщения о ней. Замечание В предыдущих версиях Мар1е возможности организовывать ловушки для генерируемых исключительных состояний не предусматривалось. Блок ггу-свгсь является новым средством, реализованным в Мар)е 6. В тех случаях, когда Мар1е не может выполнить некоторые действия с помощью своих команд из-за недостаточности информации о значениях фактических параметров или неразрешимости задачи, он просто повторяет в строке вывода вызов соответствующей команды.
Говорят, что в этом случае процедура вернула не вычисленное значение. Подобная проблема может возникнуть и при разработке пользовательских программ. Например, так)гя ситуация встретилась нам во введении к данной главе, когда мы разрабатывали функцию вычисления абсолютного значения некоторой величины и передавали в нее в качестве параметра неизвестную величину, а не числовое значение.
Там не работала булева операция проверки положительности параметра. В таких случаях следует возвращать не вычисленное значение процедуры, вставляя в ее тело вызов ее же самой с формальными параметрами, но заключая ее имя или специальную переменную ргоспвив, содержащую имя процедуры, в одинарные кавычки. При этом следует проверять тип передаваемых параметров, при котором основной алгоритм работать не будет.
Например, в процедуре нлх)х,у), вычисляющей максимальное значение из двух ее параметров, следует проверить тип фактических параметров на соот- ВЕтетВИЕ тИПу пшпег1с И ПрЕДуСМОтРЕтЬ ВОЗВрат НЕВЫЧИСЛЕННОГО ЗНаЧЕНИя процедуры: > нлх:=ргос)х, у) 1Г Гуре)х,погвег1с) апг) Гуре1у,пилегьс) Гпеп 11 х>у Г)1еп х е1ве у епг) 1Г; е1ве 'ргоспатпе'гх,у) егх1 1Гг епг) ргос: > нлхы.г,в); Глава о. Основы програыми вания в Мар!е зг( > нлх (Оьп (х),х) ! МАХ(В!п(х), х) Если в этой процедуре не предусмотреть возможность возврата не вычисленного значения процедуры при нечисловых значениях параметра, то обязательно возникла бы ошибка невозможности вычисления операции булевого сравнения (см.
введение в данный разлел), а также с помощью этой процедуры невозможно было бы нарисовать график функции, представляющей максимальное значение двух заданных функций. Разработанный нами вариант пропедуры позволяет нарисовать такой график: > р1ог (МАХ (сап (х), 2>х), х=с .. 1. 5, со1ог=-Ь1асх) ! 14 !г !а в в 4 г О.2 ОА О.В О.В 1 \.2 !.4 х 5.2.6. Объект процедура Процедуры, таблицы, массивы и модули являются единственными объектами Мар)е, вычисление которых не подчиняется общепринятому правилу полного вычисления, — они вычисляются до уровня своих имен. Чтобы вы- ЧИСЛИТЬ ИХ ПОЛНОСТЬЮ, тРЕбУЕтСЯ ЯВНОЕ ИСПОЛЬЗОВаНИЕ КОМаНДЫ вав1(): > О!атос(х) х"2 епс) рхос! > О! > ЕОО1 (О) ! ргвс(х) х 2 еп4( ргос ЛЮбая ПрсцЕдура Мар!Е ИМЕЕТ тнл рг ОО(псв, КОтОрЫй ОбЛадаЕт, КаК И ЛЮ- бой другой тип, определенным набором операндов.
Всего их семь, и они представляют следующие элементы процедуры: !. Последовательность формальных параметров. 2. Последовательность локальных переменных. 3. Последовательность опций. 4. Таблицу значений. 5. Строку описания. 6. Последовательность глобальных переменных. 7. Лексическую таблицу. 3! 344. 444 Часть ). Основы Мар)в Згя Определим процедуру и(), которую будем использовать в качестве "подопытного" экземпляра для доступа к операндам типа р г( е.
> и;=рхос(у::апуса1пд,х::папе) 1оса1 1,1) д1оьа1 Г) оре1оп Соруг1дЫ; Оезсгьрсьоп "1агедгасьоо") зап(ьпг(1, х=0..1),1=1.. 4) еог( ргос: Чтобы увидеть все операнды этого типа, занесем в таблицу значений про- цедуру одно значение и тем самь(м создадим ее в памяти: > п(о,х):=О/ пг(0, х):= О Теперь наша процедура имеет все операнды, и мы можем осуществить к ним доступ.
Имя процедуры: Сам объект процедура, отображаемый при полном вычислении его имени: > еча1 (и) г ргос(усаауй(пя,ххаате) дезег)рооп Ппгеагаггап" ... еп4 ргос Так как в нашей процедуре задана опция сору 'дьс, то тело процедуры не отображается, а отображается только строка описания.
Список формальных параметров: > ор(1,еча1(п))) усануй)ая, ххпате Список локальных переменных: > ор(2, еча1(п) ) ) Список опций: > ор (3, еча1 (п) ) ) Саруг(яЫ Так как в нашей процедуре задана только одна опция, то мы, естественно, списка не видим. 323 Глава о. Основы программирования в ((4ар(в Таблица значений процедуры: > ор(4,ета1(пс) ); (ао!е! !(О, х ) = 01) Строка описания: > ор(5,ееа1(се))) "!п(еага(!оп" Список глобальных переменных: > ор ( 6, еаа1 (пс) ); Когда процедура отлажена и оттестирована, ее можно сохранить в файле с расширением се командой вате(), которвл позволяет сохранить любой объект Мар!е.
Впоследствии, когда для вычислений потребуется эта процедура, ее можно прочитать в сеансе Мар!е командой геас((). Например, следующая команда сохраняет процедуру ас() этого раздела в файле с именем т.е в каталоге теаср диска о: > ааее са, "с(: 'с'стесар~ ~се.т"; Подключить данную процедуру в другом сеансе Мар!е можно следующей командой: > геас( "с)с'с1тесарс'сас.са") > ас(х З,х)) )О На этом мы заканчиваем знакомство с процедурами Мар!е. Отметим, что хотя наша книга не является пособием по программированию в этой системе аналитических вычислений, мы сознательно достаточно подробно описали создание пользовательских процедур, так как практическое программирование в большинстве случаев заканчивается созданием процедур.