Матросов А.В. Maple 6. Решение задач высшей математики и механики (1185909), страница 55
Текст из файла (страница 55)
Основы программирования в МарЬ 11ве2. Обычно создается список, длина которого равна длине наименьшего из двух заданных списков. Если при обрашении к этой команде задается четвертый параметр, то длина нового списка равна длине наибольшего списка, а четвертый параметр используется в качестве недостаюшего параметра при вызове функции г. > Ш: = (ееЧ (1, 1="а" ..
"Ь'Ч ! х Г,г:= ["а", "Ь"! > Ь2;=[хеЧ(1,1=2..6)]; 12:= [2, 3,4, 5, б! > х1р( (х, у) ->х ( (у, Ш, Ь2); ["а2", "ЬЗ"! > х1р((х,у(->х((у,Ь1,Ь2,рь1); [ "а2", "ЬЗ", ф4, ф5, фб ! [Подробное описание команды хтр(( можно найти в гл. 2.) 5.2. Процедуры В языках программирования процедуры позволяют выделить код в одну связанную единицу с тем, чтобы в дальнейшем простым обрашением к ее имени инициировать выполнение всех, содержащихся в ней операторов. Обычно процедуры используются для реализации некоторых часто выполняемых действий.
Так как основным режимом работы в Мар!е является интерактивное взаимодействие пользователя с его ядром, то процедуры являются единственным способом создания программ, расширяющих функциональные возможности самой системы аналитических вычислений Мар1е. И здесь следует отметить, что программирование в Мар1е достаточно своеобразно в силу аналитических "способностей" Мар!е.
Разработка программ для выполнения численных расчетов над числовыми данными, конечно, практически не отличается от аналогичных действий в других языках программирования, разве что синтаксис используемых операторов разный, но вот как только мы хотим запрограммировать действия с аналитическими выражениями, то наш опыт численного программирования становится практически не нужным. Программирование аналитики больше связано с проверкой типов выражений, позволяющих определить, в конечном счете, их структуру и состав, а эти знания уже позволяют нам реализовать разнообразные необходимые аналитические действия над выражениями, Небольшой пример. Пусть необходимо разработать процедуру, вычисляющую абсолютное значение некоторой величины.
Программист, не работавший с аналитическими системами, но имеющий опыт программирования на Часть Ь Основы Мар)е таких языках, как Рог(гав или С, без сомнения быстро напишет процедуру типа следующей: > АВЯ:=ргос(х) т т х<0 Гпеп -х е1ве х епс( 1Г; еос) ргос; Для вещественных числовых значений параметра она будет прекрасно ра- ботать: > АВЯ(-5,В9); 5.89 > в:=1/2: АВЯ (в) Но как только ей в качестве параметра будет передана переменная, которой не присвоено никакого числового значения, а такое в Мар!е может произойти, то наша процедура выдаст сообщение об о)пибке: > АВЯ(Ь) ) Еггог, (1п АВЯ) саппос ева1папе Ьоо1еап: Ь < 0 Действительно, невозможно определить, будет ли переменная ь меньше или больше нуля. В этом случае придется немного подкорректировать процедуру с тем, чтобы она в подобных случаях возвращала не вычисленное значение нашей функции Авя(): > АВЯ:=ргос(х) 1Г Гуре(х,повег1с) слеп 1Г х<0 гпеп -х е1ве х епс( 1Г) е1ве 'АВЯ'(х) епо' 11) епп ргос: > АВЯ(Ы ~ АВБ(Ь) На этом простейшем примере мы показали, какие "проблемы" возникают при программировании с аналитическими вычислениями, и показали простейший вариант решения с помощью проверки типа передаваемого в процедуру параметра.
Хотя, справедливости ради, следует заметить, что на этом "проблемы" не закончились. А если передаваемое в процедуру Авя() выражение является произведением, например, двух неизвестных величин? Ведь нам известно, что модуль произведения равен модулю произведения модулей, но наша процедура не сделает такого преобразования, т. е. мы получим в качестве результата АВЯ (а Ь ), а не АВБ (а) АВЗ (Ь ), как следовало бы. Глава 5. Основы программирования в Мар(е 5.2.1. Определение процедуры Определение процедуры Мар!е имеет следующий общий синтаксис: ргос ([ список формальных параметров ]) 1оса1 список локальных переменных; ] ( 91оЬа1 список глобальных переменных; [ орсзопа список опций с(еасггргзоп строка описания; последовательность операторов епб ргос При объявлении процедуры единственным обязательным параметром является последовательность операторов, формирующих тело процедуры.
Остальные параметры, определяюшие локальные и глобальные переменные, список формальных параметров, задающие специальные опции режима выполнения процедуры и строку описания, могут полностью отсутствовать. Замечание Для совместимости с предыдущими версиями в Мар]е завершать объявление процедуры можно просто ключевым словом епгь Последовательность ключевых слов епб ргос в предыдущих версиях не допустима. Определение процедуры на рабочем листе создает объект Мар!е, которому. однако, следует дать имя, чтобы в дальнейшем можно было обрашаться к нему.
Это осуществляется обычной операцией присваивания: > гессог 1епдсп:=-ргос(х,у) ачгс(х"2еу-2)) епб ргос) ьессог )ела)ь:= ргес(х, у) ачг((х 2 + у 2) ева ргес После того, как процедура определена и ей присвоено имя, ее можно вызвать и выполнить с помощью оператора вызова функции, в котором задается имя процедуры, а в скобках определяются фактические переменные, которые заменяют в теле процедуры все формальные параметры: > еесгог 1епчгй(2,5) ) ('29 Обычно возврагнаанын значением процедуры явпяется значение последне~о вычисленного в теле процедуры оператора. В нашем примере последний, и единственный, оператор вычисляет квадратный корень из суммы квадратов параметров процедуры. При вызове процедур следует помнить, что Мар1е сначала вычисляет все фактические параметры, а затем уже использует полученные значения в качестве параметров процедуры: > х: нпгс(у)) Часть 1 Основы Мар(е > у:=х) у:=х > х:=в; х:= а > оесхох 1епдп)1(х,у) а+а Задать процедуру, тело которой состоит из одного выражения или одного оператора ьг, можно и с помощью специальной нотации, заимствованной из алгебры, — последовательности '(спхсох пара веров)->оператор'.
Определенную нами ранее процедуру можно задать и так: > оеспох 1епдпп:= (х, у) ->вЧ«с(х"2+у"2); тес(ог (епяй:= (х,у) -+ тгх +у Если в процедуре задан только один параметр, то при таком способе зада- ния круглые скобки можно опустить; > д:=х->1х х<0 спев -1 е11х х=О спеп 0 е1ве 1 еп«( 1х; я:= ртое(х) орпоп арета)ог, о«гоп; (Гх < О (Ьеп -! е(П х = О тьеп О е(ве ! епй и епп ртее > 9(-9),9(0),д(9); -), О, ! Определения процедур трактуются Мар)е как правильные выражения, по- этому их можно создавать и вызывать и без присваивания имен: > ( (х, у) ->вяхс (х 2еу"2) ) (4, а) т())О+а' > ртос(х,у) вяхп(х 2+у"2) ) епо рхос (с,«(); т(с'+ д' Однако неименованные процедуры обычно используются совместно с функци- ей пер(): > пар (х->х" 3, (1, 5, 9, 4 ) ); ( (, 64, ! 25, 729 ) Над неименованными процедурами можно выполнять разнообразные подходящие действия, например, вычислять производную операцией О.
Если результату, который также является процедурой, присвоить какое-либо имя, то его можно использовать для вызова полученной процедуры: > Ьл -О ( (х) ->вяхв (х" 2+у" 2) ); х Г:=х-ь „Гх2+у2 Глава д Основы программирования в ((()ар)в > г(1)г ! Д ( 2 5.2.2. Передача параметров При вызове процедуры Мар1е сначала вычисляет ее имл, а затем последовательность переданных ей параметров, причем если значением какого-либо параметра оказывается последовательность, то формируется одна результирующая последовательность величин, которая и трактуется как последовательность фактических параметров: > в:=а,пг (::=2; вга,Ь (:=2 > И:=(х,у,х)->х*у*г; вс:=(х,у,г) — >хух > ьнв,г) 2аЬ В этом примере х, у, х является последовательностью формальных парамет- рОВ, тОГда КаК в,в,2 — ПОСЛЕдОВатЕЛЬНОСтЬ фаКтИЧЕСКИХ ПараМЕтрОВ.
Количество фактических параметров не обязательно должно равняться количеству формальных параметров процедуры, определенных при ее объявлении. Если их меньше, то ошибка во время выполнения процедуры возникнет только тогда, когда при вычислении тела процедуры действительно потребуется значение этого отсутствующего параметра. Если фактических параметров больше, чем формальных, то никакой ошибки не будет сгенерировано — дополнительные параметры будут просто проигнорированы. > тххеп=ргос(х, у, х) гв х>у спеп х е1ве г епс( )в епс( ргос; еХУ2:= ргес (х, у,х) Ыу < х Феп х е!ве епа Ы епе' ргпс > тхХЕ (1, 2, 3, 4, 5, б ) г 3 > тУЛЕ (5, 1): 5 > тХХЕ (1,5) ) Еггог, (1п тХХЕ) тХХЕ пеев а Згс( агоптепс, х, еиьоп тв тъввтпя Первый вызов процедуры ххе() с большим числом фактических параметров выполнился нормально.
Второй вызов этой же функции с двумя параметрами тоже завершился нормально, так как значение третьего параметра не потребовалось. А вот третий вызов с двумя параметрами завершился сообщением об ошибке, что необходим третий параметр, который в вызове отсутствует. Часть Л Основы гйзар(в зог До сих пор мы не обращали внимания на типы передаваемых в процедуру фактических параметров, а это во всех языках программирования является важной составляющей, так как позволяет исключить ошибки во время выполнения, связанные с некорректным применением некоторых операций к данным определенного типа, получаемым через параметры. Пока что наши процедуры работали без ошибок либо с параметрами любого типа, либо мы вызывали их с параметрами правильного типа, при которых подобных коллизий не возникало. Попробуем вызвать процедуру ~хуг(( с первым параметром„являющимся алгебраической переменной: > пхуг ('х',2, г( з Еггог, (за пе(угз саппос еиахпасе Ьоо1еап: -х < -2 Естественно, получили ошибку выполнения, так как действительно невозможно выяснить, больше или нет переменная х значения второго параметра.
Сообщение об ошибке нам понятно, так как мы сами разрабатывали процедуру и знаем ее алгоритм, но если передать ее другому программисту, то он наверняка не поймет в чем тут дело. Чтобы избежать подобных сообщений для процедур, работающих с определенным типом параметров, следует при объявлении процедуры обьявлять и тип ее параметров. Для этих целей предназначена операция проверки типа ::, первым операндом которой является имя формального параметра, а вторым его тип: > пкугз=ргос(хззпозпегхс,уззппзеегхс,х( гд х>у гьеп х е1зе г епг( зд епс( ргосг изхуУ: = ргос (хспзипенс, успигоепг, з) 1г у < х гвеп х еае г епо' и епп' ргос В этом случае, прежде чем начнется выполнение операторов тела процедуры, Мар1е проверит вычисленные значения фактических параметров соответствующим в объявлении процедуры типам формальных параметров.