- •Часть I
- •1.1 Простейшее консольное приложение. Основные понятия
- •Задачи.
- •1.2 Простые типы
- •Целые типы.
- •Задачи.
- •Символьные типы.
- •Логические типы
- •Задачи.
- •Перечислимый тип
- •Вещественные типы
- •Тип дата-время
- •1.3 Операторы Оператор присваивания
- •Составной оператор
- •Условный оператор if
- •Задачи.
- •Оператор выбора case
- •Задачи.
- •Операторы цикла
- •Задачи.
- •Задачи.
- •Задачи.
- •1.4 Процедуры и функции.
- •Процедуры.
- •Функции.
- •Вызов подпрограмм.
- •Локализация имён.
- •Параметры.
- •Задачи.
- •Перегрузка функций.
- •Процедурные типы.
- •1.5 Динамическая память и указатели
- •1.6 Массивы
- •Статические массивы
- •Задачи.
- •Задачи.
- •Задачи.
- •Задачи.
- •Динамические массивы
- •Параметры-массивы
- •1.7 Строки Строковые типы
- •Стандартные подпрограммы для строк.
- •Строковые выражения
- •Задачи.
- •Преобразование строк в числовые типы и обратно.
- •1.8 Множества
- •Задачи.
- •1.9 Записи
- •Задачи.
- •Литература.
- •Оглавление
Динамические массивы
Динамические массивы появились в Delphi 4 и представляют собой удобное средство для хранения данных для тех задач, где заранее неизвестно количество элементов в обрабатываемых массивах.
Объявить динамический массив можно следующим образом:
var <имя масива> : array of <тип>;
Например:
var vect : array of real;
Длину массива следует задать при помощи процедуры SetLength. Например:
SetLength(vect, 6);
Данная процедура выделяет для массива vect в оперативной памяти место для 6 вещественных элементов и присваивает этим элементам нулевые значения. Индекс первого элемента равен 0, поэтому массив vect содержит элементы vect[0], vect[1],…, vect[5]. При желании длину динамического массива можно изменить при помощи повторного использования процедуры SetLength. Если новая длина окажется больше исходной, то в массив добавляются новые элементы с нулевыми значениями; если меньше, то последние элементы в исходном массиве будут отброшены.
Переменная, имеющая тип динамического массива, является указателем, т.е. содержит адрес участка памяти, начиная с которого располагаются элементы массива. Поэтому удаление динамического массива может быть осуществлено одним из трёх способов:
1. Присвоить переменной значение nil, например:
vect:=nil;
2. Использовать процедуру finalize, например:
finalize(vect);
3. Установить нулевую длину, например:
SetLength(vect, 0);
Интересной особенностью динамических массивов является то, что можно создавать непрямоугольные массивы, т.е. когда для каждой строки количество столбцов различно. Для этого нужно вначале установить длину первого измерения, а затем, определить длину каждой строки. Например, последовательность операторов
…………………………………….
var r : array of array of integer;
…………………………………….
SetLength(r, 3);
SetLength(r[0], 1);
SetLength(r[1], 2);
SetLength(r[2], 3);
……………………………………..
создаёт треугольный массив.
Параметры-массивы
Типом любого параметра в списке формальных параметров процедур и функций может быть только стандартный или ранее объявленный тип. Поэтому ошибочным будет, например, следующее объявление процедуры:
procedure T(x : array[1..10] of real);
так как в списке формальных параметров фактически объявляется тип-диапазон, указывающий границы индексов массива.
Если в подпрограмму передаётся массив, то следует первоначально описать его тип, например:
type tmas = array[1..10] of real;
procedure T(x : tmas);
…………………………………..
Динамический массив может передаваться в качестве параметра в те подпрограммы, в описании которых соответствующий формальный параметр объявлен как открытый массив, например:
procedure Q(t : array of real; var w : array of array of real);
Начальное значение индекса в открытом массиве равно 0, как и в динамическом. В подпрограмме реальная длина массива может быть определена либо при помощи функции Length – длина массива, либо при помощи функции High – наибольшее значение индекса. Для этих функций справедливо следующее соотношение:
High(<массив>) = Length(<массив>) – 1.
В качестве фактического параметра для открытого массива может выступать и статический массив.
Пример 42. Заполнить случайными целыми числами из интервала [-20,20] двумерный целочисленный массив размера nm, где n – случайное число из интервала [2, 5], m=n+1. В каждой строке массива вставить число, равное i100 ( i – номер строки), после третьего элемента.
type matrix = array of array of integer;
var a : matrix;
n, m, i, j : integer;
procedure init_dinmas(var x:matrix);
var i, j:integer;
begin
for i:=0 to n-1 do
for j:=0 to m-1 do x[i,j]:=-20 + random(41);
end;
procedure print_dinmas(x:matrix; nn, mm:integer);
var i,j:integer;
begin
for i:=0 to nn-1 do
begin for j:=0 to mm-1 do write(x[i,j]:5); writeln end;
end;
begin
randomize;
n:=random(4)+2; m:=n+1;
setlength(a, n, m); writeln(n:5, m:5);
init_dinmas(a); print_dinmas(a, n, m);
setlength(a, n, m+1);
for i:=0 to n-1 do
begin
for j:=m-1 downto 3 do a[i, j+1]:=a[i, j];
a[i, 3]:=(i+1)*100;
end;
print_dinmas(a, n, m+1);
readln
end.
Пример возможного варианта выполнения программы:
3 4
-4 -7 7 19
10 -2 5 7
6 -14 6 -3
-4 -7 7 100 19
10 -2 5 200 7
6 -14 6 300 -3
