AlgStr / Библиотека / ЗАДАЧИ / INTSET0
.DOCЗ А Д А Ч А №1
РЕАЛИЗОВАТЬ подчеркнутые операции в соответствии с предложенной спецификацией, функцией абстракции и инвариантом представления.
ПРОВЕСТИ анализ создаваемого типа на полноту, изменяемость, обобщенность (или частичность).
РАЗБИТЬ операции типа на классы.
СПЕЦИФИКАЦИЯ
абстракции данных
"Наборы целых чисел intset"
intset = DATA TYPE IS create, insert, delete, member, size, choose,
equal, similar, copy, elems, destroy
ОПИСАНИЕ
Наборы целых чисел intset - это ограниченные математические множества целых чисел. Наборы целых чисел ИЗМЕНЯЕМЫЕ: операции insert и delete добавляют и удаляют целые числа из набора.
ОПЕРАЦИИ
create = function (SizeSet: word): PIntset
EFFECTS Возвращает указатель на новый, пустой набор intset размером SizeSet
insert = procedure (S: PIntset; X: integer);
MODIFIES S
EFFECTS Добавляет X к элементам S; после добавления - возвращает Spost = S U {X}, где Spost - это набор значений в S при возврате из insert.
delete = procedure (S: PIntset; X: integer);
MODIFIES S
EFFECTS Удаляет X из S (т.е. Spost = S – {X}).
member = function (S: PIntset; X: integer): boolean;
EFFECTS Возвращает значение true, если X принадлежит S.
size = function (S: PIntset): word;
EFFECTS Возвращает число элементов в S
choose = function (S: PIntset): integer;
REQUIRES Набор S не пуст.
EFFECTS Возвращает произвольный элемент S
equal = function (S1, S2: PIntset): boolean;
EFFECTS Возвращает значение true, если S1 и S2 - один и тот же объект.
similar = function (S1, S2: PIntset): boolean;
EFFECTS Возвращает значение true, если S1 и S2 содержат одинаковые элементы.
copy = function (S: PIntset): PIntset;
EFFECTS Возвращает новый объект intset, содержащий те же элементы, что и S.
elems = iter (s: PIntset) yields (int)
REQUIRES S не модифицируется в теле цикла.
EFFECTS Выдает элементы S в некотором произвольном порядке, причем каждый элемент только один раз.
destroy = proc(S: PIntset)
EFFECTS Уничтожает объект S с освобождением всей занимаемой им памяти.
END intset
Функция АБСТРАКЦИИ
для абстракции данных
"Наборы целых чисел intset"
------------------------ ФУНКЦИЯ АБСТРАКЦИИ -------------------------
г========================================================¬
¦ Дескриптор набора REP (Представление набора) ¦
¦ -------------¬ ========================== ¦
S1-----+->¦ MaxSize ¦ - Диапазон 0..MaxSize, хранимых в мно- ¦
¦ +------------+ жестве целых чисел (битовая шкала)¦
¦ ¦ PBody ¦ ¦
¦ L-----+------- ¦
¦ ¦ ¦
¦ ------+---------------------------------------------¬ ¦
¦ ¦ ¦ Тело набора целых чисел ¦ ¦
¦ ¦ ¦ ------------¬ (массив из нулей ) ¦ ¦
¦ ¦ ¦ MaxSize ¦///////////¦ (и единиц, выде- ) ¦ ¦
¦ ¦ ¦ +-----------+ (ленный в куче ) ¦ ¦
¦ ¦ ¦ ¦///////////¦ ¦ ¦
¦ ¦ ¦ +-----------+ ¦ ¦
¦ ¦ ¦ ...¦///////////¦ ¦ ¦
¦ ¦ ¦ +-----------+ ¦ ¦
¦ ¦ ¦ 2 ¦///////////¦ ¦ ¦
¦ ¦ ¦ +-----------+ ¦ ¦
¦ ¦ L--------> 1 ¦///////////¦ ¦ ¦
¦ ¦ L------------ ¦ ¦
¦ L---------------------------------------------------- ¦
L========================================================-
Принимаем решение: Набор целых чисел храним в виде массива нулей и единиц, начиная от первого элемента и до элемента с индексом Size (количество элементов в массиве). Причем целое число i будет храниться в множестве, если соответствующий элемент PBody^[i]=1.
Опишем это формально:
---------------------------------------------------------------------
Типичный непустой набор целых есть {x1, x2, ..., xn}
---------------------------------------------------------------------
ФУНКЦИЯ АБСТРАКЦИИ есть:
A(r) = { i | PBody^[i]=1 }
---------------------------------------------------------------------
ФУНКЦИЯ ИНВАРИАНТ ПРЕДСТАВЛЕНИЯ есть:
0 < MaxSize <= 65535