Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
28
Добавлен:
23.03.2015
Размер:
47.62 Кб
Скачать

З А Д А Ч А №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

Соседние файлы в папке ЗАДАЧИ