lunes, 13 de febrero de 2012

Propuesta 2 Hallar el Area


ESTRUCTURAS DE SECUENCIA

ACTIVIDADES
Se desarrollan algoritmos que involucren estructuras de secuencia.

Propuesto 2.- Diseñe un algoritmo que determine el área lateral, el área total y el área de la
base de un cilindro, sabiendo que:
areabase = π x r2
arealateral = 2 x π x r x h
areatotal = 2 x areabase + arealateral
Siendo r el radio y h la altura.
Soluciòn:

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/*
 * Propuesto2.java
 *
 * Created on 13/02/2012, 10:50:25 AM
 */
package EstructurasDeSecuencia.Propuestos;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;

/**
 *
 * @author Gonzales
 */
public class Propuesto2 extends javax.swing.JFrame implements ActionListener {

    /** Creates new form Propuesto2 */
    public Propuesto2() {
        initComponents();
        btnProcesar.addActionListener(this);
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {

            public void run() {
                Propuesto2 nuevo=new Propuesto2();
                nuevo.setVisible(true);
                nuevo.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            }
        });
    }
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                         
    private void initComponents() {

        lblRadio = new javax.swing.JLabel();
        lblAltura = new javax.swing.JLabel();
        txtRadio = new javax.swing.JTextField();
        txtAltura = new javax.swing.JTextField();
        jScrollPane1 = new javax.swing.JScrollPane();
        txtResultados = new javax.swing.JTextArea();
        btnProcesar = new javax.swing.JButton();
        btnLimpiar = new javax.swing.JButton();

        setTitle("PROPUESTO2");
        getContentPane().setLayout(null);

        lblRadio.setText("Radio :");
        getContentPane().add(lblRadio);
        lblRadio.setBounds(40, 20, 40, 20);

        lblAltura.setText("Altura :");
        getContentPane().add(lblAltura);
        lblAltura.setBounds(40, 60, 40, 20);
        getContentPane().add(txtRadio);
        txtRadio.setBounds(100, 20, 70, 20);
        getContentPane().add(txtAltura);
        txtAltura.setBounds(100, 60, 70, 20);

        txtResultados.setColumns(20);
        txtResultados.setRows(5);
        jScrollPane1.setViewportView(txtResultados);

        getContentPane().add(jScrollPane1);
        jScrollPane1.setBounds(30, 110, 330, 140);

        btnProcesar.setText("Procesar");
        getContentPane().add(btnProcesar);
        btnProcesar.setBounds(250, 20, 110, 23);

        btnLimpiar.setText("Limpiar");
        getContentPane().add(btnLimpiar);
        btnLimpiar.setBounds(250, 60, 110, 23);

        java.awt.Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
        setBounds((screenSize.width-400)/2, (screenSize.height-300)/2, 400, 300);
    }// </editor-fold>                       
    // Variables declaration - do not modify                    
    private javax.swing.JButton btnLimpiar;
    private javax.swing.JButton btnProcesar;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JLabel lblAltura;
    private javax.swing.JLabel lblRadio;
    private javax.swing.JTextField txtAltura;
    private javax.swing.JTextField txtRadio;
    private javax.swing.JTextArea txtResultados;
    // End of variables declaration                  

    public double getRadio() {
        return Double.parseDouble(txtRadio.getText());
    }

    public double getAltura() {
        return Double.parseDouble(txtAltura.getText());
    }

    public double getAreaBase() {
        return 3.14 * getRadio();
    }

    public double getAreaLateral() {

        return (2 * 3.14) * getRadio() * getAltura();
    }

    public double getAreaTotal() {

        return getAreaBase() + getAreaLateral();
    }

    public void resultados() {
        txtResultados.setText("Area de la Base :" + getAreaBase());
        txtResultados.append("\n Area Lateral :" + getAreaLateral());
        txtResultados.append("\nArea Total :" + getAreaTotal());
    }

    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == btnProcesar) {
            resultados();
        }
    }
}

Propuesto 1: Hallar Area y Perimetro


ESTRUCTURAS DE SECUENCIA

ACTIVIDADES
Se desarrollan algoritmos que involucren estructuras de secuencia.

Propuesto 1.- Diseñe un algoritmo que determine el área y el perímetro de un rectángulo,
sabiendo que:
area = b x h
perimetro = 2 x (b + h)
Siendo b la base y h la altura.
Soluciòn JAVA = NETBEANS 6.0.9:

 /*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/*
 * Propuesto1.java
 *
 * Created on 13/02/2012, 03:33:45 PM
 */
package EstructurasDeSecuencia.Propuestos;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;

/**
 *
 * @author OMAR
 */
public class Propuesto1 extends javax.swing.JFrame implements ActionListener {

    /** Creates new form Propuesto1 */
    public Propuesto1() {
        initComponents();
        btnProcesar.addActionListener(this);
        btnLimpiar.addActionListener(this);
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                        
    private void initComponents() {

        lblBase = new javax.swing.JLabel();
        lblAltura = new javax.swing.JLabel();
        txtBase = new javax.swing.JTextField();
        txtAltura = new javax.swing.JTextField();
        jScrollPane1 = new javax.swing.JScrollPane();
        txtResultados = new javax.swing.JTextArea();
        btnProcesar = new javax.swing.JButton();
        btnLimpiar = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setTitle("PROPUESTO 1");
        getContentPane().setLayout(null);

        lblBase.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT);
        lblBase.setText("Base :");
        getContentPane().add(lblBase);
        lblBase.setBounds(54, 30, 40, 20);

        lblAltura.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT);
        lblAltura.setText("Altura :");
        getContentPane().add(lblAltura);
        lblAltura.setBounds(54, 70, 40, 20);
        getContentPane().add(txtBase);
        txtBase.setBounds(110, 30, 70, 20);
        getContentPane().add(txtAltura);
        txtAltura.setBounds(110, 70, 70, 20);

        txtResultados.setColumns(20);
        txtResultados.setRows(5);
        jScrollPane1.setViewportView(txtResultados);

        getContentPane().add(jScrollPane1);
        jScrollPane1.setBounds(40, 110, 320, 140);

        btnProcesar.setText("Procesar");
        getContentPane().add(btnProcesar);
        btnProcesar.setBounds(250, 20, 90, 23);

        btnLimpiar.setText("Limpiar");
        getContentPane().add(btnLimpiar);
        btnLimpiar.setBounds(250, 70, 90, 23);

        java.awt.Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
        setBounds((screenSize.width-408)/2, (screenSize.height-327)/2, 408, 327);
    }// </editor-fold>                      

    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {

            public void run() {
                Propuesto1 nuevo=new Propuesto1();
                nuevo.setVisible(true);
            }
        });
    }
    // Variables declaration - do not modify                   
    private javax.swing.JButton btnLimpiar;
    private javax.swing.JButton btnProcesar;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JLabel lblAltura;
    private javax.swing.JLabel lblBase;
    private javax.swing.JTextField txtAltura;
    private javax.swing.JTextField txtBase;
    private javax.swing.JTextArea txtResultados;
    // End of variables declaration                 
    //DECLARACION DE VARIABLES

//ENTRADA DE DATOS
    //OBTENER ALTURA
    public double getAltura() {
        return Double.parseDouble(txtAltura.getText());
    }
    //OBTENER BASE
    public double getBase() {
        return Double.parseDouble(txtBase.getText());
    }
    //CALCULAR AREA
    public double getArea() {
        return getBase() * getAltura();
    }
    //CALCULAR PERIMETRO
    public double getPerimetro() {
        return (2 * getAltura()) + (2 * getBase());
    }

//SALIDA DE RESULTADOS
    public void resultados() {
        txtResultados.setText("Area :" + getArea());
        txtResultados.append("\n Perimetro :" + getPerimetro());
    }

    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == btnProcesar) {
            resultados();
        }else if(e.getSource()==btnLimpiar){
            limpiar();
        }
    }

    private void limpiar() {
        txtAltura.setText("");
        txtBase.setText("");
        txtResultados.setText("");
    }
  
}


jueves, 9 de febrero de 2012

Composite (patrón de diseño)


Composite (patrón de diseño)

El patrón Composite sirve para construir objetos complejos a partir de otros más simples y similares entre sí, gracias a la composición recursiva y a una estructura en forma de árbol.
Esto simplifica el tratamiento de los objetos creados, ya que al poseer todos ellos una interfaz común, se tratan todos de la misma manera.
  
Imaginemos que necesitamos crear una serie de clases para guardar información acerca de una serie de figuras que serán círculos, cuadrados y triángulos. Además necesitamos poder tratar también grupos de imágenes porque nuestro programa permite seleccionar varias de estas figuras a la vez para moverlas por la pantalla.
En principio tenemos las clases Círculo, Cuadrado y Triángulo, que heredarán de una clase padre que podríamos llamar Figura e implementarán todas la operación pintar(). En cuanto a los grupos de Figuras podríamos caer en la tentación de crear una clase particular separada de las anteriores llamada GrupoDeImágenes, también con un método pintar().

Problema.
Esta idea de separar en clases privadas componentes (figuras) y contenedores (grupos) tiene el problema de que, para cada uno de los dos atributos, el método pintar() tendrá una implementación diferente, aumentando la complejidad del sistema.

Implementación
El patrón Composite da una solución elegante a este problema, de la que además resulta en una implementación más sencilla.
A la clase Figura la llamaríamos Gráfico y de ella extenderían tanto Círculo, Cuadrado y Triángulo, como GrupoDeImágenes. Además, ésta última tendría una relación todo-parte de multiplicidad * con Gráfico: un GrupoDeImágenes contendría varios Gráficos, ya fuesen éstos Cuadrados, Triángulos, u otras clases GrupoDeImágenes.
Así, es posible definir a un grupo de imágenes recursivamente. Por ejemplo, un objeto cuya clase es GrupoDeImágenes podría contener un Cuadrado, un Triángulo y otro GrupoDeImágenes, este grupo de imágenes podría contener un Círculo y un Cuadrado. Posteriormente, a este último grupo se le podría añadir otro GrupoDeImágenes, generando una estructura de composición recursiva en árbol, por medio de muy poca codificación y un diagrama sencillo y claro.

Diagrama



Ejemplos de utilización
En Java: las clases java.awt.Component (Componente), java.awt.Container (Contenedor), java.awt.Panel (Contenedor concreto), java.awt.Button (Boton)

Código en Java

Código en Java

import java.util.*;
 
public abstract class Componente
{
        protected String nombre;
        public Componente (String nombre)
        {
                this.nombre = nombre;
        }
        abstract public void Agregar(Componente c);
        abstract public void Eliminar(Componente c);
        abstract public void Mostrar(int profundidad);
}
class Compuesto extends Componente
{
        private ArrayList<Componente> hijo = new ArrayList<Componente>();
        public Compuesto (String name)
        {
                super(name);
        }
        @Override
        public void Agregar(Componente componente)
        {
                hijo.add(componente);
        }
        @Override
        public void Eliminar(Componente componente)
        {
                hijo.remove(componente);
        }
        @Override
        public void Mostrar(int profundidad)
        {
                System.out.println(nombre + " nivel: " + profundidad);
                for (int i = 0; i < hijo.size(); i++)
                        hijo.get(i).Mostrar(profundidad + 1);
        }
}
class Hoja extends Componente
{
        public Hoja (String nombre)
        {
                super(nombre);
        }
        public void Agregar(Componente c)
        {
                System.out.println("no se puede agregar la hoja");
        }
        public void Eliminar(Componente c)
        {
                System.out.println("no se puede quitar la hoja");
        }
        public void Mostrar(int depth)
        {
                System.out.println('-' + "" + nombre);
        }
}
public class Client
{
        public static void main(String[] args)
        {
                Compuesto raiz = new Compuesto("root");
                raiz.Agregar(new Hoja("hoja A"));
                raiz.Agregar(new Hoja("hoja B"));
                Compuesto comp = new Compuesto("compuesto X");
                comp.Agregar(new Hoja("hoja XA"));
                comp.Agregar(new Hoja("hoja XB"));
                raiz.Agregar(comp);
                raiz.Agregar(new Hoja("hoja C"));
                Hoja l = new Hoja("hoja D");
                raiz.Agregar(l);
                raiz.Eliminar(l);
                raiz.Mostrar(1);
        }
}