Universidad de Costa Rica
Recinto de Golfito
Informática Empresarial
Profesores Di Mare y Noguera
IF-3001
I Semestre 2013
[<=] [home] [<>] [\/] [=>]
IF-3001 Algoritmos y Estructuras de Datos

Tarea #1 [solución]

Convertidor de expresiones infijas

.../pub/Pg1-T9

      Diseñe e implemente su clase RPN para que funcione con el programa de prueba TestRPN.java que ejercita los métodos que permitan traducir una hilera que contiene una expresión infija, en la que es necesario usar paréntesis, en una posfija equivalente. Para obtener su implementación, use el algoritmo que funciona usando pilas. Además, su implementación de la clase RPN debe ser polimórfica, de manera que la expresión pueda tener números enteros o números de punto flotante. También incluya el método useLista() y el método usaVector() que cambia el tipo de pila de una implementada con listas a otras implementada con vectores, y viceversa. De esta forma, su clase podrá modificar en tiempo de ejecusión su rendimiento tanto en uso de espacio como en tiempo de ejecución.

      Además, incluya más datos de prueba para RPN, con el fin de ejercitar la mayor parte de las posibles variantes de ejecución para su clase. Luego, agregue un interfaz amigable usando ventanas. Recuerde que las clases lista y vector de Java necesitan empacar (box/unbox) en una clase los objetos que contienen, por lo que usted está obligado a lidiar con esta necesaria incomodidad del lenguaje.

      Para esta tarea programada ustedes debe entregar, por lo menos, estos archivos:

  1. RPN.java
  2. Calculadora.java
  3. TestRPN.java
  4. CARNET.docx
  5. CARNET.html
  6. CARNET.url

      En el documento CARNET.docx deben describir su experiencia de aprendizaje para completar esta tarea. Explique qué hizo, cómo lo hizo y por qué lo hizo. En especial, es importante que mencionen por qué escogieron las instrucciones que incluyeron y cuáles fueron las dificultades que enfrentaron. El archivo CARNET.html es copia de la página Internet en donde usted instaló la solución de su tarea programada. El archivo de enlace Internet CARNET.url contiene solo 2 renglones y sirve para abrir la página Internet en que está la documentación completa de su programa (para crearlo puede usar cualquier editor de texto).

[InternetShortcut]
URL=http://www.di-mare.com/adolfo/cursos/if-3001.htm
if-3001.url

Consulta:
Profe: ¿Puedo usar mi propia lista?
Respuesta:
No. Deben usar la lista y el vector de la biblioteca de Java. Usen los contenedores parametrizados, que son los que tienen el parámetro <E> en su encabezado.
Consulta:
Profe: ¿Cuál es el programa de ejemplo que debemos usar para leer del teclado?
Respuesta:
No es un programa; se llama el patrón Modelo-Vista-Controlador y sirve para desligar la interfaz de los algoritmos de implementación y de los datos, que generalmente se almacenan en una base de datos. Un ejemplo Java lo pueden ver en la tarea del “Remolvo en Espiral” de un semestre anterior. Esta es una forma de implementar la “arquitectura de 3 capas” que se usa para mejorar el rendimiento de los sistemas de información.
Consulta:
Profe: ¿Estoy en la obligación de usar las clases Algoritmo, Interfaz, Controlador y Datos en el programa?
Respuesta:
Realmente no. No todo en programación es una receta, pero muchas veces conviene usar patrones para construir programas..

/**
    @(#)TestRPN.java 2013
    adolfo@di-mare.com
    Datos de prueba para {@code RPN}.

    @author Adolfo Di Mare <adolfo@di-mare.com>
*/

import junit.framework.*;

/** Datos de prueba para la clase {@code RPN}. */
public class TestRPN extends TestCase {

   /** test -> RPN. */
    public static void test_RPN() {
        RPN calc = new RPN();

        calc.cargue( "(5 * 3)" );
        assertTrue( calc.posfijo().compareTo( "53*" ) == 0 );
        assertTrue( 15 == calc.evaluar() );

        calc.cargue( "(1 + 2) * (3 - 4 - 5)" );
        assertTrue( calc.posfijo().compareTo( "12+34-5-*" ) == 0 );
        assertTrue( -18 == calc.evaluar() );

        calc.cargue( "(( (((((1 + 2))))) * ((((3 - 4 - 5)))) ))" );
        assertTrue( calc.posfijo().compareTo( "12+34-5-*" ) == 0 );
        assertTrue( -18 == calc.evaluar() );

        calc.cargue( "1 / ( 3 - (2+1) )" );
        assertTrue( calc.posfijo().compareTo( "1321+-/" ) == 0 );
        assertTrue( 0 == calc.evaluar() );

        calc.cargue( ")" );
        assertTrue( calc.posfijo().compareTo( "" ) == 0 );
        assertTrue( 0 == calc.evaluar() );

        calc.cargue( "1++)" );
        assertTrue( calc.posfijo().compareTo( "" ) == 0 );
        assertTrue( 0 == calc.evaluar() );

        calc.cargue( "1+2*)" );
        assertTrue( calc.posfijo().compareTo( "" ) == 0 );
        assertTrue( 0 == calc.evaluar() );

        calc.cargue( "(x +" );
        assertTrue( calc.posfijo().compareTo( "" ) == 0 );
        assertTrue( 0 == calc.evaluar() );
    }

}

// EOF: TestRPN.java

     

Entregue su tarea por correo electrónico.
Modalidad: Individual
Etapa No.1 → miércoles 22 mayo
RPN.java && TestRPN.java && Calculadora.java (sin intefaz gráfica: lea una hilera del teclado usando la clase Scanner de Java).
Etapa No.2 → viernes 24 mayo
Calculadora.java (con intefaz gráfica).
Calculadora
(25+32)÷3×12
=228
C ÷ ×
7 8 9
4 5 6 +
1 2 3 ( )
0 . +/− =

Soluciones

[mailto:] Adolfo Di Mare <adolfo@di-mare.com>.
Copyright © 2013
Derechos de autor reservados © 2013
[home] <> [/\]