Говорухин В., Цибулин Б. Компьютер в математическом исследовании (1185927), страница 35
Текст из файла (страница 35)
Возвращаемым значением по умолчанию является результат последне- го оператора из тела'процедуры, однако существуют и другие возможности, о ко- торых будет сказано ниже. Тип результата работы процедуры зависит от типа возвращаемого значения. Например, процедура с именем Г, вычисляющая сумму пе- ременных х и у, выглядит следующим образом: > Г: ргос(х,у): х«у; епщ ?:= ргос (х, у) х + у еЫ рпхс Функции, процедуры и модули 185 Приведем два результата обращения к этой процедуре: > Г(п хи П( ч) ) .
Г(1. 9): и "~ Мп(ч) 10 Для написания процедур в Мар!е имеется ряд команд и служебных слов, кроме указанного выше обязательного минимального набора. Эти команды и слова позволяют описывать переменные, управлять выходом нз процедуры, сообщать об ошибках, Формальньш параметр процедурь! можно явно описать, указав его тип после двух двоеточий, следую!цпх за именем параметра. В этом случае при обра!цении к процедуре Мар!е проверит тип фактического параметра и выведет сообщение об ошибке в случае его несовпадения с типом форматьпого параметра.
Пример: > 9;=ргос(ы и п(ооег) 1 2 епо ргос: > 9(123456799); !524!578750!9052! » 9(11/2): 5 гог 9 ехрестл !Г> 1л( ггвииеп(. и то Ье о( (уре !п(ечег. пот гесе1чЕО Пч2 Еше одним способом передачи данных из процедуры является изменение значения входных параметров. При помощи описания еча1п можно присваивать переменным, выступающим в качестве входных параметров, значения внутри процедуры. Отметим, что присваивать фактическим параметрам возвращаемые значения следует только перед выходом из процедуры, что связано со спецификой обработки выражений внутри процедур.
Пример: > Г>=ргос(х: ечл)п) х:-!О. х; епп ргос: 7";= ргос(хпгча1п) х:= 1О; х епх) ргос ' ((р): ги Р !О После заголовка процедуры может следовать описательная часть процедуры, отделяющаяся от него пробелом. В атой части описываются локальные и глобальные переменные, используемые процедурой. Локальные переменные доступны только внутри тела процедуры, и опн пе конфликтуют с одноименными глобальными и локальными переменными других процедур. Следует помнить, что при выполнении операций с локальными переменными производится только один уровень оценивания, см, пример в следующем разделе.
Все переменные, описанные во внешнем по отношению к процедуре блоке, являются для нее глобальными. Изменения глобальных переменных внутри тела процедуры действительны и за ее пределами. Для определения локальных переменных, используемых только внутри данной процедуры, применяется описатель 1оса1. Перечислить глобальные переменные можно при помощи описателя 910!)е1, который должен размещаться в описательной части процедуры. Во избежание накладок с использованием имен рекомендуется описывать все переменные, встречающиеся в процедуре, Если в теле процедуры встречаются неописанные переменные, стоящие в левой части оператора , в36 - Глава 7. йроараааивоеаэие э нар(е присваивания или фигурирующие в качестве переменной цикла, то Мар!е выводит предупреждение и автоматически описывает их как локальные. Приведем пример: > геыаг(: Ч; а: Х: 1:-4; ! (:=4 > аг-ргьс() 1аса1 Ч; Й1ЬЬа1 ), ~:-): ):-2-1.
Х:-3, епс ргос: Иагп~пд, "Х" аа Чер1)сЧЬ!у йес1агей 1оса1 (с ргосеппге "а" > а(): > 1. ); Х; После опнсателей в процедуре может стоять указатель на параметры: орыапа ОРТ; Термин ОРТ может принимать одно нз следующих значений: геачепчЬег (ускоряет выполнение процедур н делает рекурсивные процедуры более эффективными), срегаьог (аналогичен заданию процедуры-функции) и некоторыедругие (ьш1ьчп, эуатепч, агг(м, ась! е, Ь гасе, раей айе н Соруг) дЬЬ). После опнсателей идет тело процедуры, которое может содержать команды н другие процедуры. Для выхода из процедуры в любом месте ее тела используется команда ЙЕТОЙИ(ЧАЕ ).
Здесь ЧА(. — возвращаемое значение. Если в процедуре несколько операторов йЕТОйИ, то возвращаемые значения могут быть даже различных типов. Для аварийного выхода из процедуры в случае возникновения ошибки и сообщения о случившемся используется команда ЕЙЙОЙ("техт" ), где гехт — сообщение, которое должно появиться на экране в аварийной ситуации, Для вывода предупреждающих сообщений используется команда ИАЙИ1ИЯ (см/ справку Мар1е), Схематично общий вид процедуры можно изобразить следующим образом: ИАИЕ:-ргсс(РАЙ)::суре)...., РАЙК::Фурах) 1оса1 ЧН.),....ЧАЬИ: Й)сЬа! ЧАЙ)„ ...ЧАЙИ: орьчопа ОРТ: ЕХРЙ); ЕХРй2:...
ЙЕТОЙИ(геа)); ,Еййрй("Еггсг Чп ргссесчгй,.паве");...ЕХРЙР; йпб, Йгсс; ,здесь ЕХРй1„ЕХРЙ2; .. „ЕХРЙИ вЂ” группы операторов Мар!е, Приведем пример, демон,ст13ирующий ращ возможностей при конструировании процедур, Описываемая процедура преобразует отрицательное число в по вожитальное. Если входным па- Функции, процедуры и модули 187 раметром является нуль, то выводится сообщение об ошибке; для положительных чисел выводится массив, содержащий само число, его квадрат и куб; > ехапр: ргос(х.:полег!с) 9)оЬа) г: )оса) у.н; ор(1оиа гекееоег; ат х<О Слеп йЕ(Ойн(-х); е)! 1 х-О слеп Еййсй(етаг1аше х-О"): 11; [х,х"2,х"3): епб: ехагар х< ргос (хглимемс) )оса) у, кп В)оЬН х; орбоп геаыгпьег; их<0(ьеп КЕт()К)Ч[-х) еИх= Обып ЕККОК(')гаг(аыех=О') епб)Е; [х, х"2, х"3] епб ргос Обратимся к процедуре с различными входными параметрами: > ехапр(-)); ехамр(О); ехазр(Э): ) Еггог, (!и ехазр) Уаг!аЫ е х-О [3,9, 27) Продемонстрируем эффективность использования параметров на примере гнпееЬег, которая сохраняет промежуточные результаты процедуры в памяти.
Опишем рекурсивную процедуру т! Ы, вычисляющую число Фибонначи, и аналогичную ей процедуру 1102, не использующуюпараметр гевепй)ег. В процедурах тип поппед1пС указывает на целые положительные числа: > Г!Ы . ргос (и;:поппе91пс) орс!оп геаепЬег; 11 п < 2 Слеп п е)ае 11Ы(п-))<11Ы(п-2) епб 11; епб ргос; Г!Ь2 : РГОС (П:;ПОППЕ91ПС) 1г п < 2 ььеп п е)ае 11ь2(п-1)+11ь2(п-2) еоб 1 1: епб ргсс: Теперь обратимся к процедурам, выводя время нх выполнения: » Е1зе(Г(Ы(ЭО)): Мзе(Г1Ь2(ЭО)): .024 103.033 Эффект использования параметра геаевЬег очевиден. Иногда процедура должна уметь обрабатывать различное число входных параметров.
В этом случае при описании процедуры не обяаательно указыватьявно количество и тип параметров. Число фкктических параметров можно узнать внутри тела процедуры при помощи команды оагдз, а обращаться к ним нужно как к элементам массива агдз. Приведем пример процедуры без предварительно описанных параметрок 188 Глава 7.
программирование в нар(е > ехамр;=ргос() )оса) п; и:=пагдв; 1Г пагдв-2 Спел гесцгп "Число паранетров равно 2", аг)в[1!-агдв[23 епо' тт; [пагдд.агдв) епс ргос: Обратинси х процедуре с различннн числон параиетров > ехаир(а.Ь,ст, ехазр(а.Ь): [ 3. и, ь, с 1 Чоело лоро иетрое раино 2а — Ь Для вывода дополнительной информации о работе процедуры при ее отладке можно использовать команду цвег(пто.
Первый параметр команды задает помер уровня вложенности, при котором будет выводиться информация, а второй — имя процедуры, в которой находится обращение к команде. Уровень вложенности определяется глобальной переменной 1пто1еуе1. Поясним сказанное примером: > т -ргос(х,у) цаегтпто(2 Г,"Били введены:",х,у): х"2+у 2 егс > тото)ече)[Г).=2: > т().2); Били введена.
) 2 5 Обработка процедур и возможные ошибки При работе в Мар!е могут возникать ошибки, которые связаны со спецификой обработки обращений к процедурам. При обращении к процедуре Мар!е в первую очередь анализирует на правильность ее имя, затем входные параметры, после чего выполняет тело процедуры. Число фактических параметров может быть меньше числа описанных параметров процедуры. В этом случае ошибка возникнет только тогда, когда недостающий параметр понадобится для выполнения команд.
Например; > [.=ргос(а. Ы т( а<0 Слеп ргтпс("Значение первого параиетра отрицательно"), е)ве рю пС(сам "Значение второго параиетра. ". сопуегС(Ь.ССгтпд))); епо тт; епо ргос: > 1(-)): Значение первого параметра отрицательно > т(1), Еггог, (тп т) т цвев а 2по агдцмепС. Ь, иысЬ 1в и1вв1пд 1().З): Значение еторого параметра: 3 При обращении к процедурам следует помнить, что многие операции выполняются только с переменными определенного типа и важно соответствие типа фактического параметра типу, требуемому в операторах тела процедуры. Например, использование в качестве фактического параметра процедуры т из предьшушего примера символьной переменной а приведет к ошибке при проверке условия: Функции, процедуры и модули 189 > Г(а.Ь): Еггог.