X-Git-Url: http://svarog.pmf.uns.ac.rs/gitweb/?a=blobdiff_plain;ds=sidebyside;f=kodovi%2Fpolinomi%2FPOLINOML.MOD;h=74af962c988ff9ce1be426d931c151374d47dcef;hb=391e0a12d2593ab45a8a0ab56daab8858f922f1d;hp=405e485774b4a471e50e8144efd00549032398c5;hpb=53bb5a4bae8d6b444244829b6343a4c98a62958f;p=spa1skripta-public.git diff --git a/kodovi/polinomi/POLINOML.MOD b/kodovi/polinomi/POLINOML.MOD index 405e485..74af962 100644 --- a/kodovi/polinomi/POLINOML.MOD +++ b/kodovi/polinomi/POLINOML.MOD @@ -1,5 +1,5 @@ (* Modul za rad sa polinomima preko listi - verzija 2012, rev 1 *) + verzija 2014 *) IMPLEMENTATION MODULE PolinomL; FROM InOut IMPORT Write, WriteString, WriteLn, WriteCard, ReadCard, Done; @@ -72,6 +72,74 @@ BEGIN END END Stampaj; +PROCEDURE PostaviClan(k:REAL; st:CARDINAL; + VAR p:Polinom); +VAR + cilj, prethodni : Polinom; +BEGIN + cilj := p; + prethodni := NIL; + WHILE (cilj # NIL) AND (cilj^.st>st) DO + prethodni := cilj; + cilj := cilj^.veza; + END; + (* da li upisujemo vrednost ili sklanjamo clan *) + IF k#0.0 THEN + (* da li menjamo clan ili pravimo novi *) + IF (cilj # NIL) AND (cilj^.st = st) THEN + cilj^.k:=k; + ELSE + NEW(cilj); + cilj^.k := k; + cilj^.st := st; + cilj^.veza := NIL; + IF p = NIL THEN + p := cilj; + ELSIF prethodni = NIL THEN + cilj^.veza := p^.veza; + p := cilj; + ELSE + cilj^.veza := prethodni^.veza; + prethodni^.veza := cilj; + END; + END; + ELSE + (* da li postoji ovakav clan *) + IF (cilj # NIL) AND (cilj^.st = st) THEN + IF p = cilj THEN + p := p^.veza; + ELSE + prethodni^.veza:= prethodni^.veza^.veza; + END; + DISPOSE(cilj); + END; + END; +END PostaviClan; + +PROCEDURE KoeficijentUz(p:Polinom; st:CARDINAL):REAL; +VAR + tekuci : Polinom; +BEGIN + tekuci := p; + WHILE (tekuci#NIL) AND (tekuci^.st > st) DO + tekuci := tekuci^.veza; + END; + IF (tekuci # NIL) AND (tekuci^.st = st) THEN + RETURN tekuci^.k; + ELSE + RETURN 0.0; + END; +END KoeficijentUz; + +PROCEDURE MaksimalniStepen(p:Polinom):CARDINAL; +BEGIN + IF p#NIL THEN + RETURN p^.st; + ELSE + RETURN 0; + END; +END MaksimalniStepen; + PROCEDURE UbaciMonom(mon:Polinom; VAR p: Polinom); VAR stari, tekuci, kopija: Polinom; @@ -234,7 +302,8 @@ PROCEDURE Kolicnik(p1, p2: Polinom; VAR kol, ost: Polinom; VAR ok: BOOLEAN); novi^.k := - ost^.k / p2^.k; novi^.st := ost^.st - p2^.st; MonomPuta(p2, novi, pomocni); - Saberi(ost, pomocni, ost); + SaberiNa(pomocni, ost); + DisposePolinom(pomocni); novi^.k := - novi^.k; UbaciMonom(novi, kol); DISPOSE(novi); @@ -258,18 +327,19 @@ PROCEDURE PolinomNaN(p: Polinom; n: CARDINAL; VAR rez: Polinom); VAR i: CARDINAL; + pret : Polinom; BEGIN IF n = 0 THEN NEW(rez); rez^.k := 1.0; rez^.st := 0; rez^.veza := NIL; - ELSIF n = 1 THEN - Kopiraj( p, rez ); ELSE - rez := p; + Kopiraj( p, rez ); FOR i := 2 TO n DO - Puta(rez, p, rez) + pret := rez; + Puta(pret, p, rez); + DisposePolinom(pret); END END; END PolinomNaN;