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




Типы данных

Обрабатываемые в программе данные подразделяются на константы и переменные. Константы – это данные, значения которых установлены в разделе объявления констант и не изменяются в процессе выполнения программы. Переменные объявляются в разделе объявления переменных, а свои значения получают в процессе выполнения программы, причем эти значения можно менять. К константам и переменным можно обращаться по имени. (Различают статические и динамические переменные. Статические переменные присутствуют в программе на протяжении всего времени ее работы. Динамические переменные создаются и уничтожаются на разных этапах выполнения программы.) Каждый элемент данных принадлежит к определенному типу. Тип данных – это множество допустимых значений этих данных и совокупность операций над ними.

Типы данных можно разделить на следующие группы:

o простые;

o структурированные;

o указатели;

o процедурные;

o вариантные;

o объектные.

Все типы данных можно также разделить на стандартные (предопределенные) и пользовательские (определяемые программистом).

К стандартным типам относятся:

o целочисленные;

o вещественные;

o логические;

o символьные;

o строковые;

o файлы;

o указатели.

Все другие используемые типы данных должны быть определены пользователем либо в разделе описания типов, либо в разделе объявления переменных.

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

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

Простые типы данных

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

o Целочисленные;

o Символьные (литерные);

o Логические (булевские);

o Вещественные.

Все типы, кроме вещественного, являются порядковыми, т.е. значения переменных каждого из этих типов образуют упорядоченную конечную последовательность. Номера соседних значений в ней отличаются на единицу. Для данных порядковых типов определены стандартные функции (Low, High, Ord, Pred, Succ) и стандартные процедуры (Dec, Inc).

Для порядковых типов программист может создавать перечисляемые и интервальные т ипы. Эти типы относятся к пользовательским. Их применение улучшает внешний вид программы и облегчает поиск ошибок.

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

Символьные типы: значениями символьного типа являются элементы из набора символов, т.е. буквы. К символьным типам относятся: Char, AnsiChar, WideChar. Для кодирования символов типа AnsiChar используется код Американского национального института стандартов ANSI. Для кодирования символов типа WideChar используется международный набор символов Unicode, включающий более 60 тыс. элементов им позволяющий кодировать символы национальных алфавитов. Первые 256 символов Unicode совпадают с кодом ANSI. Тип Char эквивалентен типу AnsiChar.

Для символов определены следующие функции: Chr(x):Char – возвращает символ с кодом, равным значению целочисленного выражения x; UpCase (С): Char – преобразует символ C в символ C верхнего регистра (заглавный). В программах значения данных символьного типа заключают в апострофы ‘ ‘.

Логические типы: Boolean, ByteBool, WordBool, LongBool. В программах рекомендуется использовать тип Boolean, остальные логические типы введены для совместимости с другими системами программирования. Данные этого типа могут принимать два возможных значения True (Истина) и False (Ложь).

Перечисляемые типы: задаются непосредственно перечислением всех значений (имен), которые может принимать переменная данного типа. Формат описания перечисляемого типа:

Type <имя типа> = (<значение_1>, <значение_2>,..., <значение_ n >);

Пример: type Gas=(C, O, N); Day=(Mon, Tue, Wed, Thur, Fri, Sat, Sun);

var G1, G2: Gas; Period: Day; Season: (Winter, Spring, Summer, Autumn);

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

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

Type <имя типа> = <константа_1>.. <константа_2>);

Пример: type Day 1_31 = 1.. 31;

...

var day1, day2: Day1_31;

Вещественные типы: Real48, Single, Double, Extended, Comp, Currency.

Общим является тип Real, который соотвествует типу Double.

Данные этих типов занимают от 4 до 10 байтов. Запись вещественных чисел возможна в форме с фиксированной десятичной точкой и в форме с плавающей точкой.

Примеры: +12.5, -137.46, 5 e +3 (~5? 10 3 = 5000)

К выражениям вещественных типов применимы функции Round(x) – округленное значение выражения x и Trunc(x) – целая часть значения выражения x.

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

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

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 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2016-04-26 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: