Динамические массивы. При объявлении динамических массивов не указываются размерность и число элементов (<имя массива> Array Of <тип>)
При объявлении динамических массивов не указываются размерность и число элементов (<имя массива> 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];
Типы строк
Строки представляют собой последовательность символов.
Название | Максимальная длина | Нулевой символ в конце (#0) | Вид строки и директива компилятора |
ShortString | Нет | Короткая строка со счетчиком длины | |
AnsiString | 2 Гб | Есть | Длинная строка с символом #0 в конце |
String | 2 Гб | Есть | {$H+}‑ тип AnsiString |
String [n] | Нет | {$H‑} или есть n ‑ тип ShortString | |
WideString | 1 Гб | Есть | Строка 16‑битовых символов Unicode |
Пример:
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)+'.'
Дата добавления: 2016-03-22; просмотров: 647;