Números Racionales en Java: Clase Racional

/* Se construye la clase Racional para el manejo de números racionales. Se sobreescriben los métodos hashCode(), equals() y toString() para el caso específico de racionales. Se codifican las operaciones básicas con racionales */

package racionales;
import java.util.Scanner;

public class Racional {

    private int num, den;

    /*******************/

    public Racional(int n, int d)
    {
        if (d == 0)
        { num = 0; den = 1;}
        else
        { num = n; den = d;}
    }

      /**************/

    @Override
    public String toString()
    {
        return String.valueOf(num) + "/" + String.valueOf(den);
    }

    @Override
    public int hashCode()
    {
        Racional representante = representante();
        int hash = 7;
        hash = 83 * hash + representante.num;
        hash = 83 * hash + representante.den;
        return hash;
    }

    @Override
    public boolean equals(Object obj)
    {
        if (obj == null) return false;
        if (getClass() != obj.getClass()) return false;
        final Racional other = (Racional) obj;
        return num*other.den == den*other.num;
    }

    public Racional representante()
    {
        if (num==0) return new Racional(0,1);
        int mcd = mcd(Math.abs(num),Math.abs(den));
        Racional res = new Racional(num/mcd, den/mcd);
        if (den<0) { res.num = -res.num; res.den = -res.den; }
        return res;
    }

    public static int mcd(int n, int m)
    {
        if (n<m)
        {
            int aux = n; n = m; m = aux;
        }
        while (m>0)
        {
            int aux = n%m;
            n = m; m = aux;
        }
        return n;
    }

    public Racional sumar(Racional r)
    {
        Racional suma = new Racional(0,1);

        suma.num = this.num*r.den + this.den*r.num;
        suma.den = this.den * r.den;

        return suma.representante();
    }

    public Racional multiplicar(Racional r)
    {
        Racional prod = new Racional(0,1);

        prod.num = this.num*r.num;
        prod.den = this.den*r.den;

        return prod.representante();
    }

    public Racional dividir(Racional r)
    {
        Racional div = new Racional(0,1);

        div.num = this.num*r.den;
        div.den = this.den*r.num;

        if(div.den==0)
            System.out.println("UNA DIVISION POR CERO!!");

        return div.representante();
    }

   /********* main() ***********/

/*
 * @authors ARF, RLR
 */

 public static void main(String[] args)
{        
        Scanner sc=new Scanner(System.in);

        Racional r1 = new Racional(-3,4);
        Racional r2 = new Racional(3, -8);
        Racional r3 = new Racional(-6,8);

        System.out.println(r1.toString());
        System.out.println(r2);
        System.out.println(r3);

        System.out.println("NUMEROS:");
        System.out.println(r1.hashCode());
        System.out.println(r2.hashCode());
        System.out.println(r3.hashCode());

        System.out.println("EQUALS:");
        System.out.println(r1.equals(r2));
        System.out.println(r1.equals(r3));

        System.out.println("==:");
        System.out.println(r1==r2);
        System.out.println(r1==r3);
        System.out.println(r1.representante().equals(r3.representante()));
        System.out.println(r1.representante()==r3.representante());

        System.out.println("REPRESENTANTES:");
        System.out.println(r1.representante());
        System.out.println(r2.representante());
        System.out.println(r3.representante());

        System.out.println("FRACCION NULA:");
        Racional cero = new Racional(0,1);
        System.out.println(cero.representante());
        System.out.println(cero.hashCode());

        System.out.println("SUMAS:");
        System.out.println(r1.sumar(r2));
        System.out.println(r1.sumar(r3));
        System.out.println(r1.sumar(cero));

        System.out.println("PRODUCTOS:");
        System.out.println(r1.multiplicar(r2));
        System.out.println(r1.multiplicar(r3));
        System.out.println(r1.multiplicar(cero));

        System.out.println("DIVISIONES:");
        System.out.println(r1.dividir(r2));
        System.out.println(r1.dividir(r3));
        System.out.println(r1.dividir(cero));

        System.out.println("\n\nPulsa Tecla+Return para acabar.\n");
        String FIN=sc.next();
    }

     /**********************/
}
Esta entrada fue publicada en Ciencia y programación. Guarda el enlace permanente.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s