Матросов А.В. Maple 6. Решение задач высшей математики и механики (1185909), страница 58
Текст из файла (страница 58)
Любая строка в списке опций, начинающаяся со слова аСоруг(я(т(", трактуется Мар!е как опция сорухгчьс, которая запрещает отображать операторы теЛа ПрОцЕдурЫ, ЕСЛИ ТОЛЬКО ЗНаЧЕНИЕ ПсрЕМЕННОй ИНтЕрфЕйСа оогьоааргос, отвечающей за отображение на рабочем листе текста процедуры, не установлено равным 2 или больше; > Г:=-ргпс(х,у)оргьоп ' орут(ЧПС 2000'; х"2ту"2; епп ргос; 1 т ргос(х, у) ...
спд ргос > ГпгегГасе(уехЬоаерхос=2)) > етах(Г)г ргос (х. у) орион 'Соруияь( 2000'; х 2 ь у 2 спо' ргос Последним в заголовке процелуры может быть задана строка описания в ОПЕратОрЕ поест(ргьс . Оиа НЕ ВЛИяЕт На ВЫПОЛНЕНИЕ ПрОцсдурЫ И Едниетвенное ее предназначение предоставить единственную строку комментария, которая отображается в области вывода при объявлении процедуры или ее чтения из файла, или библиотеки. Дело в том, что при распечатке процедуры из ее тела удаляются все комментарии и только эта строка может дать пользователю информацию о предназначении процедуры.
Более того, если процедура определена с опцией сорухгдьс и переменная интерфейса оогьпааргпп имеет значение, меныцее чем 2, то эта строка является единственной отображаемой из всех операторов тела процедуры: > д: =р гас ( х: . "патае, у:: патае ) с(еасхгрсгоп 'ьепдсь ох оессох х"2еу 2; () Комментария опс( рхос; д:= ргос(хсаате, уплате) йеесг(рноп хеолтл о) гесгог' ( ха2 + уа2 епй ргос > Г:=рхос(х,у) среьоп 'Сорух(ЧЬС 2000'г г(еасгьрсьсп 'энга'т Глава 5, Основы программирования в Мвр!в х"2+у"2; епг) ргос; Г:= ргос(х, у) деосир6оп 5игп ...
епд ргос 5.2.5. Возвращаемые значения Любая процедура Мар!е возвращает единственное значение, которым обычно является значение последнего выполненного в теле процедуры оператора. Однако это не единственный способ передачи вычисленных в теле процедуры величин. Как и в других языках программирования, процедура Мар!е может возвращать значения через свои параметры, но этот способ несколько отличается от аналогичного в других языках программирования.
Для того чтобы процедура возвращала некоторое значение через параметр, необходимо в теле процедуры этому параметру присвоить требуемое значение. Процедура примера 5.!б возвращает сгпе, если символ, определяемый первым параметром, содержится в строке второго параметра, в противном случае — ао1ее. Третий параметр возвращает позицию первого вхождения заданного символа в строку. > г:=ргос(х::егггпд, э::зггьпс, и::папге) 1оса1 1,3) 3;=0; гог 1 ап е с)о 3:=зс1; 1Г Х=ь СЬЕП П:=3; ГЕСиГП СГПЕГ Е1ЕЕ га1ХЕг Епп 11; епг) дог епс) ргос: > Г("1","1234",п)г дъе > пг > Г("4","1234",и)) Еггог, г ехресге ьгэ Згг) агчпгоепг, и, Со Ье от Суре па|хе, Ьсе геое1оео Процедура последовательно в цикле го -1п проверяет равенство переданного ей символа с каждым символом строки.
В случае совпадения параметру и присваивается номер позиции этого символа в строке и процедура завершается выполнением оператора геспгп. Первое обращение к процедуре г() завершается совершенно правильно, а ПЕрЕМЕННая и СОдЕржИт ПраВИЛЬНЫй НОМЕР ПОЗИЦИИ СИМВОЛа '1" В СтрОКЕ "1234 ч Однако второй вызов этой же процедуры с параметром и приводит к ошибке.
Дело в том, что после первого вызова переменная и получает зна- Часть 1 Основы )йвр)е ЧЕНИЕ 1 И ЕЕ тИП СтаНОВИтСя раВНЫМ гпседег, а НЕ тее, КаК ЭТОГО трЕбуЕт процедура. Для выхода из этой ситуации в нашем случае следует передавать в процедуру переменную п не вычисленной, заключая ее в одинарные ка- ВЫЧКИ ИЛИ ВЫПОЛНяя КОМаиду е з1п(): > Г (" 4 ", "1234 ", еиа1п (и) ); с; сгие > Г("2","1234",'п');пг ггие Процедура примера 5.16 будет корректно работать, если при каждом ее вызове в качестве третьего параметра передавать ей переменную, которой не присвоено никакого значения.
Более корректный способ исправления подобной ошибки заключается в ис- ПОЛЬЗОВаНИИ тИПа етз1 Прн ОирсдЕЛЕНИИ фОрМаЛЬНОГО ПараМЕтра ПрОцЕдуры, через который будет возвращаться некоторое значение. Этот тип Мар)е, используемый исключительно при задании типов параметров процедур, предписывает вычислять действительный параметр процедуры только до уровня имени. В теле процедуры его можно использовать обычным способом. Измененная процедура г() примера 5.16 представлена в примере 5.17. ч:» > г:=ргос(х::згггос,з::згггпо, п::ета1п) 1осз1 3:=О; Гог 1 1п з с(о 3:=3-~1( 1г х=ь Гпеп и:=3; ге( игп ггиег е1зе га1зег епг( 1Г; есо оог епо ргос: > г("х","12х34",п)гп' иие > Г("4","12х34",п)гпг ггие 5 Еше одним отличием использования параметров в процедурах Мар!е является то, что фактические параметры вычисляются только один раз при входе 3(5 Глава 5 Основы программирования в Мвр(в в процедуру, поэтому их нельзя свободно использовать в теле процедуры, как локальные параметры; если формальному параметру в теле процедуры присвоено какое-то значение, то при дальнейшей ссылке на этот параметр мы не получим присвоенного значения, Единственное законное присваивание возможно только в случае возвращения значения через этот параметр.
ПрОцЕдура агпр1е() ПрИМЕра 5.17 дЕМОНСтрИруЕт ЭтО ЯВЛЕНИЕ. ФОрМаЛЬНЫй ПараМЕтр х ОПрЕдЕЛЕН КаК тИП е а1п(1аееяеп). Этс ОЗНаЧаЕт, ЧтО СООтВЕтетвуюший ему фактический параметр при входе в процедуру должен вычисляться до уровня имени переменной, которая хранит целое значение. В теле процедуры, так как параметр х является именем, чтобы использовать его ЗНаЧЕНИЕ, ПрИХОдИтСя ЯВНО ПрИбЕГатЬ К фуНКцИИ ееа1 () .
В ПЕРВОМ ОПЕратОрЕ изменяется значение формального параметра, а сам формы(ьный параметр является возвращаемым значением процедуры а1ер1е(). Казалось бы, если мы передадим в процедуру переменную со значением, например ь, то результатом выполнения процедуры должно быть значение б. Однако ее вызов с указанным параметром показывает, что значением процедуры является имя х, а не число ь.
Здесь работает правило Мар(е вычисления фактических параметров олин раз, а наш параметр как раз и должен вычисляться до своего имени. А вот значение самого параметра увеличилось на единицу, так как он был изменен в теле процедуры. :.'~й11()()УФ~~~'::Ив1~17)М~ф~~йййй(х4в(В41иййпфдвЖй1)~й:"в(той'врЬмвпУйы > а)ппр1е:=ргсс(х::епа1а(1аседеп)) х:=епа1(х) е1; х; еап( рпсс: > х:=-6) х:=б > агер1е (х); > х; Правило использования фактических параметров таково: присваивать им возвращаемые значения можно только непосредственно перед выходом из процедуры.
Если необходимо, например, в цикле менять значение параметра, то следует его первоначальное вычисленное значение присвоить локальной переменной, произвести вычисления, а затем присвоить формальному параметру полученный результат. Рассмотрим процедуру и() примера 5.19, которая возвращает стае, если в слагаемых первого параметра встречается переменная, заданная вторым параметром, и га1ае — в противном случае. Третий параметр возвращает либо ноль, либо число слагаемых, в которых содержится эта переменная. Часть 1 Основы Мар(е Зтб > т:=ргос(р:: '~-', х::папе,п::ееа1М 1оса1 1; и:=От гог 1 ьп р с(о 11 Ьая(1,х) гпеп п;=пе1 епг( 11( епг( с(о; ега1Ь(п>ОШ епо' ргос: > е(х~-я1п(х),х,пю -и <0 > и; Еггог, гоо папу 1еее1я ог геспгя1оп Она работает неправильно, так как в ней подсчет осуществляется с использованием фактического третьего параметра, который в теле процедуры всегда вычисляется до уровня своего имени, а поэтому и не работает проверка истинности логического выражения п>0.
Более того, попытка вычислить значение третьего параметра после выполнения процедуры приводит к ошибке, так как он выражен через самого себя и это приводит к бесконечной рекурсии. Правильный вариант реализации этой процедуры с использованием локальной переменной для подсчета числа слагаемых, содержащих заданную переменную, показан в примере 5.20. > хи=ргос(р:: '+ ',х::пате,г1::ееа1п) 1оса1 ', 1; 1:=0; гог 1 гп р оо 1г Ьая(т,х( гпеп 1:=1+1 епс 1ту епг( с(о; п:=1; ееа1Ь(1>0)( епг( ргос: > т(х+я1п(х),х,пю !тие > го Прекратить выполнение процедуры и возвратить некоторое требуемое значение можно в любом месте тела процедуры.
Для этих целей применяется оператор гет . Значение следующего за ним выражения и является воз- Глава 5. Основы и грвммироввния в аавр!е врашаемым значением. Мы использовали данный оператор в примере 5.)б, когда определяли первое вхождение символа в заданную строку, а возвра|цаемым значением была позиция этого символа в строке. Общий синтаксис этого оператора следуюший: сеСпгп выражение Выражение может быть любой структурой данных, включая последовательность, список и множество. Оно может и отсутствовать, в этом случае процедура ничего не возвращает.
Кроме возврата значений процедура может возвратить ошибку, сгенерировав исключительную ситуацию, создающую специальный объект исключительного состояния, который в дальнейшем можно использовать в конструкции егу для анализа возникшей ошибки и выполнения определенных корректируюших действий. Возврат ошибки из процедуры осушествляется оператором е ощ который создает объект исключительного состояния, печатает сообшение об ошибке и немедленно прекрашает выполнение процедуры: егсос строка сообщения П список параметры) Строка сообшения — это строка, которая участвует в формировании обшсго сообщения об ошибке в процедуре после ее завершения оператором воо .
Если в ней заданы специальные переменные, начинающиеся с символа процента (з), за которым следует целое число без знака или со знаком минус, то вместо нее в строку сообщений подставляется значение переменной из списка параметров, причем абсолютное значение целого числа соответствует порядковому номеру переменной в списке. В случае целого числа со знаком минус значение соответствуюшего параметра преобразуется в порядковое числительное (с точки зрения английского языка) и подставляется в строку сообщений (естественно, оно должно быть целым).
Пример формирования строки сообшений показан ниже: > и:=б; > егсог "Ъ-1 рагащеоег 'паа Сье ча1се Ъ2", 2, и; Егсог, 2пб рагапевег 'паа сне яа1пе б Специальный параметр аз будет отображать через запятую и пробел все зна- чения переменных из списка параметров: > ессог "А11 равате ега: %0", 2,п; евсос, А11 рататеТега: 2, б Создаваемый оператором е сот объект исключительного состояния представляет последовательность выражений со следуюшими элементами: 0 имя процедуры, в которой было сгенерировано исключительное состояние, или константа о, если исключительное состояние было сгенерировано на верхнем уровне, а не в процедуре; Часть 1 Основы Мар!е П строка сообшения; П список параметров в случае его задания.