Т. Пратт, М. Зелковиц - Языки программирования - разработка и реализация (4-е издание_ 2002) (1160801), страница 157
Текст из файла (страница 157)
Строки 26-30. Здесь определяется подпрограмма зеьчз!. Формальный параметр а гд является только входным и аналогичен параметру в языке Рааса?, передаваемому по значснию. Строка 3 б Ключевое слово ч>! Сб указывает, что в следующем далее компоненте языка Аг?а должен использоваться стандартный пакет Тех1 1О. Все объекты, определенные в Тех? 10, в качестве префикса содержат имя пакета. Поскольку Тек! 1О является стандартным пакетом ввода-вывод>Ь среди прочих в нем определены функции?ех! 10.дес и Тех! 1О.рпс. Команда иве специфицирует, чтобы компилятор А>?а первым просматривал пакет Текч 1О для определения области видимости объектов. Это позволяет в программе использовать, например, имя рп! вместо полного имени Тек! !О. рп!. Сп>рока 32. Пакет АггауСа1с также будет использоваться в следующем далев компопснтс Ас1а.
Строка ХХ Программа, написанная на языке Аг!а, состоит из главной процедуры, которая может вызывать подпрограммы из различных пакетов. В этом примере главная процедура называется п>а>п. Строка 36. Для чтения данных в пакстс ТехС !О определена функция де!. Это псрсгружсшпш функция, так что аргумент может быть целой переменной (в данном прпмерс 'х), строковой переменной или парой (файл, объект), позволякнцей считывать данные из файлов. Поскольку для каждого случая набор аргумснтов уникален, то компилятор сам знает, какую функцию де! следует вызывать.
Строка 39. Функция де! считывает данные в целую переменную в, Функция рпС, определенная в пакете Техт 10, выводит на печать значение своего аргумента. Нсобязатсльпый второй аргумснт задает ширину поля вывода для печати значения объекта. Так, значение переменной в> печатается в виде трех символов (с предшсствукипими пробелами для чисел, меньших 100). Строка 40. Вызывается процедура зе!ча! пакета ЯггауСа1с, которой передается фактический параметр н. Поскольку в строке 32 имеется команда пзе, то нет необходимости в задании гюлного имени процедуры АггауСа1с зеьчз!.
Строка 42. Функция пен 1>пе, определенная в пакете Тех! !О, выводит на печать символ конца строки, Функция рпс печатает БОМ =. Обратите внимание па то, что этот вызов функции отличается от вызова функции рп! в строке 39, поскольку данная функция печатает строку, а функция рпг в строке 39 печатает целое число. Реализация персгрузки функций определяет, какую функцию следует вызвать.
Строка 4Х Здесь употребляется полностью уп>чненное имя. Из-за того, что в строке 32 использовалась команда пзе, вместо етого имени можно было бы пашюагь просто зпп. Полпос гью уточненнос имя необходимо использовать, если одно и то жс имя функции используется в нескольких пакетах внутри области видимости текущего оператора и прп разрешении псрсгрузки опи окажутся исразличнмы.
В данном случае числ<>, возвращаемое функцией зпн, печатается в виде четырех выходных символов. пд. Ас)а 567 П.1.1. Объекты данных Основные типы данных, описанные в этом разделе, лишь слегка расширяют типы данных, доступные в языке Равсай Однако средства Ада, позволяющие программисту определять новые типы, значительно мощнее, чем аналогичные в языке Разса), а наличие пакетов позволяет инкапсулнровать определения типов для получения истинных абстракций данных.
Элементарные типы данных Такие типы, как целый (!пгеяег), вев)ест венный (геа!) (в языке Ада называемый /7оаг), сннвоньный (сг!агасгег), оунев (Воо!еап) и строковый (в!пня) являются предопределенными типами, определенными в пакете 51аосвгд, который автоматически известен внутри любой программы на языке Ада.
Фактически эти типы определены при помощи набора более ярилы!тинных коиструкторое типось Примерами таких конструкторов могут служить перечисления,массивы и записи. Например, типы Воо) еап и сйагасгег определяются как перечисления, а строковый тип втг! п0 определяется как вектор, состоящий из символов. Поскольку механизм опрелеления типов используется как для элементарных, так и для определенных пользователем типов, многие примеры этого раздела могут включать определения типов. Переменные и константы. Любой объект данных может быть определен либо как переменная, либо как константа.
Любое объявление, начинающееся с ключевого слова соовгвот, является объявлением константы. В нем должно быть задано значение константы, которое нс может меняться в процессе выполнения программы. Если слово сопвгвпг опушено, тогда это же объявление определяет объект данных как переменную, В этом случае можно задать начальное значение, а затем изменять его обычным присваиванием. Например, константу Мах50хе и переменную СсггепгЯ ве можно обьвить следующим образом: Мак5гве: сооввант 1нгеоег .= 500: Соггеп15уте: 1н1еоег .= О, Константы языка Ад а могут бь!ть как объектами элементарного типа, так и массивами или записями; Ыеековув сопвСаот аггау!1. 5) ое всг100!! 3) :- !"МОМ".
"Т0Е", "ЫЕ0", "ТН0" "Ей!") В языке Аг)а существует множество предопределенных атрибутов, которые обозначают важные связи или свойства объектов данных, типов данных, подпрограмм или аппаратной части компьютера. Для получения значения атрибута следует указать его имя (предварив его префиксом н ' л) сразу же после имени объекта. Например, одним из атрибутов любого векторного типаданных, уесг, является нижняя граница диапазона пзмспспия его индекса, обозначаемая как Уесь'Е! гвг.
Верхняя граница обозначается Уес1' Еввг. Используя этот атрибут, можно написать программу так, что она будет независима от конкретного определения типа уесг. Таким образом, если изменяется опредс ление уесс, операторы, использующие уес!' Е! гвг и уесг'Еавг, можно не изменять. Предопределенные атрибутысушсствуютдлябольшинстваосновных типов данных, о писан и ых ниже; другис атрибуты обсуждаются в следующих разделах. Числовые типы данных.
Основными числовыми типами данных являются целые числа, всществспныс числа с плавающей точкой и вещественные числа с фик- 568 Приложение. Обзоры языков сированной точкой. Объявления объектов этих типов похожи па объявления в Рааса), где используются атрибуты гапде (для целых чисел) и д>д> св (для вещественных чисел), которые определяют диапазон значений для объектов; Суре Оаубгуеаг 15 гапде 1..3бб; Целые значения от 1 до 366 ))уВ>гС)>дау; дауд(уеаг:= 219; МуВ)г()>дау соответствует дате 7 августа Суре Ве501С >5 д>01(5 7; Всществснныйтипиз7цифр Апвнег: Вевц1С: Вещественная переменная из 7 цифр Программа может получить доступ к аппаратному представлению вещественного числа с фиксированной точкой, если таковое существует, Для определения типа с фиксированной точкой в программе следует объявить необходимую максимальную разность между двумя соседними значениями объектов этого типа, называемую дельта-з>гачеиие.
Например, для определения лесятичных чисел с фиксированной точкой с двумя знакал>и после десятичной точки дельта-значение следует задать как . 01: Суре 5пв11явк>ипС >в ее1(а 0.01 гапде -100.0..100.0: Для чисел с фиксированной точкой предусмотрены обычные арифметические операции. Если в аппаратной части непосредственно не предусмотрено соответствующее представление с фиксированной точкой, в реализации языка может использоваться моделируемое программными средствами представление числа с плавающей точкой, если обеспечена определенная точность представления числа (то есть числа должны быть представлены с точностью не меньшей, чем дельта-значение).
Перечисления. В языке Ада перечисления можно определять подобно тому, как они определяются и реализуются в Разса!. Например, определение Суре с1авв >в (Егевп. 5орь, Звпъвг, 5еп1ог); задаст перечисляемый юш, который затем можно использовать при объявлении переменных. В отличие от языка Равса! перечисляемый тип не может быть задан непосредственно при объявлении переменной, а должен быть определен как отдельное описание типа. Для представления элементов перечисления во время выполнения программы используется номер позиции для каждого литеральногозначения: 0 лля первого из перечисленных значений, 1 — для второго и т.
д. Для перечисляемых значений предусмотрены основные операции сравнения (например, равенство, веные чек и т. д.), а также функции определения последующего и предыдущего элементов и операция присваивания. Одно и тоже литеральное имя может использоваться в нескольких перечислениях (в отличие от языка Рааса), где все перечисляемые литеры должны быть различными). Говорят, что такое литеральное имя является перегружен>гыи. Например, если задано предыдуп(ес определение с1055, то определение Суре Вгевд5Савив >в (5(а1е, Егевп): перегружает литералы>ое имя Егев)>.
В некоторых случаях компилятор может разрешить перегрузку непосредственно (например, при присваивании В:- Егев)>, где  — объект типа с1055), Для явного определения того, какое из значений егезп имеется в виду в данном месте программы, где видны оба типа (с!авв и Вгеад5СаСцв), программист может указать вместе с литеральным именем имя базового типа (например, с1авв(Егев)>) или Вгеад5(агцв(Егев)>)). ПЛ. А((а 569 Символьный и булез типы. Эти типы определены в пакете Ьтапоаге как специальные перечисления.
Указатели. Тип указатель, нззываемый ссылочным типом (ассеьз), вместе с элементарной функцией петт создает новый объект данных (выделяя для него память в куче) и возвращает указатель на него, который затем может быть присвоен переменной ссылочного типа. Переменную нельзя непосредственно объявить как переменную ссылочного типа, а следует использовать следующее описание типа туре ассеан турепаае >а ассеаа ини типа; После эп>го перемен пыс можно объявлять с помощью определен ного таким образом ссылочпого типа.