Дьяконов В. Maple 7 - Учебный курс (1185900), страница 40
Текст из файла (страница 40)
Эта процедура вычисляет квадратный корень из числа х При х ( 0 выводится заданное сообщение об ошибке. Еще раз обращаем внимание читателя иа учебный характер данного примера, поскольку вычисление квадратного корня (в том числе из комплексных н отрпцателъных действительных чисел) реализовано встроенной функцией зцгк Ключи в процедурах В объявление процедуры можно включить кчючевые слова, вводимые словом орыопа ораец Иногда их называют расширяюшдми ключами.
Предусмотрены следующие ключи: О аггоы — определят процедуру-оператор в нотации °; О Ьц(101п — определяет функцию как встроенную; О са11 еххегпа) — задает обращение к внешним программным модулям; О соруг(дйс — защищает процедуру от копирования; О 1011пе — определяет процедуру как подчиненную (возможно, не для всех процедур — см. справку); О 1оа() яеаЬегйапе — загружает нужный для определений процедуры модуль (см. также опцию цп! оаб и детали в справке); О орегаФог — объявляет процедуру — функциональный оператор; 268 Урок 7. Типовые средства програииировпния О вузтеа — определяет процедуру как системную, О геяеаЬег — определяет таблицу памяти для процедуры; О тгасе — задает трассировку процедуры; О ип!оаб аеяЬегйаяе — выгружает нужный для определения процедуры модуль (см. опцию 1оа«().
Ключ гел)егпЬег Ключ гевеяЬег обеспечивает занесение результатов обращений к процедуре в таблицу памяти, которая используется прп исполнении процедуры. Функция ор позволяет вывести таблицу: > т: ргос(х) ор11ооп гевевьег: х"3 епа: > т(2); 8 > 1(3); 27 > ор(4.епп1(т)).
1вЬ)с([2 = 8, 3 = 27)) Ключ гепеаЬег особенно полезен при реализации итерационных процедур. К примеру, в приведенной ниже процедуре (без использования ключа геаеаЬег) время вычисления и-го числа Фнбоначчн растет пропорционально квадрату ж > 1: ргос(о) 11 и 2 «ьео и е1«е 1(п- 1)+т(п-2) 11 епв: 7:=рв)с(и) (гп <2(Ьев и е1ве Г(и — ! )+ Т(и — 2) еп«((Г еп«(ргос > 11ве(т(30)): 27.400 > 1(30): 832040 Вычисление Т(30) по этой процедуре на ПК с процессором Реп()цш П 350 МГц занимает около 30 с — см. контроль этого времени с помощью функции 01яе (результат в секундах).
Стоит добавить в процедуру ключ геаеяЬег, н время вычислений резко уменьшится; > гепппгтз > те: ргос(п) ор11ооп гепевьег; 11 о<2 Пиеп п е1«е те(п-1)+те(п-2) 11 епвг > те(30): 832040 > 11ве(те(30)): О. При этом вычисление те(30) происходит практически мгновенно, так как все промежуточные результаты в первом случае вычисляются заново, а во втором они берутся из таблицы. Однако это справедливо лишь тогда, когда к процедуре было хотя бы однократное обращение. Обратите виимацие на то, что данные процедуры являются регпурсивппыяпи: в их теле цвпавтсп( обид)пение к самим себе.
Процедуры и процедуры-функции 269 Ключ Ьийбг) Ключ Ьп)1т1п придает процедуре статус встроенной. Он должен использоваться всегда первым. С помощью функции еуа1(паве) можно проверить, являетсд лп функция с именем паве встроенной; > ече1 (суви): ргос() орцоп Ьо)11)п; 268 епе ргос > ечех(рхьпе); ргос() орцоп Ьо)1()п; 229 епе ргос Числа в теле процедур указывают системные номера функций. Следует отметить, что в новой версии Мар!е 7 они существенно отличаются от принятых в предшествующих версиях.
Ключ 8Уаье(г) Этот ключ придает процедуре статус системной. У таких процедур таблица памяти может быть удалена, У обычных процелур таблица памяти не удаляется и входит в так называемый «мусорный ящик» (йагЬайе со11ессог). Ключи орега1ог и агго)()( Эта пара ключей задает процедуре статус оператора в «стрелочной» нотации (->). Это достаточно пояснить следующими примерами: > о;-ргос(х,у) ор(1оп орегасог , аггее; х-ацгт(у) епс; о:= (х у)-» х- /у > о(4,2); 4 — /2 > о(4,2.]; 2.585786438 Ключ вегасе Ключ спасе задает вывод отладочной информации: > о:-ргос(х.у) ор(1оп спасе, аггои; х-ацгс(у) епе; о:= ргос(х,у) ор(!ов г.асе, аггоиц х- ацп(у) ева) ргос > о(4,2.); 1--> ептег о а ра - 4, 2.
2.585786438 <.- ехп о (пои а( тор 1ече1) - 2.585786438) 2.585786438 Ключ сорупдЫ Этот ключ защищает тело процедуры от просмотра. Это поясняют следующие два примера: > о: ргос(х'.У) х.ацгв(у) епе: о, рек)в()~(х«а)(<г" «ф')цу) ыЫ ртОо 270 Урок 7.
Типовые средства программирования > оо: ргос(х,у) ор1(оп Соруг1диьп х-вцгс(у) епд; оо:=руоп(х,у) ... епг(ргос > оо(4,2.): 2.585788438 Нетрудно заметить, что во втором примере тело процедуры уже не просматривается. Для отмены защиты от просмотра можно использовать оператор (птегбасе(чегЬозергос"2). Общая форма задания процедуры Выше мы рассмотрели основные частные формы задания процедур. Все онн могут быть объединены в общую форму задания процедуры: паве: ргос(<вгдвец>) () объявление процедуры 1оса1<пвец>. Ф объявление покаянных перененных д)оЬа)<пвец>: () объявление глобалъных переиенных ор11опв<пвец>г Ф объявление расюиряющих ключей Оввс<яр( оп<я(гяпдвец>; () объявление кониенгарий <в(а(ец> Ф въранения — тело процедуры епб; (ипи епб:) () объявив<не конца процеяуры Эта форма охватывает все описанные выше частные формы и позволяет гото.
вить самые сложные и надежно работающие процедуры. Средства контроля и отладки процедур Большая часть функций и операторов системы Мар!е 7 реализована в виде процедур, написанных на Мар!е-языке программирования. Благодаря возможности нх просмотра пользователь получает неисчерпаемый источник примеров программирования па этом языке. Кроме того, пользователь может создавать свои собственные процедуры. Для контроля и отладки процедур прежде всего надо уметь вь(вести их текст. Для этого служит функция: ргхп(чаще): где папе — имя процедуры. Однако перед тем, как использовать эту функцию, надо исполнить команду: > 1псегтасе(чегьоввргос-2,ргестург1пт-1,чегв1оп)г Мар!е Чую<ивисе( !п(ег(асе, Мар!е 7, 1ВМ !НТЕЕ ЙТ, Мау 28 2001 Вирд Н) 98223 Ее смысл будет пояснен ниже.
Пока же отметим, что эта команда обеспечивает полный вывод текста процедур библиотеки. Встроенные в ядро процедуры, написанные не на Мар)е.языке, в полном тексте не представляются. Поясним это следующими примерами: > рг1пе(еча)т); рюсо орпоп Ьц((цп, тегпешЬег) 167 епд ргос > рг1пе(егт): рвос(х! !а(деЬта(с) Средства контроля и отладки процедур 271 !оса! де х, 1пт х, вг вй хг, хй орбоп ' Соруг!яит (с) 1996 Ьу йе Ипыегвау от Чуатег(оо. А(! г!ЯЬЙ гевегчеб.'; П пагяв <и 1 йеп еггог "ехресбп9 1 агяигпепт, 9от 551", пагяв е((1 1уре(х, 'согпр(ех(воат)') йеп еча(1('егр(х)) е((т х = О йеп О е!(1 туре(х, '(пбпду') йеп б 1уре(х, ('сх (псгп!ту', 'опбедпеб')) тиепвпбетгпеб + цобе((пеба( е!!1 туре(ае(х), '!ппп(ту') йеп Сору5(Яп(1, Де(х)) е!!1 туре(х, 'кпаЯ!лагу') йеп х е!ве (птгп(ту + !пГ!п((уа( епб и е(!(туре(х,'ипбедпеб')йеп х*ипбедпеб е(Н туре(х, 'сагир!ех(пцптег!с)') йеп (т с59п(х) = -1 тьеп -егт(-х) еве 'ег('(х) епб П е(!1 туре(х, ' *' ) апб туре(ор(1, х), 'солар(ех(погпег!с)') апб свЯп(ор(1, х)) = .1 йеп .егт(-х) е((т туре(х, ' е ) апб тгареггог(5!яп(х)) = -1 йеп— егт(-х) е(ве егт(х): = 'егГ(х) епб (т епб ргос Здесь вначале выполнен вывод сокраШенного листинга встроенной в ядро процедуры еча1т, а затем выведен полный листинг процедуры вычисления функции ошибок егт.
Эта функция имеет довольно короткую процедуру — многие важные функции и операторы задаются гораздо более сложными и большими процедурамп. Но вернемся к функции 1птегГасе. Эта функция служит для управления выводом и задается в виде: тптегтасе! а 91 аг92.... ) где аргументы задаются в виде равенств вида паве-ча1ие и слов-указателей: еггогЬгеа)г 1аЬе1н1бси р1ойорс1оп5 рговрс 5иоиаввопеб аосоа5519п 1пбепгааоипс ратси)ече1 ргер!от всгеепие(ЯЬС нагп1ече1 есио 1аЬеН 1пЯ р1огбеч(се ргетсург1пг 5сгеепн!бги ап51 1ви9тпагуци1с 1оп9бе11В ровср)от ггаЬ)е512е ЕГГОГСОГ5ОГ 1агехи1 бти р1отоцтрот до1ег чегЬовергос чег51ои К сожалению, объем и характер данной книги не позволяют остановиться на всех вариантах использования этой очень мошной функции, тем более что в ней может использоваться множество аргументов. Мы рассмотрим только некоторые, наиболее важные возможности.
Указание чегЬовергос и задает степень детальности вывода листинга процедур. При п=0 текст не выводится, при и-1 выводится текст только заданных пользователем процедур, а при п 2 — всех процедур на Мар)е-языке. Пример этого был дан выше. Указание ргегсург1п~О или 1 управляет выводом стандартных сообщений. Указание р1осбеч(се всг1пЯ управляет выводом графики, например р1оабечтсе д1 т указывает на то, что запись графиков в виде файлов будет происходить в формате,.Я(б 272 урок т, типовые средства программироваиив Одним из основных средств отладки процедур является функция трассировки тгасе(папе).
Детальность ее работы задается системной переменной рг1пт1ече1 (уровень вывода). При рг1пт! ече1:=п (значение и = 1 по умолчанию) выводится результат только непосредственно исполняемой функции или оператора, Для вывода информации о выполнении Й-го уровня вложенности надо использовать значение этой переменной от 5*й до 5*1)ае1). Так, при и от 1 до 5 выводятся результаты трассировки первого уровня, при и от 6 до 10 — второго н т. д. Максималыюе значение и = 100 обеспечивает трассировку по всем уровням вложенности процедуры паве.
Следующий пример показывает осуществление трассировки для функции 1пт(х п, х): > рх1иС1ече1:=5; рг)и(1ече1:= 5 > стасе (1ис) ( (--» еп(ег (гасе, а(па - )п( <-- ех)( Спасе (пв» ас (ор )ече)) = )п() (и( > 1иС(х"и,х); 1-- еп(ег )пс а(па = х"и, х (» »() х (иаи ег и< —. и+1 (» к() х и+1 <-- ех)1 (п( (пои ат Сор )ече)) = х (п»1Р(п+1Ц (» к- 1) Х и+ 1 Действие функции трассировки отменяется командой апсгасе: > иисхасе(1ис)( (--» еп(ег оп(гасе. агоа = )п( <-- ек)( пп(гасе (пои а( Сор )ече'() - ) > 1аС(х"и,х)( (--» еп(ег (п(.