Ada (798525), страница 9
Текст из файла (страница 9)
Переменная такого типа может быть описана следующимобразом:Numbers : Numbers_Array (1..5) := (1, 2, 3, 4, 5);Здесь, при описании переменной Numbers предусматривается ограничение (constraint)размеров массива - указывается диапазон значений индекса - (1..5).Пакет Standard предоставляет предопределенный тип String, который описывается какнеограниченный массив символов:type String is array (Positive range <>) of Character;Таким образом, тип String может быть использован для описания обширного классасимвольных массивов, которые идентичны во всем, кроме количества элементов в массиве.Также как и в предыдущем примере описания переменной Numbers, для создания фактическогомассива типа String, мы должны предусмотреть ограничение диапазона возможных значенийиндекса:My_Name : String (1..20);Здесь, ограничение диапазона индексных значений находится в диапазоне 1..20.Преимущество такого подхода в том, что все описанные строки имеют один и тот же тип, имогут, таким образом, использоваться как параметры подпрограмм.
Такой дополнительныйуровень абстракции позволяет более общее использование подпрограмм обработки строк.Необходимо заметить, что для инициализации объектов типа String, можно использоватьагрегаты, поскольку тип String, по сути, является массивом символов. Однако, болеецивилизованным способом будет использование строковых литералов. Так, вышеописаннуюпеременную My_Name, можно инициализировать следующим образом:My_Name := "Alex";Следует учесть, что в приведенном примере, строковый литерал, указывающий имя, необходимодополнить пробелами, чтобы его размер совпадал с размером описанной переменной. Впротивном случае, компилятор может выдать предупреждение о возбуждении исключенияConstraint_Error во время выполнения программы.При описании строк, которым присваиваются начальные значения, границы диапазона можно неуказывать:Some_Name: String := "Vasya Pupkin";Some_Saying : constant String := "Beer without vodka is money to wind!";Для обработки каждого элемента переменной, которая порождается при использовании типанеограниченного массива, требуется использование таких атрибутов типа массив, как A'Range,A'First и т.д., поскольку не известно какие индексные значения будет иметь обрабатываемыймассив.My_Name: String (1..20);My_Surname : String (21..50);Обычно, неограниченные массивы реализуются с объектом который хранит значения границдиапазона индекса и указатель на массив.4.4 Стандартные операции для массивовСуществует несколько операций, которые могут выполняться не только над отдельнымиэлементами массива, но и над целым массивом.4.4.1 ПрисваиваниеЦелому массиву может присваиваться значение другого массива.
Оба массива должны бытьодного и того же типа. Если оба массива одного и того же неограниченного типа, то они должнысодержать одинаковое количество элементов.declareMy_Name : String(1..10) := "Dale";Your_Name : String(1..10) := "Russell ";Her_Name : String(21..30) := "Liz";His_Name : String(1..5) := "Tim ";beginYour_Name := My_Name;Your_Name := Her_Name;-- это корректно, поскольку в обоих случаях-- оба массива имеют одинаковое количество-- элементовHis_Name := Your_Name; -- это приведет к возбуждению исключения:-- хотя обе переменные одного и того же типа,-- но они имеют различную длину (число элементов)end;4.4.2 Проверки на равенство и на неравенствоПроверки на равенство и на неравенство доступны почти для всех типов Ады.
Два массивасчитаются равными если каждый элемент первого массива равен соответствующему элементувторого массива.if Array1 = Array2 then....4.4.3 КонкатенацияСимвол & может быть использован как знак операции конкатенации двух массивов.declaretype Vector is array(Positive range <>) of Integer;A : Vector (1..10);B : Vector (1..5) := (1, 2, 3, 4, 5);C : Vector (1..5) := (6, 7, 8, 9, 10);beginA := B & C;Put_Line("hello" & " " & "world");end;4.4.4 Сравнение массивовДля сравнения одномерных массивов могут быть использованы следующие знаки операций "<","<=", ">" и ">=".
Они наиболее полезны при сравнении массивов символов (строк)."hello" < "world"-- возвращает результат "истина" (True)В общем случае, можно сравнивать только те массивы у которых можно сравнивать между собойиндивидуальные компоненты. Таким образом, например, нельзя сравнивать массивы записейдля которых не определена операция сравнения. (то есть, чтобы обеспечить возможностьсравнения массивов записей, необходимо, чтобы была определена операция сравнения длязаписи компонента массива).4.4.5 Логические операцииЕсли знаки логических операций "and", "or", "xor", "not" допускается использовать дляиндивидуальных компонентов массива, то использование знаков логических операций длятакого массива также будет допустимым (например, в случае массива логических значений типаBoolean).4.5 Динамические массивыАда позволяет не указывать размеры массива при написании программы.
В этом случае размерымассива не фиксируются во время компиляции программы, а определяются во время еевыполнения, что во многих случаях более предпочтительно. Массивы подобного вида известныкак динамические массивы. Кроме того, в отличие от многих других языков программирования,Ада позволяет использование динамических массивов в качестве значения результата,возвращаемого функцией.declareXAbegin: Integer := Y -- значение Y описано где-то в другом месте: array (1..X) of Integer;for I in A'Range loop...end loop;end;procedure Demo(Item: String) isCopy : String(Item'First..Item'Last) := Item;Double : String(1..2 * Item'Length) := Item & Item;begin.
. .Следует заметить, что не стоит позволять вводу пользователя устанавливать размер массива, иприведенный пример (с декларативным блоком) не должен использоваться как способ решенияэтой задачи. Использование второго примера наиболее типично.5. Записи (record)Понятие записи, также как и понятие массива, является механизмом структурирования данных.Однако, в отличие от массива, запись позволяет сгруппировать в одном объекте набор объектовкоторые могут принадлежать различным типам. При этом объекты из которых состоит записьчасто называют компонентами или полями записи.Для работы с записями, Ада предлагает средства подобные тем, которые предоставляют другиесовременные языки программирования, а также дополняет их некоторыми своимиособенностями.
Также как и для массивов, для записей предусматривается использованиеагрегатов. Использование дискриминантов позволяет создавать вариантные записи, указыватьразмер для записи переменного размера и выполнять инициализацию компонентов записи.5.1 Простые записи5.1.1 Описание простой записиКак уже было сказано, запись - это структура данных состоящая из набора различныхкомпонентов.
В Аде, для описания такой структуры данных, необходимо описать тип записи. Вобщем случае, описание типа записи имеет следующий вид:type <имя_записи> isrecord<имя_поля_1> : <тип_поля_1>;<имя_поля_2> : <тип_поля_2>;...<имя_поля_N> : <тип_поля_N>;end record;Например:type Bicycle isrecordFrame: Construction;Maker: Manufacturer;Front_Brake : Brake_Type;Rear_Brake : Brake_Type;end record;My_Bicycle: Bicycle;Примечательно, что описание индивидуальных компонентов записи выглядит как описаниепеременных.
Также, следует заметить, что описание типа записи не создает экземпляр объектазаписи. В приведенном выше примере, тип Bicycle описывает структуру записи, а переменнаяMy_Bicycle типа Bicycle - является экземпляром записи.В отличие от массивов, Ада не позволяет создавать анонимные записи. Таким образом,следующий пример описания будет неправильным:My_Bicycle: record-- использование анонимных-- записей - ЗАПРЕЩЕНО!!!Frame: Construction;Maker: Manufacturer;Front_Brake : Brake_Type;Rear_Brake : Brake_Type;end record;Из этого следует, что сначала необходимо описать тип записи, а затем описывать объекты этоготипа.5.1.2 Значения полей записи по-умолчаниюПри описании записи, полям записи могут быть назначены значения по-умолчанию. Этизначения будут использоваться всякий раз при создании экземпляра записи данного типа (до техпор пока они не будут инициализированы другими значениями).type Bicycle isrecordFrame: Construction := CromeMolyebdenum;Maker: Manufacturer;Front_Brake : Brake_Type := Cantilever;Rear_Brake : Brake_Type := Cantilever;end record;5.1.3 Доступ к полям записиВ Аде организация доступа к индивидуальным полям записи осуществляется с помощьюточечной нотации, за именем переменной-записи, которое сопровождается точкой, следует имяполя записи.