Usuario:ManuelRomero/practica 1

De WikiEducator
Saltar a: navegación, buscar



Práctica 1: Calculadora usando números Racionales

  • El enunciado de esta práctica se ha impartido en clase
  • Puede descargarlo aqui Archivo:Practica 1 Racional.odt
  • Conviene revisar y comprender la solución:
    • Tanto la solución algorítmica
      • hay muchas alternativas y seguro que mejores, pero en clase hemos realizado ésta
    • A nivel de sintaxis
      • comprender las instrucciones y las clases utilizadas
      • comprender el uso de objetos de clases del api
p.e Scanner leer ...
      • Comprender el uso de métodos directamente de clases de java.lang

p.e. System.out.println Integer.pareInt(String)

      • Métodos de la clase String

p.e.`` indexOf(char) substring(posicionInicial, posicionFinal) Conviene revisarlo y plantear cualquier duda


Icon reading.jpg

Lectura

  1. Revisa este código
  2. anótate cualquier duda o anótala en discusion
  3. Plantéala el próximo día en clase:)


Propuesta de solucion

  • Realizamos la solución implementando dos clases
  • La clase Racional
  • La implemntación de un programa principal
    • Hecho en una clase principal
    • Para implementar el método main
    • Recordar todos los métodos y atributos que usa main státicos

Clase Racional



Icon reading.jpg

Lectura

Revisar constructores sobrecargados


public class Racional {
//Defino atributos
  private int num;
  private int den;
 
//Definimos los constructor sobrecargados
/**
 * A partir de la cadena "a/b" construyo el racional
 * num=a
 * den=b
 * @param numero es una cadena de caracteres de la forma a/b
*/
 Racional (String numero){
   int pos;
   pos = numero.indexOf('/');
   if (pos==-1){
      System.out.println("Error "+numero+"No es racional. " +"\n Crearemos el racional 1/1");
      this.num=1;
      this.den=1;
   }
   else{
      String n;
      n=numero.substring(0,pos);
      this.num=Integer.parseInt(n);
      n=numero.substring(pos+1);
      this.den=Integer.parseInt(n);
   }
 }//End constructor Racional(Strint)
 
/**
 * A partir de los enteros pasados construyo el racional
 * @param num
 * @param den
*/
 Racional(int num, int den){
         this.num=num;
	 this.den = den;
 }//End Racional
 
/**
 * Me pasan solo el numerador
 * el denominador = 1
 * @param num
 */
 Racional(int num){
	this.num=num;
	this.den = 1;
 }//End Racional
 
/**
 * No me pasan nada, construyo 1/1
 */
 Racional(){
	this.num=1;
	this.den =1;
 }//End Racional()
 
/**
 * simplemento visualizo "num/den"  
 */
public void visualizar(){
	System.out.print(this.num+"/"+this.den);
}//End visualizar()
 
/**
 * @return la cadena de caracteres num/den
 */
 
 public String toString() {
          return (this.num + "/" + this.den );
 }//End 
 
/**
 * 
 * @return el float de num/den
 */
 public float diValor(){
	return ((float)this.num/(float)this.den);
 }
 
/**
 * suma al racional actual el racional que le paso por parámetro
 * Retorna el racional suma
 * @param r Racianal 2º sumndo
 * @return Un racional suma del objeto actual y r
 */
 public Racional sumar(Racional r){
      Racional resultado = new Racional();
      resultado.den=this.den*r.den;
      resultado.num=this.num*r.den+this.den*r.num;
      return resultado;
      /*Posible en una sóla instruccion
       * return (this.den*r.den,this.num*r.den+this.den*r.num);
      */
 }//End sumar
 
 public Racional restar(Racional r){
        Racional resultado = new Racional();
        resultado.den=this.den*r.den;
        resultado.num=this.num*r.den-this.den*r.num;
        return resultado;
        /*Posible en una sóla instruccion
         * return (this.den*r.den,this.num*r.den-this.den*r.num);
         */
  }//End restar
 
 public Racional multiplicar(Racional r){
        Racional resultado = new Racional();
        resultado.den=this.den*r.den;
        resultado.num=this.num*r.num;
        return resultado;
       /*Posible en una sóla instruccion
        * return (this.den*r.den,this.num*r.num);
        */
 }//End multiplicar
 
 public Racional dividir(Racional r){
    Racional resultado = new Racional();
    resultado.num=this.num*r.den;
    resultado.den=this.den*r.num;	    
    return resultado;
    /*Posible en una sóla instruccion
      return (this.num*r.den,this.den*r.num);
    */
 }
 
/**
 * Modifica el objeto actual simplificandolo
* si num y den no son primos entre ellos
 */
 public void simplificar(){
	int n = mcd();
	this.num= this.num/n;
	this.den= this.den/n;
 }
 
/**
 * 
 * @return el máximo común divisor de num y den
 */
 private int mcd(){
	int mayor = this.num;
	int menor = this.den;
	int resto=1;
	if (mayor< menor){
     	   resto = menor;
	   menor = mayor;
	   mayor = resto;
	}
	while (mayor!=menor){
	      resto= mayor-menor;
	      if (resto > menor){
		 mayor = resto;
	      }
    	      else{
		 mayor=menor;
		 menor=resto;
	      }	
	}//End while (mayor!=menor)
	return menor;
 }//End mcd()
 
}//End class Racional()

Clase Principal

  • Revisar el concepto de static (lo trataremos con más detalle)
import java.util.Scanner;
public class Principal {
	/**
	 * @param args
	 */
	static Scanner leer = new Scanner(System.in);
	static Racional r1 =null;
	/**
	 * 
	 * @param operacion Es la operacion que se quiere realizar '''a/b op d/e''' donde
*  '''op''' una de las siguientes operaciones +,-,*,:
* a/b es el primer operando (Racional)
* d/e es el segundo operando (Racional)
	 * @return un caracter que representa la operación o 0 si no hay ninguna 
	 */
public static char sacaOperando(String operacion){
		int pos;
		pos = operacion.indexOf('+');
		if (pos != -1)
			return '+';
		pos = operacion.indexOf('-');
		if (pos != -1)
			return '-';
		pos = operacion.indexOf('*');
		if (pos != -1)
			return '*';
		pos = operacion.indexOf(':');
		if (pos != -1)
			return ':';
		else {
		    System.out.println("Operadores permitidos ('+,-,*,:) no presente en "+operacion);	 
			return 0;
		}
}	
/**
 * 
 	 * @param operacion Es la operacion que se quiere realizar '''a/b op d/e''' donde
*  '''op''' una de las siguientes operaciones +,-,*,:
* a/b es el primer operando (Racional)
* d/e es el segundo operando (Racional
 * @return Un Racional con el resultado de la operacion a/b+c/d p.e
 */
 
public static Racional opera (String operacion){
	char operando = sacaOperando(operacion);
	int pos;
	String  op;
	pos = operacion.indexOf(operando);
	op = operacion.substring(0,pos);
	Racional op1 = new Racional(op);
	op = operacion.substring(pos+1);
	Racional op2 = new Racional(op);
	switch (operando){
	case '+':
		return (op1.sumar(op2));
	case'-':
		return (op1.restar(op2));
	case '*':
		return (op1.multiplicar(op2));
	case ':':
		return(op1.dividir(op2));
	default:
		System.out.println("Operacion no permitida");
		return(new Racional());
	}
 
}
 
 
	/** Visualiza opciones
	* valida que la opcion introducida es número
	* valida que la opcion introducida está en rango permitido
	*retornar  la opción seleccionada (1-6)
	*/
public static int menu(){
  int opcion;
  do{
    System.out.println("Menu princial");
	System.out.println("1.-Insertar Racional");
	System.out.println("2.-Visualizar");
	System.out.println("3.-Simplificar");
	System.out.println("4.-Visualiza valor");
	System.out.println("5.-Calculadora");
	System.out.println("6.-Salir");
	System.out.println("Elija una opción: ");
	while (leer.hasNextInt()==false){
	      System.out.println("Solo número por favor");
    	  leer.nextLine();
	}//End do...
	opcion=leer.nextInt();
  }while((opcion<1)|| (opcion >6));
      //Para dejar el buffer limpio 
      //(después de leer entero se queda en intro)
  leer.nextLine();
  return opcion;
}//End método menú()
 
 
/**
 * 
 * @param opcion es la opión seleccionada 1-6
 * En función de la opción seleccionada 
 * realiza las acciones correspondientes
 * Hacer notar que hay acciones que si el racional 
 * no se ha instanciado, no se pueden realizar (visualizar, simplificar y diValor)
 */
public static void accion (int opcion){
  String num;
  switch (opcion){
		case 1:  System.out.println("Inserta el racional a/b");
		         num=leer.nextLine();
		         r1= new Racional(num);
		         break;
		case 2:
			   if (r1==null)
	 			   System.out.println("Primero inserta");
			   else
				   System.out.println("Racional = "+r1.toString());
			   break;
		case 3:
			   if (r1==null)
				   System.out.println("Primero inserta");
			   else{
				   System.out.print("Racional = "+r1.toString());
				   r1.simplificar();
				   System.out.println(" simplificado = "+r1.toString());
			   }
			   break;
		case 4:
			   if (r1==null)
				   System.out.println("Primero inserta");
			   else{
				   System.out.println(r1.toString()+"="+r1.diValor());
			   }
			   break;
		case 5:
			   String operacion;
			   System.out.println("inserta operacion a/b op c/d");
 			   System.out.println("donde op =(+,-,*,:)");
			   operacion = leer.nextLine();
			   r1 = opera(operacion);
			   System.out.println(operacion+"="+r1.toString());
			   break;
		case 6:
			   System.out.println("Fin de programa");
			   break;
	}//End del switch
 }//End método accion()
 
 
/**
 * 
 * @param args (vacío, necesario por sintaxis
 * lee la opción de lo que retorna menu()
 * y le dice al método accion() que la realice
 * Se itera hasta que la opción sea salir (6) 
 */
 public static void main(String[] args) {
	int opcion;
    do{
	   opcion = menu();
	   accion(opcion);
	}while (opcion!=6);
 }//fin de main
 
 
}//Fin del programa principal