class Fraz{ // frazioni aventi numeratore e denominatore interi final static int uno = 1; // tutti i metodi non-statici della classe 'vedono' i seguenti due campi: private int num, // questo puo` anche essere negativo (o nullo) denum; // questo obbligatoriamente positivo public Fraz( int n, int denum ){ assert denum != 0; // sotituire con il lancio di un'eccezione sanabile altrove num = n; this.denum = denum; // mettiamo in salvo il parametro nel campo // che ha il suo stesso nome // dall'embrione al feto num *= sg( denum ); this.denum *= sg( denum ); // dal feto all'oggetto compiuto int mmm = mcd( abs( num ), this.denum ); num = num / mmm; this.denum /= mmm; } public Fraz( int n ){ // modella l'intero num = n; denum = uno; } // Il metodo che segue verra` invocato cosi`: // Fraz.somma( fr1, fr2 ); public static Fraz somma( Fraz primoAddendo, Fraz altroAddendo ){ // (a/b) + (c/d) == (a*d + c*b) / b*d return new Fraz( primoAddendo.num * altroAddendo.denum + altroAddendo.num * primoAddendo.denum, primoAddendo.denum * altroAddendo.denum ); } // Il metodo che segue verra` invocato cosi`: // fr1.sommati( fr2 ); public Fraz somma( Fraz altroAddendo ){ return new Fraz( this.num * altroAddendo.denum + altroAddendo.num * this.denum, this.denum * altroAddendo.denum ); } // Il metodo che segue verra` invocato cosi`: // fr1.sommati( fr2 ); public void sommati( Fraz altroAddendo ){ num = this.num * altroAddendo.denum + altroAddendo.num * this.denum; denum = this.denum * altroAddendo.denum; // dall'embrione al feto num *= sg( denum ); denum *= sg( denum ); // dal feto all'oggetto compiuto int mmm = mcd( abs( num ), denum ); num = num / mmm; denum /= mmm; } private static int sg( int xxx ){ return (xxx > 0) ? 1 : (xxx < 0) ? -1 : 0 ; } private static int abs( int x ){ return (x >= 0) ? x : -x ; } private static int mcd( int x, int y ){ // STUB!!! return 1 ; } }