nextupprevious

Next:5.3.2 Упражнения
Up:5.3 Программы обработки записей
Previous:5.3 Программы обработки записей

5.3.1 Обработка анкет

Задача. Имеются анкеты женатых студентов, в которых каждая семья указала дату свадьбы и количество детей, а каждый из супругов сообщил о себе следующую информацию: факультет (физический, математический или химический), день рождения (месяц, число), и средний балл. Определить, есть ли среди анкетированных семей такие супруги, которые имеют детей, вступили в брак в день рождения одного из супругов, оба имеют средний балл больше трех, причем жена -- химик, а муж -- математик или физик. Решение. Структура входных данных адекватно описывается с использованием таких типов Паскаля, как дата, студент и анкета (см. программы АНКЕТЫ). Определив логические функции $F$ "анкета удовлетворяет заданным свойствам" и ПАУС "последовательность содержит анкету, удовлетворяющую заданным свойствам", получаем следующие соотношения: (1) ПАУС$(\Lambda)$ = False. (2) ПАУС$(\alpha)$$F(X)$or ПАУС$(\beta$) для любой $\alpha =X \parallel \beta$. Таким образом, если при вычислении ПАУС на заданной последовательности $\alpha$ встретился элемент $Х$, для которого $F(X)$ = True, то нет смысла продолжать вычисление, поскольку ответ найден: ПАУС$(\alpha$) = True. В программе АНКЕТЫ поиск обрывается в этом случае за счет использования логической переменной НЕТ -- "нет элемента с заданными свойствами в просмотренной части заданной последовательности".

program ОбработкаАнкет;
const ФИЗИК = 'F'; МАТЕМАТИК = 'M'; ХИМИК = 'C';
type ДАТА = record МЕСЯЦ: 1..12; ДЕНЬ: 1..31 end;
СТУДЕНТ = record ФАК:Char; РОЖД: ДАТА; БАЛЛ:Real end; АНКЕТА = record МУЖ, ЖЕНА:СТУДЕНТ; СВАДЬБА:ДАТА; ДЕТИ: 0..10 end;
var X:АНКЕТА; НЕТ:Boolean;
begin НЕТ := True; {$НЕТ \leftrightarrow \neg ПАУС(Input1)$} while НЕТ and not Eof do {Ограничивающее выражение:$\mid Input2 \mid \}$begin {Ввод очередной анкеты } Read(Х.МУЖ.ФАК,Х.МУЖ.РОЖД.МЕСЯЦ, Х.МУЖ.РОЖД.ДЕНЬ, Х.МУЖ.БАЛЛ, Х.ЖЕНА.ФАК, Х.ЖЕНА.РОЖД.МЕСЯЦ, Х.ЖЕНА.РОЖД.ДЕНЬ, Х.ЖЕНА.БАЛЛ, Х.СВАДЬБА.МЕСЯЦ,Х.СВАДЬБА.ДЕНЬ,Х.ДЕТИ); {Проверка условия } НЕТ := not ((Х.ЖЕНА.ФАК = ХИМИК)and ((Х.МУЖ.ФАК = ФИЗИК) or (Х.МУЖ.ФАК = МАТЕМАТИК)) and ((Х.ЖЕНА.РОЖД = Х.СВАДЬБА) or (Х.МУЖ.РОЖД = Х.СВАДЬБА)) and (Х.ДЕТИ $>$ 0) and (Х.МУЖ.БАЛЛ $>$ 3) and (Х.ЖЕНА.БАЛЛ $>$ 3)) end; {$НЕТ \leftrightarrow \neg ПАУС(Input)$} WriteLn('В списке представленных анкет'); if НЕТ then Write('отсутствует') else Write('имеется'); Write('анкета с заданными свойствами') end.


© В.Н. Касьянов, 2001