Песни о Паскале | страница 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.
Согласитесь, программа стала и гибче, и проще. Однако к первому её варианту мы ещё вернемся.
• Стандартные процедуры ввода и вывода не способны вводить и выводить множества, для этого создают специальные процедуры.
• Вывод (распечатка) множества выполняется циклом со счетчиком, внутри которого проверяется вхождение каждого элемента в множество.
• Ввод множества из текстового файла основан на операции объединения по отдельности прочитанных элементов.
А) Напишите процедуры для ввода и вывода множества символов. Можно ли здесь для счетчика цикла применить символьную переменную?
Б) Напишите функцию, принимающую числовое множество и возвращающую количество содержащихся в нём элементов.