Пример 3.

Begin

Var

Пример 2.

Begin

Var

Uses

Пример 1.

Процедура Finalize

Процедура SetLength

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

Var

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

Const

Type

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

Const

Инициализация массивов

End.

Begin

Var

Type

Var

Begin

Begin

Else

Begin

Var

Else

Else

Else

Begin

ifn < 1 then

Fib := 0

ifn = 1 then

Fib := 1

ifn = 2 then

Fib := x

Fib := x*Fib(n-1, x) + Fib(n-2, x);

end;

 

Пример рекурсивной процедуры. Ханойские башни.

 

n: integer;

 

procedureHanoiTowers(n, x, y, z: integer);

ifn = 1 then

writeln(x,'->', y)

HanoiTowers(n-1, x, z, y);

writeln(x,’–>’, y);

HanoiTowers(n-1, z, y, x);

end;

end;

readln(n);

HanoiTowers(n,1,2,3);

end.

 


Тип «Перечисляемый»

 

<Перечисляемый тип> : : =

(<Список имён значений>)

Первому из элементов <Списка имён значений> придаётся внутренний (недоступный пользователю) номер 0, второму – номер 1, и т.д.


Переменные типа «Перечисляемый»

 

Примеры

v1: (LeftDyrecton, RightDyrecton, BackDyrecton);

MyType2=(Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday);

MyType4=(MyTrue, MyFalse);

MyVar2: MyType2;

MyVar3: boolean;

MyVar4: MyType4;

forMyVar2 :=Monday toFriday dowriteln(MyVar2); // Ошибка

forMyVar4 :=MyFalse toMyTrue dowriteln(MyVar4); // Ошибка

forMyVar3 := False toTrue dowriteln(MyVar3); // Выход:False True

Замечание. boolean ≠ (False, True). Вообще говоря.

Замечание. Тип «Перечисляемый – порядковый тип.

 

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. Ответственность за выход за границы массива (и за всю тяжесть последствий) лежит на программисте.