Структурированные типы данных
Объект структурированного типа всегда имеет несколько компонентов. Допускается вложенность типов, т.е. компонент может быть структурным. Имеется четыре типа: массив, запись, множество, файл (описание этого типа приводится в пункте 6.1). Статические массивы Массив ‑ группа переменных (элементов). Описание типа имеет вид: <имя типа>=[Packed] Array[<индекс>] Of <тип> Packed - элементы массива располагаются плотно без пропусков, что уменьшает размер используемой памяти, но увеличивает время обработки. <индекс> ‑ список индексов через запятую. Индексами могут быть переменные типов: целые (кроме Longint), логические, символьные, перечисляемые, интервальные (кроме базового типа Longint). Обычно используется интервальный тип. Границы значений индексов могут задаваться только константами, а не переменными, т.е. при выполнении программы нельзя изменить размер массива. Поэтому такие массивы называют статическими в отличие от динамических, размер которых не известен до выполнения программы и определяется в процессе ее выполнения. Элементами массива могут быть и структурированные данные. Суммарная длина массива ограничена ‑ 2 Гб. Число индексов определяет размерность массива. Пример. Двумерный массив: таблица из 5 строк и 10 колонок type mot=array [1 .. 5,1..10] of byte //таблица символов Переменную типа «массив» можно определить сразу в разделе переменных без предварительного описания типа массива. Пример. var urog: array [1..10,1..100] of real Доступ к элементу массива осуществляется по его индексу. Запись вида А:=В означает, что всем элементам массива А присваиваются попарно значения элементов массива В при следующем ограничении: перечислены в одном списке команды объявления или объявлены через один поименованный тип.
Однотипные массивы можно сравнивать (А=В, А<>В). Действия осуществляются с элементами массива. Пример. FOR I:=1 TO 10 DO A[I]:=0 //очистка массива нулями. Индексы можно задавать не только числовым интервальным типом, как это обычно и бывает, но и другими типами. Пример перечисляемого типа индекса: Type Cvet=(krasnii, geltii, zelenii, hernii); //перечисляемый тип ‑ цвета Var Mcvetov: Array [Cvet] Of Integer; //одномерный массив цветов Для обращения к третьему элементу массива нужно указать Mcvetov[zelenii]. Пример интервального символьного типа ‑ латинские буквы. Var Cim: Array [‘a’..’z’] Of Char; I:char;... For I:=’a’ to ‘z’ Do Cim[I]:=I; //заполнение массива латинскими буквами При объявлении массива можно указать начальные значения его элементов. Покажем на примерах, как это делается. Пример присвоения начальных значений одномерному массиву: Var A1: Array [0..6] of integer=(2,1,7,4,3,8,10); // список констант Для многомерных массивов каждый список констант соответствующего измерения заключается дополнительно в круглые скобки и отделяется запятой. Самые внутренние множества констант связываются с изменением самого правого индекса массива. Пример присвоения начальных значений двумерному массиву: Type A2: Array [1..3,1..2] of integer=((1,2),(3,4),(5,6)); // значения 1,2,3,4,5,6. Пример типизированной константы типа «массив»: Const Matr: Array[1..3,1..5) Of Byte=((0,1,2,3,4),(5,6,7,8,9),(10,11,12,13,14)); К одномерным символьным массивам применимы функции работы со строками. Параметры в виде открытых массивов При объявлении подпрограммы (функции или процедуры) можно не указывать размерность массивов. Такой открытый массив воспринимается в подпрограмме как массив с целыми индексами, начинающимися с нуля. Размер массива определяется функцией Length и Height=Length‑1. При вызове подпрограммы в качестве параметра со значениями открытого массива можно использовать конструктор открытого массива, который задает в квадратных скобках список значений элементов массива через запятые.
Пример: S=MinValue([1.3,45.6,‑22,67,132.45,56]). Приведем некоторые полезные функции обработки массивов. Length(x) -возвращает число элементов в массиве. High(x)/Low(x) - возвращает наибольшее/наименьшее значение индекса. MaxIntValue(x), MinIntValue(x), MaxValue(x), MinValue(x) - возвращает максимальное, минимальное значение элемента числового массива. Sum(x) - возвращает сумму элементов числового массива.
Динамические массивы При объявлении динамических массивов не указываются размерность и число элементов (<имя массива> Array Of <тип>), и место в памяти под массив не отводится. Динамическое размещение массива в памяти производится процедурой SetLength (<имя массива>,n1 [,n2]...), где n1, n2,... - число (константа или переменная) элементов в 1, 2,... размерности массива. При первом размещении динамического массива всем элементам присваиваются нулевые значения. Индексы динамического массива ‑ всегда целые числа, начинающиеся с нуля. Повторное применение этой функции к уже существующему массиву изменяет его размер. Если размер увеличен, то все значения элементов сохраняются, а в конце добавляются новые нулевые элементы. Если размер уменьшается, то отсекаются последние элементы, а остаются значения первых элементов. Пример: Var A: Array Of Integer; N,i: Integer; //объявление динамического массива A Begin N:=3; SetLength(A,N); // массив A(0,0,0) For i:=0 to N‑1 Do A[i]:=i+1; // массив A(1,2,3) N:=5; SetLength(A,N); // массив A(1,2,3,0,0) N:=2; SetLength(A,N); // массив A(1,2) N:=3; SetLength(A,N); // массив A(1,2,0) End Для удаления динамического массива, например, массива A, имеются три варианта: A:=Nil; Finalize(A); SetLength(A,0). Если A=Nil, то массив A не размещен в памяти. К размещенным в памяти динамическим массивам можно применять функции обработки статических массивов. Если при обращении к динамическому массиву указать только имя массива без индексов, то это означает задание указателя на первый элемент массива. Если динамические массивы (A, B) одного типа (например, Var A,B: Array Of Integer) и размер массива A не меньше размера массива B или массив A не размещен, то запись вида B:=A означает, что переменная B указывает на массив A (В есть псевдоним имени A), и содержимое массива В теряется при этом.
Записи Запись ‑ группа компонентов (полей), не обязательно одного типа. Описание этого типа имеет вид: <имя типа>=[Packed] Record<список описаний полей> End; Packed - поля располагаются плотно без пропусков, что уменьшает размер используемой памяти, но увеличивает время обработки. Переменную данного типа можно определить сразу в разделе переменных без предварительного описания типа в виде: <имя переменной типа записи> = [Packed] Record <описание полей> End Полям присваиваются пустые исходные значения: 0 ‑ числовым; пробелы ‑ строковым. Значение константы типа записи задается списком из последовательности вида: имя поля, двоеточие и константа. Пример типизированной константы типа записи: Type Date= Record D:1..31; M:1..12; Y:1900..1999; End; Const Someday: Date=(D:16; M:3; Y:1999) Допускается вложенность записей любого уровня. При обращении к полю указывают имя записи, символ «точка» и имя поля. Для вложенных полей уточнение продолжается. Пример вложенных записей: Type Adress=record //запись с адресом Gorod string[30];Ulica:string[30];Dom String[30];Kvartira:string[10] end; Persona=record //запись с личными данными о человеке Fam:string[40]; datarogdenij:TdataTime; AdressDom,AdressRab:Adress end; Var Director, Sotrudnik: Persona; //объявление записей типа Persona ... Director.AdressDom.Gorod:=’Арамиль’;... Записи могут быть элементами массивов (массив записей). Пример массива записей.Дополним предыдущий пример объявлением массива записей о сотрудниках фирмы. Msotr: array [1..100] of Persona; //массив из 100 записей типа Persona ... Msotr[2].AdressDom.Gorod:=’Екатеринбург’;//дом. адрес 2‑го сотрудника... Для упрощения доступа к полям используется оператор присоединения вида (п.1.4.9). Пример записи с массивом: Type M=Array [1..5) Of Integer; Rec=Record A: M; S:String; End; … Var P: Rec; … P.A[2]:=1; //пример обращения к переменной P. Допускаются записи с вариантами вида: <тип записи>=Record <описание полей постоянной части> Сase [<имя поля с константой выбора>:] <имя типа> Of <константа выбора ‑1>: (<поле‑1>;...<поле‑i>); ... < константа выбора ‑ n>: (<поле‑1>;...<поле‑j>); End;
Пример типазаписи о товаре с вариантами представления цены:
Zap = Record Articul: Integer; //код товара Name: String[40]; //наименование товара Case TypeCena: Boolean Of //тип значения цены True: (CenaI: Integer); //цена - целое число False: (CenaR: Real); //цена ‑ вещественное число End; Var PZap: Zap; {объявление переменной ‑ записи PZap типа Zap} Всем вариантам выделяется одна и та же область памяти. Это можно использовать для преобразования типов, например: Var Numer: Record //запись из одной вариантной части с тремя полями Case Byte Of //признак начала вариантной части 0: (Bn: array [0..3] of Byte); //массив из четырех символов 1: (Wn: array [0..1] of Word); //массив из двух целых типа Word 2: (Ln: LongInt); //целое число типа LongInt End; //окончание записи Множества Множество‑ это набор однотипных, логически связанных объектов: <имя типа> = set of <базовый тип элемента множества> Переменную типа «множество» можно определить сразу в разделе переменных без предварительного описания типа в виде: <имя переменной ‑ множества>: set of <базовый тип элемента> Правила: 1. В качестве базового типа элемента множества может использоваться любой порядковый тип, кроме Word, Integer, LongInt. Обычно он задается диапазоном или перечислением. 2. Количество элементов множества ограничено 256. Номер значения базы от 0 до 255. 3. В выражении значение элементов задается конструктором множества ([ ] ‑ пустое множество). Пример: type prostoi, nomer = set of 3..99; var pr: prostoi; n: nomer; p: set of 'a'..'z'; begin pr:=[3,5,7,11,13];... Пример множества заданного перечислением: type dni=(vosk,pon,vtor,sreda,chetv,pjtn,sub); var dnirab,weekend: set of dni;... begin weekend:=[sub,vosk]; dnirab:=[pon..pjtn] Пример объявления глобальной переменной типа множества: Implementation //исполнимый раздел модуля Var NumChar: set of Char=['0'..'9', '+', '‑', ’.’]; //допустимые символы числа Константы типа «множество» задаются в виде ([...]). Пример. Type Days= set of 1..31; //объявление типа множества Const Workdays: Days=[1..5, 8..12, 15..19, 22..26, 29, 30]; Типы строк Строки представляют собой последовательность символов.
Пример: Type Fam=String; Var FamStud, FamPrep: Fam; Date: String [8] Функция Length(s) возвращает длину текущего значения строки. Процедура SetLength(s,n) переопределяет строку (s) с новой длиной в n символов; при этом сохраняются начальные символы и удаляются последние символы при уменьшении длины строки. Строка трактуется как одномерный массив символов типов AnsiChar или WideChar соответственно. Доступ к отдельному символу строки можно осуществлять по его порядковому номеру (отсчет от 1 ‑ для коротких и от 0 - для длинных строк).
Пример: A:=Fam[5]; {выбирается пятый символ строки Fam} Строку можно объявить в виде массива: Type TS=Array [0..1000] Of Char; Var S1,S2: TS; К строкам можно применять операцию сцепления строк «+», строковые процедуры и функции (п. 1.2.5). Пример. Используя переменные fam, imj, otch, famio, присвоить переменной famio текст «Иванов И.И.» fam:='Иванов'; imj:='Иван'; otch:='Иванович'; famio:=fam+' '+copy(imj,1,1)+'. '+copy(otch,1,1)+'.'
Воспользуйтесь поиском по сайту: ©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|