4608

Основные принципы работы с статическими структурами данных, реализованными в языке Delphi

Реферат

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

Структуры данных наряду с алгоритмами являются основными составными частями создаваемых программ. Одну из своих книг профессор H. Вирт, автор языка программирования Pascal буквально так и назвал: Алгоритмы + Структуры данных = Программы. П...

Русский

2012-11-23

1.59 MB

19 чел.

Введение

Структуры данных наряду с алгоритмами являются основными составными частями создаваемых программ. Одну из своих книг профессор H.Вирт, автор языка программирования Pascal буквально так и назвал: «Алгоритмы + Структуры данных = Программы».

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

Данные представляют собой, прежде всего, абстракции реальных объектов и формулируются предпочтительно как абстрактные структуры.

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

Целью лекции является изучение основных принципов работы с статическими структурами данных, реализованными в языке Delphi.


1. КЛАССИФИКАЦИЯ СТРУКТУР ДАННЫХ

Используемые в программировании данные подразделяются на две большие группы:

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

Данные статической структуры могут быть простыми (скалярными) и составными (агрегативными), которые формируются из простых структур по какому-либо закону (рис. 1.1).

Рис. 1.1. Классификация данных статической структуры

Простым данным в языках программирования соответствуют стандартные (предопределенные) типы данных, к которым, как правило, относят арифметические (натуральный, целый, вещественный, комплексный), символьный, булевский и указательный (ссылочный) типы. В Delphi включены:

  •  натуральные типы Byte, Word, LongWord и Cardinal;
  •  целые типы Integer, Shortint, Smallint, Longint, Int64;
  •  вещественные типы Real, Real48, Single, Double, Extended, Comp, Currency;
  •  булевские типы Boolean, ByteBool, WordBool, LongBool;
  •  символьный тип Char (AnsiChar, WideChar);
  •  указательный тип Pointer.

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

Рис. 1.2. Классификация данных динамической структуры

Данные составной структуры бывают однородными, т.е. такими, у которых все элементы одинакового типа, и неоднородными (комбинированными), которые объединяют в единое целое разнотипные элементы. К данным однородной структуры принадлежат массивы, строки и множества, а к данным неоднородной (комбинированной) структуры — простые записи, вариантные записи, объединения и классы (объекты).

Массивы можно классифицировать по двум разным признакам:

  •  по количеству размерностей массивы разделяются на одномерные массивы (векторы), двухмерные (матрицы) и многомерные (трех-, четырехмерные и т.д.);
  •  по типу элементов массивы разделяются на массивы простых данных, массивы однородных структур данных, массивы неоднородных структур данных и массивы файлов.

Простые и вариантные записи поддерживаются отдельными синтаксическими конструкциями языка.

Классы (объекты) по своей структуре аналогичны записям, но в отличие от них могут включать поля не только простых и составных типов, но и процедурных типов, что существенно повышает их мощность как структуры данных.

К данным динамической структуры относят файлы, несвязанные и связанные динамические данные. Классификация данных динамической структуры показана на рис. 1.2.

2. ДАННЫЕ СТАТИЧЕСКОЙ СТРУКТУРЫ

2.1. Массивы и работа с ними

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

Массив определяется именем (идентификатором) и количеством размерностей (координат), необходимых для указания местонахождения требуемого элемента массива. Имя массива является единым для всех его элементов. Поскольку конфигурация элементов массива фиксирована, то к отдельному элементу можно обращаться с помощью одного или нескольких индексов, в зависимости от количества размерностей массива. В качестве индексов могут использоваться константы и переменные порядковых типов (например, целого типа – integer).

Допустимыми индексными типами являются все порядковые типы, диапазон которых не превышает 2 Гбайта.

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

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

Используемые в программе массивы должны быть обязательно объявлены в разделе описаний программы (модуля).

В общем виде инструкция объявления массива выглядит следующим образом:

Имя: array [нижний_индекс..верхний_индекс] of тип;

где:

имя — имя массива;

нижний_индекс и верхний_индекс — целые константы, определяющие диапазон изменения индекса элементов массива и, неявно, количество элементов (размер) массива;

тип — тип элементов массива.

При объявлении массива удобно использовать именованные константы, объявляемые в разделе const, который располагают перед разделом объявления переменных. В инструкции объявления именованной константы указывают ее имя и значение, отделяемое от имени символом «=». После объявления именованной константы ее можно использовать в программе как обычную числовую или символьную константу.

Схематично одно-, двух- и трехмерные массивы можно представить следующим образом:

Одномерный массив (вектор):

Определение:

const

 n=100;

var

 А: array [1..n] of Real;

const

 n=100;

type

 T_Vector = array [1..n] of Real;

var

 A: T_Vector;

Двухмерный массив (матрица):

Определение:

const

 m=30; n=50;

var

 B: array [1..m,1..n] of Integer;

const

 m=30; n =50;

type

 T_Matr=array [1..m,1..n] of Integer;

var

 B: T_Matr;

Трехмерный массив:

Определение:

const

 m=30; n=50; p=20;

var

 C: array [1..m,1..n,1..p] of Char;

const

 m=30; n=50; p=20;

type

 T_Array=array [1..m,1..n,1..p] of Char;

var

 C: T_Array;

Рассмотренный тип массива называется статическим массивом. Это значит, что размер массива (число элементов) задан при объявлении и менять его в процессе работы программы нельзя.

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

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

var 

 My_A_Array: array of Real;

Здесь не задаются размеры массива — они устанавливаются в процессе работы с помощью процедуры SetLength.

SetLength(My_A_Array, 20);

Таким образом, массив будет состоять из 20 элементов типа Real. При необходимости это значение можно изменить с помощью той же процедуры.

Примеры определения массивов:

Const

 N=5, M=10, K=3;              // Константами можно определять границы индексов

Type

 Gruppa = (G1,G2,G3,G4);              // Задание перечисляемого типа

 Znak = array [0..255] of char;        // Одномерный массив символов

 Matrica = array [-N..N,1..M] of real; // Двухмерный массива вещественных чисел

 Vector = array [0..K] of integer;     // Одномерный массив целых чисел

Var

 Z1,Z2: Znak;

    Gr: array [5..10] of Gruppa;

 A,B,C: Matrica;

 X1,X2: Vector;

 YA,YB: array [1..N,1..M,0..K,-1..1] of boolean; // Трехмерный массив 

                                                // булевских значений

После объявления массива каждый его элемент можно обработать, указав идентификатор (имя) массива и индекс элемента в квадратных скобках. Например, запись Mas[2] позволяет обратиться ко второму элементу массива Mas, а VektorZ[10] – к десятому элементу массива VectorZ. При работе с двухмерным массивом указываются два индекса, с n-мерным массивом - n индексов. Например, запись MatrU[3,4] (допустима и такая запись, как MatrU[3][4]) делает доступным для обработки значение элемента, находящегося в третьей строке четвертого столбца массива MatrU.

Индексированные элементы массива называются индексированными переменными и могут быть использованы так же,  как и простые переменные. Например, они могут находиться в выражениях в качестве операндов, использоваться в операторах for, while, repeat, if и др., входить в качестве параметров в процедуры read, readln, write, writeln; им можно присваивать любые значения, соответствующие их типу. Например,

X1[i,j,k]:=A[i,j]*cos(b[k+1]*Pi/180+fi[0,0]);

if Matr[n*m+1]<>0 then D[k]:=True else D[k]:=False;

Язык Object Pascal позволяет работать с массивом как единым целым, используя идентификатор массива без указания индекса в квадратных скобках. В этом случае массив может участвовать только в операциях отношения «равно», «не равно» и в операторе присваивания. Массивы, участвующие в этих действиях, должны быть идентичны по структуре, т.e. иметь одинаковые типы индексов и одинаковые типы компонентов.

Например, если массивы А и В описаны, как

Type 

 Matrica=array [1..5,1..6] of real;

Var

  А,В: Matrica;

то применение к ним допустимых операций даст следующий результат:

  •  А=В True, если значение каждого элемента массива А равно соответствующему значению элемента массива B;
  •  А<>B True, если хотя бы одно значение элемента массива А не равно значению соответствующего элемента массива B;
  •  А:=В Все значения элементов массива В присваиваются соответствующим элементам массива А. Значения элементов массива В остаются неизменны.

Типичными операциями при работе с массивами являются:

  •  инициализация массива;
  •  ввод - вывод массива;
  •  поиск максимального или минимального элемента массива;
  •  поиск заданного элемента массива;
  •  сортировка массива и др.

Рассмотрим некоторые из них, для чего введем следующие описания:

Var

 A,D: array[1..4] of real;           {Одномерные массивы вещественного типа}

   В: array[1..10,1..15] of integer; {Двухмерный массив целого типа}

 I,J,К: integer;

   S: real;

Инициализация массива заключается в присваивании каждому элементу массива одного и того же значения, соответствующего базовому типу. Это можно сделать, записав группу операторов присваивания. Например,

A[1]:=0; A[2]:=0; A[3]:=0; А[4]:=0;

Однако при большом количестве элементов такой способ инициализации нерационален. Гораздо удобнее получить тот же результат, использовав оператор for:

for I:=1 to 4 do A[I] =0;

Для инициализации двухмерного массива используются вложенные операторы for:

for I:=1 to 10 do

  for J:=1 to 15 do

   B[I,J]:=100;

Если массив не является локальным, т.е. объявлен не в какой-либо пользовательской процедуре, а в разделе переменных программы, то одновременно с объявлением массива можно выполнить его инициализацию (присвоить начальные значения элементам массива). В этом случае инструкция объявления массива в общем виде выглядит так:

Имя: array [нижний_индекс..верхний_индекс] of тип = (список);

где список — разделенные запятыми значения элементов массива. Например:

var

 a: array[10] of integer = (1,2,3,4,5,0,0,0,0,0);

 Team: array[1..4] of String[10] = ('Динамо','Шахтер','Днепр','Металлург');

При этом количество элементов списка инициализации должно соответствовать размерности массива.

Ввод-вывод массива. В Object Pascal не предусмотрено средств ввода-вывода элементов массива сразу, поэтому ввод и вывод значений производится поэлементно.

Значения элементам массива можно присвоить с помощью оператора присваивания, как показано в примере инициализации выше, однако чаще всего они вводятся с клавиатуры с помощью оператора read или readln с использованием оператора организации цикла for:

for I:=1 to 10 do

  for J:=1 to 15 do

   readln(B[I,J]);

Вывод значений элементов массива выполняется аналогичным образом, но используются операторы write или writeln:

for I:=1 to 4 do

 writeln(А[I]);      {Вывод значений массива A}

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

А:=D;

или с помощью оператора for:

for I:=1 to 4 do A[I]:=D[I];

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

Иногда требуется осуществить поиск в массиве каких-либо элементов, удовлетворяющих некоторым известным условиям. Например, надо выяснить, сколько элементов массива А имеют нулевое значение. Для ответа на этот вопрос введем дополнительную переменную К (счетчик числа нулевых элементов) и воспользуемся операторами for и if:

К:=0;

for I:=1 to 4 do

 if A[I]=0 then К:=К+1;

После выполнения цикла переменная К будет содержать количество элементов массива А с нулевым значением.

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

Vs:=A[4];  {Vs - вспомогательная переменная}

A[4]:=А[1];

2.2. Строки

Строка – это последовательность любых символов таблицы ASCII, заключенная в одиночные апострофы. Количество символов в строке (длина строки) может динамически изменяться от 0 до максимального значения, определяемого идентификатором строкового типа.

Определение строкового типа устанавливает максимальное количество символов, которое могут содержать строки. Формат определения переменных строкового типа следующий:

Type

 Имя_типа_строка = string[Максимальная_длина_строки];

Var

 Идентификатор,...: Имя_типа_строка;

или

Var

 Идентификатор,...: string[Максимальная_длина_строки]

Максимальную длину строки можно не указывать.

Основные строковые типы, допустимые в языке Delphi, перечислены в табл. 2.1.

Таблица 2.1. Строковые типы

Тип

Максимальная длина

Требуемая память

Для чего используется

ShortString

255 символов

2 до 256 байт

Обратная совместимость

AnsiString

231 символов

4 байта до 2 Гбайт

8-разрядные символы ANSI, DBCS ANSI, MBCS ANSI и т.д.

WideString

230 символов

4 байта до 2 Гбайт

Символы Unicode; многопользовательские серверы и многоязычные приложения

Примеры объявления строк:

Type

 Flot = string[125];

 Stroka = ansistring;

Var

 Fstr: Flot;

 A,B,C: Stroka;

 X1,Z2: string[30];

Тип AnsiString называется длинной строкой и является предпочтительным для большинства приложений. «Обобщающее» ключевое слово String используется как обозначение именного этого типа.

Строка, по сути, представляет собой одномерный массив элементов символьного типа (Char).

Основные, наиболее общие операции, которые могут производиться со строками, следующие:

  •  присваивание строке значения другой строки или константы;
  •  получение значения строки;
  •  получение длины строки;
  •  получение значения конкретного символа (символа находящегося в определенной позиции строки);
  •  изменение значения конкретного символа в строке;
  •  слияние (конкатенация) двух и более строк;
  •  выделение подстроки из строки;
  •  вставка одной строки внутрь другой;
  •  удаление части строки;
  •  определение позиции вхождения одной строки в другую;
  •  изменение регистра символов;
  •  сравнение строк на равенство или больше/меньше и др.

В основном все операции со строками реализуются через стандартные функции.

Строковой переменной может быть присвоено значение, как и любой другой переменной. Строку можно выводить на экран или вводить с клавиатуры (при вводе апострофы, заключающие строку, не вводятся). Единственное ограничение состоит в том, что тип значения должен быть String или Char, например,

const

 A='Hello, world';        // Объявление строковой константы

var

 B: String;               // Объявление строковой переменной

...

 B:=A;                    // Присваивание значения константы A переменной B

 Writeln(B);              // Вывод на экран содержимого переменной B

 Writeln('Vvedite name'); // Вывод строковой константы на экран

 Read(B);                 // Ввод строковой переменной с клавиатуры

Строки можно складывать, используя оператор +. Такая операция называется конкатенацией. Результатом сложения является более длинная строка, включающая в себя содержимое обеих строк в порядке их употребления в операции.

Формат операции конкатенации двух строк:

A+B

где A и В - идентификаторы строки или строковые выражения.

Например:

var

 A,B,C,D: String;

...

 C:='Hello';

 D:='world';

 A:=C+D;       // Результат - Helloworld

 B:=C+', '+D;  // Результат - Hello, world

 C:=D+C;       // Результат - worldHello

К символам строки можно обращаться по их индексу (позиции в строке). Индекс первого символа строки равен 1. Индекс последнего символа строки будет равен результату вызова функции Length, которой в качестве параметра будет передана строка. При попытке обращения к символу с индексом меньше 0 или больше Length(идентификатор_строки) возникает ошибка времени выполнения.

Формат обращения к символу строки:

S[I]

где S - идентификатор строковой переменной, а I – индекс символа.

Выражение вида S[I], где S - идентификатор строковой переменной, возвращает результат типа Char.

При работе со строками используются стандартные функции и процедуры (табл. 2.2).

Таблица 2.2. Процедуры и функции работы со строками

Функция/ Процедура

Назначение

Функции

Concat(A,B)

Конкатенация (слияние) двух строк. Эквивалентна операции А+В.

Length(B)

Длина строки в символах. Результат: значение типа Integer.

Copy(S,I,C)

Копирование подстроки: S - строковая переменная или строковое выражение, часть которого должна быть скопирована; I – позиция, с которой должно быть осуществлено копирование; C - количество символов, которое должно быть скопировано. Если I больше длины строки S, то функция возвращает пустую строку. Если C указывает больше символов, чем имеется в строке S, начиная с позиции I, то копируются все символы S, начиная с позиции I и до конца.

Пример:

var

 A,B: String;

...

 A:='Hello, world';

 B:=Copy(A,2,5);     // Копируется ello,

 A:=Copy('Delphi rulez',1,6)+' great';  // Delphi great

Pos(SubS,S)

Определение позиции вхождения одной строки в другую: S - строка, в которой производится поиск подстроки SubS. Функция возвращает позицию вхождения в качестве результата. Если подстрока SubS не находится в S, то результат функции будет равен 0. Функция различает регистр букв.

Пример:

var

 I: Integer;

...

 I:=Pos('или','Быть или не быть');  // I=6

UpCase(S), LoCase(S)

Преобразование символа в верхний и нижний регистр соответственно: S - идентификатор переменной или выражение типа Char. Результат: значение S типа Char, преобразованное в верхний или нижний регистр.

UpperCase(S), LowerCase(S)

Преобразование строки в верхний и нижний регистр соответственно: S - идентификатор переменной или выражение типа String. Результат: значение S типа String, в верхний или нижний регистр.

Процедуры

Insert(S,T,P);

Вставка одной строки внутрь другой: S - вставляемая строка; T - строковая переменная, в которую вставляется содержимое S; P - позиция, начиная с которой вставляется содержимое S в T. В качестве T можно передавать только идентификатор переменной, но нельзя передавать выражение или идентификатор константы.

Если P меньше 1, то процедура принимает его равным 1. Если P больше чем Length(T), то содержимое S добавляется к T с конца.

Пример:

var

 A: String;

...

 A:='В лесу елочка';

 Insert(' родилась',A,7); // В лесу родилась елочка

Delete(T,I,C);

Удаление части строки: T - строковая переменная, из которой удаляются символы; I - позиция, начиная с которой производится удаление; C - количество удаляемых символов. Если I меньше 1 или больше чем Length(T), то ничего из T не удаляется. Если C указывает больше символов, чем есть, начиная с I, то удаляются символы от I и до конца строки. Если C меньше 1, то ничего не удаляется.

Пример:

var

 A: String;

...

 A:='Happy friends';

 Delete(A,3,5);    // Получится Hariends

Str(X[:W[:D]],S);

Преобразование численного значения в строковое представление: X – выражение целого или вещественного типа; W – размер поля (выражение целого типа); D – количество цифр в дробной части  (выражение целого типа); S – строковая переменная.

Пример:

var S: string;

   х: real;

...

 x:=-1234.56789;

 str(x:20:6,S);

 writeln(s); // На экран выдается -1234.567890

Val(S,V,C);

Преобразование строкового значения в числовое представление: S – выражение строкового типа; V – переменная целого или вещественного типа; С – переменная целого типа, формирующая все число со знаком.

Строка S преобразуется в ее численное представление. Результат сохраняется в V. Если где-либо в строке встречается недопустимый символ, то его номер сохраняется в параметре С. В противном случае этот параметр равен 0. Предшествующие пробелы в строке S должны быть удалены.

Пример:

var S: string;

   х: real;

   c: integer;

...

 S:='-1234.56789';

 val(s,x,c);

Строки можно сравнивать между собой как если бы они были числами:

= - сравнение строк на предмет равенства;

<> - сравнение строк на предмет неравенства;

< - сравнение на «меньше»;

> - сравнение на «больше»;

<= - сравнение на «меньше или равно»;

>=  - сравнение на «больше или равно».

Результатом сравнения является значение типа Boolean, которое может быть только одним из двух - TRUE (Истина) и FALSE (Ложь).

Правила сравнения:

Сравнение на предмет равенства

  1.  Сравнивается длина строк. Если длина разная, то значит, что строки не равны. Возвращается результат FALSE.
  2.  Если длина одинаковая, производится посимвольное сравнение строк. Как только в какой-либо позиции сравниваемых строк находятся разные символы, возвращается FALSE - строки не равны.
  3.  Если длина строк одинаковая и все символы на соответствующих позициях равны друг другу, то строки считаются равными. Возвращается результат TRUE.

Сравнение на предмет неравенства

Производится сравнение на предмет равенства, затем результат «переворачивается вверх ногами». Вместо TRUE возвращается FALSE и наоборот.

Сравнение на «меньше»

Поочередно сравниваются коды символов, стоящих на соответствующих позициях. Если одна из строк больше не имеет символов, или символ, стоящий в соответствующей позиции имеет меньший код, то считается что эта строка «меньше». Например, строка 'Ivan' меньше строки 'Ivar', так как первые три символа равны, а четвертый символ в первой строке ('n') меньше чем четвертый символ ('r') во второй строке.

Сравнение на «больше»

Поочередно сравниваются коды символов, стоящих на соответствующих позициях. Если одна из строк еще имеет символы, в то время как другая больше не имеет символов, или символ, стоящий в соответствующей позиции имеет больший код, то считается что первая строка «больше».

Нечеткие сравнения на «меньше или равно» и «больше или равно»

Фактически «меньше или равно» означает «не больше», а «больше или равно» означает «не меньше». Соответственно производится сравнение на предмет «больше» или «меньше» и результат инвертируется.

2.3. Записи и работа с ними

В практике программирования довольно часто приходится иметь дело с данными, которые естественным образом состоят из других данных. Например, сведения о студенте содержат фамилию, имя, отчество, число, месяц и год рождения, домашний адрес и другие данные. Для представления подобной информации используется структура, называемая записью (record).

Запись, в отличие от других структур данных (например, массивов), является составной структурой, т.е. объединяет в единое целое любое число структур данных других типов: простых переменных, массивов, множеств, записей и файлов.

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

Запись — это структура данных, состоящая из отдельных именованных компонентов разного типа, называемых полями.

Записи делятся на обычные и вариантные.

Обычная фиксированная запись состоит из одного или нескольких полей, для каждого из которых при объявлении указывается имя (идентификатор) и тип в разделе Type:

Type

 Имя_записи = record

   Поле_1: Тип_1;

   ...

   Поле_n: Тип_n;

 end;

Var

 Идентификатор_1, ...: Имя_записи;

где

Имя — имя типа запись;

Поле_i и Тип_i (i = 1, ..., n) — имя и соответствующий тип i-го поля записи.

Например, запись, описывающая карточку успеваемости студента, выглядит так:

Type

 TStudentCard = record

   SurName     : String;    {Фамилия}

   Name        : String;    {Имя}

   FatherName  : String;    {Отчество}

   Year        : Integer;  {Год рождения}

   HomeAddress : String;    {Домашний адрес}

   GroupCode   : String;    {Шифр группы}

   Marks       : record     {Вложенная запись оценок}

     MathAnal  : Byte;      {Мат. анализ}

     Prog      : Byte;      {Программирование}

     Phys      : Byte;      {Физика}

   end;

 end;

{Объявление переменных типа запись TStudentCard}

Var

 St1,St2,A: TStudentCard;

Иногда тип переменной-записи объявляют непосредственно в разделе объявления переменных (Var). В этом случае тип записи указывается сразу за именем переменной, через двоеточие. Например, запись student может быть объявлена следующим образом:

Var

 student: record

  f_name: string[20];

  i_name: string[20];

     day: integer;

   month: integer;

    year: integer;

 address:string[50];

end;

Обращение к полям записей выполняется с помощью квалифицируемых (уточненных) идентификаторов, в которых указывается вся цепочка имен от идентификатора переменной типа запись до идентификатора требуемого поля. Имена полей квалифицируемого идентификатора разделяются точками.

Пусть, к примеру, введены следующие тип и переменные.

Type

  TGroup = array [l..25] of TStudentCard;

var

  Group_KB51,Group_KB52: TGroup;

В этом случае корректными будут такие операторы и обращения к полям записей:

Group_KB51[1].Name       :='Sergey';

Group_KB51[1].Year       :=1978;

Group_KB51[1].Marks.Prog :=5;

Group_KB51[1].Marks      :=Group_KB52[1].Marks;

Group_KB51[5]            :=Group_KB52[7];

Group_KB51               :=Group_KB52;

Для упрощения работы с записями имеется специальный оператор присоединения with, позволяющий использовать в тексте программы имена полей без указания имени переменной-записи:

with Имя_записи do

 begin

   Инструкции программы

 end;

В Инструкциях программы можно использовать только имена полей.

С использованием этого оператора выше приведенные операторы будут записаны в таком виде:

with Group_KB51[1] do 

 begin

  Name:='Sergey';

  Year:=1978;

  Marks.Prog:=5;

  Marks:=Group_KB52[1].Marks;

 end;

Group_KB51[5]:=Group_KB52[7];

Group_KB51:=Group_KB52;

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

Вариантные записи включают две части:

  1.  обычная фиксированная запись;
  2.  вариантная, состоящая из поля признака и одной или нескольких вариантных компонент. Вариантные компоненты включаются в конкретный элемент типа «запись» по альтернативному принципу, в зависимости от значения поля признака.

Например, если тип TStudentCard расширить оценками за второй семестр, то в форме вариантной записи он примет такой вид:

type

  TMarksSem1=record

    MathAnal: Byte;          {Мат. анализ}

       LinAl: Byte;          {Лин. алгебра}

        Prog: Byte;          {Программирование}

        Phys: Byte;          {Физика}

  end;

  TMarksSem2=record

   MathAnal2: Byte;          {Мат. анализ}

    Electron: Byte;          {Электроника}

       Prog2: Byte;          {Программирование}

    DigAutom: Byte;          {Теория цифровых автоматов}

  end;

  TStudentCard=record

     {Фиксированная часть записи}

         SurName: String;           {Фамилия}

            Name: String;           {Имя}

       FatherName: String;           {Отчество}

            Year: Integer;          {Год рождения}

     HomeAddress: String;           {Домашний адрес}

       GroupCode: String;           {Шифр группы}

     {Вариантная часть записи}

     case Semestr: Byte of

       1: (MarksSem1: TMarksSem1);  {Оценки за первый семестр}

       2: (MarksSem2: TMarksSem2)   {Оценки за второй семестр}

    end;

В типе TStudentCard поле Semestr является полем признака, а поля MarksSem1 и MarksSem2 — альтернативными вариантами данной записи.

Если объявить, как показано выше, переменные Group_KB51 и Group_KB52, то заполнение информацией за первый семестр экземпляра карточки одного студента, имеющей порядковый номер 3, может иметь, например, такой вид:

...

with Group_KB51[3] do 

begin

{Заполнение фиксированной части записи}

      SurName:='Иванов';

         Name:='Иван';

   FatherName:='Иванович';

         Year:=1978;

  HomeAddress:='г.Киев, ул.Строителей, д.12, кв.63';

    GroupCode:='KB-51';

{Заполнение вариантной части записи}

      Semestr:=1;        {Установка признака первого семестра}

  with MarksSem1 do      {Оценки за первый семестр}

  begin

     MathAnal1:=5;

         LinAl:=4;

         Prog1:=5;

          Phys:=3;

  end;

end;

В вариантных компонентах таких записей не допускается использование одинаковых идентификаторов.

Выводы

  1.  Используемые в программировании данные по своей структуре делятся на статические (взаиморасположение и взаимосвязи элементов которых всегда остаются постоянными) и динамические (внутреннее строение которых формируется по какому-либо закону, но количество элементов, их взаиморасположение и взаимосвязи могут динамически изменяться во время выполнения программы согласно закону формирования).
  2.  Массив — это структура данных, которая представляет собой однородную, фиксированную по размеру и конфигурации совокупность элементов простой или составной структуры, упорядоченных по номерам. Массив определяется именем (идентификатором) и количеством размерностей (координат), необходимых для указания местонахождения требуемого элемента массива. Имя массива является единым для всех его элементов. Для работы с массивом как единым целым используется идентификатор массива без указания индекса в квадратных скобках. Массив может участвовать только в операциях отношения «равно», «не равно» и в операторе присваивания.
  3.  Строка – это последовательность любых символов таблицы ASCII, заключенная в одиночные апострофы. Количество символов в строке (длина строки) может динамически изменяться от 0 до максимального значения, определяемого идентификатором строкового типа. К основным операциям над строками относятся: присваивание строке значения другой строки или константы, получение значения строки и ее длины, значения конкретного символа, изменение значения конкретного символа в строке, слияние (конкатенация) двух и более строк, выделение подстроки из строки, вставка одной строки внутрь другой, удаление части строки, определение позиции вхождения одной строки в другую, изменение регистра символов, сравнение строк на равенство или больше/меньше и др. В основном все операции со строками реализуются через функции стандартной библиотеки.
  4.  Запись – это структурированный тип данных, состоящий из фиксированного числа компонентов (полей) разного типа. Обращение к полям записей выполняется с помощью квалифицируемых (уточненных) идентификаторов.

Контрольные вопросы

  1.  Что собой представляют данные статической структуры и как они классифицируются?
    1.  Какие данные относятся к типу простых?
    2.  Что собой представляют данные динамической структуры и как они классифицируются?
    3.  Что собой представляет массив? Как объявляются массивы?
    4.  Как можно использовать именованные константы для объявления размерностей массива?
    5.  Как объявляется динамический массив с помощью какой процедуры устанавливается его размер?
    6.  Каким образом обращаются к элементам массива? Где можно использовать элементы массива?
    7.  Какие операции можно выполнять одновременно со всеми элементами массива?
    8.  Как инициализируются элементы массива?
    9.  Каким образом осуществляется ввод и вывод элементов массива?
    10.  Что собой представляют строки и как они объявляются?
    11.  Какие основные операции производятся над строками?
    12.  Какие основные встроенные процедуры и функции используются при работе со строками?
    13.  Как сравниваются между собой строки?
    14.  Что такое запись? Как объявляется обычная фиксированная запись?
    15.  Что собой представляет квалифицированный идентификатор и для чего он используется?
    16.  В каких целях используется оператор присоединения with?
    17.  Что собой представляют вариантные записи и как они объявляются?


 

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

18969. Интернет-технологии, применяемые в связях с общественностью 166 KB
  Интернеттехнологии применяемые в связях с общественностью Internet представляет из себя динамично развивающееся средство представления информации и следовательно публикация сайта это сильная рекламная акция которая привлекает внимание к деятельности вашей компан...
18970. Нарушение правовых и этических норм в ходе избирательной кампании 40.5 KB
  Нарушение правовых и этических норм в ходе избирательной кампании К технологиям такого рода относятся как нарушающие букву закона так и формально не вступающие в противоречие с действующим законодательством. Объектом так называемых грязных технологий служат избира
18971. Кодексы профессионального поведения и этики ПР-специалиста 55.5 KB
  Кодексы профессионального поведения и этики ПРспециалиста Для такой специфической доверительной основанной на межличностных отношениях сферы как ПР законодательных норм бывает недостаточно. В практике ПР нередко возникают немалые противоречия между целью и эт
18972. Эффективность рекламы и связей с общественностью 101.5 KB
  Эффективность рекламы и связей с общественностью Реклама – распространяемая в любой форме с помощью любых средств информация о физическом или юридическом лице товарах идеях и начинаниях рекламная информация которая предназначена для неопределённого круга лиц и ...
18973. Создание и управление комплексом интегрированных маркетинговых коммуникаций 60.5 KB
  Создание и управление комплексом интегрированных маркетинговых коммуникаций ИМК комплекс объединяющий средства коммуникации от рекламы до упаковки позволяющее с согласованными и убедительными сообщениями обратиться к целевой аудитории. Цель: объединить разрозн...
18974. Принципы формирования, цели и задачи бренда 53 KB
  Принципы формирования цели и задачи бренда Брэнд это название термин символ или дизайн либо комбинация всех этих понятий обозначающие определенный вид товара или услуги отдельно взятого производителя либо группы производителей и выделяющие его среди товаров
18975. Фирменный стиль: понятие и содержание 40 KB
  Фирменный стиль: понятие и содержание Фирменный стиль это совокупность устойчиво воспроизводимых отличительных характеристик общения манер поведения традиций свойственных фирме позиционирующих ее в коммуникационном пространстве современной экономики. Фирменны...
18976. Содержание организационной (корпоративной) культуры предприятия 52 KB
  Содержание организационной корпоративной культуры предприятия Большинство авторитетных специалистов в области бизнеса соглашаются с тем что организации как и нации имеют свою культуру. Для описания этого понятия пользуются различными терминами близкими по смыс...
18977. Лоббизм – эффективная ПР-технология 170.5 KB
  Лоббизм – эффективная ПРтехнология Лоббирование это влияние заинтересованных групп на принятие решений властными структурами. Термин происходит от английского Lobby коридор так как попытки давления на законодателей часто проводились в коридорах связанных с зако...