X-Git-Url: http://svarog.pmf.uns.ac.rs/gitweb/?p=spa1skripta-public.git;a=blobdiff_plain;f=kodovi%2Fpolinomi%2FPOLINOML.MOD;fp=kodovi%2Fpolinomi%2FPOLINOML.MOD;h=20e64ea213815df5f7f1f41fb2a0afa7f52da290;hp=405e485774b4a471e50e8144efd00549032398c5;hb=5032b8ef31be8b199297901b7fe1ec2c6dccea37;hpb=74eec3956c02c387de6afb0839d112544881cd3e diff --git a/kodovi/polinomi/POLINOML.MOD b/kodovi/polinomi/POLINOML.MOD index 405e485..20e64ea 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; @@ -205,7 +273,7 @@ END MonomPuta; PROCEDURE Puta(p1, p2: Polinom; VAR pr: Polinom); VAR - pomocni: Polinom; + pomocni, brisi: Polinom; BEGIN Anuliraj(pr); IF (p1 <> NIL) AND (p2 <> NIL) THEN @@ -215,7 +283,9 @@ BEGIN MonomPuta(p1, p2, pomocni); REPEAT UbaciMonom(pomocni, pr); + brisi := pomocni; pomocni := pomocni^.veza + DISPOSE(brisi); UNTIL pomocni = NIL; p2 := p2^.veza END @@ -234,7 +304,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 +329,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;