Многомерные динамические массивы

Для объявления многомерного динамического массива используют следующие объявления:

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 - отсутствие символа, если да, то введенный символ появляется в поле редактора.

 

 


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: