Diferencia entre revisiones de «Usuario:ManuelRomero/practica 1»

De WikiEducator
Saltar a: navegación, buscar
Línea 3: Línea 3:
 
=Práctica 1: Calculadora usando números Racionales=
 
=Práctica 1: Calculadora usando números Racionales=
 
*El enunciado de esta práctica se ha impartido en clase
 
*El enunciado de esta práctica se ha impartido en clase
*Se facilitan los fuentes comentados
+
*Puede descargarlo aqui [[Archivo:practica_1_Racional.odt]]
*Conviene revisar y comprender la solución
+
*Conviene revisar y comprender la solución:
*Tanto la solución algorítmica ç
+
** Tanto la solución algorítmica  
** hay muchas alternativas y seguro que mejores, pero en clase hemos realizado ''ésta''
+
*** hay muchas alternativas y seguro que mejores, pero en clase hemos realizado ''ésta''
*A nivel de sintaxis
+
** A nivel de sintaxis
** comprender los comandos y las clases utilizadas
+
*** comprender las instrucciones  y las clases utilizadas
** comprender el usao de objetos de clases del api '''Scanner leer'''
+
*** comprender el uso de objetos de clases del api
** Comprender el uso de métodos directamente de clases de java.lang
+
''p.e'' '''Scanner leer ...'''
  System.out.println Integer.pareInt(String)  
+
*** Comprender el uso de métodos directamente de clases de java.lang
**Métodos de la clase String
+
''p.e.'' '''System.out.println Integer.pareInt(String) '''
  indexOf(char) substring(posicionInicial, posicionFinal)
+
*** Métodos de la clase String
 +
''p.e.`` '''indexOf(char) substring(posicionInicial, posicionFinal)'''
 
Conviene revisarlo y plantear cualquier duda
 
Conviene revisarlo y plantear cualquier duda
{{Pregunta|si revisas este código anótate cualquier duda o anótala en discusion
+
{{Pregunta|#Revisa este código #anótate cualquier duda o anótala en discusion
*El próximo día la planteamos :)}}
+
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==
 
==Clase Racional==
*Revisar constructores sobrecargados
+
{{Idea|Revisar constructores sobrecargados}}
 
<source lang=java>
 
<source lang=java>
  
 
public class Racional {
 
public class Racional {
 
//Defino atributos
 
//Defino atributos
private int num;
+
  private int num;
private int den;
+
  private int den;
 
 
 
//Definimos los constructor sobrecargados
 
//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);
 +
}
 
 
/**
+
/**
* A partir de la cadena "a/b" construyo el racional
+
* suma al racional actual el racional que le paso por parámetro
* num=a
+
* Retorna el racional suma
* den=b
+
* @param r Racianal 2º sumndo
* @param numero es una cadena de caracteres de la forma a/b
+
* @return Un racional suma del objeto actual y r
*/
+
*/
Racional (String numero){
+
public Racional sumar(Racional r){
int pos;
+
      Racional resultado = new Racional();
pos = numero.indexOf('/');
+
      resultado.den=this.den*r.den;
if (pos==-1){
+
      resultado.num=this.num*r.den+this.den*r.num;
System.out.println("Error "+numero+"No es racional. " +"\n Crearemos el racional 1/1");
+
      return resultado;
this.num=1;
+
      /*Posible en una sóla instruccion
this.den=1;
+
      * return (this.den*r.den,this.num*r.den+this.den*r.num);
}
+
      */
else{
+
}//End sumar
String n;
+
 
n=numero.substring(0,pos);
+
public Racional restar(Racional r){
this.num=Integer.parseInt(n);
+
        Racional resultado = new Racional();
n=numero.substring(pos+1);
+
        resultado.den=this.den*r.den;
this.den=Integer.parseInt(n);
+
        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){
* A partir de los enteros pasados construyo el racional
+
    Racional resultado = new Racional();
* @param num
+
    resultado.num=this.num*r.den;
* @param den
+
    resultado.den=this.den*r.num;      
*/
+
    return resultado;
Racional(int num, int den){
+
    /*Posible en una sóla instruccion
this.num=num;
+
      return (this.num*r.den,this.den*r.num);
this.den = den;
+
    */
}
+
}
/**
+
 
* Me pasan solo el numerador
+
/**
* el denominador = 1
+
* Modifica el objeto actual simplificandolo
* @param num
+
* si num y den no son primos entre ellos
*/
+
*/
Racional(int num){
+
public void simplificar(){
this.num=num;
+
int n = mcd();
this.den = 1;
+
this.num= this.num/n;
}
+
this.den= this.den/n;
/**
+
}
* No me pasan nada, construyo 1/1
+
 
*/
+
/**
Racional(){
+
*  
this.num=1;
+
* @return el máximo común divisor de num y den
this.den =1;
+
*/
}
+
private int mcd(){
/**
+
int mayor = this.num;
* simplemento visualizo "num/den"  
+
int menor = this.den;
*/
+
int resto=1;
public void visualizar(){
+
if (mayor< menor){
System.out.print(this.num+"/"+this.den);
+
      resto = menor;
}
+
  menor = mayor;
/**
+
  mayor = resto;
* @return la cadena de caracteres num/den
+
*/
+
public String toString() {
+
return (this.num + "/" + this.den );
+
}
+
/**
+
*
+
* @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);
+
    */
+
}
+
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);
+
    */
+
   
+
}
+
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);
+
    */
+
   
+
}
+
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;
+
}
+
}
+
return menor;
+
 
}
 
}
 +
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()
 +
</source>
  
}
 
</source>
 
  
=Clase Principal=
+
==Clase Principal==
 
*Revisar el concepto de '''static''' (lo trataremos con más detalle)
 
*Revisar el concepto de '''static''' (lo trataremos con más detalle)
 
<source lang=java>
 
<source lang=java>

Revisión de 21:01 6 abr 2012



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 qmark.gif

Pregunta

#Revisa este código #anótate cualquier duda o anótala en discusion

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

Plantilla:Idea

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