Говорухин В., Цибулин Б. Компьютер в математическом исследовании (1185927), страница 36
Текст из файла (страница 36)
((п () саппьс еча1оа(е Ьас1еап. а < О Если бы переменной а перед обращением к Е было присвоено числовое значение, то ошибка бы не возникла. Ошибки можно избежать, используя обращение к процедуре как к процедуре отложенного действия, указан ее имя в кавычках. При таком обращении не происходит выполнения тела процедуры, Результат можно присвоить переменной и вернуться к выполнению процедуры после явного определения всех фактических параметров.
Например: > а:='('(а.ь): е.= 1(а) > а'-1, ч: Значение второго наро иетро: Ь Е)це одним источником ошибок может быть использование в процедурах локальных переменных. Дело в том, что для оценки локальных переменных Мар!е использует только один уровень оценивания и это иногда приводит к неверным результатам, Проиллюстрпруем сказанное примером: > (.-росс(х) 1аса1 а Ь,с, Ь:=с: а+х; епб ргос. З:= ргос (х) 1оса1 а, Ь, е: а;= Ь; Ь:= с; а + х спб ргос и Г(1); Ь+1 Этой ошибки можно избежать, если перед оператором авх; поставить оператор а:=еоа1(а).
Модули Если процедуры предназначены для создания команд, включаюц(их в себя набор Мар1е-команд, то модули позволяют создавать более сложные конструкции, такие как наборы процедур, данных и др. Описание модуля имеет вид: люби1е () ехрогс Е5ЕО: 1оса1 15ЕО. В1ЬЬа1 65ЕО: срг)сп ОРТ5ЕО: белею р11сп ОЕ5С. аорт епб пюби1е . Описатель ел росс предназначен для задания имен процедур, наборов данных и других составляющих модуля, которые будут доступны для вызова. Обращение к этим объектам осуществляется при помощи команды выбора О-). Другие описатели аналогичны соответствующим описателям процедур.
2410, Глава 7 Програииироаание а иар(е Приведем пример простых процедуры и модуля, которые реализуют операции сложения и произведения двух величин: > ехрг:-ргос() 1аса) р1ов,ргоа; р1ов:-(а. Ы ->а>Ь; рсоа:=(а. Ы->а*Ь; р1ыв,ргоо епа ргос: Обратимся к процедуре ехрг и выведем результат: > «1: ехрг(); 51(13(1.1); 51(2)<1,1): «!:= р1ы, ргали 2 Теперь приготовим модуль для выполнения аналогичных операций: > ехео:=вюао1е() ехрог< р1ов,ргоп; р1ив:-(а. Ы ->а«Ь: ргоа.-(а.Ы ->а*Ь: епт) еоао1е.
Обратнисв н эленентан надули; > еяво: -р1о«(1.1): ехвю: -ргой1,1); 2 Модули являются мощным инструментом программирования в Мар1е и позволяют реализовывать самые разнообразные конструкции. Последнее время широкое распространение получили объектно-ориентированные языки программирования. Хотя Марте и не является таким языком в полной мере, но с помощью модулей можно реализовывать разнообразные операции с объектами. Приведем пример конструктора объекта «комплексное число«и > Соилов:-ргос(ге1,!ей) тт пагад«>2 Слеп еггог("Неправильный входной паранетр") Гт; пюоы1е<) ехрогс ге Ни.'аЬв',ат<2!с " 1оса1 геа(ртиай геа).тиар:-ге),тир, ге;-()->геа1: 1е:-()->тлей: аов:-<)->ва С(ге()"2+ив<)"2); .ага: (у->агсаап(нв()тге()): епа вюаа1е: епа ргос: создадим с помощью конструктора соевою комплексное число 2+21 и выведем его модуль и мнимую часть.
Функции, процедуры и надули 191 > а:-Соаиыа(2.2): кая О1 0 а).' 8; х ва,(иь Ь,ага; ееа(вих)о)е > 5:-аЬ5(): г:-1и(): 2 /2 2 Макроопределения Часто бывает удобно ввести новые имена для уже существующих функций или переменных. Это позволяет сделать команда 51 ! аз. Проиллюстрируем ее действие примером: > а1)аа(Г-5)о); > Р(х): 51ир11ту(аиЬ5(х-Р!/2.3)): Р(Х) 1 Для задания макроопределений (макросов) используется команда авсго. ее удобно применять для введения сокращенных имен-синонимов команд Мар!е, присвоения одного имени для последовательности команд или переопределения уже существующих команд. Поясним сказанное примерами.
Сначала определим макрос с именем сс для вычисления определителя при помощи команды ЬеС пакета 1тоа19 и обратимся к нему: > геасагс; иасго(сс-11оа19(оет)): > сс(Па1.а2) . (аз.ааП): а! а4 — а2 аЗ Следующий макрос реализует сразу несколько операций: > аасго(с5 аЬ50(соа+"-"+5!п)): > 9: с5(х); 8:=(-соа(х) + х — аго(х) ) Подставим в полученное выражение значение х: > 5ОЬ5(х 0.1.9): ! -Соа(. ! ) +,1 — 5!о(.
! ) ! Значение выражения вычислено не было, для этого требуется выполнить команду еча) Г. Переопределим команду подстановки 50Ь5 так, чтобы после подстановки всегда выполнялись действия с плавающей запятой: > авсго(аоЬ5-еча1(95оЬ5); С, СХ, Хива Теперь при обращении к команде 50Ь5 сразу производится и вычисление выражения: > 5иЬ5(х 0.1,9); аоЬ5(х 1/5.(х-1) Э); .9948375820 -.5120000000 192 Глава 7. Программирование в Мер<в 1оздание и использование пакетов и библиотек Пакетом обычно является коллекция процедур, предназначенных для решения определенного класса задач. В поставке Мар1е существует более двадцати пакетов, в том числе пакет для решения задач линейной алгебры, пакет по теории графов и др.
Этот стандартный набор мовкно расширять пакетами, разработанными самим пользователел(. В создаваемый пакет имеет смысл номен<ать уже отла)кепные и оттестированные процедуры. Напол<ним, что один из вариантов обращения к команде паше сош пакета пап)е рас<(, выглядит следующим образом; паше рас2 Гпаше сош) < ор11опз), Таким образом, полное имя команды, входящей в пакет, состоит из имени етого пакета и имени самой команды, а пакет представляет собой как бы массив, злементалвн которого являются команды.
Для оформления пакета нужно переменной с составным именем присвоить процедуру. После того как пакет написан, ого нужно сохранить на диске в файле с расширением зп <например, с именем пешеГ11е) при помощи команды ввее паше овсе."паше<1)е ш" В последующих сеансах пакет нужно предварительно считать с диска при помощи команды геап 'паше<11е.ш" Пакеты можно создавать также прн помощи модулей <фактически модуль и является пакетом).
Для подключения пакета используется команда и) 1П. Приведем пример небольшого пакета рас<(1 из трех процедур с именами ргос1, ргос2, ргосЗ: > расх1<ргоо1): = ргос(а) 1оса1 в; ю "2*а; рюпт("ргос1: ".в); гс епо' ргос рдсл1<ргос2)'- ргос(а) 1оса1 гн в;-в"2; рг1п<<"ргос2: ".в), в: епс ргос: овсв)<ргосЗ) = ргос<а.з) 1оса1 гк в =<в+в)/2, рюпм "ргосЗ: ",в): вп епо ргос: Сохраним пакет в файле рас<(1.)п: > ва>е раск)."расл1 ш"; Теперь в другам сеансе мы можем считать зтат пакет командой геай и подключить при помощи команды )<1 СП; > гелгвг(л > геао "рвск1 ш": > нгел(расх1); < ргосб ргос2, ргосЗ) > ргос2(а): ргос2:, а~ Если пользователем написаны и используются несколько собственных пакетов, то целесообразносоздатьсобственн юбиблиатек .Впредыд щихверсияхМар1едля Создание и использование пакетов и библиотек 193 этого была предназначена программа п)агсй.ехе. В состав ядра Мар]е б включена команда пигсЬ. С ее помощью можно создавать библиотеки, добавлять или исключать элементы библиотек и т.
д. Обращение к ней имеет вид: еагсм сознана, агс1п че сц г, орт1опз ) Здесь сспп)ап6 описывает действие с библиотекой агсйче сйг, а орт1опз — дополнительные параметры. Мы не будем далее подробно останавливаться на описании работы с библиотеками, а ограничимся только простым примером. Для более подробной информации следует обратиться к справке Мар]е. Вначале создадим новую библиотеку (директория с:~тел) р), должна уже существовать на диске) при помощи команды > иагсп("сгеаге","с:))Сезр))", 1), Отметим, что при указании директорий в Мар]е вместо одного используется два обратных еле)па.
Для работы с библиотеками в Мар]е имеются две зарезервированные переменные: 1) Ьпап)е — содержит пути к каталогам, где находятся доступные в текущем сеансе библиотеки, а з аче1 (Ьпаве — имя каталога с библиотекой, в которую будут записываться новые процедуры. Файлы с библиотеками имеют имя п)ар[е.йЬ, Для того чтобы в сеансе стала доступна дополнительная библиотека, необходимо этим переменным присвоить строки с указанием пути к библиотеке: > 1)Ьпаее: -1(Ьпаие. "с: ()Сепо) ) ": ПБпахпе х> "С:1)РКООКАМ Р[[.ЕЯ)МАР).Е од)Ь," "с:ц(ехпрц" > захе)1Ьпаее:-11Ьпаие[2]: Приготовим модуль, содержащий две процедуры: > енпо: -пюао1е() ехрогс р!из.рго6; 1оса1 а.Ь: ор(1оп раскаое: р1оз:-ргос(а,Ы а+Ь епс ргос: рго6:"ргсс(а.Ы а>Ь гп6 ргос; епа пкн о)е: Сохраним его и пакет рас]хт (будем считать, что мы его уже подключили) в библиотеку с помощью команды заче11Ь: > заче1)щехаа.раси)): Чтобы записанные команды активировать в другом сеансе, нужно добавить путь к пользовательской библиотеке в список йЬпап)е и подключить пакеты при помощи команды кп СЬ.
Например: > гезгагг; > 11Ьпаие:-11Ьпаие,"с:1)Свар)1": > и)СЬ(ехпю): [Р(ит,ргол ] В Мар!е имеется возможность сопровождать написанные команды текстами справки. Для этого используется команда вакепе1 р: иакеье1 р(сорте., тхет()е, 11ьгагу) 19Га Глава 7. Программирование в нар!е Здесь гор!с — имя команды, для которой создается справка, Охот!1е — имя текстового файла, содержащего текст справки, 1! Ьгагу — имя библиотеки, содержащей команду. (оманды ввода/вывода В Мар1е можно сохранить в файле результаты всего сеанса работы, но часто бывает нужно записать только конечный результат, а не весь ход решения. Это становится особенно актуальным, если для получения результата проводился большой объем символьных вычислений и манипуляций с формулами.
Для записи данных в Мар1е существует команда заче. Если результатами работы являются значения переменных чаг1, чаг2,..., то для сохранения их в файл с именем паве и расширением ехт достаточно дать команду ааче чаг1,чаг2,. .."пане.ехт": Способ представления сохраняемой информации в файле зависит от расширения ехт. Если в качестве расширения указано .!и, то файл запишется во внутреннем Мар1е-формате, при других расширениях команды Мар!е запишутся в текстовом формате. Например, в результате выполнения команд > а:-51п(х): ааче а."а.и"; будет создан файл с именем а.пт со следующей информацией: нбрО 1"а-$55!п66ФФ"хбб" Приведем пример сохранения в текстовом формате: > а:-5!п(х) ааче а."а яхт"; Содержимое файла имеет вид: а: 51п(х); Если использовать команду заче без перечисления переменных, а указать только имя файла, то произойдет сохранение всех назначенных за сеанс величин.