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