PJV - 1. cvičení - Zlomky
V tomto příkladu záměrně “flákám” dvě věci (budu se jim věnovat později):
- Výjimky. Řeším je tak, aby to jen indikovalo chybu. Správně by se měl použít správný typ v hierarchii, případně si výjimku udělat vlastní.
- Metody pro porovnávání (equals, hash, compareTo atd.). Momentálně nelze objekty zlomků porovnávat a tudíž je např. nelze řadit podle jejich číselných hodnot.
Zlomek.java
package pjv1; /** * Trida reprezentujici zlomek. * @author Martin Plicka * @version 1.0 */ public class Zlomek { /** * citatel */ protected int citatel; //protected nam umozni pristupovat k promenne z potomka /** * jmenovatel */ protected int jmenovatel; /** * Normalizuje zlomek. * Nedovoli, aby jmenovatel byl zaporny. Navic zlomek zkrati. */ private void norm() { //pokud je jmenovatel zaporny, otoc znamenka u citatele i jmenovatele if (jmenovatel < 0){ jmenovatel = -jmenovatel; citatel = -citatel; } /* * Neni to moc inteligentni algoritmus, ale mel by fungovat :-) * V cyklu for vyuzivame toho, ze jmenovatel je vzdycky kladny * (diky kodu vyse), takze podle nej muzem iterovat k nule. * * Pro hledani nejvetsiho spolecneho delitele jinak mame eukliduv alg. * * Na pouziti modula u zapornych cisel obecne pozor. * V Jave to nastesti funguje tak, jak potrebujeme. */ for (int i = jmenovatel; i>1; i--){ if (citatel % i == 0 && jmenovatel % i ==0){ jmenovatel = jmenovatel / i; citatel = citatel /i; return; } } } /** * Standardni konstruktor * @param citatel Citatel zlomku. * @param jmenovatel Jmenovatel zlomku, nesmi byt nulovy. * @throws Exception Pri nepovolenem vstupu. */ public Zlomek (int citatel, int jmenovatel) throws Exception{ if (jmenovatel == 0){ /* * Spravne bychom meli pouzit jinou vyjimku v hierarchii nebo * si vytvorit vlastni. * Vyjimkam se budeme venovat pozdeji. */ throw new Exception("Neplatny jmenovatel"); } this.citatel = citatel; this.jmenovatel = jmenovatel; //a ted normalizujeme hned po vytvoreni this.norm(); } /** * Pricte druhy zlomek a vrati vysledek. * @param z2 Druhy zlomek. * @return Vysledek souctu jako novy objekt. * @throws Exception */ public Zlomek plus(Zlomek z2) throws Exception{ /* * Jelikoz stejne musime kratit, nema smysl pocitat nejmensi spolecny * nasobek do jmenovatele. Kraceni za nas provede konstruktor vysledku. */ int cit = (citatel * z2.jmenovatel) + (z2.citatel * jmenovatel); int jm = jmenovatel * z2.jmenovatel; return new Zlomek(cit,jm); } /** * Vrati negaci zlomku. * @return Vraci negaci puvodniho zlomku jako novy objekt * @throws Exception */ public Zlomek neg() throws Exception{ return new Zlomek(- citatel, jmenovatel); } /** * Odecte druhy zlomek a vrati vysledek * @param z2 Druhy zlomek (mensitel). * @return Vysledek rozdilu jako novy objekt. * @throws Exception */ public Zlomek minus(Zlomek z2) throws Exception{ /* * Kod pro scitani a odecitani muze byt obecne treba slozity. * Abychom neduplikovali kod (odcitani se lisi jen znamenkem), * udelame tento trik a pouzijeme scitani a negaci druheho zlomku. */ return plus(z2.neg()); } /** * Vypocte soucin zlomku a vrati vysledek. * @param z2 Druhy zlomek soucinu. * @return Vysledek nasobeni jako novy objekt * @throws Exception */ public Zlomek krat(Zlomek z2) throws Exception{ /* * Nasobeni je jednoduche. */ return new Zlomek(citatel*z2.citatel, jmenovatel*z2.jmenovatel); } /** * Vypocte inverzi nenuloveho zlomku. * @return Vraci inverzi jako novy objekt * @throws Exception pri nulovem zlomku */ public Zlomek inv() throws Exception{ /* * Sice by to za nas udelal konstruktor, ale tady mame * moznost vyhodit lepsi popis chyby, takze to udelame. */ if (citatel == 0){ throw new Exception("Nelze provest inverzi nuly"); } return new Zlomek (jmenovatel, citatel); } /** * Vypocte podil dvou zlomku * @param z2 delitel * @return Vraci podil jako novy objekt * @throws Exception pri deleni nulou */ public Zlomek deleno(Zlomek z2) throws Exception{ /* * Stejne jako v pripade inverze, tady muzeme lepe popsat pricinu * deleni nulou. */ if (z2.citatel == 0){ throw new Exception("Nelze delit nulou"); } return krat(z2.inv()); } /** * Implicitni konverze na String * @return Vraci textovou podobu zlomku. */ @Override public String toString(){ return citatel + "/" + jmenovatel; } }
Příklad použití - Main.java
package pjv1; public class Main { public static void main(String[] args) throws Exception { Zlomek a = new Zlomek (2,12); Zlomek b = new Zlomek (1,3); Zlomek c = a.plus(b); Zlomek d = a.minus(b); Zlomek e = a.krat(b); Zlomek f = a.deleno(b); System.out.println(c); System.out.println(d); System.out.println(e); System.out.println(f); } }