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

Функция абстракции есть

% типичное рациональное число есть n/d

% Функция абстракции есть

% А (r) == r.num / r.denom

Исходя из этого представления, мы должны принять несколько решений: что делать с нулевым знаменателем, как хранить отри­цательные рациональные числа и хранить ли рациональные числа в сокращенной форме (т.е. когда числитель и знаменатель не имеют общего делителя). Мы решаем: исключить нулевой знаме­натель, представляй отрицательные рациональные числа с по­мощью отрицательного числителя и не хранить представления в сокращенной форме (для ускорения таких операций, как умно­жение). Таким образом, имеем

% Инвариант представления есть

% r.denom > 0

Давайте также решим находить сокращенную форму при про­верке двух рациональных чисел на равенство. Это мы можем сделать, используя процедуру gcd.

gcd = proc (n, d: int) returns (int)

requires n и d должны быть положительными

effects Возвращает макс. общий делитель n и d. ,

Реализация операции equal представлена на рис.2. Од­нажды найденные, сокращенные формы записываются в представ­ление, так как это ускоряет работу при последующих обраще­ниях к операции equal.

rep = record [num, denom: int] equal = proc (rl,. r2: cvt) returns (bool)

if rl.num = 0 then return (r2.num = 0)

elseif r2.num = 0 then return (false)

end

reduce (rl)

reduce (r2)

return (rl.num = r2.num cand rl.denom = r2.denom)

end equal

% reduce — внутренняя программа, приводящая ее аргумент к сокращенной

% форме

reduce proc (r: гер)

g: int := gcd (int$abs (r.num), r.denom)

r.num := r.num/g

r.denom := r.denom/g

end reduce

Рис. 2. Благоприятный побочный эффект.

Модификация представления, осуществляемая операцией equal, — благоприятный побочный эффект. Такие побочные эф­фекты часто используются для улучшения эффективности. Они возможны, если функция абстракции отображает различные эле­менты в один, так как тогда имеется много объектов представле­ния, которые представляют один и тот же абстрактный объект. Иногда полезно внутри реализации переходить от одного такого объекта представления к другому. Такой переход законен, так как новое представление соответствует тому же самому абстракт­ному объекту.

2

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