Структурированный тип данных – записи 


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



ЗНАЕТЕ ЛИ ВЫ?

Структурированный тип данных – записи



Записи

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

Структура объявления записи такова:

<имя типа>= record <список полей> end;

Здесь <имя типа> – правильный идентификатор;

record, end – зарезервированные слова;

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

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

 

Type

Birthday=record

day, month: byte;

year: word;

end;

var

a,b: Birthday;

...

 

В этом примере тип Birthday (день рождения) содержит три поля с именами day, month и year (день, месяц и год); переменные a, b сидержат записи типа Birthday.

Как и в массиве, значения переменных типа запись можно присваивать другим переменным того же типа, например

A:=b;

К каждому из компонентов записи можно получить доступ, если использовать составное имя, т.е. указать имя переменной, затем точку и имя поля:

 

a.day:=27;

b.year:=1939;

 

Для вложенных полей приходится продолжать уточнения:

 

var

c: record

name: string;

bd: Birthday;

end;

...

if c.bd.year=1939 then...

 

Оператор WITH

Если в программе содержится большое число обращений к компонентам записи (полям), то указание имени записи и имени поля с помощью сочленяющей точки будет громоздким. Для упрощения вводится оператор WITH - присоединение. Его еще называют оператором над записями.

Общая форма

 

WITH имя переменной-записи DO оператор

 

Тогда в операторе или составном операторе следующем за DO имя переменной записи можно опускать, а использовать только имя поля.

Пример обращения к полям:

 

gl.price:= 200;

with gl do

begin

price:= 200;

number:= 10

end;

 

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

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

 

program store;

const Max_n = 100;

type

str20 = string [20];

goods = record

name: str20;

price: real;

number: integer;

end;

var stock: array[l..Max_n] of goods;

i, j, len: integer;

name: str20;

found: boolean;

count: integer;

begin

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

readln(count);

for i:=1 to count do begin

writeln(‘Введите в отдельных строках наимен., цену и кол-во’);

with stock[i] do

readln(name, price, number);

end.

 

Рассмотрим пример программы с использованием массива структур. В ведомости, содержащей фамилии группы студентов, оценки по физике, математике и программированию определить средний балл каждого студента и средний балл в группе.

В программе использованы следующие обозначения:

n1 – максимальное количество студентов в группе;

n – реальное количество студентов в группе;

student – идентификатор типа, представляющий запись с полями fam, fiz, mat, pr и ss;

fam – поле записи, содержащее фамилию студента;

fiz, mat, pr – поле записи, содержащее оценки по физике, математике и программированию соответственно;

ss – поле записи, содержащее средний балл студента;

ved – массив, содержащий элементы типа student;

sg – средний балл группы;

i – индекс элемента массива ved;

Программа выглядит следующим образом:

program stud;

const n1=30;

type student=record

fam:string[10];

fiz,mat,pr:integer;

ss:real;

end;

var ved:array[1..n1] of student;

i,n:integer;

sg:real;

begin

writeln('сколько студентов в группе?');

read(n);

for i:=1 to n do

with ved[i] do

begin

writeln('введите фамилию студента');

read(fam);

writeln('введите оценки');

read(fiz,mat,pr)

end;

sg:=0;

for i:=1 to n do

with ved[i] do

begin

ss:=(fiz+mat+pr)/3; {вычисление среднего балла

студента}

sg:=sg+ss;

end;

sg:=sg/n;{вычисление среднего балла группы}

writeln('ведомость группы');

write('! фамилия! физика! матем! прогр!');

writeln('! cp. балл!')

for i:=1 to n do

with ved[i] do

begin

write('!',fam:10,'!',fiz:10,'!',mat:10,'!',pr:10);

writeln('!',ss:10:2,'!');

end;

writeln('средний балл в группе =',sg);

end.

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

· время прохождения очередных военных сборов;

· род войск, в которых проходил военный сбор;

или же:

· любимые цветы.

Для таких случаев в Турбо-Паскале предусмотрены записи с вариантами. Такие записи содержат фиксированную и вариантную часть, которая начинается с ключевого слова case. Рассмотрим пример:

type personsex=(male,female);

person = record

name,secondname,surname: string[20];

birthday: date;

case sex: personsex of

male: (army1: date;

army2: string[20]);

female: (flower: srting[20]);

end;

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



Поделиться:


Последнее изменение этой страницы: 2017-02-19; просмотров: 286; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.15.197.123 (0.014 с.)