// ATTENZIONE: si noti che il testo riportato qui sotto e' in realta' // la concatenazione di DUE FILE diversi: Razionale.java ed Esempio1.java // La classe eseguibile e' ovviamente Esempio1, contenuta in Esempio1.java // ESERCIZIO: provare a leggere in input una sequenza di numeri razionali // e calcolarne la media espressa come numero reale. ///////////////////////////////////////////////////////////////////////// // FILE Razionale.java import java.util.Scanner; public class Razionale { private int numeratore; private int denominatore; public Razionale(int numeratore, int denominatore) { this.numeratore = numeratore; this.setDenominatore(denominatore); } public Razionale(int numeratore) { this.numeratore = numeratore; this.denominatore = 1; } public Razionale() { this.numeratore = 0; this.denominatore = 1; } public Razionale(Razionale r) { this.set(r); } public String toString() { return this.numeratore + "/" + this.denominatore; } public double toDouble() { return this.numeratore / (double) this.denominatore; } public int getNumeratore() { return numeratore; } public void setNumeratore(int numeratore) { this.numeratore = numeratore; this.semplifica(); } public int getDenominatore() { return denominatore; } public void setDenominatore(int denominatore) { if(denominatore != 0) { this.denominatore = denominatore; this.semplifica(); } else // se denominatore e' 0 lo settiamo a 1 per evitare una divisione per zero // (ma l'utente dovrebbe evitare di settare il denominatore a zero) this.denominatore = 1; } public void set(Razionale r) { this.numeratore = r.numeratore; this.denominatore = r.denominatore; } private void semplifica() { if(this.denominatore < 0) { this.numeratore *= -1; this.denominatore *= -1; } int d = Razionale.mcd(Math.abs(this.numeratore), denominatore); this.numeratore /= d; this.denominatore /= d; } private static int mcd(int a, int b) { while(true) { if(a == 0) return b; if(b == 0) return a; if(a > b) a -= b; else b -= a; } } public boolean ugualeA(Razionale r) { return this.toDouble() == r.toDouble(); } public boolean diversoDa(Razionale r) { return !this.ugualeA(r); } public boolean minoreDi(Razionale r) { return this.toDouble() < r.toDouble(); } public boolean minoreDiOUgualeA(Razionale r) { return this.toDouble() <= r.toDouble(); } public boolean maggioreDi(Razionale r) { return this.toDouble() > r.toDouble(); } public boolean maggioreDiOUgualeA(Razionale r) { return this.toDouble() >= r.toDouble(); } public void moltiplica(Razionale r) { this.numeratore *= r.numeratore; this.denominatore *= r.denominatore; this.semplifica(); } public void dividi(Razionale r) { Razionale tmp = new Razionale(r); tmp.inverti(); this.moltiplica(tmp); } public void inverti() { if(this.numeratore != 0) { int tmp = this.numeratore; this.numeratore = this.denominatore; this.denominatore = tmp; this.semplifica(); } } public void somma(Razionale r) { this.numeratore = this.numeratore * r.denominatore + r.numeratore * this.denominatore; this.denominatore *= r.denominatore; this.semplifica(); } public void sottrai(Razionale r) { Razionale tmp = new Razionale(r); tmp.moltiplica(new Razionale(-1)); this.somma(tmp); } public static Razionale leggi(Scanner input) { System.out.print("Numeratore: "); int n = input.nextInt(); System.out.print("Denominatore: "); int d = input.nextInt(); System.out.println(); return new Razionale(n, d); } } ///////////////////////////////////////////////////////////////////////// // FILE Esempio1.java /* * Verificare che l'output di questo programma sia corretto. */ public class Esempio1 { public static void main(String[] args) { Razionale r1 = new Razionale(1,2); System.out.println(r1 + " = " + r1.toDouble()); Razionale r2 = new Razionale(4,5); System.out.println(r2 + " = " + r2.toDouble()); Razionale r3 = new Razionale(r1); r3.moltiplica(r2); System.out.println(r3 + " = " + r3.toDouble()); r3.somma(r2); System.out.println(r3 + " = " + r3.toDouble()); r3.sottrai(r2); System.out.println(r3 + " = " + r3.toDouble()); r3.dividi(r2); System.out.println(r3 + " = " + r3.toDouble()); System.out.println(r3.ugualeA(r1)); } }