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

Параметризованные абстракции данных

Типы —выгодные параметры для типов, точно так же, как и для процедур. Например, рассмотрим абстракцию общего на­бораset, в котором элементы набора могут быть произвольного типа. Конечно, не все типы могут быть имеющими смысл параме­трами общего набора. Так как общие наборыsetне хранят дубли­рующих друг друга элементов, должен быть некий способ опреде­лить, дублируют элементы друг друга или нет. Следовательно, спецификацияset, представленная на рис. 4.10,требует, чтобы элементы типа имели операциюequal. Эти требования помещены сразу после заголовка. (Требования на индивидуальные операции также разрешены; об этом мы будем говорить в следующем раз­деле.)

set = data type [t: type] is create, insert, delete, member, size, choose

Requires t имеет операцию

equal: proctype (t, t) returns (bool), т. e. условие равенства t

Описание

Общие наборы set —неограниченные математические наборы. Эти наборы изменяемые: операцииinsertиdelete , добавляют и уничтожают элементы набора.

Операции

create = proc ( ) returns (set [t ])

effectsВозвращает новый пустой набор

insert = proc (s : set [t], x: t)

modifies s

effectsДобавляетxк элементамs; послеinsertвозвращаетсяSpogi =sU{x},

delete = proc (s: set [t], x: t)

modifies; effects Удаляет x из s (т.е. Spost = s - {x}).

member == proc (s: set [t], x: t) returns (bool)

effectsВозвращаетx єs.

size = proc (s: set [t ]) returns (int)

effectsВозвращает число элементов вs.

choose» proc (s: set [t]) returns (t)

requiresнаборsне пуст

effectsВозвращает произвольный элементs.

endset

Рис. 4,10.Спецификация параметризованной абстракции данных.

Реализация общего набора setпоказана на рис. 4.11.Обра­тите внимание на предложение where,которое следует за заго­ловком; это предложение содержит синтаксическую часть пред­ложения requires,которая необходима для контроля типов. Реализация набораsetиспользует тип параметра tкак тип эле­ментов. Таким образом, представление в кластере набораsetесть:

гер =array[tJ

set ^cluster [t: type] is create, insert, delete, member, size, choose

where t has equal: proctype (t, t) returns (bool)

rep = array [t ]

create = proc ( ) returns (cvt) return (rep$new ( )) end create

insert = proc (s: cvt, x: t)

if ~ member (up (s), x) then rep$addh (s, x) end

end insert

delete = proc (s: cvt, x: t)

j: int := getind (s, x)

if j <= rep$high (s) then s [j ] := rep$top (s)

rep$remh (s)

end

end delete

member = proc (s: cvt, x: t) returns (bool)

return (getind (s, x) <= rep$high (s))

end member

size = proc (s: cvt) returns (int)

return (rep$size (s))

end size

choose = proc (s: cvt) returns (t)

return (rep$bottom (s))

end choose

getind = proc (s: rep, x: t) returns (int)

i: int := rep$low (s)

while i <= rep$high (s) do

if x = s [i] then return(i) end

% = короткая форма операции t$equal

i : = i+ I end return (i)

end getind

end set

Рис. 4.11. Реализация общего набораset.

Заголовок же операции insertследующий:

insert = proc (s: cvt, i: t)

Итак, там, где мы раньше использовали целочисленные опе­рации над элементами, теперь мы будем использовать t-операции. Таким образом, в операцииgetindмы используемt$eqiialдля проверки, принадлежит ли данный элемент набору. Заметим, чтоequal —единственная t-операция,используемая в кластере об­щего набораset.

Для использования процедуры setмы должны задать в качестве параметра тип.

psst =set[poly]

Это законный параметр для процедуры set, так как polyимеет операциюequal. Полученный тип имеет все перечисленные опе­рации, где в каждом случае имя параметра заменено на тип пара­метра, Например, операции дляpsetвключают в себя:

create = proc ( ) returns (pset)

insert = proc (s: pset, x: poly)

Лекция. Понятие об абстрактных типах данных (А.Т.Д.)

Hовый уровень абстракции в ЯП связан с понятием А.Т.Д. Появился в языках третьего поколения. Hаша цель - помочь программистам в составлении программ высокого

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

Лекція Проектирование цикла с помощью инварианта

Розглянемо задачу:

Задача 1. Найти такое i, при котором сумма величин 1 + ½ + 1/3 + … + 1/i впервые станет больше некоторого наперед заданного числа a.

АНАЛИЗ ЗАДАЧИ. Прежде всего выясним, что дано (предусловие P) и, что надо получить (постусловиеQ).

  1. P: Подготовить вещественное числоa.

  2. Q: 1 + ½+ 1/3 + … + 1/i > a & 1 + ½+ 1/3 + … + 1/(i-1)  a .

Разработаем стратегию решения задачи: будем последовательно накапливать n-ые частичные суммы, начиная отn=1.

  1. СТРАТЕГИЯ РЕШЕНИЯ ЗАДАЧИ: Последовательное получение величин Sn= 1 + ½ + 1/3 + … + 1/n, начиная отn=1.

Ясно, что решение задачи будет представлять собой цикл с неопределенным количеством повторений. В этом цикле будут последовательно формироваться n-ые частичные суммыSn. Номер частичной суммы будет определяться величинойn. Сформулируем инвариант цикла.

4) ИНВАРИАНТ ЦИКЛА I: <Частичная суммаSn> = 1 + ½ + 1/3 + … + 1/n.

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