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

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

Итоги

• Множества – это инструмент, взятый в Паскаль из математики.

• В Паскале применяют конечные множества, элементами которых могут быть числа, символы и булевы значения. Мощность множеств в Паскале не превышает 256.

• В Паскале предусмотрен ряд операций с множествами: объединение, пересечение, вычитание, сравнение, а также проверка на вхождение элемента в множество.

• Сравнение двух множеств дает булев результат, который используют в условных и циклических операторах.

• Операция IN – удобное средство для проверки вхождения одного элемента в множество, она тоже дает булев результат.

А слабо?

А) Найдите ошибки в следующих операторах.


>type TNumbers = set of 1..300;

>      TChars = set of char;

>      TBytes = set of byte;


>var c1, c2 : TChars;

>      b1, b2 : TBytes;

>begin

>      c1:= [1..9];

>      c2:= ['1'..'9'];

>      c2:= c2 + ’0’;

>      c2:= c2 + [0];

>      b1:= c1;

>      b2:= b1 + [1,7,3];

>      Writeln(b1=b2);

>      Writeln(1 in b2);

>      Writeln([1] in b2);

>      Writeln(b1 in b2);

>end.


Б) Напечатайте 20 случайных чисел в диапазоне от 1 до 50 так, чтобы каждое число встретилось в распечатке лишь по разу. Подсказка: после генерации числа функцией Random проверьте его на вхождение в множество уже напечатанных чисел.

В) Введите программу решения директорской задачи (см. предыдущую страницу), а затем запустите её в пошаговом режиме (клавишей F7). Перед запуском вставьте все переменные в окно обзора переменных «Watch» и проследите за их изменением. Напомню, что о средствах отладки рассказано в главе 21.

Глава 37

Ввод и вывод множеств



Мы узнали о множествах и приспособили их к директорской задаче. Чтобы покончить с нею доделаем ещё пару пустяков: организуем ввод и вывод множеств. Для ввода-вывода строк и простых типов данных годятся процедуры Read[ln] и Write[ln]. Но сейчас все не так просто, – эти процедуры не способны работать, ни с множествами, ни с другими сложными типами данных. Однако ж «нормальные герои всегда идут в обход», – пойдем так и на этот раз.

Вывод множества в текстовый файл

Начнем с вывода числового множества на экран (или в файл, – что одно и то же). Так мы получим средство для последующей проверки вводимых множеств.

Раз уж процедура Writeln не печатает множество одним махом, выведем каждый его элемент по отдельности – ведь это обычные числа или символы. Проверяя все возможные элементы множества, будем печатать лишь те, что входят в него – в этом основная идея. Напомню, что для такой проверки подходит операция IN. Дополнив её циклом со счетчиком, соорудим несложную процедуру распечатки числового множества. Вот она вместе с программой для её проверки.


>{ P_37_1 – вывод множества в файл }


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


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

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

>var k : integer;

>begin

>      for k:=1 to 255 do       { цикл по всем элементам множества}

>      if k in aSet       { если K входит в множество }

>      then Write(aFile, k:4);       { печатаем в строке }

>      Writeln(aFile); { по окончании – переход на следующую строку }

>end;

>      {----- Программа для проверки процедуры WriteSet -----}

>var S1 : TSet;       F: text;

>begin

>      Assign(F, ''); Rewrite(F); { связываем файл с экраном! }

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


Ввод множества из текстового файла.

Разобравшись с распечаткой множества, перейдем к вводу его из файла. Есть соображения на этот счет? Здесь пригодится опыт чтения чисел из строки текстового файла, – вспомните обработку классного журнала. Добавить число к множеству мы тоже умеем: для этого надо объединить его с множеством, состоящим из добавляемого числа. На этих идеях построена процедура ввода, показанная ниже вместе с тестирующей её программой.


Рекомендуем почитать
Зверь

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


Мираж

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


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

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


Мое Черное Сердце

Его мир это ночь. Злой дух. Живой мертвец. Слуга тьмы. Он продал свою душу ради любви. И теперь каждую ночь ровно в полночь он приходит в этот мир чтобы убивать. Тысяча невинных душ это цена одной души… той единственной. Ради любви к которой он покончил с собой и заключил сделку с дьяволом. Но черная испепеляющая страсть не самое возвышенное чувство, за которое он выдавал свою любовь. Но есть ли время, чтобы это понять? Поздно начинать жить, когда ты уже мертв. Будет ли у него шанс почувствовать искреннюю нежность, которая не разольется жгучим ядом по его венам?.


Зеркала

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


Шептунья

Легко ли быть не такой как все? Безусловно, если твои магические силы вызывают восхищение, страх или любые другие сильные эмоции. Но если это всего лишь непонятная смесь странностей? Что делать? И как быть, если родной отец вдруг «продаёт» пугающему вампиру, совершенно не интересуясь твоим мнением? Быть женой ненавистного существа или же попытаться скрыться, устроив всем незабываемое прощание?