Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Ответы по информатике.doc
Скачиваний:
23
Добавлен:
22.04.2019
Размер:
469.5 Кб
Скачать

Тема№17 Записи. Синтаксис описания записей

Записи в Паскале – фиксированное число элементов одного или нескольких типов, то есть в отличие от массивов, в которых содержатся элементы одного типа, в записях могут содержаться элементы как одного, так и разных типов. Тема, например, сведения о книгах имеет структуру: автор, название книги, издательство, год издания, её цена. Первые три элемента относится к строковому типу данных, четвертый к целому, а цена - к вещественному типу. Элементами записей могут быть базовые типы, переменные, массивы, указатели, записи и т.д. Элементы записи вместе с их описанием называются полями записи. Над элементами записи можно выполнять действия, допустимые для данных этого типа.

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

TYPE card = record

Author : string [15];

Title: string [20];

Firm: string[10];

year : integer ;

cena : real

End;

VAR Book : card;

Тип записи (например, card) вводит только шаблон записи и с его именем не связан никакой конкретный обьект. Обращение к полю выполняется с помощью составного имени (селектора записи), которое состоит из :

Имя_записи . имя_элемента

Например, присвоить значения элементам записи Author и Title можно так: Book.author:=’Довгаль С.И.’; Book.title:=’Турбо Паскаль V 7.0’;

Ввод цены книги с клавиатуры : readln (Book.cena);

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

WITH имя записи DO оператор;

Предыдущие операторы можно записать проще:

With Book do begin

author:=’Довгаль С.И.’; title:=’Турбо Паскаль V 7.0’; readln (cena);

end;

Пример: Из ведомости 3-х студентов с их оценками ( порядковый номер, Ф.И.О. и три оценки) определить количество отличников и средний бал каждого студента.

Program Spic;

Type wed = record {Тип wed включает 3 поля: n, fio, bal}

n : integer ;

fio : string[40] ;

bal : array [1..3] of integer {Поле bal – массив из 3 оценок }

end;

Var spisok : wed ; {Запись spicok типа wed}

i, j, kol, s : integer; sr : real;

Begin

kol:=0; {kol- количество отличников}

With spisok do {with присоединяет имя записи spisok ко всем }

For i:=1 to 3 do { полям внутри цикла For по i }

begin

n:=i;

Write (' Vvedite FIO # ', i ,' ');

Readln (fio);

s:=0;

For j:= 1 to 3 do

begin

write ( 'Vvedite ocenky: ' );

readln ( bal [j] );

s := s+ bal [j];

end;

if s=15 then kol:=kol+1; {подсчет количества отличников}

sr := s/3; writeln ( fio, ', Sredniy bal = ', sr:4:1); end;

writeln ( ' Kolichestvo otlichnikov = ', kol );

readln;

end.

Тема№18 Сравнение массивов и записей. Работа с полями записей

Сравнение записей с массивами

В то время как массив – объединение компонент одинакового типа, в записи можно объединять компоненты различного типа. Сравните массив и запись:

type

numb = array[1..4] of integer;

date = record

month: 1..12;

day: 1..31;

year: integer;

week: (mo, tu, we, th, fr, sa, su)

end;

Переменные, определенных выше типов, содержат либо целые массивы, либо целые записи:

var

m, n: numb;

one, two: date;

Присваивание значений элементам массивов и записей также имеет некоторое сходство:

m[1] := 498;

n[3] := 637;

one.day := 25;

one.week := fr;

two.year := 2011;

Следует отметить, что записи сами могут быть элементами массива. Пример массива записей:

var

daysopen: array[1..10] of date;

Оператор With

Этот оператор используется для удобства работы с переменными типа record (запись).

Общий вид:

with a do st;

здесь a – имя переменной типа record, st – оператор.

В операторе st при ссылках на компоненты записи имя a можно опускать.

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

with birthday[mother] do begin

month := 5;

day := 1;

year := 1965

end;

Запись с вариантами

Общий вид:

type v = record

a: type1

b: type2

……

case n: typen of

c1:(t11: type11;

t12: type12; …);

c2:(t21: type21;

t22: type22; …);

……..

end;

var z: v;

Здесь z – переменная типа v; n – переменная, называемая переключателем; typen – тип переменной n.

Этому же типу должны принадлежать метки c1 и c2. Каждой метке соответствует набор полей t11, …. Эти поля являются компонентами варианта.

Если какой-либо метке c вообще не соответствуют поля, то пишут c…: ( );

Замечания:

Любая запись (record) может иметь только одну вариантную часть (case).

Вариантная часть должна помещаться после постоянной части.

Среди идентификаторов полей не должно быть одинаковых.

Обращение к компоненте z.tij записи z происходит так:

Присваивается соответствующее значение c… переключателю n. В зависимости от значения n переменная z, помимо полей a, b, …, содержит те поля, которые соответствуют той метке c…, с какой совпадает значение n.

Выполняется операция с компонентой z.tij.

Пример. Пусть необходимо собрать следующие сведения о сотрудниках института: фамилию, дату рождения и, если есть семья, то фамилию и дату рождения супруги (супруга).

Эта информация может быть описана, например, записью person.

Пусть переменная типа kind может иметь одно из значений («женат», «холост»).

kind = (married, single);

person = record

name: string;

datebirth: date;

case yesno: kind of

married: (name1: string; date1: date);

single: ()

end;

Здесь name – строка символов; datebirth – запись, содержащая дату рождения; yesno – переключатель типа kind, который может принимать одно из двух значений: married либо single; name1 – строка символов, содержащая фамилию супруга(и); date1 – запись, содержащая дату рождения; single – пустое поле.

Если персона в браке, то будет присутствовать поле married, если нет – поле single. Паскаль допускает вложение вариантов в типе record.

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

Пример.

type

kind = (married, single);

date = record

day: 1..31;

month: 1..12;

year: integer;

end;

person = record

name: string;

datebirth: date;

case yesno: kind of

married: (name1: string; date1: date);

single: ()

end;

var

p: person;

begin

with p do begin

yesno := married;

name := 'panin';

with datebirth do begin

day := 14;

month := 5;

year := 1962

end;

case yesno of

married: begin

name1 := 'panina';

with date1 do begin

day := 30;

month := 12;

year := 1968

end;

end;

end;

end;

with p do

write(' ', name);

with p.datebirth do

writeln(' ', day, '/', month, '/', year);

with p do

write(' ', name1);

with p.date1 do

write(' ', day, '/', month, '/', year);

readln

end.