Next:5.3.2
Упражнения
Up:5.3
Программы обработки записей
Previous:5.3
Программы обработки записей
5.3.1 Обработка анкет
Задача. Имеются анкеты женатых студентов, в которых каждая семья
указала дату свадьбы и количество детей, а каждый из супругов сообщил о
себе следующую информацию: факультет (физический, математический или химический),
день рождения (месяц, число), и средний балл. Определить, есть ли среди
анкетированных семей такие супруги, которые имеют детей, вступили в брак
в день рождения одного из супругов, оба имеют средний балл больше трех,
причем жена -- химик, а муж -- математик или физик. Решение. Структура
входных данных адекватно описывается с использованием таких типов Паскаля,
как дата, студент и анкета (см. программы АНКЕТЫ). Определив логические
функции
"анкета удовлетворяет заданным свойствам" и ПАУС "последовательность
содержит анкету, удовлетворяющую заданным свойствам", получаем следующие
соотношения: (1) ПАУС
= False. (2) ПАУС
= or
ПАУС)
для любой .
Таким образом, если при вычислении ПАУС на заданной последовательности
встретился элемент ,
для которого
= True, то нет смысла продолжать вычисление, поскольку ответ найден: ПАУС)
= 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; {}
while
НЕТ and not Eof do {Ограничивающее выражение:begin
{Ввод очередной анкеты } Read(Х.МУЖ.ФАК,Х.МУЖ.РОЖД.МЕСЯЦ, Х.МУЖ.РОЖД.ДЕНЬ,
Х.МУЖ.БАЛЛ, Х.ЖЕНА.ФАК, Х.ЖЕНА.РОЖД.МЕСЯЦ, Х.ЖЕНА.РОЖД.ДЕНЬ, Х.ЖЕНА.БАЛЛ,
Х.СВАДЬБА.МЕСЯЦ,Х.СВАДЬБА.ДЕНЬ,Х.ДЕТИ); {Проверка условия } НЕТ
:= not ((Х.ЖЕНА.ФАК = ХИМИК)and ((Х.МУЖ.ФАК = ФИЗИК)
or
(Х.МУЖ.ФАК = МАТЕМАТИК)) and ((Х.ЖЕНА.РОЖД = Х.СВАДЬБА)
or
(Х.МУЖ.РОЖД = Х.СВАДЬБА)) and (Х.ДЕТИ
0) and (Х.МУЖ.БАЛЛ
3) and (Х.ЖЕНА.БАЛЛ
3)) end; {}
WriteLn('В списке представленных анкет'); if НЕТ then Write('отсутствует')
else
Write('имеется'); Write('анкета с заданными свойствами') end.
© В.Н. Касьянов, 2001