Дьяконов В.П. Maple 9.5 и 10 в математике, физике и образовании (1185901), страница 82
Текст из файла (страница 82)
При этом соответствующие переменные останутся локальными. 10.3.8. Функция вывода сообщений об ошибках ЕЯЯОЯ При профессиональной подготовке процедур пользователь должен предусмотреть их поведение при возможных ошибках. Например, если он готовит процедуру или функцию, вычисляющую квадратный корень из действительных чисел, то надо учесть, что такой корень нельзя извлекать из отрицательных чисел (будем, исключительно в учебных целях, считать, что комплексные числа в данном примере недопустимы). Для контроля за типом данных обычно используются различные (рункции оценки и тестирования.
При выявлении ими ошибки, как правило, предусматривается вывод соответствующего сообщения. Для этого используется функция ЕЯЯОК: ЕВРОП(ехрг 1, ехрг 2, ...) где ехрг 1, ... — ряд выражений (возможно, пустой). Наиболее часто ЕКЯОЯ выводит просто строковое сообщение об ошибке, например ЕЯЯОЯ('в(ппдв'). Полное сообщение об ошибке имеет вид: Еггог, (1п паве) вггдпд, Приведем пример процедуры, в которой предусмотрен вывод сообщения об ошибке при задании переменной х < 0 (файл р5): > г:= ргос (х) ге х<0 гпеп еггог "1пча11<) чаггавзе х: «1", х е1ае х"(1/2) епг) гГ епо ргос; /': = ргос(х) 1( х < 0 (Ьеп еггог "(пча)Ы чапаЫе х: % 1", х е)ае х" (1/2) епд й" епд ргос > г(3.)с 1.732050808 > г(-3.); Еггог, (гп г) гпча11о чагсаЫе х: -3. 615 1О.З.
Процедуры и процедуры-функции > таатеттотг ")пчай() чапаЫе х: %1", -3 > Хаатехсерььоог Г, ")пча!1() чапаЫе х: %1", -3 Эта процедура вычисляет квадратный корень из числа х. При х < 0 выводится заданное сообщение об ошибке. Еще раз обращаем внимание читателя на учебный характер данного примера, поскольку вычисление квадратного корня (в том числе из комплексных и отрицательных действительных чисел) реализовано встроенной функцией вг)П.
10.3.9. Ключи е процедурах В объявление процедуры можно включить ключевые слова, вводимые словом орехова ореес) Иногда их называют раси(иряюи(ими ключами. Предусмотрены следующие ключи: аггочч — определят процедуру-оператор в нотации ->; Ьц)1()п — определяет функцию как встроенную; са11 ех(егпа) — задает обращение к внешним программным модулям; соруп9Ы вЂ” защищает процедуру от копирования.
)папе — определяет процедуру как подчиненную (возможно не для всех процедур — см. справку). 1оас)еп)еп)Ьег)Чапе — загружает нужный для определений процедуры модуль (см. также опцию цп!оа() и детали в справке); орега!ог — объявляет процедуру — функциональный оператор;вув(еп) — определяет процедуру как системную, геп)еп)Ьег — определяет таблицу памяти лля процедуры; (гасе — задает трассировку процедуры; цп1оас)еп)еп)Ьег)Чап)е — выгружает нужный для определений процедуры модуль (см. опцию !оа()). 10.3.10. Ключ гегпеп)Ьег Ключ геп)еп)Ьег обеспечивает занесение результатов обращений к процедуре в таблицу памяти, которая используется при исполнении процедуры.
Функция ор позволяет вывести таблицу (файл рб): > т:=ртос(х) орттооа тееевьетг х"3 еос): > г(2) г > т(3) ю 27 > ор(4,еча1(Г) ); !аЫе(]2 = 8, 3 = 27]) 616 Глава 10. Типовые средства нрогуамзнарования Ключ геп)егпЬег особенно полезен при реализации итерационных процедур. К примеру, в приведенной ниже процедуре (без использования ключа гегпегпЬег) время вычисления и-го числа Фибоначчи растет пропорционально квадрату и: > Гз=ргос(п) 1Г п<2 С)зеп п е1ае Г(п-1)+Г(п-2) Гь епз3( ,Г: = ргос(и) !Г и < 2 !Ьеп и е(ве Ци — 1) + Г(и — 2) епд 1( епд ргос > Сьве (Г(30) ); 4.891 > Г(30] з 832040 Вычисление г(30) по этой процедуре на ПК с процессором Реп(!цп) 4 НТ 2,6 ГГц в системе Мар1е 9.5 время вычисления составляет менее 5 с — см.
контроль этого времени с помощью функции бизе (результат в секундах). Стоит добавить в процедуру ключ геп)еп)Ьег, и время вычислений резко уменьшится: > геасагсз > ге з=ргос (и) оротопа гевевьетз ьг п<2 сдеп п е1ае ге (п-1) +ге (п"2) г1 еп<) з > Ге (30) з 832040 > Спае(те(30)); О.
При этом вычисление !е(30) происходит практически мгновенно, так как все промежуточные результаты в первом случае вычисляются заново, а во втором они берутся из таблицы. Однако это справедливо лишь тогда, когда к процедуре было хотя бы однократное обращение. Обратите внимание на то. что данные процедуры являются рекурсивными — в их теле имеется обращение к самой себе. 10.3.11. Ключ Ьц)11!и Ключ Ьц!й!и придает процедуре статус встроенной. Он должен использоваться всегда первым.
С помощью функции еча((папзе) можно проверить, является ли функция с именем пегие встроенной: > еча1((уре) з ргосо орбоп Ьнзугзи, 274 епд ргос > еча1 (р<1пс) ) ргосО орйоп ЬшИи, 235 епд ргос Числа в теле процедур указывают системные номера функций.
Следует отметить, что в новой версии Мар!е 9 они существенно отличаются от принятых в предшествующих версиях (даже Мар!е 8). 10.3.11. Ключ вув1егп Этот ключ придает процедуре статус системной. У таких процедур таблица памяти может быть удалена. У обычных процедур таблица памяти не удаляется и входит в так называемый «мусорный ящик» (8агЬайе со11ес(ог).
617 10.3. Процедуры и процедуры-функции 10.3.12. Ключи орега1ог и аггове Эга пара ключей задает процедуре статус оператора в «стрелочной» нотации (->). Это достаточно пояснить следующими примерами: > о:=ргос(х,у) орг1оп орегагог, аггон: х-асгг(у) ела[ о:=(х,у) -~ х — ~у > о(4,2); 4-~Г2 > о[4,2.); 2.585786438 10.3.13. Ключ 1гасе Ключ (гасе задает вывод отладочной информации: > о:=ргос(х,у) орсьоп Ггасе, аггон; х-ас[гс(у) епс[; о: = Ргос(х, у) орбоп [гасе, иге[я«; х -зцг[(у) епд Ргос > о(4,2.); (-> епсег о, агав = 4, 2.
2.585786438 <- ехьс о (пон ас Гор 1ече1) = 2.585788438) 2.585786438 10.3.14. Ключ соруг)0$)1 Этот ключ защищает тело процедуры от просмотра. Это поясняют следующие два примера: > о:=ргос (х, у] х-асгс (у) епс[г о: = Ргос(х, у) х — зцП(у) епд ргос > оо:-ргос(х, у) орсьоп Соруг1оасг х-асгс [у) еп<)г оо:= ргос(х,у) ... епд Ргос > оо[4,2.); 2.585786438 Нетрудно заметить, что во втором примере тело процедуры уже не просматривается.
Для отмены защиты от просмотра можно использовать оператор Иег(все(нег[)овергосс2). 10.3.15. Общая форма задания процедуры Выше мы рассмотрели основные частные формы задания процедур. Все они могут быть объединены в общую форму задания процедуры: паве:=ргос(<аговес>) 4 объявление процедуры 1оса1<паеч>; $ объявление локальных переменных О1оьа1<паея>( объявление глобальных переменных савв<овес> $ объявление структур цае ... 1п ... епо' цае 618 Глава Ш Типовые средства программирования орс1олв<пвед>) бевсттрс1оп<зстьпдвед>; <всасед> епа) (или епс)с) 4 объявление расширяющих ключей 4 объявление комментарий 4 выражения — тело процедуры $ объявление конца процедуры 10.4. Средства отладки программ 10.4.1.
Средства контроля и отладки процедур Для контроля и опыадки процедур прежде всего надо уметь вывести их текст. Для этого, что уже отмечалось, служит команда рттвс(паве]; где пате — имя процедуры. Перед тем как использовать ее, надо также исполнить команду > тпсетеасе(четЬовертос=2,ртессурт1пс=1,четв1оп)) 1, 3, с1аввтс иотхвьеес 1всеттасе, мар1е 9.50, и1вбонв, )сод 9 2004 Вц116 10 1б3356 Ее смысл детально будет пояснен ниже. Пока же отметим, что эта команда обеспечивает полный вывод текста процедур библиотеки.
Встроенные в ядро процедуры, написанные не на Мар(е-языке, в полном тексте не представляются. Поясним это следующими примерами: > ртьпС (еча1Г) с ртос() орс1ов Ьц11ств, тевеп1Ьет; 171 епб ртос > рттпС(ет1) с ртос(хсса1деЬтаас) 1оса1 Ве х, 1в х, зт, в1, хт, хь; ортьоп 'Соруттдае (с) 1994 Ьу СЬе цп1нетвтту от Иатет1оо. )(11 ттдЬСв тезетчеб.'с тв Патдз <> 1 СЬЕП ЕттОт ЯЕХрЕСС1пд 1 атдцВЕВС, дОС $1", Латдз е1те Суре(х, 'совр1ех(с1оас)') СЬеп еча1Т('етГ'(х)) е11Т х = 0 СЬев 0 е1те суре(х, '1вт1п1су') сьеп 1т суре(х, 'сх 1ветвтсу') савв ппбе1твеб + цпбесепеб*1 е1т1 Суре(х, 'цпбееспеб') СЬеп МцветьсТоо1в:-ТЬтоицпбегтпеб(х] е1те Суре(ае(х), 'твт1п1Су'] СЬел Сору51дп(1, Ке(х)) е1>Т суре(х, '1вадтлату') Спев х е1ве Спе1л1Су + Свт1в1су*1 епс) тт е1те суре(х, 'цпс)ее>пес]') СЬев Ицвет1сТоо1вс-тптоицлбеттвеб(х, 'ртеветне' = 'ахея') е1тт аувЬо11с/атдл (х) = -1 СЬеп -ете(-х) е1ве 'ете' (х] евс) тт ело ртоо Эта форма охватывает все описанные выше частные формы и позволяет готовить самые сложные и надежно работающие процедуры.
Читателям-программистам стоит детально изучить по справке возможности этой формы задания процедур, а также возможности конструкции цве ... ]и ... епс) цзе. 10.4. Средсюиаа оииадки программ Здесь вначале выполнен вывод сокращенного листинга встроенной в ядро процедуры еча1(, а затем выведен полный листинг процедуры вычисления функции ошибок ег(. Эта функция имеет довольно короткую процедуру — многие важные функции и операторы задаются гораздо более сложными и большимн процедурами. Их просмотр очень полезен читателям, которые занимаются программированием — листинги процедур на языке Мар(е являются наглядными примерами профессионально выполненных программ. Но вернемся к функции )и1е)1асе. Она служит для управления выводом и задается в виде 1исаггасе 1 аг91, аг92, ...