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

4.4. Реализация полиномов

В следующем примере мы реализуем тип данных poly. Спе­цификация этого типа представлена на рис. 4.3. Полиномы мо­гут быть представлены массивами, в которых i-му элементу мас­сива соответствует коэффициент при i-м члене полинома. В мас­сивах хранятся коэффициенты только для членов, степень ко­торых не выше степени полинома; хранить коэффициенты при более старших членах необходимости нет (поскольку все они равны нулю). Точно так же, мы не храним младшие нулевые коэффи­циенты, и нулевой полином представляется пустым массивом. Если нижняя граница этого массива равна нулю, то его верхняя граница всегда будет равна степени полинома. Если между млад­шим и старшим ненулевыми членами полинома мало членов с ну­левыми коэффициентами, то это представление удачно, если же нет, как, например, у полинома х + х^, то неудачно, так как в мас^ сиве будет храниться много нулей.

Кластер, использующий это представление, показан ^ Р^- 4-7. ро1у= cluster is create, degree, coeff, add, minus, mul, sub, е-Ч"^ rep == array [int ]

create = proc (c, n: int) returns (cvt) if с = 0 then return (rep$new ( )) end % нулевой полином r: rep := rep$create (n) % степенью будет нижн. и верх. гра. нипа rep$addh (r, с) % добавить ненулевой коэффициент return (r) end create

degree = proc (p: cvt) returns (int) return (rep$high (p)) end degree

coeff == proc (p: cvt, n: int) returns (int) If n )rep$high (p) cor n (rep$low (p)

then return (0) else return (p [n]) end end coeff

add = proc (p, q: cvt) returns (cvt) % сделать p полиномом с началом у нижней границы if rep$low (q) (rep$low (p) then p, q := q, p end s: rep :^= rep$copy (p) % инициализировать s в p qhigh: int := rep$high (q) % расширить s 0-ми до верхней границы q while rep$high (s) (qhigh do rep$addh (s, 0) end

i: int :=== rep$low (q)

while i (= qhigh do % прибавить коэфф. q к s s [i] := s [i]+q [i] i:=i+ I end

while — rep$empty (s) do % удалить лишние нули справа и слева if rep$bottom (s) = 0 then rep$reml (s) elseif rep$top (s) = 0 then rep$remh (s) else return (s) end end

return (rep$new ( )) % нулевой полином end add

minus = proc (p: cvt) returns (cvt) i: int := rep$low (p) q: rep ;= rep$create (i) while i (= rep$high (p) do rep$addh (q, —p [i]) i:=i+ I end return (q) end minus

sub = proc (p, q: poly) returns (poly) return [p+ (~q)) % используются короткие формы end sub

mul = proc (p, q: cvt) returns (cvt) % проверка на умножение на нуль if rep$empty (p) cor rep$empty (q) then return (rep$new ( )) en»

Абстракции данных

&: rep := rep$create (rep$low (p) + rep$low (q))

% создание s с новой нижней границей

shigh: int := rep$high (p) + rep$high (q) % новая верхняя граница while rep$high (s) (shigh do % записать в s нули rep$addh (s, 0) end i: int := rep$low (p) phigh: int := rep$high (p) qlow: int := rep$low (q) qhigh: int := rep$high (q)

while i (= phigh do % осуществить умножение j: int := qlow while j (= qhigh do s [i+jl := s [i+jl+ P li] *q Ш j^j+l end i:=i+ I end return (s) endi mul

equal = proc (p, q: cvt) returns (bool) return (rep$similar (p, q)) end equal

end poly Рис. 4.7. Реализация типа данных poly.

Для этого представления легко реализуются операции create, degree и coeff. Операция create возвращает либо пустой массив (который представляет нулевой полином), либо массив с одним элементом, содержащий заданный коэффициент. Операция degree возвращает верхнюю границу массива; таким образом, она пред­полагает, что эта граница равна степени полинома. Выполнение этого требования гарантируется операцией create и операцией add, которая после произведения необходимых действий удаляет все лишние нули. Выполнение этого требования также гаранти­руется операцией mul, так как нули в старших или младших чле­нах могут возникнуть, только если один из вводных полиномов нулевой, этот же случай обрабатывается явно.

Операция equal просто обращается к операции similar для массивов, а эта операция возвращает значение true, если ее пара­метры имеют одинаковые нижние границы и одинаковые (оди­наковым образом расположенные) элементы, что нам как раз и требуется. Заметим, что операция equal для массивов не годится, так как она возвращает значение true, только если два ее ввод­ных массива являются одним и тем же объектом.

Имена операций над полиномами были выбраны так, чтобы они были достаточно коротки и удобны. Например, для операции add может использоваться р+q, а для операции minus может использоваться —р. Эти короткие формы используются при реа­лизации операции sub.

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