gitweb on Svarog

projekti pod git sistemom za održavanje verzija -- projects under the git version control system
PolinomL v1.0.2, doterivanja javadoca, dodat eksplicitan konstruktor
[spa1-materijali.git] / kodovi / polinomi / PolinomL.java
1 /**
2 * Polinom predstavljen listom monoma od kojih je svaki predstavljen svojim
3 * koeficijentom (tipa {@code double}) i stepenom (tipa {@code int}).
4 *
5 * U listi su monomi poredjani od najviseg do najnizeg stepena i svi monomi su
6 * razlicitog stepena. Monomi kojima je koeficijent jednak nula se ne cuvaju u
7 * listi.
8 *
9 * <p>Pomocni materijal za SPA1, DMI, PMF, UNS<br>
10 * <strong>v1.0.2</strong></p>
11 */
12 public class PolinomL {
14 /**
15 * Predstavlja jedan monom, odnosno njegov koeficijent i stepen, u listi
16 * monoma u polinomu.
17 */
18 public class Monom {
20 /** Koeficijent monoma. */
21 double k;
22 /** Stepen monoma. */
23 int st;
24 /** Pokazivac na sledeci monom u listi. */
25 Monom veza;
27 /** Kreira nov monom sa zadatim koeficijentom i stepenom. */
28 public Monom(double k, int st) {
29 this.k = k;
30 this.st = st;
31 this.veza = null;
32 }
34 /**
35 * Kreira nov monom jednak sa "1".
36 */
37 public Monom() {
38 this(1.0, 0);
39 }
41 public String toString() {
42 String res = "";
43 if (st != 0) {
44 if (Math.abs(k) != 1.0) {
45 res += k;
46 } else if (k == -1.0) {
47 res += '-';
48 }
49 res += 'x';
50 if (st != 1) {
51 res += "^" + st;
52 }
53 } else {
54 res += k;
55 }
56 return res;
57 }
58 }
60 /** pokazivac na prvi monom u listi monoma */
61 Monom prvi;
63 /**
64 * Kreira nov polinom jednak nuli.
65 */
66 public PolinomL() {
67 prvi = null;
68 }
70 public String toString() {
71 String res = "";
72 if (prvi == null)
73 res += 0.0;
74 else {
75 res += prvi;
76 Monom pom = prvi.veza;
77 while (pom != null) {
78 if (pom.k > 0)
79 res += "+" + pom;
80 else
81 res += pom;
82 pom = pom.veza;
83 }
84 }
85 return res;
86 }
88 /** Vraca nezavisnu kopiju tekuceg polinoma. */
89 public PolinomL kopija() {
90 PolinomL kopija = new PolinomL();
91 if (prvi != null) {
92 kopija.prvi = new Monom();
93 kopija.prvi.st = prvi.st;
94 kopija.prvi.k = prvi.k;
95 kopija.prvi.veza = null;
96 Monom pomocni = prvi.veza;
97 Monom tekuci = kopija.prvi;
98 while (pomocni != null) {
99 tekuci.veza = new Monom(pomocni.k, pomocni.st);
100 pomocni = pomocni.veza;
101 tekuci = tekuci.veza;
103 } else
104 kopija.prvi = null;
105 return kopija;
108 /** Ubacuje kopiju monoma mon u tekuci polinom. */
109 public void ubaciMonom(Monom mon) {
110 if (mon != null) {
111 if (prvi == null) {
112 prvi = new Monom(mon.k, mon.st);
113 } else {
115 Monom tekuci = prvi;
116 Monom stari = null;
118 while (tekuci != null && tekuci.st > mon.st) {
119 stari = tekuci;
120 tekuci = tekuci.veza;
123 if (tekuci != null && mon.st == tekuci.st) {
124 tekuci.k = mon.k + tekuci.k;
125 if (tekuci.k == 0.0) {
126 if (prvi == tekuci)
127 prvi = tekuci.veza;
128 else
129 stari.veza = tekuci.veza;
131 } else {
132 Monom kopija = new Monom(mon.k, mon.st);
133 kopija.veza = tekuci;
135 if (tekuci == prvi) {
136 prvi = kopija;
137 } else {
138 stari.veza = kopija;
145 /** Postavlja clan monoma na dati koeficijent, pri cemu se po potrebi menja postojeci monom,
146 * kreira novi monom ili brise monom. */
147 public void postaviClan(double k, int st) {
148 Monom cilj, prethodni;
149 cilj = prvi;
150 prethodni = null;
151 while (cilj != null && cilj.st > st) {
152 prethodni = cilj;
153 cilj = cilj.veza;
155 /* da li upisujemo vrednost ili sklanjamo clan */
156 if (k != 0.0) {
157 /* da li menjamo clan ili pravimo novi */
158 if (cilj != null && cilj.st == st) {
159 cilj.k = k;
160 } else {
161 cilj = new Monom();
162 cilj.k = k;
163 cilj.st = st;
164 cilj.veza = null;
165 if (prethodni == null) {
166 /* ili je prazan polinom, ili dodajemo na pocetak */
167 cilj.veza = prvi;
168 prvi = cilj;
169 } else {
170 cilj.veza = prethodni.veza;
171 prethodni.veza = cilj;
174 } else {
175 /* da li postoji ovakav clan - brisemo ga */
176 if (cilj != null && cilj.st == st) {
177 if (prvi == cilj)
178 prvi = prvi.veza;
179 else {
180 prethodni.veza = prethodni.veza.veza;
186 /** Vraca koeficijent uz monom zadat stepenom. */
187 public double koeficijentUz(int st) {
188 if (prvi != null) {
189 Monom tekuci = prvi;
190 while (tekuci != null && tekuci.st > st) {
191 tekuci = tekuci.veza;
193 if (tekuci != null && tekuci.st == st) {
194 return tekuci.k;
195 } else
196 return 0.0;
197 } else
198 return 0.0;
201 /** Vraca stepen polinoma. */
202 public int maksimalniStepen() {
203 if (prvi != null)
204 return prvi.st;
205 else
206 return 0;
209 /** Trazi od korisnika da unese novi polinom koji ce biti ubacen u tekuci. */
210 public void unos() {
211 int n;
212 try {
213 do {
214 System.out.print("Unesite broj monoma n (n>=0) ");
215 n = Svetovid.in.readInt();
216 } while (n < 0);
217 for (int i = 1; i <= n; i++) {
218 Monom novi = new Monom();
219 do {
220 System.out.print("Unesite koeficijent monoma br. " + i + ": ");
221 novi.k = Svetovid.in.readDouble();
222 } while (novi.k == 0);
223 do {
224 System.out.print("Unesite eksponent monoma br. " + i + ": ");
225 novi.st = Svetovid.in.readInt();
226 } while (novi.st < 0);
227 ubaciMonom(novi);
229 } catch (Exception e) {
230 e.printStackTrace();
234 /** Vraca novi polinom koji je jednak zbiru polinoma p2 i ovog polinoma. */
235 public PolinomL saberi(PolinomL p2) {
236 PolinomL zbir = kopija();
237 if (p2 != null) {
238 Monom pom = p2.prvi;
239 while (pom != null) {
240 zbir.ubaciMonom(pom);
241 pom = pom.veza;
244 return zbir;
247 /** Dodaje polinom p na tekuci polinom. */
248 public void saberiNa(PolinomL p) {
249 if (p != null) {
250 Monom pom = p.prvi;
251 while (pom != null) {
252 ubaciMonom(pom);
253 pom = pom.veza;
258 /** Menja znak tekucem polinomu. */
259 public void promeniZnak() {
260 Monom pom = prvi;
261 while (pom != null) {
262 pom.k = -pom.k;
263 pom = pom.veza;
267 /** Vraca novi polinom koji je jednak razlici izmedju tekuceg polinoma i p2.*/
268 public PolinomL oduzmi(PolinomL p2) {
269 if (p2 == null) {
270 return this.kopija();
273 PolinomL razlika = p2.kopija();
274 razlika.promeniZnak();
275 Monom pom = prvi;
276 while (pom != null) {
277 razlika.ubaciMonom(pom);
278 pom = pom.veza;
280 return razlika;
283 /** Vraca novi polinom koji je jednak ovom polinomu pomonomenom sa monom mon. */
284 public PolinomL monomPuta(Monom mon) {
285 if (mon != null && prvi != null) {
286 PolinomL mp = new PolinomL();
287 mp.prvi = new Monom();
288 mp.prvi.k = prvi.k * mon.k;
289 mp.prvi.st = prvi.st + mon.st;
290 Monom pom = prvi.veza;
291 Monom tekuci = mp.prvi;
292 while (pom != null) {
293 tekuci.veza = new Monom();
294 tekuci.veza.k = pom.k * mon.k;
295 tekuci.veza.st = pom.st + mon.st;
296 pom = pom.veza;
297 tekuci = tekuci.veza;
299 return mp;
301 return null;
304 /** Vraca novi polinom koji je jednak proizvodu tekuceg polinoma sa p2. */
305 public PolinomL puta(PolinomL p2) {
306 if (p2 != null && prvi != null) {
307 PolinomL pr = monomPuta(p2.prvi);
308 Monom pom = p2.prvi.veza;
309 while (pom != null) {
310 PolinomL pomocni = monomPuta(pom);
311 Monom pomocniMon = pomocni.prvi;
312 do {
313 pr.ubaciMonom(pomocniMon);
314 pomocniMon = pomocniMon.veza;
315 } while (pomocniMon != null);
316 pom = pom.veza;
318 return pr;
319 } else
320 return null;
323 /**
324 * Vraca niz dva polinoma od koji prvi predstavlja kolicnik, a drugi ostatak pri deljenju
325 * tekuceg polinom sa prosledjenim polinomom `delilac`.
326 */
327 public PolinomL[] kolicnik(PolinomL delilac) {
328 if (delilac != null) {
329 PolinomL ostatak = this.kopija();
330 PolinomL kolicnik = new PolinomL();
332 while (ostatak.prvi != null && ostatak.prvi.st >= delilac.prvi.st) {
333 Monom novi = new Monom();
334 novi.k = -ostatak.prvi.k / delilac.prvi.k;
335 novi.st = ostatak.prvi.st - delilac.prvi.st;
336 PolinomL pomocni = delilac.monomPuta(novi);
337 ostatak.saberiNa(pomocni);
338 novi.k = -novi.k;
339 kolicnik.ubaciMonom(novi);
342 PolinomL[] rez = { kolicnik, ostatak };
343 return rez;
345 return null;
348 /** Vraca novi polinom koji je jedank tekucem polinomu podignutom na stepen n. */
349 public PolinomL polinomNaN(int n) {
350 PolinomL rez;
351 if (n == 0) {
352 rez = new PolinomL();
353 rez.prvi = new Monom(1.0, 0);
354 } else {
355 rez = this.kopija();
356 for (int i = 2; i <= n; i++) {
357 PolinomL pret = rez;
358 rez = puta(pret);
361 return rez;
Svarog.pmf.uns.ac.rs/gitweb maintanance Doni Pracner