Песни о Паскале - [74]

Шрифт
Интервал


>{ 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;

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

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


>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.


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

Итоги

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

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


Рекомендуем почитать
Там, где холод и ветер

Мы не меняемся. Мы просто становимся сами собой. Мы теряем, чтобы найти и расстаемся, чтобы встретиться.  ...Спустя несколько лет отсутствия, Хейз возвращается в родной город, желая забыть то, что не сложилось и начать строить жизнь заново. Все идет по плану, пока на пороге ее квартиры не появляется он. От автора: Вдохновение черпалось в кельтской мифологии, из которой взяты небольшие фрагменты. Все остальное - плоды фантазии автора) На достоверность описаний мест действия и прочих специфических моментов не претендую.


Дорога снов

В застывшем воздухе — дымы пожарищ. Бреду по раскисшей дороге. Здесь до меня прошли мириады ног. И после будут идти — литься нескончаемым потоком… Рядом жадно чавкает грязь. — тоже кто-то идет. И кажется не один. Если так, то мне остается только позавидовать счастливому попутчику. Ибо неизбывное одиночество сжигает мою душу и нет сил противостоять этому пламени.Ненависть повисла над дорогой, обнажая гнилые, побуревшие от крови клыки. Безысходность… Я не могу идти дальше, я обессилел. Но… все-таки иду. Ибо в движении — жизнь.


Зверь

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


Мираж

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


Он идет за мной

Главная героиня юная карьеристка, Татьяна Лунева, живет в своем неприметном городе, работает на не приметной работе и мечтает об отпуске. В один из июльских вечеров в ее жизнь врывается незнакомец. Он представляется как убийца теней и увозит ее в свой мир, что бы защитить от темных душ, охотившихся за ней. Вскоре Татьяна узнает, что она не просто человек, и что отныне ей придётся бороться за свою жизнь и свободу. Читайте захватывающие приключения юной девушки в мире призраков. И узнайте, каково быть человеком с серебреной душой.


Зеркала

Неожиданно подобранный с улицы кот может оказаться вовсе и не котом, а ещё выясняется, что зеркала способны перенести человека в совершенно иной мир. Благодаря тому самому не-коту, конечно же.