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

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

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

Кластер, использующий это представление, показан ^ Р^- 4-7. ро1у=clusteriscreate,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) endcreate

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

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

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

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

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

Соседние файлы в папке Б. Лисков