Урок 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]; и т.д.).
Массивы могут иметь несколько измерений, перечисляемых через запятую. Например, таблицу из четырёх столбцов и трёх строк:
|
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 |
A:=nil;Ключевое слово nil в Delphi означает отсутствие значения.
Данная тема обширна и не влезает в один урок, Множества и Записи в следующей части.
Удачи!
Встретимся в следующем уроке!
Добавил(а): DIMASKRASAVA | Дата: 2018-01-11 | |
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |