/** Le istanze di questa classe rappresentano frazioni ridotte ai minimi termini. * * @author Paolo Boldi * */ public class Frazione { /** Questo attributo contiene il numeratore della frazione semplificata, eventualmente con segno. * */ private int num; /** Questo attributo contiene il denominatore della frazione semplificata, sempre con segno positivo. * */ private int den; /** Questo costruttore costruisce una nuova frazione, semplificando i dati forniti dal chiamante. * * @param x il numeratore della frazione. * @param y il denominatore della frazione. */ public Frazione( int x, int y ) { boolean negativa = x * y < 0; x = Math.abs( x ); y = Math.abs( y ); this.num = x / Frazione.gcd( x, y ); this.den = y / Frazione.gcd( x, y ); if ( negativa ) this.num *= -1; } /** Questo costruttore costruisce una nuova frazione con denominatore 1. * * @param x il numeratore della frazione. */ public Frazione( int x ) { this( x, 1 ); } /** Questo metodo restituisce il numeratore della frazione su cui è invocato. * * @return il numeratore. */ public int getNumeratore() { return this.num; } /** Questo metodo restituisce il denominatore della frazione su cui è invocato. * * @return il denominatore. */ public int getDenominatore() { return this.den; } /** Restituisce il prodotto di f per la frazione su cui è invocato. * * @param f la frazione per cui moltiplicare il target. * @return il risultato della moltiplicazione. */ public Frazione per( Frazione f ) { Frazione risultato = new Frazione( this.num * f.num, this.den * f.den ); return risultato; } /** Restituisce il rapporto fra il target e f. * * @param f la frazione per cui dividere. * @return il risultato della divisione. */ public Frazione diviso( Frazione f ) { Frazione risultato = new Frazione( this.num * f.den, this.den * f.num ); return risultato; } /** Restituisce la somma di f e della frazione su cui è invocato. * * @param f la frazione a cui sommare il target. * @return il risultato della somma. */ public Frazione piu( Frazione f ) { int denRis = f.den * this.den; int numRis = f.num * this.den + f.den * this.num; Frazione risultato = new Frazione( numRis, denRis ); return risultato; } /** Restituisce la differenza fra il target e f. * * @param f il sottraendo. * @return il risultato della differenza. */ public Frazione meno( Frazione f ) { int denRis = f.den * this.den; int numRis = -f.num * this.den + f.den * this.num; Frazione risultato = new Frazione( numRis, denRis ); return risultato; } public String toString() { if ( this.den == 1 ) return "" + this.num; else return this.num + "/" + this.den; } /** Calcola e restituisce il MCD fra due interi dati. * * @param x il primo intero. * @param y il secondo intero. * @return il loro MCD. */ public static int gcd( int x, int y ) { int resto = x % y; while ( resto != 0 ) { x = y; y = resto; resto = x % y; } return y; } /** Restituisce true sse questa frazione è minore di f. * * @param f la frazione con cui fare il confronto. * @return true sse questa frazione è minore di f. */ public boolean isMinore( Frazione f ) { Frazione differenza = this.meno( f ); return differenza.num < 0; } /** Restituisce true sse questa frazione è maggiore di f. * * @param f la frazione con cui fare il confronto. * @return true sse questa frazione è maggiore di f. */ public boolean isMaggiore( Frazione f ) { return f.isMinore( this ); } /** Restituisce true sse questa frazione è uguale a f. * * @param f la frazione con cui fare il confronto. * @return true sse questa frazione è uguale a f. */ public boolean equals( Frazione f ) { return this.meno( f ).num == 0; } }