ED Icon

Estructuras de Datos

Código fuente de explicaciones

Código fuente online

Clase sobre Excepciones, Genericidad e Interfaces.

* * *

Excepciones

Ejemplo Calculadora

A continuación se puede observar el código fuente utilizado para ejemplificar el manejo de excepciones.

  • Package Calculadora

    Package Calculadora
									
package Calculadora;

/**
 * Modela las operaciones de una calculadora.
 * @author Federico Joaquín (federico.joaquin@cs.uns.edu.ar)
 */
public class Calculadora {
	/**
	 * Computa la división real entre dos valores.
	 * @param dividendo Valor del dividendo de la división.
	 * @param divisor Valor del divisor de la división.
	 * @return Resultado de aplicar la división.
	 * @throws DivisionPorCero en caso que divisor sea cero.
	 */
	public static float dividir(float dividendo, float divisor) throws DivisionPorCero{
		if (divisor == 0) throw new DivisionPorCero("Error");
		return dividendo/divisor;
	}
	/**
	 * Computa la suma real entre dos valores.
	 * @param op1 Operando 1 de la suma.
	 * @param op2 Operando 2 de la suma.
	 * @return Resultado de aplicar la suma.
	 */
	public static float sumar(float op1, float op2) {
		return op1 + op2;
	}
	/**
	 * Computa la resta real entre dos valores.
	 * @param op1 Operando 1 de la resta.
	 * @param op2 Operando 2 de la resta.
	 * @return Resultado de aplicar la resta.
	 */
	public static float restar(float op1, float op2) {
		return op1 - op2;
	}
	/**
	 * Computa la multiplicación real entre dos valores.
	 * @param op1 Operando 1 de la multiplicación.
	 * @param op2 Operando 2 de la multiplicación.
	 * @return Resultado de aplicar la multiplicación.
	 */
	public static float multiplicar(float op1, float op2) {
		return op1 * op2;
	}
	/**
	 * Método que inicia la ejecución del programa.
	 * Testea las operaciones suma, resta, multiplicación y división con un caso de prueba simple.
	 * @param args Argumentos por línea de comandos.
	 */
	public static void main(String [] args){
		float resultado = 0;
		
		try {
			resultado = dividir(10, 0);
			System.out.println("El resultado de dividir 10 y 0 es: " + resultado);
		} catch (DivisionPorCero e) {
			System.out.println(e.getMessage());
		}
		
		resultado = sumar (10,10);
		System.out.println("El resultado de sumar 10 y 10 es: " + resultado);
		
		resultado = restar(25, 15);
		System.out.println("El resultado de restar 25 y 15 es: " + resultado);
		
		resultado = multiplicar (105, -2);
		System.out.println("El resultado de multiplicar 105 y -2 es: " + resultado);
				
	}
}
								
									
package Calculadora;
/**
 * Modela la excepción ante una división por cero.
 * @author Federico Joaquín (federico.joaquin@cs.uns.edu.ar)
 *
 */
@SuppressWarnings("serial")
public class DivisionPorCero extends Exception {
	/**
	 * Inicializa la excepción indicando el origen del error.
	 * @param msj Especifica información adicional a cerca de la excepción.
	 */
	public DivisionPorCero(String msj){
		super(msj);
	}
}
								

Excepciones

Ejemplo Transferencia

A continuación se puede observar el código fuente utilizado para ejemplificar el manejo de excepciones.

  • Package Transferencia

    Package Transferencia
									
package Transferencia;

public class Cliente {
	
	private float dinero_disponible;
	private float maximo_permitido;
	
	public Cliente(){
		dinero_disponible = 0;
		maximo_permitido = 5000;
	}
	
	public Cliente(float disponible){
		dinero_disponible = disponible;
		maximo_permitido = 5000;
	}
	
	public Cliente(float disponible, float permitido){
		dinero_disponible = disponible;
		maximo_permitido = permitido;
	}
	
	public float getDisponible(){
		return dinero_disponible;
	}
	
	public void extraer(float monto) throws SinFondosException{
		if ((dinero_disponible - monto) < 0)
			throw new SinFondosException("No alcanzan los fondos para extraer en esta cuenta");
		else
			dinero_disponible -= monto;
	}
	
	public void depositar(float monto) throws SuperaMaximoException{
		if (maximo_permitido < (dinero_disponible + monto))
			throw new SuperaMaximoException("Se superó la maxima cantidad de dinero permitido en cuenta");
		else
			dinero_disponible += monto;
	}

}
								
									
package Transferencia;

public class Banco {
	public void transferir(Cliente CltA, Cliente CltB, float monto){
		try {
			CltA.extraer(monto);
		} catch (SinFondosException e) {
			System.out.println(e.getMessage());
		}
		try {
			CltB.depositar(monto);
		} catch (SuperaMaximoException e) {
			System.out.println(e.getMessage());
		}
	}
	
	public static void main(String [] args){
		Banco b = new Banco();
		Cliente cltA, cltB;
		float transferir = 0;
		
		//Caso prueba 1
		System.out.println("Caso de prueba A:");
		cltA = new Cliente(100);
		cltB = new Cliente(100);
		System.out.println("Inicial A: " + cltA.getDisponible());
		System.out.println("Inicial B: " + cltB.getDisponible());
		transferir = 50;
		System.out.println("Se intentan transferir " + transferir + " pesos");
		b.transferir(cltA, cltB, transferir);
		System.out.println("Final A: " + cltA.getDisponible());
		System.out.println("Final B: " + cltB.getDisponible());
		System.out.println("-------------------------------------");
		
		//Caso prueba 2
		System.out.println("Caso de prueba 2:");
		cltA = new Cliente(100);
		cltB = new Cliente(5000);
		System.out.println("Inicial A: " + cltA.getDisponible());
		System.out.println("Inicial B: " + cltB.getDisponible());
		transferir = 60;
		System.out.println("Se intentan transferir " + transferir + " pesos");
		b.transferir(cltA, cltB, transferir);
		System.out.println("Final A: " + cltA.getDisponible());
		System.out.println("Final B: " + cltB.getDisponible());
		System.out.println("Observar el error en el manejo de excepciones para este caso de prueba");
		System.out.println("-------------------------------------");
		
		//Caso prueba 3
		System.out.println("Caso de prueba 3:");
		cltA = new Cliente(100);
		cltB = new Cliente(200);
		System.out.println("Inicial A: " + cltA.getDisponible());
		System.out.println("Inicial B: " + cltB.getDisponible());
		transferir = 150;
		System.out.println("Se intentan transferir " + transferir + " pesos");
		b.transferir(cltA, cltB, transferir);
		System.out.println("Final A: " + cltA.getDisponible());
		System.out.println("Final B: " + cltB.getDisponible());
		System.out.println("Observar el error en el manejo de excepciones para este caso de prueba");
		System.out.println("-------------------------------------");
		
	}
}
								
									
package Transferencia;

public class SinFondosException extends Exception {
	public SinFondosException(String msg){
		super(msg);
	}
}
								
									
package Transferencia;

public class SuperaMaximoException extends Exception {
	public SuperaMaximoException(String msg){
		super(msg);
	}
}
								

Genericidad

Ejemplo Encapsulador

A continuación se puede observar el código fuente utilizado para ejemplificar la genericidad paramétrica.

  • Package Encapsulador

    Package Encapsulador
									
package Encapsulador;

public class Encapsulador <E> {
	private E elemento;
	
	public E getElemento(){ return elemento;}
	public void setElemento(E e){ elemento = e;}
	
	public static void main(String [] arg){
		Encapsulador<Integer> encapInt = new Encapsulador<Integer>();
		encapInt.setElemento(10);
		
		Encapsulador<Float> encapFloat = new Encapsulador<Float>();
		encapFloat.setElemento(10.5f);
		
		System.out.println("Entero encapsulado: " + encapInt.getElemento());
		System.out.println("Float encapsulado: " + encapFloat.getElemento());
	}	
}
								

Interfaces

Ejemplo Coleccion

A continuación se puede observar el código fuente utilizado para ejemplificar el uso de interfaces.

  • Package Colección

    Package Colección
									
package Coleccion;

public interface Coleccion<E> {
	public void insertar(E elemento);
	public boolean pertenece (E elemento);
	public void eliminar (E elemento);
	public void mostrar();
}
								
									
package Coleccion;

public class ColeccionConArreglo<E> implements Coleccion<E>{

	private E [] arreglo;
	private int cantidad;
	private final int capacidad_inicial = 100;
	
	@SuppressWarnings("unchecked")
	public ColeccionConArreglo(){
		arreglo = (E[]) new Object[capacidad_inicial];
		cantidad = 0;
	}
	
	public void insertar(E elemento) {
		// Si el arreglo no tiene más capacidad, debe redimensionarse.
		if (cantidad == arreglo.length )
			resize();
		
		// Chequeo para evitar elementos duplicados.
		if (! pertenece(elemento) )
			arreglo[cantidad++] = elemento;
	}

	
	public boolean pertenece(E elemento) {
		boolean pertenece = false;
		for(int i=0; i<cantidad && !pertenece; i++)
			pertenece = (arreglo[i].equals(elemento));
		return pertenece;
	}

	
	public void eliminar(E elemento) {
		boolean encontre = false;
		
		for(int i=0; i<cantidad && !encontre; i++){
			if (arreglo[i].equals(elemento)) {
				desplazar_izquierda_desde(i);
				encontre = true;
				cantidad--;
			}
		}
	}
	
	public void mostrar(){
		for(int i = 0; i<cantidad; i++)
			System.out.println("Coleccion["+(i+1)+"]= " + arreglo[i]);
	}
	
	@SuppressWarnings("unchecked")
	private void resize(){
		E [] arreglo_aux = (E[]) new Object[arreglo.length * 2];
				
		for(int i=0; i<cantidad; i++)
			arreglo_aux[i] = arreglo[i];
		arreglo = arreglo_aux;
	}
	
	private void desplazar_izquierda_desde(int indice){
		while(indice+1 < arreglo.length){
			arreglo[indice] = arreglo[indice+1];
			indice++;
		}
		arreglo[indice] = null;
	}
}
								
									
package Coleccion;

import java.util.Vector;

public class ColeccionConVector<E> implements Coleccion<E>{
	
	private Vector<E> vector;
	
	public ColeccionConVector(){
		vector = new Vector<E>();
	}
	
	public void insertar(E elemento) {
		if (! vector.contains(elemento) )
			vector.add(elemento);
	}

	public boolean pertenece(E elemento) {
		return vector.contains(elemento);
	}

	public void eliminar(E elemento) {
		vector.remove(elemento);
	}
	
	public void mostrar(){
		for(int i = 0; i<vector.size(); i++)
			System.out.println("Coleccion["+(i+1)+"]= " + vector.elementAt(i));
	}
}
								
									
package Coleccion;

public class Tester {
	public static void main(String [] args){
		// Colección de enteros
		Coleccion<Integer> col = new ColeccionConArreglo<Integer>();
		//Coleccion<Integer> col = new ColeccionConVector<Integer>();
		
		// Colección de floats
		//Coleccion<Float> col = new ColeccionConArreglo<Float>();
		//Coleccion<Float> col = new ColeccionConVector<Float>();
		
		System.out.println("Agrega los elementos 1-10 a la colección");
		for (int i=1; i<=10; i++)
			col.insertar(i);
		
		System.out.println("Coleccion inicial:");
		col.mostrar();

		System.out.println("¿Pertenece 5?: "+ col.pertenece(5));
		System.out.println("Elimina elemento 5");
		col.eliminar(5);
		System.out.println("¿Pertenece 5?: "+ col.pertenece(5));
		

		System.out.println("¿Pertenece 1?: "+ col.pertenece(1));
		System.out.println("¿Pertenece 10?: "+ col.pertenece(10));
	}
}
								

Código fuente online

Generación de documentación Javadoc.

* * *

Documentación Javadoc

Ejemplo Calculadora

A continuación se puede observar el código fuente utilizado para ejemplificar la documentación de código mediante la herramienta Javadoc.

  • Package Calculadora

    Package Calculadora
									
package Calculadora;

/**
 * Modela las operaciones de una calculadora.
 * @author Federico Joaquín (federico.joaquin@cs.uns.edu.ar)
 */
public class Calculadora {
	/**
	 * Computa la división real entre dos valores.
	 * @param dividendo Valor del dividendo de la división.
	 * @param divisor Valor del divisor de la división.
	 * @return Resultado de aplicar la división.
	 * @throws DivisionPorCero en caso que divisor sea cero.
	 */
	public static float dividir(float dividendo, float divisor) throws DivisionPorCero{
		if (divisor == 0) throw new DivisionPorCero("Error");
		return dividendo/divisor;
	}
	/**
	 * Computa la suma real entre dos valores.
	 * @param op1 Operando 1 de la suma.
	 * @param op2 Operando 2 de la suma.
	 * @return Resultado de aplicar la suma.
	 */
	public static float sumar(float op1, float op2) {
		return op1 + op2;
	}
	/**
	 * Computa la resta real entre dos valores.
	 * @param op1 Operando 1 de la resta.
	 * @param op2 Operando 2 de la resta.
	 * @return Resultado de aplicar la resta.
	 */
	public static float restar(float op1, float op2) {
		return op1 - op2;
	}
	/**
	 * Computa la multiplicación real entre dos valores.
	 * @param op1 Operando 1 de la multiplicación.
	 * @param op2 Operando 2 de la multiplicación.
	 * @return Resultado de aplicar la multiplicación.
	 */
	public static float multiplicar(float op1, float op2) {
		return op1 * op2;
	}
	/**
	 * Método que inicia la ejecución del programa.
	 * Testea las operaciones suma, resta, multiplicación y división con un caso de prueba simple.
	 * @param args Argumentos por línea de comandos.
	 */
	public static void main(String [] args){
		float resultado = 0;
		
		try {
			resultado = dividir(10, 0);
			System.out.println("El resultado de dividir 10 y 0 es: " + resultado);
		} catch (DivisionPorCero e) {
			System.out.println(e.getMessage());
		}
		
		resultado = sumar (10,10);
		System.out.println("El resultado de sumar 10 y 10 es: " + resultado);
		
		resultado = restar(25, 15);
		System.out.println("El resultado de restar 25 y 15 es: " + resultado);
		
		resultado = multiplicar (105, -2);
		System.out.println("El resultado de multiplicar 105 y -2 es: " + resultado);
				
	}
}
								
									
package Calculadora;
/**
 * Modela la excepción ante una división por cero.
 * @author Federico Joaquín (federico.joaquin@cs.uns.edu.ar)
 *
 */
@SuppressWarnings("serial")
public class DivisionPorCero extends Exception {
	/**
	 * Inicializa la excepción indicando el origen del error.
	 * @param msj Especifica información adicional a cerca de la excepción.
	 */
	public DivisionPorCero(String msj){
		super(msj);
	}
}
								

Código fuente online

Generación de Jar Ejecutables.

* * *

Generación de Jar Ejecutables

Ejemplo GUI Calculadora

A continuación se puede observar el código fuente utilizado para ejemplificar la generación de Jars ejecutables.

  • Packages

    Packages Jars Ejecutable
									
package Calculadora;

/**
 * Modela las operaciones de una calculadora.
 * @author Federico Joaquín (federico.joaquin@cs.uns.edu.ar)
 */
public class Calculadora {
	/**
	 * Computa la división real entre dos valores.
	 * @param dividendo Valor del dividendo de la división.
	 * @param divisor Valor del divisor de la división.
	 * @return Resultado de aplicar la división.
	 * @throws DivisionPorCero en caso que divisor sea cero.
	 */
	public static float dividir(float dividendo, float divisor) throws DivisionPorCero{
		if (divisor == 0) throw new DivisionPorCero("Error");
		return dividendo/divisor;
	}
	/**
	 * Computa la suma real entre dos valores.
	 * @param op1 Operando 1 de la suma.
	 * @param op2 Operando 2 de la suma.
	 * @return Resultado de aplicar la suma.
	 */
	public static float sumar(float op1, float op2) {
		return op1 + op2;
	}
	/**
	 * Computa la resta real entre dos valores.
	 * @param op1 Operando 1 de la resta.
	 * @param op2 Operando 2 de la resta.
	 * @return Resultado de aplicar la resta.
	 */
	public static float restar(float op1, float op2) {
		return op1 - op2;
	}
	/**
	 * Computa la multiplicación real entre dos valores.
	 * @param op1 Operando 1 de la multiplicación.
	 * @param op2 Operando 2 de la multiplicación.
	 * @return Resultado de aplicar la multiplicación.
	 */
	public static float multiplicar(float op1, float op2) {
		return op1 * op2;
	}
	/**
	 * Método que inicia la ejecución del programa.
	 * Testea las operaciones suma, resta, multiplicación y división con un caso de prueba simple.
	 * @param args Argumentos por línea de comandos.
	 */
	public static void main(String [] args){
		float resultado = 0;
		
		try {
			resultado = dividir(10, 0);
			System.out.println("El resultado de dividir 10 y 0 es: " + resultado);
		} catch (DivisionPorCero e) {
			System.out.println(e.getMessage());
		}
		
		resultado = sumar (10,10);
		System.out.println("El resultado de sumar 10 y 10 es: " + resultado);
		
		resultado = restar(25, 15);
		System.out.println("El resultado de restar 25 y 15 es: " + resultado);
		
		resultado = multiplicar (105, -2);
		System.out.println("El resultado de multiplicar 105 y -2 es: " + resultado);
				
	}
}
								
									
package Calculadora;
/**
 * Modela la excepción ante una división por cero.
 * @author Federico Joaquín (federico.joaquin@cs.uns.edu.ar)
 *
 */
@SuppressWarnings("serial")
public class DivisionPorCero extends Exception {
	/**
	 * Inicializa la excepción indicando el origen del error.
	 * @param msj Especifica información adicional a cerca de la excepción.
	 */
	public DivisionPorCero(String msj){
		super(msj);
	}
}
								
									
package GUI_Calculadora;

import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;

import Calculadora.Calculadora;
import Calculadora.DivisionPorCero;

import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JTextField;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.Font;
import java.awt.Image;
import javax.swing.SwingConstants;

/**
 * Modela la GUI de una calculadora con 4 operaciones: sumar, restar, multiplicar, dividir.
 * @author Federico Joaquín (federico.joaquin@cs.uns.edu.ar)
 *
 */
@SuppressWarnings("serial")
public class VentanaCalculadora extends JFrame {
	
	//Atributos de instancia de clase
	private JPanel contentPane;
	private JTextField operando1;
	private JTextField operando2;

	/**
	 * Método principal de la aplicación.
	 * Crea una instancia de VentanaCalculadora.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					VentanaCalculadora frame = new VentanaCalculadora();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Inicializa las componentes gráficas de la GUI.
	 */
	public VentanaCalculadora() {
		setResizable(false);
		setTitle("ED 2019-2020 || Mini calculadora by F. Joaqu\u00EDn");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 580, 200);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		contentPane.setLayout(null);
		
		JLabel lblMinicalculadoraestructurasDeDatos = new JLabel("Estructuras de Datos 2019-2020");
		lblMinicalculadoraestructurasDeDatos.setHorizontalAlignment(SwingConstants.CENTER);
		lblMinicalculadoraestructurasDeDatos.setFont(new Font("Corbel", Font.BOLD | Font.ITALIC, 20));
		lblMinicalculadoraestructurasDeDatos.setBounds(116, 22, 300, 50);
		contentPane.add(lblMinicalculadoraestructurasDeDatos);
		
		JButton btnSumar = new JButton("Sumar");
		btnSumar.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				float op1, op2, resultado;
				if (operandosValidos()) {
					op1 = Float.parseFloat(operando1.getText());
					op2 = Float.parseFloat(operando2.getText());
					resultado = Calculadora.sumar(op1, op2);
					JOptionPane.showMessageDialog(null, "El resultado de la operación suma es: " + resultado, "Información de operación", JOptionPane.INFORMATION_MESSAGE);
				}else {
					JOptionPane.showMessageDialog(null, "Alguno de los operandos ingresados son inválidos", "Error datos entrada", JOptionPane.WARNING_MESSAGE);
				}	
			}
		});
		btnSumar.setBounds(81, 125, 89, 23);
		contentPane.add(btnSumar);
		
		JButton btnRestar = new JButton("Restar");
		btnRestar.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				float op1, op2, resultado;
				if (operandosValidos()) {
					op1 = Float.parseFloat(operando1.getText());
					op2 = Float.parseFloat(operando2.getText());
					resultado = Calculadora.restar(op1, op2);
					JOptionPane.showMessageDialog(null, "El resultado de la operación resta es: " + resultado, "Información de operación", JOptionPane.INFORMATION_MESSAGE);
				}else {
					JOptionPane.showMessageDialog(null, "Alguno de los operandos ingresados son inválidos", "Error datos entrada", JOptionPane.WARNING_MESSAGE);
				}	
			}
		});
		btnRestar.setBounds(180, 125, 89, 23);
		contentPane.add(btnRestar);
		
		JButton btnMultiplicar = new JButton("Multiplicar");
		btnMultiplicar.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				float op1, op2, resultado;
				if (operandosValidos()) {
					op1 = Float.parseFloat(operando1.getText());
					op2 = Float.parseFloat(operando2.getText());
					resultado = Calculadora.multiplicar(op1, op2);
					JOptionPane.showMessageDialog(null, "El resultado de la operación multiplicar es: " + resultado, "Información de operación", JOptionPane.INFORMATION_MESSAGE);
				}else {
					JOptionPane.showMessageDialog(null, "Alguno de los operandos ingresados son inválidos", "Error datos entrada", JOptionPane.WARNING_MESSAGE);
				}	
			}
		});
		btnMultiplicar.setBounds(279, 125, 89, 23);
		contentPane.add(btnMultiplicar);
		
		JButton btnDividir = new JButton("Dividir");
		btnDividir.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				float op1, op2, resultado;
				if (operandosValidos()) {
					op1 = Float.parseFloat(operando1.getText());
					op2 = Float.parseFloat(operando2.getText());
					
					try {
						resultado = Calculadora.dividir(op1, op2);
						JOptionPane.showMessageDialog(null, "El resultado de la operación dividir es: " + resultado, "Información de operación", JOptionPane.INFORMATION_MESSAGE);
					} catch (DivisionPorCero e) {
						JOptionPane.showMessageDialog(null, "No se puede realizar una división por cero.", "Error datos entrada", JOptionPane.ERROR_MESSAGE);
					}
				}else {
					JOptionPane.showMessageDialog(null, "Alguno de los operandos ingresados son inválidos", "Error datos entrada", JOptionPane.WARNING_MESSAGE);
				}	
			}
		});		
		btnDividir.setBounds(378, 125, 89, 23);
		contentPane.add(btnDividir);
		
		operando1 = new JTextField();
		operando1.setBounds(186, 94, 86, 20);
		contentPane.add(operando1);
		operando1.setColumns(10);
		
		JLabel lblOperando = new JLabel("Operando 1:");
		lblOperando.setBounds(113, 97, 84, 14);
		contentPane.add(lblOperando);
		
		JLabel lblOperando_1 = new JLabel("Operando 2:");
		lblOperando_1.setBounds(282, 97, 84, 14);
		contentPane.add(lblOperando_1);
		
		operando2 = new JTextField();
		operando2.setBounds(353, 94, 86, 20);
		contentPane.add(operando2);
		operando2.setColumns(10);
		
		JLabel label = new JLabel("");
		ImageIcon iconoDCIC = new javax.swing.ImageIcon(getClass().getResource("/Imagenes/DCIC.png"));
		Image imagenDCIC = iconoDCIC.getImage();
        ImageIcon iconoDCICEscalado = new ImageIcon (imagenDCIC.getScaledInstance(50,50,Image.SCALE_SMOOTH));
		label.setIcon(iconoDCICEscalado);
        label.setBounds(56, 22, 50, 50);
		contentPane.add(label);
		
		JLabel label_1 = new JLabel("");
		ImageIcon iconoUNS = new javax.swing.ImageIcon(getClass().getResource("/Imagenes/UNS.png"));
		Image imagenUNS = iconoUNS.getImage();
        ImageIcon iconoUNSEscalado = new ImageIcon (imagenUNS.getScaledInstance(65,50,Image.SCALE_SMOOTH));
		label_1.setIcon(iconoUNSEscalado);
		label_1.setBounds(430, 18, 65, 50);
		contentPane.add(label_1);
		
		JLabel label_2 = new JLabel("");
		ImageIcon iconoCalc = new javax.swing.ImageIcon(getClass().getResource("/Imagenes/Calculadora.png"));
		Image imagenCalc = iconoCalc.getImage();
        ImageIcon iconoCALCEscalado = new ImageIcon (imagenCalc.getScaledInstance(50,50,Image.SCALE_SMOOTH));
		label_2.setIcon(iconoCALCEscalado);
		label_2.setBounds(21, 94, 50, 50);
		contentPane.add(label_2);
	}
	
	/**
	 * Cheque la correctitud de los operandos ingresados.
	 * @return True si los operandos ingresados son válidos, false en caso contrario.
	 */
	private boolean operandosValidos(){
		boolean toReturn = true;
		
		//Si no se ingresó el operando 1, el operando 2 o ambos, estos no son válidos
		if (operando1.getText().isEmpty() || operando2.getText().isEmpty())
			toReturn = false;
		else {
			//Valida que los operandos ingresados sean valores numéricos.
			try {
				Float.parseFloat(operando1.getText());
				Float.parseFloat(operando2.getText());
			//Si al intentar convertir el String a Float existe error de conversión, los operandos no son válidos.
			}catch(NumberFormatException e) {
				toReturn = false;
			}
		}
		return toReturn;
	}
}
								

Código fuente online

Práctico Pilas y Colas

* * *

Práctico Pilas y Colas

Chequear_formato(...)

A continuación se puede observar el código fuente utilizado para implementar el Ejercicio 10, Inciso a, del Práctico de Pilas y Colas.

  • Packages

    Packages Chequear Formato
									
package Operaciones;

import TDACola.*;
import TDAPila.*;

public class Operaciones_con_colas {
	
	/**
	 * Método que chequea si una cola de caracteres cumple el siguiente formato: AxA'A.
	 * A es una cadena de uno o más caracteres.
	 * A' corresponde con los caracteres de la cadena A pero en orden inverso.
	 * x corresponde con un caracter separador.
	 * 
	 * @param q Cola de caracteres con los que se valida el formato. 
	 * @param x Caracter separador en el formato AxA'A
	 * @return Verdadero si la cola q cumple con el formato; false en caso contrario.
	 * 
	 * Ejemplo de cadena válida: q = < a, b, c, $, c, b, a, a, b, c >, con A = abc, A' = cba y x = $.
	 * Ejemplos de cadenas inválidas: q = < a, b, c, $ >, q = < >, en todos los casos con x = $. 
	 * 
	 */
	public static boolean chequear_formato(Queue<Character> q, char x) {
		// Variables auxiliares utilizadas.
		Queue<Character> cola_control_a;
		Stack<Character> pila_control_a_prima;
		boolean respeta_formato = false;
		char caracter_de_q, caracter_control_a, caracter_control_a_prima;
		
		// Se instancia una pila y una cola auxiliares que se utilizarán para chequear que la cola q
		// cumpla con el formato A'A luego de hallar el caracter separador x.
		pila_control_a_prima = new LinkedStack<Character>();
		cola_control_a = new LinkedQueue<Character>();
		
		try {
			
			// Teniendo en cuenta que cualquier subcadena A de una cola q que respete el formato tiene 
			// al menos 1 caracter, entonces la cola q debería tener al menos 4 caracteres para respetar 
			// el formato q = AxA'A.
			respeta_formato = (q.size() >= 4);
				
			if (respeta_formato) {
				
				caracter_de_q = q.dequeue();
				
				// Bucle que consume la primera subcadena A de la cola de caracteres q.
				// El bucle finaliza cuando se consume el separador x, o cuando la cola q se quede 
				// sin caracteres. Cada uno de los caracteres consumidos se guardan tanto en la 
				// cola_de_control_a y pila_control_a_prima para luego validar que q cumpla el formato 
				// xA'A luego del separador x.
				while (caracter_de_q != x && !q.isEmpty()) {
					cola_control_a.enqueue(caracter_de_q);
					pila_control_a_prima.push(caracter_de_q);
					caracter_de_q = q.dequeue();
				}
								
				// Finalizado el bucle while, se validan las siguientes condiciones:
				// - Se respeta el formato siempre que se haya consumido el caracter separador x.
				// - Se respeta el formato siempre que la longitud de la subcadena A sea mayor a cero.
				respeta_formato = (caracter_de_q == x) && !cola_control_a.isEmpty();
				
				if (respeta_formato) {
					
					// Valida que en q ahora aparezca la cadena A'
					
					// Bucle que consume y valida la subcadena A' de la cola de caracteres q.
					// El bucle finaliza cuando se detecta que:
					// - La cola de caracteres q deja de respetar el formato.
					// - La pila_de_control_a_prima se queda sin caracteres.
					// - La cola q no tienen más elementos para consumir.
					while(respeta_formato && !pila_control_a_prima.isEmpty() && !q.isEmpty()) {
						caracter_de_q = q.dequeue();
						caracter_control_a_prima = pila_control_a_prima.pop();
						respeta_formato = (caracter_de_q == caracter_control_a_prima);
					}
					
					// Finalizado el bucle while, se validan las siguientes condiciones:
					// - Se respeta el formato siempre que todos los caracteres procesados hayan respetado el formato.
					// - Se respeta el formato siempre que la pila_control_a_prima no tenga más caracteres a procesar.
					// - Se respeta el formato siempre que la cola q aún tenga elementos para procesar la subcadena A luego de A'.
					respeta_formato = respeta_formato && pila_control_a_prima.isEmpty() && !q.isEmpty();
					
					// El bucle finaliza cuando se detecta que:
					// - La cola de caracteres q deja de respetar el formato.
					// - La cola_de_control_a se queda sin caracteres.
					// - La cola q no tienen más elementos para consumir.
					while(respeta_formato && !q.isEmpty() && !cola_control_a.isEmpty()) {
						caracter_de_q = q.dequeue();
						caracter_control_a = cola_control_a.dequeue();
						respeta_formato = (caracter_de_q == caracter_control_a);
					}
					
					// Finalizado el bucle while, se validan las siguientes condiciones:
					// - Se respeta el formato siempre que todos los caracteres procesados hayan respetado el formato.
					// - Se respeta el formato siempre que la cola_control_a no tenga más caracteres a procesar.
					// - Se respeta el formato siempre que en la cola q no queden elementos extras a procesar.
					respeta_formato = respeta_formato && cola_control_a.isEmpty() && q.isEmpty();
				}
			}
		
		}catch(EmptyQueueException e) {
		}catch(EmptyStackException e1) {
		}
		
		return respeta_formato;
	}
	
	public static void main(String [] args) {
		Queue<Character> cola = new LinkedQueue<Character>();
		String cola_prueba;
		int i;
		
		// Caso de prueba: cadena válida
		cola_prueba = "abc$cbaabc";
		for(i=0; i<cola_prueba.length(); i++) {
			cola.enqueue(cola_prueba.charAt(i));
		}
		System.out.println("chequear_formato("+cola_prueba+",$): " + chequear_formato(cola, '$') );
		
		// Caso de prueba: cadena inválida
		cola_prueba = "bccabc$cbaccbbccabc";
		for(i=0; i<cola_prueba.length(); i++) {
			cola.enqueue(cola_prueba.charAt(i));
		}		
		System.out.println("chequear_formato("+cola_prueba+",$): " + chequear_formato(cola, '$') );
		
		// Caso de prueba: cadena inválida
		cola_prueba = "bccbaabc";
		for(i=0; i<cola_prueba.length(); i++) {
			cola.enqueue(cola_prueba.charAt(i));
		}		
		System.out.println("chequear_formato("+cola_prueba+",$): " + chequear_formato(cola, '$') );
		
		// Caso de prueba: cadena inválida
		cola_prueba = "abc$cbaabcc";
		for(i=0; i<cola_prueba.length(); i++) {
			cola.enqueue(cola_prueba.charAt(i));
		}		
		System.out.println("chequear_formato("+cola_prueba+",$): " + chequear_formato(cola, '$') );
		
		// Caso de prueba: cadena inválida
		cola_prueba = "a";
		for(i=0; i<cola_prueba.length(); i++) {
			cola.enqueue(cola_prueba.charAt(i));
		}		
		System.out.println("chequear_formato("+cola_prueba+",$): " + chequear_formato(cola, '$') );
		
		// Caso de prueba: cadena inválida
		cola_prueba = "$cbaabcc";
		for(i=0; i<cola_prueba.length(); i++) {
			cola.enqueue(cola_prueba.charAt(i));
		}		
		System.out.println( "chequear_formato("+cola_prueba+",$): " + chequear_formato(cola, '$') );
		
		// Agregar casos de prueba ...
		
	}
	
}
								

Código fuente online

Iterable vs. Iterator

* * *

Iterable vs. Iterator

Implementación de iteradores

A continuación se puede observar el código fuente utilizado para implementar dos iteradores de lista: uno que itera sobre la lista original, otro que clona el contenido de la lista para implementar las iteraciones.

  • Packages

    Packages Iterable Iterator
									
package TDALista;

import java.util.Iterator;
import java.util.NoSuchElementException;

/**
 * Clase que modela un iterador de lista. </br>
 * El iterador se modela internamente con <i>punteros</i> a los elementos de lista original.</br>
 * Provee la funcionalidad de un iterador, realizando toda la operatoria sobre la ED original. </br>
 * <b>No asegura</b> un correcto funcionamiento si durante el proceso de iteración la lista es modificada.</br>
 * @author FJoaquin (federico.joaquin@cs.uns.edu.ar)
 *
 * @param <E> Tipo de dato de los elementos de la lista a iterar.
 */
public class IteradorListaSobreEdOriginal<E> implements Iterator<E>{
	
	private PositionList<E> lista;
	private Position<E> cursor;
	
	  /**
	   * Inicializa la ED interna considerando incialmente el primer elemento de la lista.
	   * @param lista Contiene los elementos a ser iterados.
	   */
	public IteradorListaSobreEdOriginal(PositionList<E> l){
		try {
			lista = l;
			if (lista != null && !lista.isEmpty())
				cursor = l.first();
		}catch (EmptyListException e) {
			cursor = null;
		}
	}
	
	@Override
	public boolean hasNext() {
		// COMPLETAR
		return false;
	}

	@Override
	public E next() throws NoSuchElementException{ 
		// COMPLETAR 
		return null;
	}
}
								
									
package TDALista;

import java.util.Iterator;
import java.util.NoSuchElementException;
import TDACola.*;

/**
 * Clase que modela un iterador de lista. </br>
 * El iterador se modela internamente con una <i>ED Auxiliar</i> a la lista, esto es, se realiza una clonación de los elementos de la lista sobre una ED Auxiliar.</br>
 * Provee la funcionalidad de un iterador, realizando toda la operatoria sobre la ED Auxiliar. </br>
 * <b>Requiere:</b> <i>TDACola</i>.
 * @author FJoaquin (federico.joaquin@cs.uns.edu.ar)
 *
 * @param <E> Tipo de dato de los elementos de la lista a iterar.
 */
public class IteradorListaSobreEdAuxiliar<E> implements Iterator<E>{
	  private Queue<E> cola;
	  
	  /**
	   * Clona en una estructura auxiliar todos los elementos de lista.
	   * @param lista Contiene los elementos a ser iterados.
	   */
	  public IteradorListaSobreEdAuxiliar(PositionList<E> lista) {
	    cola = new LinkedQueue<E>();
	    try {
	      Position<E> cursor = lista.isEmpty() ? null : lista.first();
	      while(cursor != null) {
	        cola.enqueue(cursor.element());
	        cursor = (cursor == lista.last()) ? null : lista.next(cursor);
	      }
	    }
	    catch(EmptyListException e) { cola = new LinkedQueue<E>();}
	    catch(InvalidPositionException e1) { cola = new LinkedQueue<E>();} 
	    catch(BoundaryViolationException e2) { cola = new LinkedQueue<E>();}
	  }  
	  
	  @Override
	  public boolean hasNext(){
		  // COMPLETAR
		  return false;
	  }
	  
	  @Override
	  public E next() throws NoSuchElementException{ 
		  // COMPLETAR 
		  return null;
	  }
	}
								

Iterable vs. Iterator

Implementación de positions

A continuación se puede observar el código fuente utilizado para implementar el método positions().

  • Packages

    Packages Iterable Iterator
									
package TDALista;

public class DoubleLinkedList<E> implements PositionList<E>{
	protected DNode<E> header, trailer;
	
	// Implementación de lista 

	public Iterable<Position<E>> positions() {
		PositionList<Position<E>> iterable;
		iterable = new DoubleLinkedList<Position<E>>();
		DNode<E> actual = header.getNext();
		
		while(actual != trailer) {
			iterable.addLast(actual);
			actual = actual.getNext();
		}
		
		return iterable;
	}
}								

Iterable vs. Iterator

Eliminando elementos de una lista

A continuación se puede observar el código fuente utilizado eliminar elemento de una lista, cuando esta se recorre "manualmente" y mediante un iterable de posiciones.

  • Packages

    Packages Iterable Iterator
									
package Operaciones_con_listas;

import TDALista.BoundaryViolationException;
import TDALista.DoubleLinkedList;
import TDALista.EmptyListException;
import TDALista.InvalidPositionException;
import TDALista.Position;
import TDALista.PositionList;

/**
 * Clase que encapsula dos métodos para eliminar los elementos pares de una lista de valores enteros.</br>
 * Los métodos se distinguen por la forma en la que se recorren las listas a modificar:
 * <ul>
 * <li> <i>Con recorrido "manual"</i>: se utilizan los métodos first(), last(), next() de la lista.</li>
 * <li> <i>Con método positions()</i>: se utiliza la instrucción for-each y el iterable de posiciones retornado por el método positions() de lista.</li>
 * </ul> </br>
 * 
 * <b>Requiere:</b> <i>TDALista2</i>.
 * @author FJoaquin (federico.joaquin@cs.uns.edu.ar)
 */
public class Operaciones_con_listas{
	
	/**
	 * Elimina los números pares de una lista, recorriéndola de forma "manual".
	 * @param l Lista a modificar, eliminándole los números pares.
	 */
	public static void eliminar_con_recorrido_manual(PositionList<Integer> l){
		int elemento;
		try{
			Position<Integer> actual = l.isEmpty() ? null : l.first();
			Position<Integer> aux;
			while(actual != null && actual != l.last()){
				elemento = actual.element();
				aux = l.next(actual);
				if (elemento % 2 == 0){
					l.remove(actual);
				}
				actual = aux;
			}
			if (actual != null){
				if (actual.element() % 2 == 0)
					l.remove(actual);
			}
		}catch(EmptyListException e){
		}catch(InvalidPositionException e1){
		}catch(BoundaryViolationException e2){
		}
	}
	
	/**
	 * Elimina los números pares de una lista, recorriéndola mediante el uso de un iterable de posiciones.
	 * @param l Lista a modificar, eliminándole los números pares.
	 */
	public static void eliminar_con_positions(PositionList<Integer> l){
		try{
			for(Position<Integer> pos : l.positions()){
				if (pos.element() % 2 == 0)
					l.remove(pos);
			}
		}catch(InvalidPositionException e){}
	}
	
	/**
	 * Método que inicia la ejecución del programa. Testea el funcionamiento de <i>eliminar_con_recorrido_manual</i> y <i>eliminar_con_positions</i> con dos listas prueba.
	 * @param args Argumentos por línea de comandos.
	 */
	public static void main(String [] args){
		PositionList<Integer> l1 = new DoubleLinkedList<Integer>();
		PositionList<Integer> l2 = new DoubleLinkedList<Integer>();
		
		//Inicializa L1 con elementos enteros en el rango [20-40]
		//Inicializa L2 con elementos enteros en el rango [50-70]
		for(int i=0; i<=20; i++) {
			l1.addLast(20 + i);
			l2.addLast(50 + i);
		}
				
		//Muestra el contenido de L1 y L2 haciendo uso de dos iteradores.
		System.out.println("Elementos de L1 antes de eliminar:");
		for(Integer i : l1) System.out.print(i + " - ");
		System.out.println("\nElementos de L2 antes de eliminar:");
		for(Integer i : l2) System.out.print(i + " - ");
		
		//Elimina los elementos pares de L1 y L2.
		eliminar_con_recorrido_manual(l1);
		eliminar_con_positions(l2);
		
		//Muestra el contenido de L1 y L2 haciendo uso de dos iteradores.
		System.out.println("\nElementos de L1 luego de eliminar:");
		for(Integer i : l1) System.out.print(i + " - ");
		System.out.println("\nElementos de L2 luego de eliminar:");
		for(Integer i : l2) System.out.print(i + " - ");
	}
}
								
Closing image
Photo by Helloquence on Unsplash

Fin de la presentación

Slides generadas mediante la herramienta Open Source @webslides.