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')