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

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) %расширить s0-ми до верхней границы 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