Глава 7. СТРУКТУРИРОВАННЫЕ ТИПЫ ДАННЫХ Организация типов данных Массивы Записи, оператор присоединения Множества, операции над множествами Строки, стандартные процедуры и функции, работающие со строками Совместимость типов Явное и неявное преобразование типов
2 Гл. 7. СТРУКТУРИРОВАННЫЕ ТИПЫ ДАННЫХ ТИПЫСкалярныеПорядковыеЦелые ВещественныеЛогический Символьный Структуриро- ванные Массивы Указатели Строки Процедурные Объекты Записи Перечисля- емый Тип-диапазонМножества Файлы
3 Гл. 7. СТРУКТУРИРОВАННЫЕ ТИПЫ ДАННЫХ Массивы – любой порядковый тип кроме LongInt и типов-диапазонов с базовым типом LongInt. Массив - упорядоченная совокупность однотипных данных. arrayof тип элемента, [ тип индекса ] Type Vector = array [1..3] of Real; {тип индекса – тип-диапазон} Var R,V : Vector; или Var R,V : array [1..3] of Real;
4 Гл. 7. СТРУКТУРИРОВАННЫЕ ТИПЫ ДАННЫХ массива – любой допустимый в Turbo Pascal тип кроме файла (в том числе и другой массив). Многомерные массивы: Type Matrix = array [0..5] of array [-2..2] of array [Сhar] of Real; или Type Matrix = array [0..5,-2..2,Сhar] of Real; Доступ к элементам массива: Var m : Matrix; N : Byte; Begin... m[1,0,'d'] := 5.2; N := 2; m[N-1][0]['n'] := 6.3;... End.
5 Гл. 7. СТРУКТУРИРОВАННЫЕ ТИПЫ ДАННЫХ Присваивание массивов: Var a,b : array [1..5] of Real; Begin... a := b;... End. При большом числе элементов массива наступают ограничения, связанные с максимальным объемом памяти, отводимой под глобальные переменные – сегмент данных объемом 64 К. Var Dim100x200 = array [1..100,1..200] of Real {100х200х6 байт = байт} При компиляции в режиме, задаваемым ключом {$R+}, будет проверяться принадлежность значения индекса объявленному диапазону, и в случае нарушения границ будет будет выдано сообщение об ошибке (Range check Error).
6 Гл. 7. СТРУКТУРИРОВАННЫЕ ТИПЫ ДАННЫХ Записи Запись – структура данных, состоящая из фиксированного числа разнотипных компонент, называемых полями записи. Type Data = record X,Y : Integer; Z : Char end; VarD1,D2 : Data; Begin... D1.X := 10;...D2.Z := 'n';... D2 := D1; {присваивание записей} End. record тип поля, идентификатор поля :end ;
7 Гл. 7. СТРУКТУРИРОВАННЫЕ ТИПЫ ДАННЫХ Полем записи может быть другая запись (вложенные структуры): Var D : record X : Integer; R : record RX : Integer; RZ : Char end end; Begin... D.R.RX := 2;... End.
8 Гл. 7. СТРУКТУРИРОВАННЫЕ ТИПЫ ДАННЫХ Оператор присоединения: with оператор, идентификатор записи/поля do with D do begin R.RX := 2; with R do RZ := 'f'; end;
9 Гл. 7. СТРУКТУРИРОВАННЫЕ ТИПЫ ДАННЫХ Множества Множество – это структурированный тип данных, представляющий собой неупорядоченную совокупность неповторяющихся элементов. Количество элементов, входящих в множество, может меняться в пределах от 0 до 256 (множество может быть пустым). Type TypeSet1 = set of Char; TypeSet2 = set of 0..9; VideoType = (Hercules,CGA,EGA,VGA,SVGA); TypeSet3 = set of VideoType; set базовый тип of – любой порядковый тип с числом элементов, не превышающим 256.
10 Гл. 7. СТРУКТУРИРОВАННЫЕ ТИПЫ ДАННЫХ Значением переменной множественного типа является множество, которое определяется с помощью конструктора множества, представляющего собой перечисление элементов базового типа через запятую в квадратных скобках Var Set1, Set2 : set of Byte; Set3 : set of 'a'..'f'; X : Integer; Begin... Set1 := [3..10,12]; Set3 := ['a','d']; X := 5; Set1 := [X+2,4,9]; Set3 := []; Set2 := [9,7,9,4];... End.
11 Гл. 7. СТРУКТУРИРОВАННЫЕ ТИПЫ ДАННЫХ Операции над множествами: Set1 = [0..3,6]Set2 = [3..9] * – пересечение множеств, результат содержит элементы общие для обоих множеств (Set1 * Set2 = [3]); + – объединение множеств, результат содержит элементы первого множества, дополненные недостающими элементами второго (Set1 + Set2 = [0..9]); - – разность множеств, результат содержит элементы первого множества, которые не принадлежат второму (Set1 - Set2 = [0,1,2]); = – проверка эквивалентности, возвращает True, если оба множества эквивалентны; – проверка неэквивалентности, возвращает True, если множества неэквивалентны; = – проверка вхождения, возвращает True, если второе множество включено в первое; in – проверка принадлежности (E in S), возвращает True, если значение Е входит в множество S и принадлежит базовому типу этого множества (3 in Set1 = True, 2*2 in Set1 = False).
12 Гл. 7. СТРУКТУРИРОВАННЫЕ ТИПЫ ДАННЫХ Процедуры, параметром которых является множество: INCLUDE (S,I) – включает новый элемент I в множество S (включаемый элемент должен принадлежать базовому типу множества S). EXCLUDE (S,I) – исключает элемент I из множества S. Var Set1 : set of 1..10; I : Byte; Begin... Set1 := [2,3,4]; Include(Set1,2*3); for I := 1 to 10 do if I in Set1 then Writeln(I); Writeln(SizeOf(Set1)); Set1 := Set1 + [12];... End.
13 Гл. 7. СТРУКТУРИРОВАННЫЕ ТИПЫ ДАННЫХ Строки Тип String используются для обработки текстов и трактуется как цепочка символов. Строка – динамический (переменной длины) массив, состоящий из символов. Максимально возможная длина строки 255 символов. Тип объявляется как String[N], где N - максимальное число символов в строке. Var S32 : String[32]; S255 : String[255]; {String} Begin S32 := 'Это строка'; S32[3] := 'a'; {ORD(S32[0]) = 10} S32 := S32 + '!!!'; End. string целое без знака []
14 Гл. 7. СТРУКТУРИРОВАННЫЕ ТИПЫ ДАННЫХ Процедуры и функции для работы со строками: LENGTH (S : String) : Byte – возвращает длину строки (функция); CONCAT (S1, S2,…,Sn) : String – возвращает конкатенацию (слияние) строк S1,…,Sn (функция); COPY (S : String; Start, Len : Integer) : String – возвращает подстроку длиной Len, начинающуюся с позиции Start строки S (функция); DELETE (Var S : String; Start, Len : Integer) – удаляет из S подстроку длиной Len, начинающуюся с позиции Start строки S (процедура); INSERT (Var S, SubS : String; Start : Integer) – вставляет в S подстроку SubS, начиная с позиции Start (процедура); POS (SubS, S : String) : Byte – ищет вхождение подстроки SubS в строке S и возвращает номер первого символа SubS в S или 0, если SubS нет в S (функция);
15 Гл. 7. СТРУКТУРИРОВАННЫЕ ТИПЫ ДАННЫХ Процедуры преобразования: STR (X; Var S : String) – преобразует числовое значение Х в строковое S, возможно задание формата для Х (Str(X:F:n,S), где F – общая ширина поля, n – количество символов в дробной части для вещественных чисел); VAL (S : String; Var X; Var Code : Integer) – преобразует строковое значение S (строку цифр) в значение числовой переменной (Х – целое или вещественное, параметр Code содержит ноль, если преобразование прошло успешно, в противном случае он содержит номер позиции в строке, где обнаружен ошибочный символ, при этом Х не меняется). Операции отношения (=, , >, =, 'ab' (результат False); 'aBcd' < 'ab' (результат True).
16 Гл. 7. СТРУКТУРИРОВАННЫЕ ТИПЫ ДАННЫХ Тurbo Рascal требует соблюдения правил совместимости типов в ряде случаев: при использовании оператора присваивания, при выполнении операций отношения, при подстановке переменных или значений в вызовы процедур и функций и т.д. Два типа совместимы, если они тождественны (идентичны). Типы считаются тождественными, если: 1. Они описаны вместе, либо одним и тем же идентификатором типа: Type T1 = Boolean; T2 = Boolean; T3,T4 = array[1..2] of Real; 2. Типы описаны как эквивалентные Type T1 = array [1..2] of Real; T2 = T1; T3 = T2;
17 Гл. 7. СТРУКТУРИРОВАННЫЕ ТИПЫ ДАННЫХ Типы совместимы (гарантирует работу операций отношения, подстановку значений или переменных в параметры функций и процедур), если: оба типа являются тождественными; оба типа являются вещественными; оба типа являются целыми; один тип является поддиапзоном другого; оба типа являются поддиапазонами одного и того же базового типа; оба типа являются множествами, составленными из одного и того же базового типа; один тип является строковым, а другой символьным или строковым; один тип является указателем, а другой указателем или ссылкой.
18 Гл. 7. СТРУКТУРИРОВАННЫЕ ТИПЫ ДАННЫХ Совместимость по присваиванию. Переменной X (тип Type1) может быть присвоено значение Y (тип Type2) (X := Y) если: Type1 и Type2 – тождественные типы, и не один не является файловым типом (или структурным типом, содержащим компонент с файловым типом); Type1 и Type2 – совместимые типы (в смысле, рассмотренном ранее), относящиеся к порядковым, и значения типа Type2 попадают в диапазон возможных значений Type1; Type1 и Type2 – вещественные типы и значения типа Type2 попадают в диапазон возможных значений Type1; Type1 – вещественный тип, Type2 – целочисленный тип; Type1 и Type2 – строковые типы; Type1 – строковый тип, Type2 – символьный тип; Type1 и Type2 совместимые множества и все члены значения множества типа Type2 попадают в диапазон возможных значений Type1; Type1 и Type2 совместимые адресные типы; (Тип объекта Type2 совместим по присваиванию с типом объекта Type1, если Type2 находится в области типа объекта Type1. Тип ссылки Ptr2, указывающий на тип объекта Type2, совместим по присваиванию с типом ссылки Ptr1, указывающим на тип объекта Type1, если Type2 находится в области типа объекта Type1).
19 Гл. 7. СТРУКТУРИРОВАННЫЕ ТИПЫ ДАННЫХ Явное преобразование типов. Может быть реализовано посредством использования специальных функций: TRUNC(x) – преобразует значение вещественного типа в значение целого типа, отбрасывая дробную часть; ROUND(x) – преобразует значение вещественного типа в значение целого типа, округляя его до ближайшего целого; ORD(x) – преобразует значение порядкового типа в его номер; CHR(x) – преобразует код символа в сам символ. В операции приведения типа используется функция преобразования, которая совпадает с именем типа, к которому должна быть приведена переменная. При приведении типов переменных необходима их совместимость в машинном представлении. Type M2Word = array[1..2] of Word; M4Byte = array[1..4] of Byte; Var V1 : M2Word;V2 : M4Byte; V3 : LongInt;V4 : Integer; Begin V3 := 100; V1 := M2Word(V3); V2 := M4Byte(V3); V4 := Integer(V1[1]); End.
20 Гл. 7. СТРУКТУРИРОВАННЫЕ ТИПЫ ДАННЫХ Неявное преобразование типов: реализуется в выражениях, составленных из вещественных и целочисленных переменных, последние автоматически преобразуются к вещественному типу, и все выражение в целом приобретает вещественный тип; происходит, если одна и та же область памяти попеременно трактуется как содержащая данные то одного, то другого типа (совмещение в памяти данных разного типа). Совмещение данных в памяти, в частности, возможно при размещении данных разного типа по одному и тому же абсолютному адресу. Для размещения переменной по нужному абсолютному адресу она описывается с последующей стандартной директивой Absolute, за которой помещается либо абсолютный адрес, либо имя ранее определенной переменной. Var w : LongInt absolute $0000:$0055; x : Real; y : array [1..3] of Integer absolute x;