К. Йенсен, Н. Вирт - Паскаль - Руководство для пользователя (1109480), страница 17
Текст из файла (страница 17)
Процедуры и'функции 129 Дает в качестве результатое; асс..бе..ЕО...Ь!..)М!..в..п.. аЬсбе(ОЬ!]П1вп соебй(а!ЬТЬвдп сей(бЬ!!вйп)па ргойгав Тгачегза!2(!прис,йисриС); ( Программа 117 — Вариант Программы 11.6 с параметрамипропедурами. ] Суре Рсг = 1йобе; Иобе = гесогб 1п(о: СЬаг; С!!пй, й!(пи: РСг епб; Рса111че = 1..йах1пс; чаг йооС: Рог; СЬ: СЬаг; ргосебиге Ргейгбег(Р: РСг); Ьей!и !Е Р <> пс1 Спеп Ьей!и Иг!Се(йиериС,Р(.1п(о); Ргейгбег(Р1.11!пп); Ргейгбег(РТ.ИС!пй) епб епб ( Ргейгбег ]; ргосебиге 1пйгбег(Р: Рог); Ьейбп СЕ Р <> и!1 Спеп Ьейап Тпйгбег(РТ.СС!пй); Иг!Се(йисрис, Р1.1п(о); 1пйгбег(Р(.й!!па) епб епб ( 1пйгбег ); ргосебиге Роесйгбег(Р: Рег); Ьей1п П Р и!! Сйеп Ьей1п Роз!Отбое(РТ.!С!пй); Розсйгбег(РТ.ИС!пй); Иг!Се(йиСриС,Р!.1п(о) епб епб ( Роаейгбег ]; ИО Руководство длл полазоеателл ргосебвге Епсег(чаг Р: РСг); Ьей!и йеаб(1прис, СЛ); Иг!Се(Овсрис, СЬ); !! П! '.' СЬеп Ьей!и йеи(Р); Р1.1п!а := СЬ; Епсег(РТ.СС!пй); Епсег(Р1.01!пй) епб е!зе Р := пт1 епб 1 Епсег 1; ргосебиге Иг!сейобез(ргосебвге ТгееОрегас!оп(йсагС: РСг); йчоС: Рсг; Т!11е: расвеб аггау [П..й: Роз!Мче] о! Сваг); чаг С: Раз!С!че; Ье01п Иг!Се!п(Овсрвс); !ог С := М Со й ба Иг!Се(Овсрвс, Т1С!е[С]); ИгтСе!п(0вСрвС) р Игые!п(ОвервС); ТгееОрегаС!ап(йаоС); Иг!Ье1п(Оверис) епб 1 имсейабез 1; Ьейтп ( Тгачегза!2 ) Епсег(йаос); Иг1се1п(Оисрвс); Игчеейобез(РгеОгоег, йооС, 'нарез 11асеб тп ргеогбег:'); Иг!Сейобез(1пОгбег, йаоС, 'йабез 1!асеб 1пагбег:'); Иг!Сейабез(РааСОгбег, йооС, 'Иабеа 1!зсеб !п раасагбег:') епб 1 Тгачегза!2 ] .
дает в качестве результатов: аЬс..бе..!О..Ы ..)Ь!..в..п.. йобез 1!асеб !и ргоагбег: аЬсбе(йм]Ь1вп йабез 1ЫСеб 1погбег: сЬебй(аж!ва!и Иабез 1ыСеб тп розсогбег: сей(бЬ!1айп)па Следует предостеречь читателя от использования рекурсивных методов без должного анализа проблемы. Хотя они и выглядят иногда «прозрачными», но не всегда приводят к самым эффективным решениям. Если процедура Р активирует (;), а () в свою очередь активирует Р, то либо Р, либо ч) должны быть заранее упомянуты с помощью опережающего описания (см.
разд. 11.3). 1Л Процедуры и функции ПП В каждой реализации стандартного Паскаля должны быть предусмотрены предописанные процедуры, приводящиеся в приложении 1. В зависимости от реализации сюда могут добавляться и другие подобные процедуры. Аналогично всем предописанным или предопределенным объектам считается, что они находятся в области действия, окружающей программу пользователя. Поэтому при переописании соответствующего имени внутри программы никаких неприятностей не будет. Предописанные процедуры нельзя передавать в качестве процедуральных фактических параметров.
11.2. ФУНКЦИИ Функция — это часть программы 1в некотором смысле аналогичная процедуре), определяющая одно-единственное ординальное, вещественное или ссылочное значение, используемое при вычислении выражения. Активация функции вызывается написанием обозначения функции, состоящим из имени обозначаемой функции и некоторого списка фактических параметров. Параметрами могут быть переменные, выражения, процедуры или функции; они подставляются вместо соответствующих формальных параметров.
Описание функции такое же, как и программы, но только заголовок функции имеет вид: Р и с. 11.1О. Синтаксическая диаграмма для Заголовка функции Как и в случае процедуры, метки из раздела меток и все имена, введенные в разделах определения констант и типов„а также в разделах описания переменных, процедур или функций, являются локальными по отношению к описанию функции, которое и называется областью действия для этих объектов. Вне области действия они неизвестны.
В начале раздела операторов значения локальных переменных не определены. Имя, указанное в заголовке функции, именует эту функцию. Тип результата должен быть простым или ссылочным. Внутри описания функции должно выполняться присваивание (с типом результата) имени функции. Такое присваивание «возвращает» ре- зультат функции. г32 Рупооодстео для польаооателл В программе 11.8 алгоритм возведения в степень из программы 4.3 оформляется как описание функции. Если имя функции появляется где-либо в выражении внутри самой функции, то речь идет о рекурсивном выполнении функции. Первый из примеров приложения 6 иллюстрирует использование рекурсивной функции. Обозначение функции может встречаться раньше ее определения, если есть опережающее описание (см. равд. 11.3). Предполагается, что в каждой реализации стандартного Паскаля предопределены функции, перечисляемые в приложении ! При реализации их состав может дополняться.
Предописанные функции нельзя передавать как функциональные фактические параметры. ргойгап ЕхрапепС1аыоп2(Оесрпс); 1 Программа 11. — Вариант Программы 4.б с функцией. Суре Иасога1 = О.,йах1пс; чаг Р1, Ртзцоагеб: йеа1; !пиес!оп Ранет(Вазе: йеа1; Ехропепс: Насога!): йеа!; чаг йезп1С: йеа1; Ьей!и резо!С := 1; нп1!е Ехропепс > 0 ео Ьей!п нй!1е поС 066(ЕхропепС) оо Ьей!п Ехропепс:= Ехропепс 6!ч 2; Вазе:= Зцг(Вазе) епо; Ехрапепс := Ехропепс — 1; йезе11:= йезо11 ' Вазе епо; Ранет := йезо1С епо 1 Ронег ); Ьейтп Рт:= Агстап(1.0) ' 4; Игтее!п(Опсрос, 2 0: П:В, 7 :3, Ронег(2.0,2) :11:О); РСЗцпагео: Ранет(Рт,2); Иг!Се!и(Оосрпс, Рт :11:В, 2 :3, Р!Зцоагер :11:О); Иг!Се!и(0озрис, Р!Зцоагео:11:О, 2 :3, Ронег(Р13цоаге6, 2) :11:6); Иг!Се1п(Оосрос, Р! ."11:В, 4:3, Ронег(РС,4) :11:В) епе 1 Ехрапеирластоп2 1 .
1!. Процедуры и функции 755 Дает в качестве результатов: 2.000000 7 128.000000 3.!41593 2 9.869605 9.869605 2 97.409100 3.141593 4 97.409100 !1.9Л. Фунпннонааьные параметры Функции сами могут передаваться в качестве параметра другим функциям или процедурам. Формальный функциональный параметр специфицируется с помощью заголовка функции, соответствующий ему фактический параметр. должен быть именем функции.
Программа 11.9 определяет суммы элементов ряда для функции, задаваемой в момент обращения. ргойгап 5»в5ег1ез(О»орое); ! Программа 11.9 — Печать таблицы сумм рлвон. ) сопзо Махгегва = 1О1" »аг Тегв: 1..йахТегпз; Еепсстоп 5!Ова((ппсыоп Р(Х!йеа1):йеа!;!снег,аррег:1поейег):йеа!; »аг 1пбех: 1поебег; 5»в: йеа); Ьейтп 5»в := 0.0; !ог 1ппех := !снег Со Оррег Оо 5»п := 5»в + Т(1прех); 5!Хна := бпв епр ( 5тбва ); !апостол 1псгеаз!пйб!пе(Х: йеа1): йеа1; Ьей!и 1псгеампйбтпе :- з!п(Х) " Х епр ( 1псгеаыпйбзпе 1; !опсс1оп 1п»егзеС»Ье(Х: йеа1): йеа1: Ьейтп 1п»егзеС»Ье:= 1 / (5цг(Х) " Х) епп ( 1п»егзеСпЬе ); 784 Руководство да ловьзовотевл ЬеВтп ( ВовВег!ез ) Тот Тегв := 1 Со МакТегвз до Ыг!Се1п(Тегв,В!Вва(1псгеаз!п85!пе,1,Тета), ЕИВва(1птегзеСэое,1,Тегв)) епд ( ВовВег!ез 1 .
Дает в качестве результата: ! 8.41471ОЕ-01 1.ООООООЕ+ОО 2 2.660066Е+ОО 1.125000Е+00 3 3.083426Е+ОО 1.162037Е+ОО 4 5.621672Е-02 1. 1П662Е+00 5-4.738405Е+00 1.185662Е+00 6-6.414900Е+00 1.190292Е+00 ,7-1.815995Е+00 1.193207Е+00 8 6.098872Е+00 1.195160Е+ОО 9 9.807942Е 00 1.198532Е+00 10 4,367733Е+00 1.197532Е+00 Ф 1 !.2.2. Побочвмй эффект Встречающееся внутри описания функции присваивание не- локальной переменной или параметру-переменной называется побочны.н эффектом. Часто это лишь затуманивает назначение программы и значительно усложняег ее верификацию. Поэтому использование функций, дающих побочный эффект, вряд ли стоит рекомендовать. В качестве примера разберите программу 1!.1О.
! 1.В. ОПЕРЕЖАЮШЕЕ ОПИСАНИЕ Имя процедуры (илн функции) можно использовать до описания процедуры (или функции), если есть оперезгсаюи(ее описание. Опережающее описание необходимо в случае взаиморекурсивных процедур и не вложенных одна в другую функций. Такое описание выглядит следующим образом (обратите внимание, что список параметров и тип результата записываются только в опережающем упоминании): ргоседоге !)(Х! Т); Еогвагд; ргоседоге Р(У: Т); ЬеВ!и ()(В) епд.„ ЕА Процедуры и функции Ид ргеседиге 0; ) параметры и тип результата не повторяются ) Ье01п Р(В) епд; ргпОгае З1деЕПесс(0псрпс); ( () рограмма 1 1 .10 — Пример побочного эффекта Функции.
) еаг А, У: 1пЬеСег; (ппсЬ1пп Зпеаау(Х: 1пйе0ег): 1пЬеаег; Ьс01п У := Х вЂ” Х [ з(де еИесе пп У ); Зпеаау := Заг(Х) епд ( Зпеаау ); Ье0(п 2 :-- 10; А : Зпсаау(Х); Ыг(те1п(0нерпс, А, Х); 2 :=- 10; А := Зпеаау(10); И:= А '" Зпеапу(У); Ыг1йе1п(ОпсреЬ, А, К); У : 10; А := Зпеаау(Х); А:= А ' Зпеаау(10); Иггае1п(Оперпй, А, У): еаза ) З(дсЕ1(есЬ ) Дает в качестве результата: 100 0 О 0 10000 -10 12 ТЕКСТОВЫЕ ФАЙЛЫ. ВВОД И ВЫВОД В гл. 9, говоря о текстовых файлах, мы уже.