Тип «запись

advertisement
Тип «запись»
При работе с массивами основное ограничение заключается в том, что
каждый элемент должен иметь один и тот же тип. Но при решении многих
задач возникает необходимость хранить и обрабатывать совокупности данных
различного типа.
Пример 1.1. Для каждого из 25 студентов известны фамилия, дата
рождения и оценка (в баллах) по пяти дисциплинам. Требуется вычислить
среднюю оценку каждого студента и выбрать имеющих максимальный
средний балл.
В данном случае фамилия может быть представлена строкой из 15
символов, дата рождения – строка из 10 символов, оценка – это целое число, а
средний балл должен быть представлен вещественным (действительным)
числом. В Паскале для описания комбинаций объектов разных типов
используются записи.
Запись - это структурированный тип, содержащий набор объектов разных
типов. Составляющие запись объекты называются ее полями. В записи каждое
поле имеет свое собственное имя. Чтобы описать запись, необходимо указать ее
имя, имена объектов, составляющих запись и их типы.
Описание типа запись:
Type <имя записи> = Record
<поле 1> : <тип 1>;
<поле 2> : <тип 2>;
...
<поле n> : <тип n>
End;
Соответствующая диаграмма изображена на рис. 6.
1
Рис. 1. Синтаксическая диаграмма типа «Запись»
Данные для решения рассматриваемой задачи можно описать как запись
следующим образом:
Type student = Record
fam: String[15];
{поле фамилии студента}
date: String[10];
{поле даты рождения студента}
b1,b2,b3,b4,b5:2..5;{поля баллов по дисциплинам}
sb: Real
{поле среднего балла}
End;
Var S:student;
Переменная S типа student будет иметь смысл структуры, содержащий
информацию, характеризующую одного студента. Организация этой структуры
показана на рисунке 7.
Student
fam
date
b1
b2
b3
b5
sb
Вещественный
Строка из 15 Строка из 10
символов
b4
2..5
символов
тип
Рис. 2. Организация переменной типа student.
Чтобы обратиться к любому элементу записи (к отдельному полю),
используется составное имя, имеющее структуру: имя переменной.имя поля.
Например, S.fam:=’Петров А.А.’; S.b1:=3;.
Каждое поле записи может иметь любой тип (кроме файлового), в
частности, оно может быть снова записью.
Например, поле date – дата рождения может быть описано так:
Type student = Record
2
fam: String[15];
{поле фамилии студента}
date: record
{запись даты рождения студента}
year:integer; {год рождения}
month:1..12;
{номер месяца}
day:1..31
{число}
end;
b1,b2,b3,b4,b5:2..5;{поля баллов по дисциплинам}
sb: Real
{поле среднего балла}
End;
Чтобы обратиться к записи 3 уровня, нужно записать составное имя:
S.date.year:=1979.

Имена полей, составляющих запись, не должны повторяться.

Имя поля может совпадать с именем другой переменной. Например,
var p: record
p1:Integer;
{имя поля}
end;
p1:integer;
{имя переменной}
begin
p1:=2;
readln(p.p1);
writeln(p1,' ',p.p1);
p1:=p.p1;
writeln(p1,' ',p.p1);
end.

Присваивание значений одной записи другой возможно только при
полной идентичности описаний.
Описание 1
Type T=record
p1:Integer;
end;
Описание 2
Var p,q:record
p1:Integer;
end;
Описание 3
Var p: record
p1:Integer;
end;
Var p:T; q:T;
q: record
p1:Integer;
end;
3
Описания 1 и 2 дадут возможность осуществлять присваивания p:=q и
q:=p, при описании 3 это будет невозможно.
Массивы записей
Чтобы хранить в памяти ЭВМ информацию обо всех 25 студентах
группы, необходимо ввести массив gruppa, представляющий массив записей:
Var gruppa: Array[1..25] Of student;
Доступ к элементам массива можно осуществить двумя способами:
1.
Указанием имени переменной и имени поля. Например, чтобы
обратиться к году рождения 5-го по списку студента, нужно записать:
gruppa[5].date.god.
Ввод фамилий и оценок учащихся, т.е. элементов массива gruppa, можно
задать так:
For i: = 1 To 25 Do Begin
Readln (gruppa[i].fam);
Readln (gruppa[i].date);
Readln (gruppa [i].b1);
Readln (gruppa [i].b2);
Readln (gruppa [i].b3);
Readln (gruppa [i].b4);
Readln (gruppa [i].b5);
End;
2. Использованием оператора присоединения, который позволяет
осуществлять доступ к полям записи, таким образом, как если бы они были
простыми переменными.
Общий вид оператора присоединения:
With <имя записи> Do <оператор>.
Внутри оператора к компонентам записи можно обращаться только с
помощью имени соответствующего поля.
Пример 1.2. Использование оператора присоединения для заполнения
массива gruppa.
For i : = 1 To 25 Do
4
With gruppa [i] Do
Begin
Readln (fam);
Readln (date);
ReadLn (b1,b2,b3,b4,b5);
End;
Программа для решения рассматриваемой задачи может быть записана в
следующем виде:
Const m=25;
Type student = Record
fam : String[15];
date : String[10];
b1, b2, b3, b4, b5 :2..5;
sb : Real;
End;
Var gruppa : Array[1..m] Of student;
p : student;
i : Integer;
sbmax : Real;
Begin
For i:=1 To m Do
{ввод исходных данных}
With gruppa[i] Do Begin
Write ('Введите фамилию: ');
Readln(fam);
Write ('Введите дату рождения: ');
Readln(date);
Write ('Введите пять оценок: ');
ReadLn(b1,b2,b3,b4,b5);
End;
For i:=1 To m Do
{вычисление среднего балла}
With gruppa[i] Do
sb:=(b1+b2+b3+b4+b5)/5;
sbmax:=0;
{поиск максимального среднего балла}
For i:=1 To m Do
If gruppa[i].sb>=sbmax
5
Then sbmax:=gruppa[i].sb;
For i:=1 To m Do
{печать результатов}
If gruppa[i].sb=sbmax Then
With gruppa[i] Do
Writeln(fam:20,'-',date:15,’-‘,sb:6:3);
Readln;
End.
Записи с вариантами
При определении типа записи в нее можно включать вариантную часть.
Это означает, что разные переменные, хотя они относятся к одному типу, могут
иметь различные структуры.
Например, пусть необходимо задать информацию о некотором человеке,
указав фамилию и год рождения, а также, если это мужчина, то сообщить,
военнообязанный ли он и какую имеет специальность, а если это женщина, то
указать, замужем ли она и сколько имеет детей.
Используются две структуры записи:
Type pol=(m,w);
persona=record
fam:string[20];
godro:1900..2007;
case mw:pol of
m: (voen: boolean; spec:string[15]);
w: (merry: boolean; child:byte)
end;
var
p1, p2: persona;
Предложение CASE... OF, открывающее вариантную часть, внешне
похоже на соответствующий оператор выбора, но на самом деле лишь играет
роль своеобразного служебного слова, обозначающего начало вариантной
части. Именно поэтому в конце вариантной части не следует ставить END как
пару к CASE... OF. (После окончания вариантной части в записи не могут
появляться никакие другие поля, за ней все же стоит END, но лишь как пара к
RECORD).
6
К элементам вариантной части можно обращаться так же, как к
элементам фиксированной части записи:
p1.mw:=m; p1.voen:=true; p2.mw:=w;p2.child:=2;
В процессе выполнения программы в структуру записи включается тот
вариант, элементам которого в данный момент было присвоено значение. Как
только какому-либо элементу другого варианта присваивается некоторое
значение, в структуру записи включается этот вариант, а элементы
предыдущего варианта становятся неопределенными.

После вариантной части записи поля появляться не могут.

Имена полей, использующиеся в описании различных вариантов, не
должны повторяться в этой записи; нельзя также применять одно и то же имя в
общей и вариантной частях записи.

При записи варианта (списков элементов) обязательно наличие
круглых скобок, даже если в них ничего не заключается.

Вариантная часть может содержать другие записи, в том числе и с
вариантами. Степень вложенности записей в вариантной части не ограничена.
7
8
Download