====== 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 =====
{{:pjvomo:zlomek.html|Jak bude vypadat JavaDoc}}
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);
}
}