/** * Murtoluku2 kuvaa murtolukua, joka koostuu osoittajasta ja nimitt�j�st�. */ public class Murtoluku2 { private int osoittaja; private int nimittaja; /** * Luo uuden murtoluvun. * * @param os Osoittaja * @param nim Nimitt�j� */ public Murtoluku2(int os, int nim) { if (nim == 0) nim = 1; if (nim * os < 0) { // Mahdollinen etumerkki tulee aina osoittajaan this.osoittaja = - Math.abs(os); this.nimittaja = Math.abs(nim); } else { this.osoittaja = Math.abs(os); this.nimittaja = Math.abs(nim); } } /** * Kertoo murtoluvun osoittajan arvon. */ public int kerroOsoittaja() { return this.osoittaja; } /** * Kertoo murtoluvun nimitt�j�n arvon. */ public int kerroNimittaja() { return this.nimittaja; } /** * Laskee yhteen kaksi murtolukua. Summaa ei supisteta automaattisesti. */ public Murtoluku2 summa(Murtoluku2 toinenLuku) { Murtoluku2 uusiLuku; int osoittaja1, osoittaja2, nimittaja1, nimittaja2; osoittaja1 = this.osoittaja; osoittaja2 = toinenLuku.kerroOsoittaja(); nimittaja1 = this.nimittaja; nimittaja2 = toinenLuku.kerroNimittaja(); /* Lavennetaan luvut samannimisiksi */ osoittaja1 *= nimittaja2; osoittaja2 *= nimittaja1; nimittaja1 *= nimittaja2; /* Luodaan uusi murtoluku, johon summa tulee */ uusiLuku = new Murtoluku2(osoittaja1 + osoittaja2, nimittaja1); return uusiLuku; } /** * Laskee kahden murtoluvun tulon. */ public Murtoluku2 tulo(Murtoluku2 toinenLuku) { Murtoluku2 uusiLuku; uusiLuku = new Murtoluku2(this.osoittaja * toinenLuku.kerroOsoittaja(), this.nimittaja * toinenLuku.kerroNimittaja()); return uusiLuku; } /** * Vertaa, ovatko kaksi murtolukua samat. Palauttaa toden (true), * jos osoittaja ja nimitt�j� ovat samat. */ public boolean onkoSama(Murtoluku2 toinenLuku) { return (this.osoittaja == toinenLuku.kerroOsoittaja() && this.nimittaja == toinenLuku.kerroNimittaja()); } /** * Sievent�� murtoluvun. */ public void sievenna() { int luku1, luku2, syt; /* lasketaan osoittajan ja nimitt�j�n suurin yhteinen tekij� */ luku1 = Math.abs(this.osoittaja); luku2 = Math.abs(this.nimittaja); if (luku1 != 0) { while (luku1 != luku2) if (luku1 > luku2) luku1 = luku1 - luku2; else luku2 = luku2 - luku1; syt = luku1; /* sievennet��n */ this.osoittaja /= syt; this.nimittaja /= syt; } } /** * Palauttaa merkkijonoesityksen murtoluvusta muodossa * osoittaja/nimitt�j�. Esimerkiksi 5/6. */ public String toString() { return this.osoittaja + "/" + this.nimittaja; } }