Объявление массива записей в программе



Оглавление

1.Общие понятия. 2

2. Тип «Запись» в языке Turbo Pascal 3

3. Массивы записей. 8

4. Файлы из записей. 11

5. Семестровая работа на тему ”Мини СУБД”. 27

 


Общие понятия

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

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

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

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

Обработку сведений, хранящихся в БД, выполняет специальная программа, называемая системой управления базами данных (СУБД). В настоящее время разными производителями разработано большое количество различных СУБД, которые различаются своим типом и набором выполняемых функций. Более подробная информация о СУБД будет предоставлена в специальном курсе «Базы данных».

В настоящий момент мы рассмотрим лишь основные функции, присущие всем без исключения СУБД. Эти функции следующие:

1) Ввод информации в БД;

2) Вывод информации из БД на экран (или на печать);

3) Поиск информации в БД по запросу пользователя (по ключу);

4) Добавление информации в БД;

5) Корректировка информации в БД;

6) Удаление информации из БД.

Каждая из этих функций реализуется особым режимом работы СУБД. Режим работы, в который следует перейти СУБД, выбирается пользователем в процессе диалога. Обычно этот диалог реализуется с помощью меню. Алгоритм реализации меню представлен на рис.2.

 

Тип «Запись» в языке Turbo Pascal

Понятие записи

Тип «Запись» служит для описания в программах на языке Turbo Pascal переменных сложной структуры, определяющих сведения об объектах реального мира. Запись - сложная структурированная переменная, состоящая из более простых переменных, возможно различного типа.

Например, календарная дата может быть описана записью следующего вида (см. рис. 3):

Переменные, составляющие запись, называются полями. В запись Data (рис.3), например, входят поля Day(тип byte), Month(тип string[10]), Year (тип integer). Как видно из примера, эти поля относятся к различным типам данных, т.к. описывают различные по смыслу сведения. Значениями полей являются данные соответствующих типов.

Описание типа «запись» в TP-программе имеет следующий формат:

type

<имя типа>=RECORD

             <описание полей>

           END;

Здесь <имя типа> – это любой правильный идентификатор;RECORD, END – ключевые слова.

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

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

type

Data=Record

        Day:byte;

        Month:string[10];

        Year:integer

      END;

Теперь, имея в наличии тип Data, можно описать несколько переменных, задающих конкретные даты, например:

VAR

NewYear,MyBirthDay:Date;

Каждая из этих переменных содержит поля Day, Month, Year, следовательно, описывает сложные структурированные данные. По этой причине обработка переменных-записей ведётся по полям, т.е. каждое поле обрабатывается отдельно от других полей.

Например, если требуется задать значение конкретной даты, каждое поле должно получить значение:

MyBirthDay.Day:=10;

MyBirthDay.Month:=’September’;

MyBirthDay.Year:=1986;

Для обращения к каждому полю записи служит операция «». Она позволяет из всей переменной-записи выделить и обработать указанное поле. Каждое поле обрабатывается по правилам обработки данных соответствующего типа.

Над всей записью целиком никаких действий выполнить невозможно. Исключением является операция присваивания «:=». Одной записи можно целиком присвоить значение другой записи (если они одинаковы по структуре). Например:

VAR

A,B:Date;

BEGIN

A.Day:=5;

A.Month:=’May’;

A.Year:=2006;

B:=A;{в переменную В поэлементно скопировано значение

записи А, т.е. (см. рис. 4)}

 

Вложенные записи

Часто при работе с объектами реального мира возникают ситуации, когда поле записи в свою очередь представляет собой запись.

Например, сведения о человеке заданы его ФИО, датой рождения, ростом, весом. На рис. 5 представлена запись Person, описывающая такую информацию.

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

Пример:

type

Date=Record

Day:byte;

Month:string[10];

Year:integer;

End;

Person=Record

FIO:string[20];

BirthDate:Date;

Height,Weight:Real;

END;

VAR

X,Y:Person;

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

пример:

X.FIO:=’Иванов И.И.’;

X.BirthDate.Day:=25;

X.BirthDate.Month:=’July’;

X.BirthDate.Year:=1986;

X.Weight:=72.3;

X.Height:=176.5;

Оператор присоединения WITH

Иногда вложенность записей может быть очень глубокой, что происходит при описании сложных объектов. В этом случае доступ к полям вложенных записей становится громоздким и неудобным. Для удобного выхода из такой ситуации служит оператор присоединения WITH. Он позволяет обращаться к полям, считая их присоединёнными к указанной в операторе записи. Формат оператора WITH следующий:

WITH<имя записи>DO

<действия с полями записи>;

Пример:

WITH X do

begin

FIO:=’Иванов И.И.’;

BirthDate.Day:=25;

BirthDate.Month:=’July’;

BirthDate.Year:=1986;

Weight:=72.3;

Height:=176.5;

end;

К полю BirthDate, которое является вложенной записью, также можно обратиться с использованием оператора присоединения WITH.

Пример:


1 Способ

WITH X do

begin

FIO:=’Иванов И.И.’;

WITH BirthDate do

begin

Month:=July;

Year:=1986

end;

Height:=176.5;

Weight:=72.3;

end;

2 Способ

WITH X, X.BirthDate do

begin

FIO:=’Иванов И.И.’;

Day:=25;

Month:=July;

Year:=1986;

Height:=176.5;

Weight:=72.3

end;

 


Массивы записей

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

1) массив хранится в оперативной памяти только во время работы программы, поэтому при каждом сеансе работы массив нужно заполнять данными снова и снова, что очень трудоёмко и неэффективно;

2) количество элементов массива задаётся в начале программы и не может быть изменено, пока программа не завершит работу;

3) объём оперативной памяти, занимаемой массивом записей очень велик. Поэтому большие объёмы данных с помощью массивов обработать невозможно, т.к. этого не позволит объём оперативной памяти. По этой же причине двумерные массивы записей не используются вообще никогда.

Тем не менее, мы рассмотрим массивы записей, чтобы освоить принципы работы с комплексами объектов реального мира.

 

Объявление массива записей в программе

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

пример:

Program ABC;

сonst

Nmax=100;{максимальное количество элементов в массиве}

type

Date=Record

Day:byte;

Month:string[10];

Year:integer;

end;

Person=Record{записной тип данных, тип каждого элемента}

FIO:string[20];

BirthDate:Date;

Height,Weight:Real

end;

MAS=array[1..Nmax] of Person;{массивовый тип данных}

VAR

X:MAX;{объявлен массив записей}

N:byte;

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

Ввод массива записей

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

 

write(‘N=’);

readln(N);

for i:=1 to N do

begin

writeln(‘Ввод данных о персоне №’,i);

WITH X[i] do

begin

write(‘ФИО:’);

readln(FIO);

WITH BirthDate do

begin

writeln(‘Дата рождения:’);

write(‘День’);

readln(Day);

write(‘Мес.:’);

readln(Month);

write(‘Год:’);

readln(Year);

end;

write(‘Рост:’);

readln(Height);

write(‘Вес:’);

readln(Weight);

end;

end;

writeln(‘Ввод массива завершён’);

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

Вывод массива записей

Алгоритм вывода массива записей также характерен тем, что усложняется вывод на экран одного элемента за счёт сложности его структуры (см. рис. 7).

Запись алгоритма вывода в программе также имеет особенности, связанные со сложной структурой элемента массива. Во-первых, для упрощения доступа к полям записи будет использован оператор WITH. Во- вторых, вывод массива записей на экран удобно выполнять в виде таблицы. Для этого на экран выводится «шапка» таблицы. Ширина колонок в таблице регулируется заданием формата вывода, который определит количество позиций на экране, отводимых для изображения колонки таблицы.

Данные из массива в колонки записываются по тому же формату, что указан в «шапке».Таким образом текст программы, описывающей алгоритм, представленный на рис.7, выглядит так:

 

• • •

write(’ФИО’:22,’Дата рождения’:25,’Рост’:10,’Вес’:10);

for i:=1 to N do

WITH X[i], X[i].BirthDate do

writeln(FIO:22,Day:6,Month:11,Year:5,’г.’:3,

Height:10:2,Weight:10:2);

• • •

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

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

Если количество и размер полей в записи велики, и невозможно отобразить массив записей на экране в виде таблицы, то разрабатывается специальная экранная форма, которая в удобном виде располагает на экране информацию записи. При этом записи размещают на экране группами по 1,2,3…записи и более.

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

Файлы из записей

Файлы записей традиционно используются для создания баз данных и отличаются значительным объёмом. Файлы записей обрабатываются покомпонентно.

Объявление файла записей

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

Объявление файла из записей в программе выглядит следующим образом:

Program ABC;

type

Date=Record

Day:Byte;

Month:string[10];

Year:integer;

end;

Person=Record

FIO:string[20];

BirthDate:Date;

Height,Weight:real;

end;

TFile=file of Person;{объявлен файловый тип данных}

Var

F:TFile;{объявлен файл из записей}

a:Person;{объявлена логическая компонента файла}

• • •

В данном примере объявлен файл, хранящий сведения о людях. Каждой компонентой файла является запись типа Person. Для работы с файлом объявлена вспомогательная переменная а – логическая компонента файла.

Дальнейшая обработка файла соответствует режимам работы СУБД (см. раздел «Общие понятия о СУБД»).

Ввод файла записей

При вводе файла из записей сохраняются все признаки алгоритма ввода числового файла (см. рис. 8).

Таким образом, запись компонент в файл выполняется до тех пор, пока пользователь не сообщит о своём желании завершить ввод файла. Для этого он должен в одно из полей очередной компоненты (в примере, приведённом на рис.8 это поле FIO) ввести заранее оговорённое значение, например строку символов ‘***’. Так как подобной фамилии не существует, можно эту строку считать сигналом пользователя о завершении ввода файла.

Каждая компонента файла вводится с клавиатуры, причём каждое поле вводится по отдельности. Записывается же компонента в файл оператором write(F,a) (см. рис. 8) всё целиком. Это возможно , т. к. тип логической компоненты а совпадает с базовым типом файла (этот тип – Person).

В программе алгоритм, приведённый на рис.8, выглядит следующим образом:

• • •

assign(F,’myfile.dat’);

rewrite(F);

writeln(’Введите сведения об очередном человеке ’);

WITH a do

begin

write(’ФИО:’);

readln(FIO);

while FIO<> ’***’ do

begin

WITH BirthDate do

begin

writeln(’Введите дату рождения’);

write(’День:’);

readln(Day);

write(’Месяц:’);

readln(Month);

write(’Год:’)

readln(Year)

end;

write(’Введите рост человека:’);

readln(Height);

write(’Введите вес человека:’);

readln(Weight);

write(F,a);

writeln(’Введите сведения об очередном человеке:’);

write(’ФИО:’);

readln(FIO);

end;

end;

close(F);

• • •

Вывод файла записей

При выводе файла записей на экран компоненты читаются из файла целиком с помощью оператора read(F,a), а выводятся на экран отдельными полями (см. рис.9).

Вывод файла на экран выполняется в виде таблицы. Подробности формирования таблицы на экране смотрите в разделе «Вывод на экран массива записей».

В тексте программы вывод файла на экран выглядит так:

• • •

writeln(’ФИО’:2,’Дата рождения’:25,

’Рост’:10,’Вес’:10);

reset(F);

while NOT EOF(F) do

begin

read(F,a);

WITH a, a.BirthDate do

writeln(FIO:22,Day:6,Month:11,Year:5,’г.’:3,

Height:10:2,Weight:10:2);

end;

close(F);

• • •


Дата добавления: 2018-10-27; просмотров: 329; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!