Песни о Паскале | страница 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. При тестировании программы входной файл содержал следующие строки.