- •Информационная модель предметной области
- •Моделирование задач на эвм
- •Преобразование информации при решении задачи на эвм
- •Понятие о данных
- •Абстрактные структуры данных
- •Классификация структур данных
- •14101954
- •Абстракция
- •Лекция 6. Види та методи абстракції в програмуванні. Абстракция через параметризацию
- •Абстракция через спецификацию
- •Виды абстракций
- •Лекция 7. Процедурна абстракція. Специфікація процедурної абстракції. Процедурная абстракция
- •Спецификации
- •Спецификации процедурных абстракций
- •Реализация процедур
- •Более обобщенные процедуры
- •Создание процедурных абстракций
- •Заключение
- •Лекция 8. Абстракція даних Абстракции данных
- •Спецификации для абстракций данных
- •Реализация на языке clu
- •Замечания по поводу операций up и down
- •Использование абстракций данных
- •Лекция 9. Реалізація абстракції даних. Функція абстракції. Функція інваріант подання.
- •Функция абстракции
- •Инвариант представления
- •Сохранение инварианта представления
- •Изменяемые представления
- •Параметризованные абстракции данных
- •Будем искать решение нашей задачи в виде цикла, имеющего следующий вид:
Замечания по поводу операций up и down
Полезно представлять себе операциюupкак окружение объ’екта типа представления непроницаемой заслонкой. Тому, кто использует операциюup, сквозь эту заслонку не видно представления. Значение объекта можно исследовать только вызовом примитивных операций, соответствующих типу объекта. Например, пользователь не видит массива, который представляет наборintset, но может сказать, какие элементы имеются в наборе, и может добавлять или удалять элементы, обращаясь к соответствующим операциям.
Операция downпроизводит обратное действие по отношению кup —она убирает заслонку. Если бы для пользователя имелась возможность обращаться к down,то ему было бы доступно конкретное представление абстрактного объекта и выгоды абстракции данных были бы утеряны. Поэтому языкCLUпозволяет использовать операцию downтолько в кластере, который реализует объект.
Чтобы избежать возникновения фальшивых объектов, ограничивается также и использование операции up.Если бы эту операцию можно было использовать вне определяющего кластера, было бы возможно создавать объекты, которые выглядели как объекты типа, но которые при передаче их операциям кластера в качестве аргумента имели бы другое, чем ожидается, представление, что приводило бы к всевозможным очень неприятным ошибкам. Поэтому, чтобы использование абстракций данных было выгодно, ограничение сферы применения операций upи down необходимо.
Как уже говорилось, если операцияdownиспользуется внутри кластера, то она убирает заслонку и представление объекта становится видимым. Однако это представление есть просто другой абстрактный объект, и он защищен заслонкой, сконструированной его собственной реализацией, которая может быть либо определенным пользователем кластером, либо частью реализации языкаCLU. Реальное представление объекта снова недоступно, но информация об объекте может быть получена при помощи операций. Так, внутри кластераintsetнам недоступна внутренняя структура массива, который реализуетintset, но мы можем исследовать и изменять интересующую нас информацию, используя операции работы с массивом.
Для операцийupиdown(и следовательно, дляcvt) не генерируется никакого объектного кода. Они лишь информируют компилятор о том, что способ рассмотрения объекта изменился. Компилятор использует эту информацию для контроля типов. Так как контроль типов производится во время компиляции, эта информация не нужна при выполнении, хотя она и может быть полезна для отладки.
Использование абстракций данных
Если абстракция данных определена, то она не отличается от встроенных типов и ее объекты и операции должны использоваться точно так же, как объекты и операции встроенных типов. Насколько это возможно, зависит от используемого языка программирования. В языке CLUмогут быть объявлены переменные нового типа. Как, например,i:intset. Создавать объекты и манипулировать ими можно следующим образом;
ii = intset$create ( ) intset$insert (i, 3)
На рис. 4.6представлена спецификация и реализация процедурыremove_dupls. Эта реализация использует тип данныхintsetдля запоминания уже имеющихся в массиве элементов. Определенные пользователем типы могут также использоваться для представления других определяемых пользователем типов. Например, если мы собираемся реализовать для банковской системы тип данныхaccount(счет), то может оказаться по лезным отслеживать индивидуальные вклады (deposits), снятия (withdrawls) и совокупный баланс (balance).
femove_dupls=proc(a: array int])
modifiesa
effectsУдаляет из а все дубли элементов. Нижняя граница а остается той же самой, но расположение оставшихся элементов может измениться. Например, если до обращения а = [1: 3, 13, 3, 6],то при возврате а имеет нижнюю границу 1 и содержит три элемента 3, 13 и 6, расположенных некоторым образом.
ai = array [int]
remove_dupls = proc (a: ai)
a_low: int :== ai$low (a)
i: int : = a_low j: int: = a_low
s: intset := intset$create () while i <= ai$high (a) do
if ~ intset$mernber (s, a [i])
then intset$insert (s, a [i]) % a [i] не дубль. Оставить его,
a [j] := a [i]
j:-j+i end i:=i+ 1
end
ai$trim (a, a_low, j - a_low) % удалить остальные элементы a
end remove_dupls
Рис, 4.6.Использование типа данныхintset.
Таким образом, мы можем иметь
гер = record [balance: int, deposits, withdrawls: intset ]
Здесь мы используем тип данных intsetдля представления счетов.