Добавил:
ikot.chulakov@gmail.com Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лабы по Delphi с готовыми программами / Лабораторная работа №5 Тип запись

.pdf
Скачиваний:
17
Добавлен:
12.07.2020
Размер:
292.79 Кб
Скачать

Лабораторные работы по информатике для специальности «Моделирование и исследование операций в организационно-технических системах»

Лабораторная работа №5 Структурные типы данных. Записи.

Введение

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

Тип запись

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

<идентификатор типа>=record <имя поля>:<тип поля>; <имя поля>:<тип поля>;

end;

где <идентификатор типа> – правильный идентификатор; record – зарезервированное слово;

<имя поля> – правильный идентификатор, уникальный в пределах объявления типа запись;

<тип поля> – любой тип Object Pascal, в том числе и структурный.

Рассмотрим пример объявления типа запись для описания информации о некоторой персоне.

type TPerson=record

name

:string[12];

//имя

familia:string[16];

//фамилия

Age:byte;

//возраст

end;

Значения переменных типа записи можно присваивать переменным того же типа.

var a, b:TPerson;

begin

...

a:=b;

...

end.

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

var a, b:TPerson;

begin

...

a.name:=’Иван’; a.familia:=’Иванов’; a.age:=18;

...

Лабораторные работы по информатике для специальности «Моделирование и исследование операций в организационно-технических системах»

end.

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

type TBirthDay=record Day, //день Month:byte;//месяц Year :word;//год

end;

TPerson=record

name :string[12]; //имя familia:string[16]; //фамилия BirthDay:TBirthDay; //дата рождения

end;

var Person:TPerson;

begin

...

Person.name:=’Иван’; Person.familia:=’Иванов’; Person.BirthDay.Day:=1; Person.BirthDay.Month:=1; Person.BirthDay.Year:=2000;

...

end.

Для упрощения доступа к полям записи можно использовать следующий оператор with <переменная> do <оператор>;

где with, do – зарезервированные слова;

<переменная> – переменная типа запись, за которой, возможно следует список вложенных полей;

<оператор> – любой оператор Object Pascal.

Для примера перепишем фрагмент программы приведенный выше с использованием оператора with do.

var Person:TPerson;

begin

...

with Person do begin

name:=’Иван’; familia:=’Иванов’; BirthDay.Day:=1; BirthDay.Month:=1; BirthDay.Year:=2000;

end;

...

end.

В выше приведенном фрагменте можно применить еще раз оператор with do.

var Person:TPerson;

begin

...

with Person do

Лабораторные работы по информатике для специальности «Моделирование и исследование операций в организационно-технических системах»

begin name:=’Иван’; familia:=’Иванов’;

with BirthDay do begin

Day:=1;

Month:=1;

Year:=2000;

end;

end;

...

end.

Object Pascal разрешает использовать в записи так называемые вариантные поля. Синтаксис определения вариантных полей приведен ниже.

case <порядковый тип> of <значение>: (

<имя поля>:<тип поля>;

<имя поля>:<тип поля>; …); < значение >: (

<имя поля>:<тип поля>; <имя поля>:<тип поля>;

…);

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

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

type TPerson=record

name :string[12]; //имя familia:string[16]; //фамилия case byte of//род занятий

0:(Type_computer:string[20]; //компьютеры MByte:Integer;

Compatible:Boolean);

1:Instrument: array[1..3] of string[10]; //музыка end;

В данном примере определено два варианта: первый вариант предназначен для человека увлекающегося компьютерами, а второй для человека увлекающегося музыкой. Особенностью вариантных полей является то, что нельзя использовать одновременно поля для различных вариантов, т.к. им выделяется одна и та же область памяти. Вариантные поля обычно используют для хранения взаимоисключающей информации с целью экономии памяти. На месте ключа в конструкции case of может стоять любой встроенный или пользовательский порядковый тип. Выбор этого типа не имеет значения и по сути игнорируется компилятором.

Обращение к вариантным полям происходит также как и к фиксированным, например

Лабораторные работы по информатике для специальности «Моделирование и исследование операций в организационно-технических системах»

var Person:TPerson;

begin

...

with Person do begin

name:=’Иван’; familia:=’Иванов’; Type_computer:=’AMD Athlon’; MByte:=1024; Compatible:=true;

end;

...

end.

Ввод и вывод переменных типа запись

Для операций ввода-вывода для записей в Object Pascal не предусмотрено ни каких средств, поэтому ввод и вывод данных для записей необходимо реализовывать самостоятельно. Ниже приведен пример организации ввода и вывода записи.

Листинг 1

program InOutRec;

{$APPTYPE CONSOLE}

type TStudent=record

name :string[12]; //имя familia:string[16]; //фамилия gruppa :string[4]; //группа

end;

var Student:TStudent; begin

writeln('Vvedite dannie');

//ввод записи with Student do

begin

write('name '); readln(name); write('familia '); readln(familia); write('gruppa '); readln(gruppa);

end;

//вывод записи with Student do

begin writeln(name); writeln(familia); writeln(gruppa);

end;

readln;

end.

Как видно из примера каждое поле записи необходимо вводить (выводить) отдельно.

Лабораторные работы по информатике для специальности «Моделирование и исследование операций в организационно-технических системах»

Организация таблиц

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

Листинг 2

program TableRec;

{$APPTYPE CONSOLE}

const n=10;//емкость массива type TStudent=record

name :string[12]; //имя familia:string[16]; //фамилия gruppa :Integer; //группа

end;

var Table:array [1..n] of TStudent; //таблица

Count:integer; //число строк в таблице MenuState:byte;//код выбранного действия i:integer;

begin Count:=0;

repeat //выводим меню writeln;

writeln('Viberite deistvie'); writeln('0 - Exit program'); writeln('1 - Add record'); writeln('2 - Show all record'); write('>>'); readln(MenuState);

//выбираем действие case MenuState of

1:

begin //добавление записи в конец массива

if Count=n then //если число элементов превышает емкость массива

writeln('Error: array overflow')

else //если в массиве есть место, то добавляем запись begin

inc(Count);

writeln('Insert record >>'); with Table[Count] do

begin

write('name :'); readln(name); write('familia :'); readln(familia); write('gruppa :'); readln(gruppa);

end;{with} end;{else}

end;{add}

2:

begin //вывод всех записей на экран

Лабораторные работы по информатике для специальности «Моделирование и исследование операций в организационно-технических системах»

//рисуем таблицу

 

writeln('|--------------------------------------------

|');

for i:=1 to Count do

 

with Table[i] do

 

writeln(i, ') ', name, ' ', familia, '

', gruppa);

writeln('|--------------------------------------------

|');

end;{show}

 

end;{case}

 

until MenuState=0;

 

writeln('Press Enter to exit');

 

readln;

 

end.

 

Задания к лабораторной работе

1.Наберите и отладьте программы приведенные в лабораторной работе.

2.Измените программу приведенную в листинге 2. Добавьте следующие функции в программу:

удаление произвольной записи из таблицы;

сортировка таблицы по столбцу «фамилия»;

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

Вопросы к лабораторной работе

1.Какое зарезервированное слово применяется для описания типа запись?

2.Как получить доступ к полям записи?

3.Как создать вариантную часть записи?

4.Почему нельзя одновременно использовать поля записи относящиеся к различным вариантам в вариантной части записи, к чему может привести неправильное использование вариантных полей?

5.Каким образом осуществляется ввод-вывод переменных типа запись?

6.Какую функцию необходимо использовать для вычисления размера записи в байтах?

Справочные таблицы