Урок 48 - Структурные типы данных, часть (1/2)

   В этом уроке мы раскроем важную тему собственных типов данных, ее не знание будет очень сильно вас ограничивать в плане удобства програмирования и построения правильной архитектуры приложения.

  При создании любой серьёзной программы не обойтись без дополнительных, более сложных, чем числа и строки, типов данных. В Delphi программист может для своих целей конструировать собственные типы данных. Чтобы ввести в программу (описать) новый тип данных, применяется оператор с ключевым словом type:
  type название_типа = описание_типа;

  Перечислимый тип - это тип данных, диапазоном значений которого является просто набор идентификаторов. Это может применяться в тех случаях, когда нужно описать тип данных, значения которого нагляднее представить не числами, а словами. Перечислимый тип записывается взятой в круглые скобки последовательностью идентификаторов - значений этого типа, перечисляемых через запятую. При этом, первые элементы типа считаются младшими по сравнению с идущими следом. Например, тип, описывающий названия футбольных команд, можно сформировать так:

type 
	FootballTeam = (Spartak, Dinamo, CSKA, Torpedo, Lokomotiv);
var 
	MyTeam: FootballTeam;
begin
	MyTeam:=Spartak;
end;
   Вообще, под перечислимыми типами понимают все типы, для которых можно определить последовательность значений и их старшинство. К ним относятся:

  • все целочисленные типы, для которых всегда можно указать число, следующее за числом N;
  • символьные типы (Char): за символом ?a? всегда следует ?b?, за ?0? следует ?1?, и так далее;
  • логические типы - тип Boolean также представляет собой перечислимый тип: type Boolean = (false, true);
  Структурные типы данных используются практически в любой программе. Это такие типы, как
  • массивы
  • записи
  • множества

  Массив - это структура данных, доступ к элементам которой осуществляется по номеру (или индексу). Все элементы массива имеют одинаковый тип.
  Описание массива имеет вид:
type 
	имя_типа_массива = array [диапазон] of тип_элемента;
   Диапазон определяет нижнюю и верхнюю границы массива и, следовательно, количество элементов в нём. При обращении к массиву индекс должен лежать в пределах этого диапазона. Массив из ста элементов целого типа описывается так:
type 
	TMyArray = array [1 .. 100] of Integer;
  Теперь можно описать переменные типа TMyArray:

var 
	A, B: TMyArray;
  Вместо присвоения типа можно явно описать переменные как массивы:

var 
	A, B : array [1..100] of Integer;
   Для доступа к элементу массива нужно указать имя массива и индекс элемента в квадратных скобках. В качестве индекса может выступать число, идентификатор или выражение, значение которых должно укладываться в диапазон, заданный при описании массива:
var 
	N: Integer;
begin
	N := 65;
	A[5] := 101;
	A[N] := 165;
	A[N+3] := 200;
	B := A;
end;
  Иногда требуется узнать верхнюю границу массива. Встроенная функция High() вернёт число, являющееся верхней границей массива. В скобки нужно подставить массив, верхнюю границу которого требуется узнать.

Выражение:
B := A
   Означает, что каждый элемент массива B равен элементу с таким же индексом массива A. Такое присвоение возможно только если переменные объявлены через некий поименованный тип, или перечислены в одном списке. И в случае:

var 
	A: array[1..100] of String;
	B: array[1..100] of String;
его использовать невозможно (но возможно поэлементное присвоение B[1] := A[2]; и т.д.).

   Массивы могут иметь несколько измерений, перечисляемых через запятую. Например, таблицу из четырёх столбцов и трёх строк:
1234
5678
9101112
   Можно описать в виде массива с двумя измерениями:
type 
	MyTable = array[1..4, 1..3] of Integer;
var
	X : MyTable;
	Y : Integer;
	begin
	Y:=X[3, 2];
	end;
   Теперь в результате операции присвоения Y будет равен 7.
   Многомерный, например, двумерный массив можно описать как массив массивов:
type
	TMyArray = array [1 .. 4] of array [1 .. 3] of Integer;
   Результат будет аналогичен предыдущему примеру.
   Каждое измерение многомерного массива может иметь свой собственный тип, не обязательно целый.
   Кроме вышеописанных, так называемых статических массивов, у которых количество элементов неизменно, в Delphi можно использовать динамические массивы, количество элементов в которых допускается изменять в зависимости от требований программы. Это позволяет экономить ресурсы компьютера, хотя работа с такими массивами происходит гораздо медленнее. Описываются динамические массивы аналогично статическим, но без указания диапазона индексов:
type 
	TDinArray = array of Integer;
var 
	A: TDinArray;
   После создания в динамическом массиве нет ни одного элемента. Необходимый размер задаётся в программе специальной процедурой SetLength. Массив из ста элементов:
begin
	SetLength(A, 100);
end;
   Нижняя граница динамического массива всегда равна нулю. Поэтому индекс массива A может изменяться от 0 до 99.
Многомерные динамические массивы описываются именно как массивы массивов. Например, двумерный:
type 
	T3DinArray = array of array of Integer;
var 
	A : T3DinArray;
   В программе сначала задаётся размер по первому измерению (количество столбцов):

   SetLength(A, 3);

Затем задаётся размер второго измерения для каждого из трёх столбцов, например:

   SetLength(A[0], 3);
   SetLength(A[1], 2);
   SetLength(A[2], 1);

   Таким образом создаётся треугольная матрица:    A00 A10 A20
A01 A12
A02
   Чтобы освободить память, выделенную динамическому массиву, нужно массиву как целому присвоить значение nil:
A:=nil;
   Ключевое слово nil в Delphi означает отсутствие значения.

   Данная тема обширна и не влезает в один урок, Множества и Записи в следующей части.

Удачи!
Встретимся в следующем уроке!




Добавил(а): DIMASKRASAVA Дата: 2018-01-11


    No results found.
Отменить.