2.3 составные типы2.3.1 Массивы Массив в Аде рассматривается как составной объект, содержащий компоненты (элементы массива) одного и того же типа. Доступ к элементам массива выполняется с помощью индексов. Различают ограниченные и неограниченные массивы. Для ограниченных массивов границы определяются во время описания объекта или во время описания индексируемого типа. Для неограниченных массивов границы не определяются во время описания. Это делается позже: • при описании типов, использующих неограниченный индексируемый тип; • при описании объектов; • во время передачи параметров. Неограниченные массивы позволяют передавать в подпрограммы фактические параметры в виде массивов различной длины. Описание ограниченных массивов: TYPE Имя_Типа_Массива IS ARRAY (Дискретный_Диапазон) OF Подтип_Компонентов_Массива; 4 — Корочкин А. В. 22 23 Глава 2. Типы Ада 95. Введение в программирование
Массив пуст, если хотя бы один из индексов определяется пустым диапазоном. П Пример: type Stack is array (1 .. 99) of Element; type Set is array (Color ) of integer; of float; Of float; of Vector; IS ARRAY (T RANGE o) Подтип_Компонентов_Массива; Здесь Т - имя типа или подтипа; о - бокс, который обозначает, что границы неопределены и будут указаны позже. (integer range <>) of float; (integer range <>, integer range <> ) of float; Определение объектов, использующих неограниченный тип Vec-tor_NN и Matrix _54, происходит с указанием границ диапазона: type Vector is array (1 .. 100) type Matrix is array ( 1 .. 15, 1 .. 10 ) type Matrix_New is array ( 1 .. 15) Описание неограниченных массивов: TYPE Имя_ Типа_Массива OF type Vector_NN is array type Matrix _54 is array Отрезки позволяют оперировать с группой элементов массива как с единым объектом, упрощая написание программы. Например, отрезок Х( 3 . . 7 ) указывает пять последовательных элементов массива X, при этом копирование этих элементов не производится: 14); ( I + 1) * 4 ) ; При использовании механизма отрезков для двухмерных массивов их следует описывать в виде "вектор векторов", после чего для них можно создавать и использовать отрезки, как для типа Matrix_New, описанного выше. Обращение к элементам массива А типа Matrix_New выполняется в форме, отличной от обращения к обычному двумерному массиву: Х(3 .. 7) : = Z( 10 Order : = Astra ( I * 4 A(i)(j) := 3.14159; А( 1 .. 5) : = Тео; Агрегат массива - это значения массива, которые конструируются непосредственно из значений компонент. Используются для присваивания значений массивам. Тип агрегата задаётся путем указания типа или подтипа: Т 'агрегат Если тип не задан явно, то он определяется из контекста. П Пример: 5, others => 0 ); (1 .. 25 => 4.557); Vector ( 1 | 23 = Z: = (1 |7.. 10=> 4.2, 9=>3.14);
X z, s Pool Vector_NN (1 .. 10); Vector_NN (-99 .. 99); Matrix _54 ( 1 .. 10, 1 .. N); СОВЕТЫ: * Избегайте анонимных типов при описании массивов; Элементы массива, отрезки и агрегаты Отрезок одномерного массива М задаётся в виде: М (Дискретный_Диапазон) Ш СОВЕТЫ: • Используйте агрегаты только для случаев работы с обычным по- рядком аргументов. > Используйте только простые агрегаты. • Отдавайте предпочтение отрезкам при работе с частями массивов вместо циклов. Атрибуты массивов Для объектов индексируемого типа или ограниченного индексируемого подтипа М (массива) определены следующие атрибуты: • M'FIRST Нижняя граница первого индекса; тоже самое, что и M'FIRST(N) • M'FIRST(N) Нижняя граница N-го индекса • M'LAST Верхняя граница первого индекса; тоже самое, 24 25 Ада 95. Введение в программирование Глава 2. Типы
что и M'LAST(N) • M'LAST(N) Верхняя граница N-ro индекса • M'LENGTH Число элементов первого измерения • M'LENGTH(N) Число элементов N-ro измерения • M'RANGE Подтип M'FIRST .. M'LAST, соответствующий правильным значениями для первого индекса • M'RANGE(N) Подтип M'FIRST.M'LAST, соответствующий правильным значениям N-ro индекса 2.3.2 Записи Запись - составной объект, компоненты которого имеют имена и могут иметь различный тип. Описание типа записи должно иметь следующую форму: TYPE IS Имя_3ашси RECORD Имя_Компоненты_1: Тип_Компоненты_1; Имя_Компоненты_1: Тип_Компоненты_1; Имя_Компоненты_1: Тип_Компоненты_1; END RECORD; Тип записи может содержать любое число компонентов. П Пример описания типа записи: type Data is record V: Vector; M : Matrix; end record; type Complex_Numbers is record X: float; Y: float; end record; - - дискриминант в записи is type Massiv (N, M : Positive) record V : array (1 .. N ) of integer; W : array (1 .. N, 1 .. M ) of integer; end record ; Object: Massiv (5, 10 ); К объектам типа запись можно обращаться как к единому целому, а также можно обращаться к каждой компоненте записи отдельно: Data; А, В Z2, Sqr : Complex_Numbers;
iUJ СОВЕТЫ: * Используйте записи с дискриминантом вместо массивов с уточняемыми границами; * Используйте записи для обьединения разнородных ( гетерогенных) связанных данных; * Для больших и сложных записей используйте разбиение их на более простые подзаписи; |
| Оглавление| |