viernes, 20 de septiembre de 2013

FACTORIAL DE UN NUMERO

RECURSIVIDAD

Es una técnica utilizada en programación para realizar una función o procedimiento llamándose a sí misma. Para hacer más ententdible esta técnica realizaremos el siguiente problema:

Problema:
Calcular el factorial de un número.

Recordemos que para obtener el factorial de un número este se multiplica por todos los números naturales anteriores o iguales a el. Por ejemplo: 

5!= 1x2x3x4x5=120
4!= 1x2x3x4= 24

Nota: Para realizar este algoritmo usaremos dos clases: una que realice el factorial y otra que la ejecute.

1ra. Clase: Factorial.

  • Diagrama UML:











  • Programa
package FactorialDeUnNumero;
import javax.swing.JOptionPane;
public class Factorial {
    private int fact;//se declaran variables
    private int numero;
    //se encapsulan las variables
    public int getFactorial() {
        return fact;
    }
    public void setFactorial(int factorial) {
        this.fact = fact;
    }
    public int getNumero() {
        return numero;
    }
    public void setNumero(int numero) {
        this.numero = numero;
    }
    public void Captura(){
    numero=Integer.parseInt(JOptionPane.showInputDialog("NUMERO A CALCULAR: "));//se captura el numero a calcular
    }
    public int CalcularFactorial(int num){//utilizaremos un parámetro de tipo entero
     if(num==1 || num==0) /* como lo dice la regla de factorial: si numero es igual a cero o a 1, entonces su factorial es igual a 1*/
          {
            return 1; //si se cumple la condición se 1
          }
     else // si no se cumple, se realizara la operación siguiente
          {
/* y aquí es donde se encuentra la técnica recursiva, consiste en multiplicar el valor dado por el mismo menos 1; por ejemplo, si el valor es 5, entonces multiplicará 5 por 5-1, osea 5 por 4, y posteriormente el resultado se multiplicará por 4-1, osea, 3; y así sucesivamente hasta que el resultado se multiplique por 2-1, osea 1. */
            fact=num*CalcularFactorial(num-1);
            return fact;                      
          }                                   
    }                                        
    public void ImprimirFactorial(){          
    JOptionPane.showMessageDialog(null,"EL FACTORIAL DE "+numero+" ES "+fact);    
    }
}

2da. Clase: Solución.

  • Diagrama UML:













  • Programa
package FactorialDeUnNumero;
import javax.swing.JOptionPane;
public class Solucion {
    public static void main(String arg[]){
     Factorial n;// se declaran las variables
     n= new Factorial();//se crean las variables
    
     n.Captura(); // los objetos hacen el llamado a los métodos
     n.CalcularFactorial(n.getNumero());
     n.ImprimirFactorial();
     
    }
}

Ejecutar el programa


Insertamos el número a calcular....

.. en otra ventana nos mostrara el resultado.





Conclusión:
La técnica recursiva es un poco complicada de entender, basta con un poco de práctica para entenderla en su totalidad.  Hemos aprendido a realizar el factorial de un número por medio de un programa estructurado, una vez más demostramos que dividiendo las clases en diferentes métodos, el entendimiento de el mismo es más sencillo.

CALCULAR ÁREAS Y PERÍMETROS (triángulos y rectángulos)

Problema:
  • Elaborar un programa que calcule el área y perímetro de tres rectángulos y tres triángulos.
Nota: Dividiremos el programa en tres clases: triángulo, rectángulo y solución.

1ra. Clase: Triangulo.

Esta primera clase la construiremos para que haga el cálculo de el área y perímetro de los triángulos, misma clase que después será llamada desde la clase Solución.

  • Diagrama UML:
El diagrama UML es uno de los elementos principales para la solución de problemas en la estructura de datos orientada a objetos, este diagrama facilita el entendimiento del problema, ya que divide en tres partes el mismo, la primera parte es quien lleva el nombre que identifica a la clase; la segunda parte contiene los atributos que tendrá el objeto identificado de nuestra clase, esto acompañado del tipo de dato que tendrá; y por último la tercera parte contiene el nombre de los procedimientos o más bien métodos que se realizarán.

Para facilitar la construcción del diagrama, recomiendo usar ArgoUML, lo pueden descargar desde este link http://argouml.tigris.org/, aquí podemos apoyarnos para aprender a usarlo http://www.youtube.com/watch?v=mHfw4Q5xubU.

Y el diagrama queda así:

Nuestro objeto es el tríangulo, tiene una base, una altura, y porsteriormente serán calculadas su área y su perímetro, para llegar a esto primero capturaremos los datos, después se calcula área, siguiendo con perímetro y se imprimiran los resultados.

  • Programa:
Nota: para construir el programa estoy usando NetBeans, es gratuito y muy recomendable, si no lo tienes puedes descargarlo desde aquí https://netbeans.org/downloads/.

package Areas_Perímetros; // identificamos el paquete en el que se encuentra nuestra clase
import javax.swing.JOptionPane; // Aqui mandamos a llamar la libreria que vamos a usar
public class Triangulo // el nombre de nuestra clase
{ //inicia la clase
    private int base; // se declaran las variables a usar
                       //(atributos que fueron mostrados en el diagrama UML)
    private int altura;
    private int área;
    private int perimetro
        /*vamos a encapsular nuestras variables con get y set se utiliza get para que
        lea o guarde el valor de la variable y set para que se pueda cambiar el valor 
        de la variable. Esto se puede realizar de manera directa simplemente dando click
        derecho en  Refactor/Encapsulate Fields, seleccionas todas las fichas de get y set
        y despues en Refactor, y creara los métodos con set y get.
        */
    public int getBase() { 
        return base; // manda la variable
    }
    public void setBase(int base) { //recibe la variable
        this.base = base; 
    }
    public int getAltura() {
        return altura;
    }
    public void setAltura(int altura) {
        this.altura = altura;
    }
    public int getÁrea() {
        return área;
    }
    public void setÁrea(int área) {
        this.área = área;
    }
    public int getPerimetro() {
        return perimetro;
    }
    public void setPerimetro(int perimetro) {
        this.perimetro = perimetro;
    }
    
    public void Captura(){ // se piden los valores de base y altura de el triangulo
        base=Integer.parseInt(JOptionPane.showInputDialog("BASE:"));
        altura=Integer.parseInt(JOptionPane.showInputDialog("ALTURA:"));
    }
    public void CalcularArea() { 
     área=(base*altura)/2; 
    }
    public void CalcularPerimetro(){
     perimetro=(base*3);//suponiendo que es un triángulo equilátero
    }
    public void Imprimir(){  
    JOptionPane.showMessageDialog(null,"EL ÁREA ES: "+área+"\nEL PERÍMETRO ES: "+perimetro);
    }
}// termina la clase

2da. Clase: Rectangulo

De la misma forma que con la clase triangulo, construiremos la clase Rectángulo:

  • Diagrama UML













  • Programa
package Areas_Perímetros;
import javax.swing.JOptionPane;
public class Rectángulo 
{
    private int base;
    private int altura;
    private int área;
    private int perimetro;
   
    public int getBase() {
        return base;
    }
    public void setBase(int base) {
        this.base = base;
    }
    public int getAltura() {
        return altura;
    }
    public void setAltura(int altura) {
        this.altura = altura;
    }
    public int getÁrea() {
        return área;
    }
    public void setÁrea(int área) {
        this.área = área;
    }
    public int getPerimetro() {
        return perimetro;
    }
    public void setPerimetro(int perimetro) {
        this.perimetro = perimetro;
    }
    
    public void Captura(){
        base=Integer.parseInt(JOptionPane.showInputDialog("BASE:"));
        altura=Integer.parseInt(JOptionPane.showInputDialog("ALTURA:"));
    }
    public void CalcularArea() {
     área=(base*altura);
    }
    public void CalcularPerimetro(){
     perimetro=base+base+altura+altura;
    }
    public void Imprimir(){  
    JOptionPane.showMessageDialog(null,"EL ÁREA ES: "+área+"\n EL PERÍMETRO ES: "+perimetro);
    }
}

3ra. Clase: Solucion

En esta clase se dará uso a las clases anteriores, se le asignan los métodos a los objetos correspondiente a su clase. Para ello deberán declararse y crearse los objetos.

  • Diagrama UML:












  • Programa:
package Areas_Perímetros;
import javax.swing.JOptionPane;
public class Solución {
   
    public static void main (String arr[]){ 
    //se declaran objetos
        Rectángulo rect1, rect2, rect3;
        // se crean los objetos
        rect1=new Rectángulo();
        rect2=new Rectángulo();
        rect3=new Rectángulo();
        
        JOptionPane.showMessageDialog(null,"CALCULO DE AREAS Y PERIMETROS DE LOS RECTANGULOS");
        JOptionPane.showMessageDialog(null,"RECTANGULO #1");
        rect1.Captura(); //el objeto mando a llamar al método que va a usar
        rect1.CalcularArea();
        rect1.CalcularPerimetro();
        rect1.Imprimir();
        
        JOptionPane.showMessageDialog(null,"RECTANGULO #2");
        rect2.Captura();
        rect2.CalcularArea();
        rect2.CalcularPerimetro();
        rect2.Imprimir();
        
        JOptionPane.showMessageDialog(null,"RECTANGULO #3");
        rect3.Captura();
        rect3.CalcularArea();
        rect3.CalcularPerimetro();
        rect3.Imprimir();
   
        Triangulo tri1, tri2, tri3;
        
        tri1=new Triangulo();
        tri2=new Triangulo();
        tri3=new Triangulo();
        
        JOptionPane.showMessageDialog(null,"CALCULO DE AREAS Y PERIMETROS DE LOS TRIANGULOS");
        JOptionPane.showMessageDialog(null,"TRIANGULO #1");
        tri1.Captura();
        tri1.CalcularArea();
        tri1.CalcularPerimetro();
        tri1.Imprimir();
        
        JOptionPane.showMessageDialog(null,"TRIANGULO #2");
        tri2.Captura();
        tri2.CalcularArea();
        tri2.CalcularPerimetro();
        tri2.Imprimir();
        
        JOptionPane.showMessageDialog(null,"TRIANGULO #3");
        tri3.Captura();
        tri3.CalcularArea();
        tri3.CalcularPerimetro();
        tri3.Imprimir();
        
        
    }
}

Ejecutar el programa


Al ejecutarse el programa aparecerá la primera ventana que indica que se realizará el calculo de las áreas y perímetros de los rectángulos...
...después indicará a que número de rectángulo se le realizará el calculo. Recordando que el problema pedía el calculo para tres triángulos y tres rectángulos...

 ... enseguida se realizará la captura de la base de el rectangulo.....
                                    .... lo mismo con la altura...
 .... y por último mostrará los resultados...





.... lo mismo será para los triángulos.











Conclusión:
Una manera mas ordenada, sencilla y entendible de realizar un programa , es dividiéndolo en métodos y clases, recordando siempre que un problema puede dividirse en clases, cada clase tiene un objeto, a su vez, cada objeto tiene atributos o propiedades, unos serán capturados, otros, serán calculados en la clase, para realizar esto basta con crear métodos que hagan las actividades o procedimientos que se necesitan para resolver el problema.