Песни о Паскале | страница 148
> S1:= [3, 10, 25]; { значение множества }
> WriteSet(F, S1); { печатаем }
> Readln;
> Close(F);
>end.
В первой строке объявлен тип данных TSet, он может содержать целые числа от 1 до 255. Процедура распечатки WriteSet принимает по ссылке два параметра: файловую переменную и множество, которое надо распечатать. Внутри процедуры работает цикл FOR, перебирающий все возможные элементы множества. Те из них, что содержатся в нём, печатаются в текущей строке. По завершении цикла оператор Writeln переводит позицию записи на следующую строку файла.
Обратите внимание: множество передано в процедуру по ссылке CONST. Передача в процедуры множеств, строк и других сложных типов данных по ссылкам CONST и VAR — это обычная практика. Так повышается скорость работы программ и уменьшается объём памяти, занимаемый параметрами.
Теперь взгляните на оператор Assign(F,''), который назначает файловой переменной пустое имя файла. Так файловая переменная связывается с экраном дисплея (при выводе данных), либо с клавиатурой (при вводе). А когда вам потребуется вывести результаты в дисковый файл, достаточно будет задать нужное имя файла, не меняя процедуры WriteSet (этот прием – подстановка пустого имени – не работает в Pascal ABCNet).
Примечание. В современные версии Паскаля (Delphi) для обработки множеств введён вариант цикла FOR-IN-DO. С ним распечатка множества станет ещё проще:
> for k in aSet do Write(aFile, k:4);
Разобравшись с распечаткой множества, перейдем к вводу его из файла. Есть соображения на этот счет? Здесь пригодится опыт чтения чисел из строки текстового файла, – вспомните обработку классного журнала. Добавить число к множеству мы тоже умеем: для этого надо объединить его с множеством, состоящим из добавляемого числа. На этих идеях построена процедура ввода, показанная ниже вместе с тестирующей её программой.
>{ P_37_2 – ввод и вывод числового множества }
>type TSet = set of 1..255; { объявление типа «множество» }
> {----- Процедура чтения множества из файла -----}
>procedure ReadSet(var aFile: text; var aSet : TSet);
>var k : integer;
>begin
> aSet:= [];
> While not Eoln(aFile) do begin { пока не конец строки }
> Read(aFile, K); { читаем очередное число }
> aSet:= aSet+[K]; { и добавляем к множеству }
> end;
> Readln (aFile); { переход на следующую строку }
>end;
> {----- Процедура распечатки множества в файл -----}