Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Структурированные типы данных




Данные структурированного типа состоят из данных других типов. Переменные этих типов могут в каждый момент времени иметь только одно значение. К данным структурированного типа относятся:

o Строки;

o Массивы;

o Множества;

o Записи;

o Файлы;

o Классы.

Строки (строковые типы): представлены тремя физическими и одним общим типами.

Данные типа ShortString представляют собой строку, которая фактически является массивом из 256 элементов – array[0..255]. Нулевой байт этого массива указывает длину строки. Строка – это последовательность символов кодовой таблицы.

Данные типов AnsiString и Wide String представляют собой динамичсекие массивы, максимальная длина которых фактически ограничена размером основной памяти компьютера. Данные типа AnsiString кодируются в коде ANSI, а типа Wide String – в коде Unicode.

Общим является тип String, который может соответствовать типу ShortString или AnsiString, что определяется директивой компилятора $H.

Так как строки фактически являются массивами, то для обращения к отдельному символу строки можно указать название строковой переменной и номер (позицию) этого символа в квадратных скобках.

Формат описания строкового типа:

Type <имя типа> = string [ max длина строки];

Иначе: var <имя переменной,... >: string [ max длина строки];

Если значение максимально допустимой длины строки не указано, по умолчанию длина 255 символов. При использовании в выражениях строка заключается в апострофы. Строковые данные можно использовать в качестве констант. Недопустимо использование строковых переменных в качестве селектора в операторе Case.

Пример: const Adres = ’ul. Korolenco, 5’;

type Stroka = string[100];

var Str: Stroka; St1: string; St2, St3: string[30];

Массивы: массив – это упорядоченная индексированная совокупность однотипных элементов, имеющих общее имя. Элементами массивов могут быть данные любого типа, включая структурные. Каждый элемент массива однозначно определяется именем массива и индексом (номером этого элемента в массиве) или индексами, если массив многомерный. Для обращения к отдельному элементу массива указывают имя этого массива и номер (номера) элемента, заключенный в квадратные скобки, например, arr1[3, 5] или arr2[7].

Количество индексных позиций определяет размерность массив (одномерный, двумерный и т.д.), при этом размерность массива не ограничивается. В математике аналогом одномерного массива является вектор, а двумерного массива – матрица. Индексы элементов массива должны принадлежать порядковому типу.

Различают массивы статические и динамические. Статическиймассив представляет собой массив, границы индексов и, соответственно, размеры которого задаются при объявлении, т.е. они известны до компиляции программы. Формат описания типа статического массива:

Type <имя типа> = Аггау [<тип индексов>] of <тип элементов >;

Иначе: var <имя переменной,...>: Аггау [<тип индексов>] of <тип элементов >;

Пример. type Matrix = a ггау [1..3, 1..2] of integer;

Znak = array[1..255] of char;

Day =(Mon, Tue, Wed, Thu, Fri, Sat, Sun);

var m1, m2: Matrix; a: Znak;

Week: array[1..7] of Day; r: array[1..10] of real;

Динамический массив представляет собой массив, для которого при объявлении указывается только тип его элементов, а размер массива определяете при выполнении программы. Формат описания типа динамического массива:

Type <имя типа> = Аггау of <тип элементов >;

Задание размера динамического массива во время выполнения программы производится процедурой SetLength(var S;NewLength: integer), которая для динамического массива S устанавливает новый размер, равный NewLength. Выполнять операции с динамическим массивом и его элемента­ми можно только после задания размеров этого массива.

После задания размера динамического массива для определения его длины, минимального и максимального номеров элементов используются функции Length(), Low() и High() соответственно. Нумерация элементов динамиче­ского массива начинается с нуля, поэтому функция Low() для него всегда возвращает значение ноль.

Пример. Var n: integer;

m: array of real;

...

SetLength(m, 100);

for n:=0 to 99 do m[n]:=n;

SetLength (m, 200);

После описания динамического массива, состоящего из вещественных чи­сел, определяется размер этого массива, равный 100 элементам. Каждому элементу присваивается значение, равное его номеру в массиве. Так как ну­мерация элементов массива начинается с нуля, то номер последнего из них равен не 100, а 99. После цикла размер массива увеличивается до двухсот.

Для описания типа многомерного динамического массива (например, дву­мерного) используется конструкция:

Type <имя типа> = Аггау of Аггау of <тип элементов >;

Действия над массивом обычно выполняются поэлементно, в том числе операции ввода и вывода. Поэлементная обработка массивов производится, как правило, с использованием циклов. Массив в целом (как единый объ­ект) может участвовать только в операциях отношения и в операторе при­сваивания, при этом массивы должны быть полностью идентичными по структуре, то есть иметь индексы одинаковых типов и элементы одинаковых типов.

Множества: множество представляет собой совокупность элементов, выбранных из пред­определенного набора значений. Все элементы множества имеют порядко­вый тип; количество элементов множества не может превышать 256. Формат, описания множественного типа:

Type <имя типа> = Set of <тип элементов >;

Переменная множественного типа может содержать от нуля до максимального числа элементов своего множества. Значения множественного типа заключаются в квадратные скобки. Пустое множество обозначается [ ]. Операции, допустимые над множествами, приведены в таблице.

Кроме того, имеется операция in (проверка членства), которая определяет принадлежность выражения порядкового типа (первого операнда) множест­ву (второму операнду). Результат операции будет типа boolean и иметь зна­чение True в случае соблюдения принадлежности значения множеству.

Записи: з аписи объединяют фиксированное число элементов данных других типов. Отдельные элементы записи имеют имена и называются полями. Имя поля должно быть уникальным в пределах записи. Различают фиксированные и вариантные записи. Фиксированная запись состоит из конечного числа по­лей, ее объявление имеет следующий формат:

Type <имя типа> = record;

<имя поля­_1>: <Тип поля>;

...

<имя поля_ n >: <Тип поля>;

end;

Вариантная запись, так же как и фиксированная, имеет конечное число по­лей, однако предоставляет возможность по-разному интерпретировать об­ласти памяти, занимаемые полями. Все варианты записи располагаются в одном месте памяти и позволяют обращаться к ним по различным именам. Отметим, что термин «вариантная запись» не имеет ничего общего с терми­ном «вариантный тип» (variant). Формат объявления вариантной записи:

Type <имя типа> = record;

Case <Признак>: <Тип признака> of;

<вариант_1>: (<описание варианта_1>)

...

<вариант_ n >: (<описание варианта_ n >);

end;

Для обращения к конкретному полю необходимо указывать имя записи и имя поля, разделенные точкой. Таким образом, имя поля является состав­ным. С полем можно выполнять те же операции, что и с переменной этого типа.

Пример. var Man: record;

Name: string;

Salary: real;

Note: string;

end;

...

Man.Name:=’Ivanov M.A.’;

Man.Salary:=5000;

Переменная Man — фиксированная запись, которая содержит поля имени (Name), оклада (Salary) и примечания (Note), причем каждое поле имеет свой тип.

Файлы: Файл представляет собой имеющую имя последовательность однотипных элементов, размещенных на внешнем устройстве, чаще всего, на диске. Файл имеет много общего с одномерным динамическим массивом, но размещает­ся не в оперативной, а во внешней памяти, и не требует предварительного указания размера.

Для выполнения операций с конкретным файлом, размещенным на диске, в программе обычно используется так называемая файловая переменная (логический файл). Файловая переменная после ее описания связывается с некоторым файлом, в результате чего операции, выполняемые над ней, при­водят к соответствующим изменениям в этом файле. После завершения всех операций связь между файловой переменной и файлом разрывается. Теперь файловую переменную можно связать с другим файлом этого же типа.

В зависимости от типа элементов различают текстовые, типизированные и нетипизированные файлы. Текстовый файл содержит строки символов пе­ременной длины, типизированный файл составляют элементы указанного типа (кроме файлового), в нетипизированном файле находятся элементы, тип которых не указан. Описание файловой переменной, предназначенной для работы с файлом, должно соответствовать типу элементов файла.

Пример. var f1: TextFile;

f2: File of integer;

f3: File of real;

f4: File;

здесь переменная f1 предназначена для работы с тек­стовыми файлами, переменные f2 и f3 – с типизированными файлами, со­держащими целые и вещественные числа, соответственно, а переменная f4 – с нетипизированными файлами.

Примечание. В языке Object Pascal описателем текстовых файлов служит слово Text. В Delphi многие компоненты имеют одноименное свойство, поэтому при описа­нии текстовых файлов этот описатель применять нельзя; нужно использовать TextFile или System. Text (описатель Text из модуля System).

Для непосредственной работы с файлами многие компоненты (объекты) предоставляют соответствующие методы, например, LoadFromFile (const FileName: string) – загрузить из файла или SaveToFile(const FileName: string) сохранить в файле. В таких методах файловая переменная не нужна и в параметре FileName указывается имя файла.

 

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...