Запись - описание комбинированного типа, состоящее из нескольких полей, каждое из которых имеет свой тип. Структура записи аналогична таблице.
Записи состоят из фиксированного числа компонентов, называемых полями записи. В отличие от массива компоненты (поля) записи могут быть различного типа.
Структура данных типа записи
Структура объявления типа "запись" имеет следующий вид:
TYPE < ИмяТипа > = RECORD
< поле1 >: < тип поля1 >;
< поле2 >: < тип поля2 >;
...
< полеN >: < тип поляN >
end;
Если тип нескольких полей совпадает, то имена полей можно перечислить через запятую. <ИмяТипа> и поля являются правильными идентификаторами.
Например:
TYPE
DENROGD = RECORD
name: string; {фамилия или имя }
den, mes: byte; {день, месяц}
god: word {год}
end;
Определение константы – записи будет иметь вид
<идентификатоp>: <тип_записи > = (<список_значений_полей>);
Список значений полей представляет собой список из последовательностей вида: имя поля, двоеточие и константа. Поля должны указываться в той же последовательности, в какой они перечислены в объявлении типа. Например:
TYPE POINT = record
x, y: real;
end;
CONST
p: POINT = (x:1; y:1);
Объявление переменных производится в разделе VAR:
VAR a, b: DENROGD;
Доступ к каждой компоненте записи производится указанием составного имени: имени переменной и затем через точку имени поля. Например:
a.name: = ' MARINA';
a.god: = 1991;
a.den: = 23;
a.mes: = 3;
Таким образом, в типе "запись" определена операция присваивания. Кроме того, как и в массиве, все значения переменных типа "запись" можно присваивать другим переменным того же типа: B:= A;.
Над полями можно выполнять действия, разрешенные для базового типа:
b.god: = а.god + 1; {на год старше}.
В качестве переменной может быть объявлен массив записей:
VAR s: array[1..20] of STUDENT;
Пример. Разработать программу формирования списка студентов с указанием дат рождения. Распечатать список в алфавитном порядке.
Program zapis;
Type {определение нового типа}
student = record {запись}
name: string[15];
den, mes: byte;
god: word
end;
Var
Z: ARRAY [1..20] OF student;
k, m, i, n: byte;
r: string[15]; {вспомогательная строка для перестановки}
BEGIN
writeln('ВВЕДИТЕ КОЛИЧЕСТВО СТУДЕНТОВ');
READln(n);
for i:=1 to n do
begin
writeLN('ВВЕДИТЕ имя ',i,' студента с прописной буквы');
readLN (z[i].name);
WRITELN('ВВЕДИТЕ день рождения');
readLN(z[i].den);
WRITELN('ВВЕДИТЕ месяц рождения');
readLN(z[i].mes);
WRITELN('ВВЕДИТЕ год рождения');
readLN(z[i].god);
end;
for I: = n downto 2 do {********* Упорядочение списка *********]
begin {поиск "наибольшего" значения поля NAME}
m:=1;
for k:=2 to i do if z[k].name > z[m].name then m:= k;
r:= z[i].name; {перестановка записей}
z[i].name:= z[m].name;
z[m].name:= r
end; {**************************************}
writeln(' Упорядоченный список ');
for i:=1 to n do
begin
WRITE(z[i].name);
WRITELN(' Дата рождения:', z[i].den, '.',z[i].mes, '.', z[i].god);
end
END.
Обработка полей записей
Для упрощения доступа к полям записи может использоваться оператор присоединения. Структура оператора имеет вид
WITH < переменная_Типа_Запись > DO < оператор >;
где WITH, DO - ключевые слова (с, делать).
Пример. WITH a DO // где a – запись, структуру см. в п. 11.1
begin
name:='MARINA';
god:=1991;
date:=23;
mes:=3
end;
Поле записи может иметь практически любой тип (массив, другая запись, множество). Доступ к вложенным элементам сложных структур, например к записи в записи, выполняется перечислением ряда полей через точку или оператор присоединения.
Пример. Определим вложенную запись (запись в записи)
TYPE
STUDENT = RECORD
name: string;
DenRogden: RECORD
den, mes: byte;
god: word
end;
end;
VAR z: STUDENT;
Имя DenRogden в свою очередь тоже является записью, тогда обращение к вложенным полям выполняется в виде
z.name:= 'LIZA';
z.DenRogden.god:= 1994;
Используя оператор присоединения, к этим же полям можно получить доступ другими способами:
WITH z DO
begin
name: = 'LIZA';
with DenRogden DO
god:= 1994;
end;
или
WITH z DO name:= 'LIZA';
WITH Z DO with DenRogden DO god:= 1994;
К полю GOD можно также обратиться и следующим оператором:
WITH z.DenRogden DO god:=1994;
Используя тип "запись", можно составить базы данных для разных назначений, а затем обрабатывать их с помощью программы [3–6]. При этом нужно следить, чтобы среди идентификаторов полей не было одинаковых.
Задания с обработкой записей
Задание 1
1. Ввести оценки студента по 5 экзаменам. Определить средний балл и подсчитать количество удовлетворительных, хороших и отличных оценок. Напечатать название предмета, если есть «неуд».
2. Дан список студентов и оценка каждого на экзамене (оценки на N экзаменах). Подсчитать количество удовлетворительных оценок, хороших, отлич- ных и средний балл в группе. Напечатать фамилии неуспевающих студентов.
3. Дан список студентов группы. Заполнить его следующими сведениями: фамилия, имя, отчество; имеет ли компьютер (если имеет, то какой и с какого года). Подсчитать сколько студентов имеют ПК.
4. Сформировать список студентов группы со следующими сведениями: фамилия, имя, отчество, знает ли языки программирования Pascal ABC, Cи (если да, где обучался и сколько лет). Подсчитать, сколько студентов знают язык Си, сколько – Pascal ABC, сколько – оба языка.
5. Сформировать список студентов группы, в котором указать фамилию (имя, отчество); город, в котором получил среднее образование (номер школы, если обучался в Омске). Подсчитать, сколько в группе иногородних студентов.
6. Сформировать запись «ключевые слова Pascal ABC»: слово и перевод. Подсчитать их количество. Организовать поиск: ключевое слово – перевод и наоборот.
7. Сформировать телефонный справочник. По номеру организовать поиск владельца, и наоборот.
8. Сформировать запись «Даты – праздники». Организовать в программе ввод дат, подсчитать число праздничных дней и рабочих.
9. Сформировать запись «английское слово – перевод». Вводя слово (английское или русское), найти перевод или выдать сообщение «нет в словаре». По возможности предусмотреть пополнение словаря.
10. Сформировать запись «операторы Pascal ABC»: оператор, действие. Подсчитать их количество и число операторов, имеющих повторяющиеся ключевые слова.
11. Сформировать запись «типы Pascal ABC»: имя, тип, операции, разрешенные в данном типе. Подсчитать количество разных операций и вывести списки типов для каждой операции.
12. Сформировать пополняемую базу данных «Континент – страны», в которой указать столицы, численность населения, крупные города. Организовать поиск страны по городу, стран или городов на континенте.
13. В файле задан список книг (автор, название, год издания). Разработать программу выбора книг, выпущенных ранее заданного года.
14. Сформировать список граждан, в котором указать фамилию, имя, отчество; адрес; профессию. Организовать в программе выборку и подсчет граждан с одинаковой профессией.
15. Сформировать список студентов группы, в котором указать фамилию, имя, отчество; день, число и месяц рождения. Организовать выборки по месяцу и году рождения.
16. Дан список студентов группы. Заполнить его следующими сведениями: фамилия, имя, отчество; день, число и месяц рождения. Распечатать список в порядке возрастания дат рождения.
17. Сформировать базу данных «Единицы измерения», в которой указать название единицы, обозначение, назначение, соотношение. Организовать поиск по любому полю.
18. Разработать базу данных «География. Реки», в которой указать название реки, местоположение, длину, глубину.
19. Разработать базу данных «Астрономия», в которой указать название звезды, величину, созвездие.
20. Разработать базу данных «Планеты солнечной системы», в которой указать название планеты, величину, удаленность, спутники.
21. Сформировать базу данных «Химические элементы», в которой указать название элемента, формулу, группу, организовать выборки.
22. Ввести сведения о человеке: фамилия, имя, отчество, пол, национальность, рост, вес, дата рождения.
23. Ввести сведения о гражданине: Ф.И.О., дата рождения, ИНН, № страхового свидетельства, № медицинского полиса. Запрограммировать поиск.
24. Сформировать справочник о спортивных командах: название, город, число сыгранных игр, число очков, количество игроков.
Задание 2
Дополнить программу для предыдущего задания заполнением и обработкой файлов. Имя файла вводить с клавиатуры в процессе работы программы.
Процедурные типы
Для организации передачи в качестве фактических параметров процедур и функций в Pascal ABC применяются два процедурных типа: тип-процедура и тип-функция. При объявлении процедурных типов используется только заголовок процедуры или функции, например:
TYPE
Proc1 = Procedure(a, b, c: real; var d: real);
Proc2 = Procedure(var b1, b2:byte);
Proc3 = Procedure;
Func = Function(x: real):real;
Func2 = Function(s: string): string;
Для объявления переменных процедурного типа используется запись:
VAR pr: proc1;
f: func;
Пример применения параметра – функции:
type Func = Function(x: real): real;
Function F1(x: real): real;
Begin
...
end;
Procedure FF(n: byte; F: Func);
Var...;
Begin
...
end;
BEGIN
...
FF(2,F1);... FF(5,F1);
END.