Java - trieda Ratio: Rozdiel medzi revíziami
(Vytvorená stránka „__NOTOC__ Category:Java Aj keď Java obsahuje obrovské množstvo hotových tried z najrozličnejších oblastí (celá kolekcia tried je označovaná ako Java Platform…“) |
|||
Riadok 88: | Riadok 88: | ||
System.out.println("a= " + a); | System.out.println("a= " + a); | ||
</source> | </source> | ||
− | Druhým problémom našej triedy je, že po každej matematickej operácii nám narastá numerická hodnota čitateľa aj menovateľa a teoreticky sa môžeme po nejakej dobe dostať k limitným hodnotám pre dátový typ určujúci ich numerický rozsah. Zmena dátového typu na väčší tento problém neodstráni, len potenciálne oddiali. Riešením je po každej numerickej operácii predeliť čitateľa aj menovateľa najväčším spoločným deliteľom a tým uržiavať čitateľa aj menovateľa na minimálnej možnej numerickej hodnote. | + | Druhým problémom našej triedy je, že po každej matematickej operácii nám narastá numerická hodnota čitateľa aj menovateľa a teoreticky sa môžeme po nejakej dobe dostať k limitným hodnotám pre dátový typ určujúci ich numerický rozsah. Zmena dátového typu na väčší tento problém neodstráni, len potenciálne oddiali. Riešením je po každej numerickej operácii predeliť čitateľa aj menovateľa najväčším spoločným deliteľom a tým uržiavať čitateľa aj menovateľa na minimálnej možnej numerickej hodnote. K tomu nám poslúži metóda ''nsd'', ktorá zároveň aj upraví čitateľa a menovateľa. Pretože je zrejmé, že takéto úpravy môže robiť len objekt triedy v rámci vlastných 'kompetencií', '''nie je''' táto metóda deklarovaná ako ''public'', vyvolávajú ju ale interne metódy triedy. |
+ | <source lang="java"> | ||
+ | public class Ratio{ | ||
+ | .... | ||
+ | void nsd() { //prevod do základného tvaru | ||
+ | int i = cit, j = men; | ||
+ | |||
+ | while(j!=0) { int k=i%j; i=j; j=k; } | ||
+ | |||
+ | cit = cit/Math.abs(i); | ||
+ | men = men/Math.abs(i); | ||
+ | } | ||
+ | .... | ||
+ | } | ||
+ | </source> | ||
+ | |||
+ | Celý zdrojový text triedy |
Verzia zo dňa a času 23:17, 7. marec 2010
Aj keď Java obsahuje obrovské množstvo hotových tried z najrozličnejších oblastí (celá kolekcia tried je označovaná ako Java Platform), pri riešení špecifických problémov musíme vytvárať vlastné triedy. Naše triedy môžu samozrejme pracovať a využívať hotové triedy Javy ako aj iné naše vlastné triedy. Predstavme si, že sme postavení pred úlohu, pre našeho známeho, ktorý sa zaoberá numerickou matematikou, vytvoriť triedu, ktorá bude simulovať počítanie s racionálnymi číslami, t.j. číslami, ktoré sa dajú zobraziť pomocou celočíselného zlomku. Napriek tomu, že saa Vám môže zdať táto úloha dosť bizardná, treba si uvedomiť, že takúto triedu môžeme využiť aj napr. pri testovaní a tvorbe algoritmov pre malé mikrokontroléry, ktroré poznajú len celočíselnú aritmetiku.
Trieda Ratio
Pri návrhu našej triedy vychádzajme z vyšššie uvedenej 'špecifikácie'. Trieda bude obsahovať celočíselné (int) atribúty cit a men, ktoré budú reprezentovať čitateľ a menovateľ zlomku. Zároveň vytvoríme aj sadu konštruktorov pre inicializáciu našich objektov. Objekty (buducej) triedy Ratio chceme vytvárať nasledujúcimi spôsobmi
Ratio x=new Ratio(); // vytvori objekt 0/1
Ratio y=new Ratio(5); // vytvori objekt 5/1
Ratio z=new Ratio(3,4); // vytvori objekt 3/4
Základom triedy Ratio potom bude nasledujúca konštrukcia, v ktorej zadefinujeme dátovú štruktúru triedy a potrebné konštruktory. Treba si uvedomiť, že konštruktor Ratio() prekrýva štandardný konštruktor triedy, ktorý inicializuje objekt s default hodnotami premenných, v našom prípade by bol čitateľ aj menovateľ inicializovaný hodnotou 0.
public class Ratio {
int cit; //bez public - default visibility
int men; //skryté pre iné balíky
public Ratio() { //konštruktor prekrývajúci default konštr.
cit = 0;
men = 1; //defaultne by menovateľ bol 0
}
public Ratio(int cit) { //konštruktor definujúci len čitateľ
this.cit = cit;
men = 1;
}
public Ratio(int cit, int men) { //štand. konštruktor
this.cit = cit;
this.men = men;
}
}
Modifikátor public pred deklaráciou konštruktora znamená, že uvedený konštruktor a/alebo metódu môže zavolať (používať) ľubovolná iná časť kódu Vašeho programu. Metódy a premenné, ktoré takto ozanačené nie sú, môže pouzívať len kód triedy samotnej (pomocné metódy a pod.) alebo v hierarchii dedenia (vysvetleneé neskôr) potomkovia triedy.
Samozrejme, takáto trieda nie je v tomto stave použiteľná pre reálne počítanie. Musíme ju doplniť metódami, ktoré nám minimálne umožnia racionálne čísla spočítať, odčítať, deliť a násobiť.
Metódy triedy Ratio
Prvou z metód, ktorými potrebujeme našu triedu doplniť, je metóda, pomocou ktorej si môžeme naše objekty zobrazit (vytlačiť) v tvare zlomku
public class Ratio {
...
public void tlac() { //len výpis
System.out.println(cit + " / " + men);
}
...
}
Matematické metódy doplníme tak, aby implementovali všeobecne známe pravidlá pre počítanie s racionálnymi číslami. Musíme si uvedomiť, že operácia spočítania dvoch čísel (všeobecne) nemení hodnotu oboch sčítancov, takže výsledkom súčtu je nove číslo. Pre spočítanie dvoch racionálnych čísel vytvoríme metódu add, obdobným spôsobom (pre rešpektovaní matematických pravidiel) si vytvoríte aj ďalšie metódy.
public class Ratio {
...
public Ratio add(Ratio b) {
int tmpcit = cit*b.men + men*b.cit;
int tmpmen = men*b.men;
return new Ratio(tmpcit,tmpmen);
...
}
Našu triedu Ratio už môžeme otestovať. K tomuto vytvoríme triedu TestRatio, v ktorej si napíšeme krátky test triedy
public class TestRatio {
public static void main(String[] args) {
Ratio a = new Ratio(2,3), b = new Ratio(1,3), c = new Ratio();
a.tlac(); // kontrolný výpis
b.tlac(); // kontrolný výpis
c=a.add(b); // príkaz pripočítania
System.out.println();
a.tlac(); // kontrolný výpis
b.tlac(); // kontrolný výpis
c.tlac(); // výsledok
}
}
Tunning triedy Ratio
Naśu triedu Ratio (po doplnení ostatnými metódami) už môžeme používať, nie je ale zatial 'kompatibilná' s ostatnými metódami javy, napr. nemôžeme v programe našu triedu použiť ako argument metódy pre štandardný výstup System.out.println(). Aby sme mohli našu triedu používať ako bežnú triedu, premenujeme metódu tlac() na metódu toString(). Táto metóda je volaná automaticky pri tlačení objektov na konzolu a môžeme v nej zadefinovať nami zvolenú textovú reprezentáciu objektu.
System.out.println("a= " + a);
Druhým problémom našej triedy je, že po každej matematickej operácii nám narastá numerická hodnota čitateľa aj menovateľa a teoreticky sa môžeme po nejakej dobe dostať k limitným hodnotám pre dátový typ určujúci ich numerický rozsah. Zmena dátového typu na väčší tento problém neodstráni, len potenciálne oddiali. Riešením je po každej numerickej operácii predeliť čitateľa aj menovateľa najväčším spoločným deliteľom a tým uržiavať čitateľa aj menovateľa na minimálnej možnej numerickej hodnote. K tomu nám poslúži metóda nsd, ktorá zároveň aj upraví čitateľa a menovateľa. Pretože je zrejmé, že takéto úpravy môže robiť len objekt triedy v rámci vlastných 'kompetencií', nie je táto metóda deklarovaná ako public, vyvolávajú ju ale interne metódy triedy.
public class Ratio{
....
void nsd() { //prevod do základného tvaru
int i = cit, j = men;
while(j!=0) { int k=i%j; i=j; j=k; }
cit = cit/Math.abs(i);
men = men/Math.abs(i);
}
....
}
Celý zdrojový text triedy