Песни о Паскале | страница 149
>procedure WriteSet(var aFile: text; const aSet : TSet);
>var k : integer;
>begin
> for k:=1 to 255 do { цикл по всем элементам множества}
> if k in aSet { если входит в множество }
> then Write(aFile, k:4); { печатаем в строке }
> Writeln(aFile); { по окончании переход на следующую строку }
>end;
> {----- Программа для проверки процедуры ввода -----}
>var S1 : TSet; F, D: text;
>begin
> Assign(F, ''); Rewrite(F); { вывод на экран }
> Assign(D, ''); Reset(D); { ввод с клавиатуры }
> S1:= []; { перед вводом опустошаем множество }
> ReadSet(D, S1); { вводим множество из файла }
> WriteSet(F, S1); Readln; { распечатаем для проверки }
> Close(F); Close(D);
>end.
Полагаю, что комментарии поясняют все. Обязательно проверьте работу этой программы. Учтите, что вводить данные вы будете с клавиатуры: напечатайте в одной строке несколько чисел, разделяя их пробелами, а затем нажмите клавишу Enter.
Освоив ввод и вывод множеств, мы вплотную подошли к полному решению директорской задачи. Напомню, что суть решения заключается всего в одном операторе.
> R:= [1..250] – (S1 + S2 + S3);
Теперь добавим ввод и вывод множеств. Чтобы не занимать место повторами показанных ранее процедур, я представлю решение в целом.
>{ P_37_3 – решение директорской задачи, вариант 1 }
>const CMax = 20; { мощность множества, реально 250 }
>type TSet = set of 1..CMax; { объявление типа «множество» }
>procedure WriteSet(var aFile: text; const aSet : TSet);
>{ взять из P_37_2 }
>procedure ReadSet(var aFile: text; var aSet : TSet);
>{ взять из P_37_2 }
>var R, S1, S2, S3 : TSet;
> FileIn, FileOut: text;
>begin {----- Главная программа -----}
> { Открытие входного файла }
> Assign(FileIn, 'P_37_3.in'); Reset(FileIn);
> { Создание выходного файла }
> Assign(FileOut, 'P_37_3.out'); Rewrite(FileOut);
> { Ввод множеств из входного файла }
> S1:=[]; ReadSet(FileIn, S1);
> S2:=[]; ReadSet(FileIn, S2);
> S3:=[]; ReadSet(FileIn, S3);
> R:= [1..CMax] – (S1+S2+S3); { Решение }
> WriteSet(FileOut, R); { Вывод решения в выходной файл }
> Close(FileIn); Close(FileOut);
>end.
Для ввода и вывода множеств используем дисковые файлы, поэтому оператор Readln в конце программы не нужен. Для облегчения проверки я уменьшил число учеников – константу CMax – с 250 до 20. При тестировании программы входной файл содержал следующие строки.