AlgStr / Библиотека / ЗАДАЧИ / INTSET5
.DOCЗ А Д А Ч А №6
РЕАЛИЗОВАТЬ подчеркнутые операции в соответствии с предложенной спецификацией, функцией абстракции и инвариантом представления.
ПРОВЕСТИ анализ создаваемого типа на полноту, изменяемость, обобщенность (или частичность).
РАЗБИТЬ операции типа на классы.
СПЕЦИФИКАЦИЯ
абстракции данных
"Наборы целых чисел 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 ¦ - Max размер выделенной памяти ¦
¦ +------------+ ¦
¦ ¦ Size ¦ - Размер заполненной части массива ¦
¦ +------------+ ¦
¦ ¦ PBody ¦ ¦
¦ L-----+------- ¦
¦ ¦ ¦
¦ ------+---------------------------------------------¬ ¦
¦ ¦ ¦ Тело набора целых чисел ¦ ¦
¦ ¦ ¦ ------------¬ (массив элементов,)¦ ¦
¦ ¦ ¦ MaxSize ¦-----------¦ (выделенный в куче)¦ ¦
¦ ¦ ¦ +-----------+ ¦ ¦
¦ ¦ ¦ ...¦-Свободно--¦ ¦ ¦
¦ ¦ ¦ +-----------+ ¦ ¦
¦ ¦ ¦ ¦-----------¦ ¦ ¦
¦ ¦ ¦ +-----------+ ¦ ¦
¦ ¦ ¦ Size ¦///////////¦ ¦ ¦
¦ ¦ ¦ +-----------+ ¦ ¦
¦ ¦ ¦ ...¦///////////¦ ¦ ¦
¦ ¦ ¦ +-----------+ ¦ ¦
¦ ¦ ¦ 3 ¦/Заполнено/¦ ¦ ¦
¦ ¦ ¦ +-----------+ ¦ ¦
¦ ¦ ¦ 2 ¦///////////¦ ¦ ¦
¦ ¦ ¦ +-----------+ ¦ ¦
¦ ¦ L--------> 1 ¦///////////¦ ¦ ¦
¦ ¦ L------------ ¦ ¦
¦ L---------------------------------------------------- ¦
L========================================================-
Принимаем решение: Набор целых чисел храним в виде массива целых чисел с повторением, начиная от первого элемента и до элемента с индексом Size (количество заполненных элементов массива).
Опишем это формально:
---------------------------------------------------------------------
Типичный непустой набор целых есть (x1, x2, ..., xn)
---------------------------------------------------------------------
ФУНКЦИЯ АБСТРАКЦИИ есть:
A(r)= { <уникальные элементы массива> }
Для представления пустого набора принимаем Size = 0.
---------------------------------------------------------------------
ФУНКЦИЯ ИНВАРИАНТ ПРЕДСТАВЛЕНИЯ есть:
0 < MaxSize <= 65536 div 2 &
0 <= Size <= MaxSize