Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
delphi / песни о паскале.pdf
Скачиваний:
63
Добавлен:
26.03.2016
Размер:
5.16 Mб
Скачать

Глава 37

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

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 }

266

Глава 37

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

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.

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

Итоги

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

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

Ввод множества из текстового файла основан на операции объединения по отдельности прочитанных элементов.

Аслабо?

А) Напишите процедуры для ввода и вывода множества символов. Можно ли здесь для счетчика цикла применить символьную переменную?

Б) Напишите функцию, принимающую числовое множество и возвращающую количество содержащихся в нём элементов.

В) На основе первого варианта директорской программы придумайте способ поиска учеников, записавшихся более чем в один кружок. Или слабо?

Г) Напишите две функции, принимающие строку и возвращающие:

строку, в которой символы исходной строки встречаются лишь по разу и следуют в алфавитном порядке, например «PASCAL» à «ACLPS»;

то же, но порядок следования символов такой же, как в исходной строке,

например «PASCAL» à «PASCL».

267

Соседние файлы в папке delphi