28615

Структурные типы данных (массивы, записи, множества)

Доклад

Информатика, кибернетика и программирование

Массив - это структура данных, доступ к элементам которой осуществляется по номеру (илииндексу). Все элементы массива имеют одинаковый тип.

Русский

2015-01-18

21.26 KB

6 чел.

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

  1.  массивы
  2.  записи
  3.  множества


   Массив - это структура данных, доступ к элементам которой осуществляется по номеру (илииндексу). Все элементы массива имеют одинаковый тип.
Описание массива имеет вид:

   
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]; и т.д.).

Массивы могут иметь несколько измерений, перечисляемых через запятую. Например, таблицу из четырёх столбцов и трёх строк:

1

2

3

4

5

6

7

8

9

10

11

12

можно описать в виде массива с двумя измерениями:

   
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
A
01 A12
A
02

Чтобы освободить память, выделенную динамическому массиву, нужно массиву как целому присвоить значение nil:
    A:=
nil;
Ключевое слово 
nil в Delphi означает отсутствие значения.

   Записи очень важный и удобный инструмент. Даже не применяя специальные технологии, с его помощью можно создавать собственные базы данных. Записи - это структура данных, каждый элемент которой имеет собственное имя и тип данных. Элемент записи иначе называют поле. Описание записи имеет вид:
   
type имя_типа_записи = record
      название_поля : тип_поля ;
      
. . .
      название_поля : тип_поля ;
   
end;
Названия полей, имеющих одинаковый тип, можно, как и в случае описания переменных, указывать в одну строку через запятую. Для обращения к полю записи сначала указывают имя записи, затем точку, затем имя поля. Например, данные о персонале предприятия могут быть организованы таким типом записи:

   
type TPers = record
     
Fam, Name, Par : String;
     
Year : Integer;
     
Dep : String;
   
end;
   
var Pers : TPers;
   
begin
    
Pers.Fam:='Иванов';
    
Pers.Name:='Иван';
    
Pers.Par:='Иванович';
    
Pers.Year:=1966;
    
Pers.Dep:='Цех №1';
   
end;

Теперь осталось записать эти данные в файл, предварительно объявив и его тип как TPers, и база данных готова. С файлом в Delphi также ассоциируется переменная, называемая файловой переменной, которая описывается так:
   VFile 
: file of тип_файла;
В качестве типа может использоваться любой ограниченный тип Delphi. При этом не допускается тип
String, так как он допускает переменный размер до 2 ГБайт. Его необходимо ограничивать: String[N], где N - количество символов. Тип TPers из предыдущего примера должен быть описан, например, так:

   
type TPers = record
     
Fam, Name, Par : String[20];
     
Year : Integer;
     
Dep : String[10];
   
end;

Теперь переменная такого типа занимает строго определённое место в памяти, и может быть записана в файл. Как это сделать, рассказывается во 
2-й части Урока №7. 

   
Множество - это группа элементов, объединённая под одним именем, и с которой можно сравнивать другие величины, чтобы определить, принадлежат ли они этому множеству. Количество элементов в одном множестве не может превышать 256. Множество описывается так:

   
type имя_множества = set of диапазон_значений_множества ;

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

   
type TMySet = set of  0 .. 255;
   
type TMySet = set of  Byte;

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

   
var MySet : TMySet;
   
begin
    MySet:=[1, 3 .. 7, 9];
   
end;

Чтобы проверить, является ли некое значение элементом множества, применяется оператор 
in в сочетании с условным оператором:

   
var Key : Char;
           
Str : String;
   
begin
    
if Key in ['0' .. '9', '+', '-'] then Str:='Math';
   
end;

   Чтобы добавить элемент во множество, используется операция сложения, удалить - вычитания:

var Digit: set of Char=['1'..'9'];
var Math: Set of Char;
begin
  Math:=Digit+['+', '-', DecimalSeparator
*];
end;


 

А также другие работы, которые могут Вас заинтересовать

44598. FDDI - распределенный волоконно-оптический интерфейс передачи данных 42 KB
  В сети FDDI компьютер: захватывает маркер на определенный интервал времени; за этот интервал передает столько кадров сколько успеет; завершает передачу либо по окончании выделенного интервала времени либо из-за отсутствия передаваемых кадров. Этим объясняется более высокая производительность FDDI чем Token Ring которая позволяет циркулировать в кольце только одному кадру. FDDI основана на технологии совместного использования сети.
44599. СЕТЕВЫЕ АРХИТЕКТУРЫ 34.5 KB
  В соответствии со стандартными протоколами физического уровня выделяют три основные сетевые архитектуры Данные Циклический избыточный код для проверки ошибок Приемника источника Формат кадра в Ethernet Поле Тип протокола используется для идентификации протокола сетевого уровня IPX и IP маршрутизируемый или нет....
44600. Причины расширения ЛВС и используемые для этого устройства 28.5 KB
  С ростом компаний растут и ЛВС. Однако существуют устройства которые могут: сегментировать ЛВС так что каждый сегмент станет самостоятельной ЛВС; объединять две ЛВС в одну; подключать ЛВС к другим сетям для объединения их в интернет.
44601. Мост как устройство комплексирования ЛВС 190 KB
  Эти устройства как и репитеры могут увеличивать размер сети и количество РС в ней; соединять разнородные сетевые кабели. на более высоком чем репитеры и учитывают больше особенностей передаваемых данных позволяя: восстанавливать форму сигналов но делая это на уровне пакетов; соединять разнородные сегменты сети например Ethernet и Token Ring и переносить между ними пакеты; повысить производительность эффективность безопасность и надежность сетей что будет рассмотрено ниже. Принципы работы мостов Работа моста основана на...
44602. Маршрутизаторы 41 KB
  Маршрутизатор в отличие от моста имеет свой адрес и используется как промежуточный пункт назначения. Однако эта таблица существенно отличается от таблиц мостов тем что она содержит не адреса узлов а адреса сетей Для каждого протокола используемого в сети строится своя таблица которая включает: все известные адреса сетей; способы связи с другими сетями; возможные пути маршрутизации; стоимости передачи данных по этим путям. Маршрутизаторы принимая пакеты не проверяют адрес узла назначения а выделяют только адрес сети. Они...
44603. Подключение репитера в ЛВС 168.5 KB
  Подключение репитера в ЛВС Репитеры передают весь трафик в обоих направлениях и работают на физическом уровне модели OSI. Однако репитеры позволяют соединять два сегмента которые используют различные физические среды передачи сигналов кабель – оптика кабель – пара и т. Некоторые многопортовые репитеры работают как многопортовые концентраторы соединяющие разные типы кабелей.
44604. Удаленный доступ к ресурсам сетей 35.5 KB
  Основной характеристикой модема является его производительность измеряемая количеством битов переданных за 1 секунду. Изначально скорость модема измерялась в бодах 1бод = 1 бит с. Однако бод используется в технике связи и относится к частоте изменений аналогового сигнала переносящей биты данных по телефонной линии. В 80х годах скорость бодов равнялась скорости передачи модемов 300 бод было эквивалентно 300 бит с.
44605. Типы модемов 48.5 KB
  Передающий модем просто шлет данные а принимающий – принимает а затем проверяет что они приняты без ошибок. Для обнаружения ошибок выделяется дополнительный бит – бит четности.32 не предусматривает аппаратного контроля ошибок и он возлагается на специальное программное обеспечение работающее с модемом.42 используют аппаратную коррекцию ошибок и поддерживают MNP4.
44606. Линии связи, используемые модемами 35 KB
  Использование той или иной линии определяется такими факторами как: пропускная способность; расстояние; стоимость. Существует два типа телефонных линий по которым может осуществляться модемная связь: каналы общедоступной коммутируемой телефонной сети коммутируемые линии арендуемые выделенные линии. Коммутируемые – это обычные телефонные линии.