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):

  1. 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í.
  2. 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

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);
    }
}
pjvomo/zlomky.txt · Last modified: 2011/08/16 22:33 (external edit)
Back to top
Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0