Песни о Паскале | страница 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;

>      {----- Процедура распечатки множества в файл -----}