Для объявления многомерного динамического массива используют следующие объявления:
Var
X: array of array of real; -объявлен двумерный массив вещественного типа;
Y: array of array of array of real; -объявлен трехмерный массив вещественного типа;
Рассмотрим принцип работы многомерного динамического массива на примере двумерного.
Var
X: array of array of real;
При данном объявлении, как говорилось выше, память не выделяется.
Для задания количества строк и столбцов массива используют известную нам функцию SetLength;
Для данного массива X установим: количество строк -2, столбцов 11.
1. Устанавливаем количество строк:
SetLength(X,2);
2. Устанавливаем количество столбцов (напоминаем, что счет строк и столбцов начинается с нуля):
setlength(x[0],10);
setlength(x[1],10);
В динамическом многомерном массиве длина строк может различаться:
setlength(x[0],10);
setlength(x[1],5);
В данном примере нулевая строка содержит 11 элементов, а первая стока - 6.
|
|
К элементам массива обращаются так же, как и в статическом массиве.
Освобождение памяти выполняется так же, как и в одномерном динамическом массиве.
Пример работы с двумерным динамическим массивом.
В данном примере мы будем читать исходные данные из нескольких текстовых файлов в динамический массив, с наращиванием длины его строк.
Каждая строка соответствует данным отдельного файла.
...........................................
Var
x: array of array of real;
i, j: word;
t: textfile;
...........................................
...........................................
i:=0;
while i<=ListBox1.Items.Count-1 do begin
assignfile(t,ListBox1.Items[i]);
reset(t);
if length(x)<=i then setlength(x,length(x)+1); // Добовляем строку
j:=0;
While not eof(t) do begin
if length(x[i])<=j then setlength(x[i],length(x[i])+1); {Увеличиваем длину строки }
readln(t, x[i,j);
inc(j);
end;//while not eof(t)
closefile(t);
inc(i);
end; //while i<=ListBox1
Здесь:
ListBox1.Items.Count-1 - количество имен файлов занесенных в список ListBox1.
ListBox1.Items[i] - имя файла, подлежащего обработке.
ЗАПИСИ.
Записи - очень важный и удобный инструмент. Даже не применяя специальные технологии, с помощью записей можно создавать собственные базы данных. Записи - это структура данных, каждый элемент которой имеет собственное имя и тип данных. Элемент записи иначе называют поле.
Описание записи имеет вид:
Type
< тип_имени_ записи> = record
<название_поля>: тип_данных;
...
<название_поля>: тип_ данных;
end;
..............................................
Var
<имя записи>: < тип_имени_ записи>;
Названия полей, имеющих одинаковый тип, можно, как и в случае описания простых переменных, указывать в одну строку через запятую. Для обращения к полю записи сначала указывают имя записи, затем точку, затем имя поля:
|
|
<имя записи>.<название_поля>;
Записи создают в разделе описания типов.
Например:
Type
M_cod = record // тип_имени_ записи
data_set: string[20];
adr: string[100]
obgect: string[50];
Tip_obg: string[30];
n_obg: string[10];
n_swid: string[10];
wlad: string[50];
end; // type
.......................................
var
cod: M_cod; // <имя записи>: < тип_имени_ записи>;
index_file: file of M_cod;
В данном примере создана запись для обследования каких либо объектов и типизированный файл записей - index_filе.
Сама запись состоит из 7 полей:
1. data_set - Данному полю отводится 20 символов - дата обследования.
2. adr - 100 символов - адрес объекта.
3. obgect - 50 символов - название объекта.
4. Tip_obg - 30 символов - тип объекта.
5. n_obg - номер объекта по кадастровому свидетельству.
6. n_swid - 10 символов - номер кадастрового свидетельства
7. wlad - 50 символов - данные о владельце.
В данном случае поля записи перечислять через запятую нельзя, поскольку длины полей типа string разные.
Получить значения поля записи:
<имя записи>.<название_поля>;
Например - получить данные о владельце:
SS:= cod.wlad;
// переменная ss должна быть описана как string;
Таких записей может быть достаточно много и их можно хранить в
типизированном файле. (каждый отдельный элемент такого файла является записью с именем COD).
МНОЖЕСТВА
Множества -это тип данных, представляющий собой набор взаимосвязанных по какому-либо признаку или группе признаков объектов, которые можно рассматривать как единое целое. Количество элементов, входящих в множество, может меняться от 0 до 256. Каждый объект в множестве называется элементом множества. Если множество не имеет элементов, то оно называется пустым.
Описание множества имеет тип
<идентификатор> = set of <базовый тип>
Где базовый тип - тип элементов данных. Обычно он задается диапазоном.
Пример задания множества:
Var
dec1: set of 0..9; //Множество задается диапазоном
dec2: set of byte; //Можно указать тип данных, если его размер - 1 байт
Над множествами определены следующие операции:
Пусть M1=[1,2,3,5,8], M2=[1,2,4,6,8]
· Пересечение множеств (*). Результат содержит элементы общие для обеих множеств (M1*M2=[1,2,8])
· Объединение множеств (+). Результат содержит элементы первого и второго множеств (M1+M2=[1,2,3,4,5,6,8])
· Разность множеств (-). Результат содержит элементы первого множества, не входящие во второе (M1-M2=[3,5])
· Проверка эквивалентности (=). Возвращает True если множества эквивалентны(все элементы совпадают).
· Проверка неэквивалентности (<>). Возвращает True если множества неэквивалентны.
· Проверка вхождения (<=). Возвращает True, если первое множество включено во второе.
· Проверка принадлежности (in). Возвращает True если выражение имеет значение, принадлежащее множеству (2 in M1=true).
Также существует возможность добавлять или исключать из множества элементы:
...
M1:=M1-[2]; //Теперь M1=[1,3,5,8]
M2:=M2+[12]; //Теперь M2=[1,2,4,6,8,12]
Множества можно использовать для проверки, входит ли какое-нибудь число или буква в некий диапазон множества.
Следующий пример демонстрирует ввод в редактор Edit1 только чисел, а в качестве разделителя - точку. Все остальные символы игнорируются.
...................
Implementation
Var
m1: boolean = false;
{$R *.dfm}
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
Begin
if (key='.') and (length(edit1.Text)=0 ) then key:=#0;
if (key='.') and (m1=false) then begin
m1:=true;
exit;
end
else if not(key in ['0'..'9']) then key:=#0
end;
End.
В данной процедуре, при вводе информации в редактор edit1, отслеживается событие On KeyPress. Данная процедура возвращает (символ) нажатой клавиши - Key типа Char (например запись '.' - соответствует нажатой клавише точке).
В строке
if (key='.') and (length(edit1.Text)=0 ) then key:= #0;
|
|
производится проверка установки разделителя - точки - в первой позиции.
Если длина length текстовой части редактора (length(edit1.Text)=0 ) равна нулю, то
символу переменной key присваивается код #0 - отсутствие символа (точку не ставим). Положение курсора в редакторе не меняется.
В следующем выражении отслеживается установка разделителя - точки.
if (key='.') and (m1=false) then begin
m1:=true;
exit;
end
else if not(key in ['0'..'9']) then key:= #0;
Если точка установлена в первый раз, то переменной m1 присваивается true
и мы покидаем процедуру - exit; - до следующего ввода символа,
иначе - else - производится проверка - if not(key in ['0'..'9']) then key:= #0; - входит ли введенный символ в данное множество.
Если нет, то символу переменной key присваивается код #0 - отсутствие символа, если да, то введенный символ появляется в поле редактора.