If 4 in C then

Else

Else

Begin

Begin

Var

Var

Пример

Var

Type

Begin

Begin

Begin

Var

Type

Uses

Begin

Var

Пример 4.

Begin

Var

Пример 3.

Begin

Var

Пример 2.

Begin

Var

Uses

Пример 1.

Процедура Finalize

Процедура SetLength

Динамические массивы

Var

Открытые массивы

Const

Type

Инициализация записей

Const

A: array[1..7] of double = (1, 3, 5, 7, 9, 11, 13);

B: array[1..2, 1..4] of integer =

(

(3, 4, 1, 0),

(5, 2, 7, 6)

);

C: array[1..2, 1..3] of char =

(

(‘a’, ‘b’, ‘c’),

(‘x’, ’y’, ‘z’)

);

 

 

 

MyRecord1 = record

i, j: integer;

x: double;

s: string[7];

end;

 

MyRecord2 = record

mA: array[1..3, 1..3] of char;

S: MyRecord1;

end;

 

R1: MyRecord1 = (i: 4; j: 9; x: 3.14159; s: 'ABCDE');

R2: MyRecord2 = ( ??? );

 

B: array[3..7] of double;

 

procedure P(var A: array of double);

begin

WriteLN('High(A)=', High(A), ' A[High(A)[=', A[High(A)]:0:2);

WriteLN('Low(A)=', Low(A), ' A[Low(A)[=', A[Low(A)]:0:2);

ReadLN;

end;

begin

B[3] := 3; B[4] := 4; B[5] := 5; B[6] := 6; B[7] := 7;

P(B);

end.

 

Динамические массивы не имеют фиксированного размера. Память под массив выделяется, когда ему придается значение (!) или по отношению к нему применяется процедура SetLength.

<Объявление динамического массива> ::=

<Имя массива>: array of<Тип>

 

Переменная <Имя массива> в действительности является указателем, однако, знаком ^, процедурами New, Disposeпользоваться по отношению к этой переменной нельзя.


 

procedureSetLength(var<Имя массива>;<Число элементов>:integer);

Под одномерный массив <Имя массива> выделяется место в памяти, объем которого задает <Число элементов>.

Диапазон индексов: 0 .. <Число элементов> - 1 .


procedureFinalize(var<Имя массива>);

Память из-под переменной <Имя массива> высвобождается.

Альтернатива:

<Имя массива> := Nil;

Процедуру FreeMem применять не следует.

 


programProject1;

{$APPTYPE CONSOLE}

SysUtils;

mA: array ofchar;

SetLength(mA, 3);

mA[2] := 's';

writeln(mA[2]);

readln;

end.

 

mA, mB: array ofinteger;

mC, mD: array[0..10] ofinteger;

 

SetLength(mA, 11);

mA[0] := 1;

mB := mA; // Указатель mB стал указывать туда же, куда и указатель mA.

mB[0] := 2;

 

mC[0] := 1;

mD := mC; // В массив mD скопировано всё содержимое массива mC.

end.

 

Переменная mB есть указатель на тот же динамический массив, что и переменная mA. Значение mA[0] есть 2.

Оператор mB[11] := 2; не приводит к увеличению числа элементов массива до 12. Ответственность за выход за границы массива (и за всю тяжесть последствий) лежит на программисте.

 


mA, mB: array ofinteger; // Динамические массивы

mC, mD: array[0..0]ofinteger; // Статические массивы

mC[0] := 2; mD[0] := 2;

writeln(mC = mD); // True. Содержимое массивов одинаково.

 

SetLength(mA, 1); SetLength(mB, 1);

mA[0] := 2; mB[0] := 2;

writeln(mA = mB); // False. Содержимое массивов одинаково,

// а вот указатели на массивы НЕ равны.

writeln(mA[0] = mB[0]); // True. Эти элементы массивов равны.

end;


 

i, n: integer;

mA: array ofinteger;

n:=7; SetLength(mA, n); fori:=0 ton-1 domA[i]:=i;

 

fori:=0 ton-1 dowrite(mA[i]:3); // 0 1 2 3 4 5 6

 

n:=4; SetLength(mA, n);

fori:=0 ton-1 dowrite(mA[i]:3); // 0 1 2 3

// Массив «подрезан» до 4 элементов. Эти элементы сохранили свои значения.

 

n:=8; SetLength(mA, n);

fori:=0 ton-1 dowrite(mA[i]:3); // 0 1 2 3 0 0 0 0

// Массив расширен до 8 элементов.

// Но нет гарантии, что новым элементам придается значение 0.

// Эти значения, вообще говоря, непредсказуемы.

 

readln;

 

writeln(Length(mA)); // 8

writeln(High(mA)); // 7

writeln(Low(mA)); // 0

 

Finalize(mA);

 

writeln(Length(mA)); // 0

writeln(High(mA)); // -1

writeln(Low(mA)); // 0

 

readln;

end.


Пример 5.Двумерные массивы (точнее, массивы массивов)

 

programProject1;

{$APPTYPE CONSOLE}

 

SysUtils;

 

MyRowType = array ofinteger;

// MyRowType – указатель на массив элементов типа integer.

 

i, j: integer;

mA: array ofMyRowType;

// mA – указатель на массив указателей (на массив элементов типа integer)


SetLength(mA, 3); // Размещен в памяти массив указателей на строки матрицы.

// Сами строки пока в памяти не размещены.

fori := 0 to2 do

SetLength(mA[i], 4);

// Размещены в памяти строки матрицы. Длина каждой строки – 4 числа.

 

fori := 0 to2 do

forj := 0 to3 do

mA[i][j] := 10 * (i + 1) + (j + 1);

// Допускается обращение mA[i, j]

 

fori := 0 to2 do

forj := 0 to3 do

write(mA[i][j]:5);

writeln;

end;

 

fori := 0 to2 do

Finalize(mA[i]);

// Память освобождена из-под строк матрицы.

// Указатели на строки пока доступны.

 

writeln;

 

fori := 0 to2 do

SetLength(mA[i], i+4);

// Размещены в памяти новые строки «матрицы». Длины строки неодинаковы.

// Таким образом, «матрица» - не совсем верное определение.

// Правильнее говорить, что mA есть «Jagged Array» (зазубренный массив).

 

 

fori := 0 to2 do

forj := 0 toi+3 do

mA[i][j] := 10*(i+1)+(j+1);

 

fori := 0 to2 do

forj := 0 toi+3 do write(mA[i][j]:5);

writeln;

end;

 

fori := 0 to2 do Finalize(mA[i]);

// Память освобождена из-под строк матрицы.

 

Finalize(mA);

// Память освобождена и из-под указателей на строки.

 

readln;

end.


Тип «Множество»

 

 

<Объявление типа «Множество»> :: =

<Имя типа «Множество»> =

Set Of <Список (перечисление) или диапазон значений>;

 

<Объявление переменной типа «Множество»> :: =

<Имя переменной> : Set Of <Список (перечисление) или диапазон значений>;

//или

<Имя переменной> :<Имя типа «Множество»>;

 


Операции над множествами:

+ Объединение

- Вычитание

* Пересечение

 

Проверка отношения двух множеств:

= Равно

<> Не равно

<= Левое множество содержится в правом

>= Левое множество содержит в себе правое

 

Проверка принадлежности элемента множеству:

inЛевый элемент принадлежит правому множеству

 


 

 

type

EnglishLetterType = 'A' .. 'z'; // Все английские буквы

EnglishLettersSetType = set ofEnglishLetterType;

SetOfDigitsType = set of0 .. 9; // Все десятичные цифры

MonthesType = (June, July, August); // Все летние месяцы

EnglishLetters: EnglishLettersSetType;

P: SetOfDigitsType;

A, B, C: set of0 .. 9;

M: MonthesType;

 


// procedureShowElementsOfSet(Tittle: string; z: set of0..9);

procedureShowElementsOfSet(sTittle: string; z: SetOfDigitsType);

i: integer;

Write('Set "', sTittle,'" Containes: ');

fori := 0 to9 do

ifi in z thenWrite(i:2);

 

writeln;

end;

 

if EnglishLetters = [] then

writeln('EnglishLetters Is Empty')

writeln('EnglishLetters Is Not Empty');

 

A := [2,4,5,6,7,8];

B := [1,3,5,7];

C := A * B;

 

ifC = [] then

writeln('c Is Empty')

writeln('c Is Not Empty');

 

writeln(' 4 Is inC')