Две подпрограммы называются взаимно рекурсивными, если первая подпрограмма обращается ко второй, а вторая - к первой. Обычное описание таких подпрограмм невозможно, так как при этом вызов подпрограммы будет предшествовать ее описанию. Противоречие разрешается использованием опережающего описания. Описывается заголовок одной из подпрограмм, а тело ее заменяется ключевым словом forward. Затем описывается другая подпрограмма полностью, а после нее - неполный заголовок (без указания параметров) и тело первой подпрограммы:
Program pr1(x:real);
forward;
procedure pr2(...);
{описание тела с вызовом pr1}
procedure pr1;
{ описание тела с вызовом pr2 };
21. КОМБИНИРОВАННЫЙ ТИП (ЗАПИСЬ)
Комбинированный тип данных или тип запись - это структурированный тип, состоящий из компонентов, типы которых могут быть различны. Компоненты записей называются полями. Записи удобно использовать для хранения и обработки различных характеристик одного и того же объекта. Например, отдел кадров хранит и поддерживает в актуальном состоянии информацию о каждом сотруднике: фамилия, имя, отчество, пол, дата рождения, адрес, образование, оклад и т.п. Записи - основная структура данных, используемая в информационных системах.
Описание записи:
Идентификаторы - имена полей. Типы полей могут быть любыми.
Пример 1.
Const MaxLen = 25;
type t_range=1.. MaxLen;
t_date=record {Тип для работы с датами}
day : 1..31;
month : 1..12;
year : 0..9999
end; {end записано под соответствующим record}
t_student=record {Тип для хранения информации о студенте}
name : string[20];
birthday : t_date; {Поле-запись}
group : string[5];
marks : array[1..4] of 2..5
end;
t_group= array[t_range] of t_student;
var d1, d2 : t_date; {Переменные для хранения дат}
group : t_group;{Переменная для хранения информации о студентах группы}
Над записями, как едиными целыми, не определены никакие операции. Совместимость по присваиванию требует тождественности типов. Для описанных выше переменных допустимы присваивания:
d1:=d2; group[1]: =group[25].
Обращение к полю записи представляет собой составное имя:
Составное имя можно использовать везде, где допустим тип поля. Например, d1.day:=5; read(group[1].name). Имена полей записей могут совпадать с именами других переменных, при этом путаницы не возникает, так как обращение к ним иное. Например, group - массив, group[i] - элемент массива, group[i]. group - поле i-й записи.
Пример 2. Процедура для определения даты следующего дня невисокосного года:
Procedure next_date(d1: t_date; var d2: t_date);
{d1 - данная дата, d2 - результат (дата следующего дня)}
var max : 28..31; {число дней в месяце}
begin d2:=d1;
case d2.month of {Определение числа дней в заданном месяце}