Песни о Паскале | страница 150




>2 11 4 13

>9 17 12 11 3 5 18

>14 2 13 15 20


А в выходной файл попали следующие числа.


>1 6 7 8 10 16 19


Легко убедиться в том, что никто из этих учеников не состоит в кружках.

Директорская задача, второй вариант

Итак, задача решена, но директор не вполне доволен. Сейчас возможности программы ограничены тремя кружками и двадцатью учениками. При изменении этих данных надо менять и программу, – мы избавимся от этого недостатка.

Во-первых, слегка изменим входной файл. Пусть первая его строка содержит количество учеников в школе; и тогда файл станет таким.


>20

>2 11 4 13

>9 17 12 11 3 5 18

>14 2 13 15 20


Во-вторых, отведем для участников кружков не три, а лишь одну переменную типа множество. Затем, по мере чтения строк файла, будем накапливать в этой переменной всех, кто состоит в кружках. Цикл чтения завершится по достижении конца входного файла. Вот и все изменения, посмотрите на второй вариант (процедуры ввода и вывода множеств только обозначены).


>{ P_37_4 – решение директорской задачи, вариант 2 }


>type TSet = set of byte; { объявление типа «множество» }


>{ Здесь надо поместить процедуры ввода и вывода множеств }

>procedure WriteSet(var aFile: text; const aSet : TSet);

>{ взять из P_37_2 }


>procedure ReadSet(var aFile: text; var aSet : TSet);

>{ взять из P_37_2 }

>var R, S : TSet;

>      FileIn, FileOut: text;

>      N: integer; { общее число учеников }

>begin

>      Assign(FileIn, ' P_37_4.in'); Reset(FileIn);

>      Assign(FileOut, ' P_37_4,out'); Rewrite(FileOut);

>      Readln(FileIn, N);       { читаем общее число учеников }

>      S:= []; { очищаем перед вводом }

>      { пока не конец файла, объединяем участников всех кружков }

>      while not Eof (FileIn) do ReadSet(FileIn, S);

>      R:= [1..N] – S;       { Решение }

>      WriteSet(FileOut, R);

>      Close(FileIn); Close(FileOut);

>end.


Согласитесь, программа стала и гибче, и проще. Однако к первому её варианту мы ещё вернемся.

Итоги

• Стандартные процедуры ввода и вывода не способны вводить и выводить множества, для этого создают специальные процедуры.

• Вывод (распечатка) множества выполняется циклом со счетчиком, внутри которого проверяется вхождение каждого элемента в множество.

• Ввод множества из текстового файла основан на операции объединения по отдельности прочитанных элементов.

А слабо?

А) Напишите процедуры для ввода и вывода множества символов. Можно ли здесь для счетчика цикла применить символьную переменную?

Б) Напишите функцию, принимающую числовое множество и возвращающую количество содержащихся в нём элементов.