public class Fraccion{
/* Los atributos de la clase Fraccion son el numerador y el denominador
que por definicion son numeros enteros */
int num;
int denom;
//Metodos Constructores
//Constructor simple
public Fraccion(){
num = 0;
denom = 1;
}
//Constructor para fracciones enteras
public Fraccion(int num) {
this.num = num;
denom = 1;
}
//Constructor general
public Fraccion(int num, int denom){
this.num = num;
this.denom = denom;
}
/*Funcion para entrada de datos por teclado */
public static Fraccion datos(){
String numc ="";
String denomc ="";
Fraccion f=new Fraccion();
String fraccionDato =
Terminal.leeCadena("\nIntroduce una fraccion: ");
/* Buscamos el lugar que ocupa en la cadena el simbolo "/" */
int pos = fraccionDato.indexOf('/');
/* Si es un numero entero no se encuentra "/" y asigna a "pos" un -1 */
if(pos==-1) {
int num1 =
Integer.valueOf(fraccionDato.trim()).intValue();
f= new Fraccion(num1);
}
else {
for(int i=0;i<pos;i++)
numc+=fraccionDato.charAt(i);
/* El denominador esta entre (pos+1) y la longitud de la cadena */
for(int i=(pos+1);i<fraccionDato.length();i++)
denomc+=fraccionDato.charAt(i);
/* Convertimos las dos cadenas en los enteros num y denom */
int num = Integer.valueOf(numc.trim()).intValue();
int denom = Integer.valueOf(denomc.trim()).intValue();
f = new Fraccion(num,denom);
}
return f;
}
public static Fraccion suma(Fraccion a, Fraccion b){
/* Se devuelve una fraccion y los argumentos son fracciones */
/* Se inicializa primero la fraccion que va a contener el resultado */
Fraccion c = new Fraccion();
c.num = (a.num*b.denom)+(a.denom*b.num);
c.denom = a.denom*b.denom;
return c;
}
public static Fraccion producto(Fraccion a, Fraccion b){
Fraccion c = new Fraccion();
c.num = a.num*b.num;
c.denom = a.denom*b.denom;
return c;
}
public static Fraccion inversa(Fraccion a){
/* Para obtener la inversa basta con cambiar numerador por denominador */
if(a.num>=0) return new Fraccion(a.denom,a.num);
else return new Fraccion(-a.denom,-a.num);
}
public static Fraccion cociente(Fraccion a, Fraccion b){
/* Para calcular el cociente se obtiene la fraccion producto de la primera
fraccion, por la inversa de la segunda fraccion */
return producto(a,inversa(b));
}
public static Fraccion potencia(Fraccion a) {
Fraccion c = new Fraccion();
double exponente = Terminal.leeReal("Exponente al que se eleva: ");
c.num = (int) Math.pow((double)a.num,Math.abs(exponente));
c.denom = (int) Math.pow((double)a.denom,Math.abs(exponente));
if(exponente<0) c=Fraccion.inversa(c);
return c;
}
public String toString(){
/* Se devuelve una cadena con el numerador y denominador y en medio
el signo "/" de division */
if(denom==1) return " "+num;
else return num+"/"+denom;
}
private int mcd(){
/* El mcd de numerador y denominador es una funcion privada de la clase
fraccion que se obtiene por el metodo de Euler y que nos sirve para la
simplificacion de fracciones */
int u = Math.abs(num); //Se usa valor absoluto por si hay negativos
int v = Math.abs(denom);
if(v==0) return u;
int r;
/* "r" va a ser el resto de cada division */
while(v!=0){
r = u%v;
u = v;
v = r;
}
return u;
}
public Fraccion simplificar(){
/* Se devuelve una nueva fraccion con sus terminos divididos por el
mcd de numerador y denominador */
return new Fraccion(num/mcd(),denom/mcd());
}
}