Sie sind auf Seite 1von 7

ITCM-Estructura de Datos

Dra. Laura Cruz Reyes

Prctica3: Analizador de Smbolos de Agrupacin


Objetivo Aplicar la estructura de datos pila al anlisis de smbolos de agrupacin y evaluacin de expresiones. Procedimiento. En Netbeans cree el proyecto P3_StackSymbols para incorporar los cdigos que se generen en esta prctica. 1. Realice la PUESTA EN MARCHA de una aplicacin que lee de teclado una cadena formada nicamente por smbolos de agrupacin, y verifica que dichos smbolos cumplan con la regla de balanceo. Utilice los cdigos del inciso (a) de la seccin de ayudas, as como la implementacin de pila que se desarroll en la prctica 2. Adems tome en cuenta los siguientes puntos: El nombre de la clase verificadora del balanceo es Balance. Esta tiene el mtodo pblico checkBalance que analiza toda la cadena y el mtodo privado areMatching que verifica solamente la correspondencia entre dos smbolos de agrupacin. Los cdigos estn en la seccin de ayuda. Para el anlisis la clase Balance utiliza la pila genrica de la prctica 2 (clase Stack en su implementacin ArrayStack). Los smbolos de agrupacin vlidos son: ( ), [ ], {}. El funcionamiento de la aplicacin se ilustra con los siguientes ejemplos: 2. Pruebe el funcionamiento de la clase Balance con los siguientes ejemplos introducidos desde el teclado: Entrada: (([])) Salida: La cadena est bien balanceada Entrada: (([]}({}))) Salida: Se encontr }; no corresponde con ) Nada corresponde con ) La cadena no est balanceada 3. Pruebe el funcionamiento de la clase Balance con los ejemplos del punto 2 pero ahora introducidos desde un solo archivo. 4. Agregue a la aplicacin anterior la lectura del nombre de un archivo que contiene un PROGRAMA-JAVA. Adems, verifique que los smbolos de agrupacin que contiene el archivo estn balanceados. Para ello, desarrolle el mtodo extractSymbols y agrguelo a la clase Balance con las siguientes consideraciones: a. El mtodo extractSymbols debe leer un archivo que contiene un PROGRAMAJAVA y extraer los smbolos de agrupacin para almacenarlos en una cadena. Esta cadena se pasa a checkBalance para que verifique el balanceo de smbolos. b. Dado que en el archivo pueden existir comentarios y cadenas constantes, durante el anlisis salte estos elementos. Recuerde que: c. Los comentarios-cortos inician con // y terminan hasta fin de la lnea. Toda la lnea se debe saltar sin importar si tiene errores en los smbolos de agrupacin como en el siguiente ejemplo: // Implementacin del mtodo push( )) de la estructura de datos pila d. Los comentarios-largos inician con /* y terminan con */ en la misma lnea o en una lnea diferente. Todos la cadena delimitada por esos smbolos se debe saltar sin importar si tiene errores en los smbolos de agrupacin como en el siguiente ejemplo:

ITCM-Estructura de Datos

Dra. Laura Cruz Reyes

/* La implementacin del mtodo queue [ } de la estructura de datos cola se basa en aritmtica modular para dar el efecto de cola circular*/ e. Una cadena constante puede contener smbolos de agrupacin y si tiene errores se deben saltar como en el siguiente ejemplo: String error = "El mtodo deque ( )) detect error de cola vaca"; 5. Realice una aplicacin, basada en pilas, que lea de teclado una cadena que representa una expresin en postfijo y produce el resultado de su evaluacin. Tome en cuenta lo siguiente: asuma que la expresin es correcta y que slo tiene operadores aritmticos binarios, los operandos son valores constantes, los operandos y operadores estn separados por espacio. Por ejemplo, para la cadena: 1 2 - 4 5 3 * 6 * 7 2 2 / se debe generar un -8. Siga el siguiente bosquejo algortmico.
1. Crear una pila para almacenar valores 2. Para cada carcter de la cadena que es una expresin en postfijo realizar: 3. Si el carcter es un operador: +, -, *, /, , entonces 4. Obtener dos operandos de la pila de valores 5. Aplicar el operador a los dos operandos extraidos 6. Almacenar el resultado en la pila de valores 7. sino, es un operando 8. almacenar el valor en la pila de valores 9. Regresar el contenido de la pila, ya que contiene el resultado final

6. Agregue a la aplicacin del punto anterior el mtodo infixToPostfix, el cual debe recibir una cadena que representa una expresin en infijo y producir como salida una expresin en postfijo. Presentacin de resultados a) Elabore un documento pdf que contenga una descripcin general de la prctica (un prrafo), bosquejo y algoritmo de los mtodos extractSymbols, checkBalance y infixToPostfix (ver inciso d de la seccin de ayuda) y los resultados de la prctica (para los puntos 1, 2, 3 y 4 muestre ejemplos de Entrada/Salida). b) Suba a la pgina del grupo, en el directorio correspondiente, un slo archivo en formato zip o rar que contenga: el documento pdf y archivos de la aplicacin (proyecto javanetbeans que incluya archivos de entrada, jar). c) Muestre a la profesora que los cdigos de la prctica funcionan. La profesora est disponibles en cualquiera de los siguientes horarios (lu-jue 13-14 hrs) o el viernes de 912 hrs o 18-20 hrs. Fecha de entrega: Lunes 19 de septiembre Nota: Los puntos 1, 4, 5 y 6 se deben hacer en casa. Los puntos 2 y 3 se deben terminar en el laboratorio y valen el 40% de su calificacin. . Ayudas a) Cdigo java que analiza si una cadena con smbolos de agrupacin esta balanceada

ITCM-Estructura de Datos Main.java


import java.util.Scanner; public class Main { public static void main (String [] args) { System.out.println ("Type a string only with this grouping symbols {}[]() :"); Scanner s = new Scanner(System.in); String cad = s.next(); Balance b = new Balance (); if (b.checkBalance(cad)) System.out.println("The string is well balanced"); else System.out.println("The string is not well balanced"); } }

Dra. Laura Cruz Reyes

Balance.java
import DataStructures.*; public class Balance { public Balance(){ errors=0; } private boolean areMatching( char c1, char c2 ) { if( c1 == '(' && c2 != ')' || c1 == '[' && c2 != ']' || c1 == '{' && c2 != '}' ) { System.out.println( "Found: " + c2 + "; does not match with: " + c1); return false; } else return true; } public boolean checkBalance(String cad){ Stack s= new ArrayStack(); char ch; for (int i = 0 ; i < cad.length () ; i++){ ch=(cad.charAt(i)); if ((ch=='(') || (ch=='[') || (ch=='{')) s.push(cad.charAt(i)); else if ((ch==')') || (ch==']')|| (ch=='}')) if (s.isEmpty()) System.out.println("nothing matching with: "+ch); else if (!areMatching(new Character((Character)s.topAndPop()),ch)) errors++; }

ITCM-Estructura de Datos
if (!s.isEmpty()) { System.out.println("some opening symbols were never matched"); return false; } else return errors == 0 ; } private int errors; }

Dra. Laura Cruz Reyes

b) Cdigo java para leer secuencialmente un archivo de texto


import java.util.Scanner; import java.io.FileReader; import java.io.IOException;

public class Main { public static void main( String [ ] args ) { if( args.length == 0 ) System.out.println( "No files specified" ); //The for-each loop is used to access each successive value in a collection of values. //The condition (type var : arr) is equivalent to (int i = 0; i < arr.length; i++) for( String fileName : args ) listFile( fileName ); } public static void listFile( String fileName ) { Scanner fileIn = null; System.out.println( "FILE: " + fileName ); try { fileIn = new Scanner( new FileReader( fileName ) ); while( fileIn.hasNextLine( ) ) { String oneLine = fileIn.nextLine( ); System.out.println( oneLine ); } } catch( IOException e ) { System.out.println( e ); } finally { // Close the stream if( fileIn != null ) fileIn.close( ); } } }

c) Archivos que se pueden utilizar para probar la aplicacin del punto 2


Echo1.java (cdigo correcto, los smbolos de agrupacin no son importante en comentarios-cortos) // Ejecute este codigo desde la linea de comandos // Un ejemplo de ejecucin es: java Eco este aquel // La variable args de main (atrapar estos valores*/ public class Echo1

ITCM-Estructura de Datos
{ public static void main( String [ ] args ) { for( int i = 0; i < args.length - 1; i++ ) System.out.print( args[ i ] + " " ); if( args.length != 0 ) System.out.println( args[ args.length - 1 ] ); else System.out.println( "No arguments to echo" ); } }

Dra. Laura Cruz Reyes

Echo2.java (cdigo correcto, los smbolos de agrupacin no son importante en comentarios-largos) /*(Ejecute este codigo desde la linea de comandos Un ejemplo de ejecucin es: java Eco este aquel La variable args de main () atrapar estos valores))*/ public class Echo2 { public static void main( String [ ] args ) { for( int i = 0; i < args.length - 1; i++ ) System.out.print( args[ i ] + " " ); if( args.length != 0 ) System.out.println( args[ args.length - 1 ] ); else System.out.println( "No arguments to echo" ); } }

TestCeldaEntero1.java (cdigo incorrecto, falta una llave) public class TestCeldaEntero1 { public static void main (String [] args) CeldaEntero m = new CeldaEntero (); m.escribir (5); System.out.println ("Contenidos de la celda: " + m.leer ()); /*La siguiente lnea seria ilegal si no estuviera comentada porque valorAlmacenado es una componente privada/* } //m.valorAlmacenado=0; } TestCeldaEntero2.java (cdigo incorrecto, falta un corchete y una llave) //Ejercicio con la clase CeldaEntero public class TestCeldaEntero2 { public static void main (String [args) { CeldaEntero m = new CeldaEntero ();

ITCM-Estructura de Datos

Dra. Laura Cruz Reyes

m.escribir (5); System.out.println ("Contenidos de la celda: " + m.leer ()); // La siguiente lnea seria ilegal si no estuviera comentada //porque valorAlmacenado es una componente privada //m.valorAlmacenado=0; } TestCeldaEntero3.java (La cadena de salida es correcta, pero el cdigo es incorrecto porque falta un parntesis) //Ejercicio con la clase CeldaEntero public class TestCeldaEntero3 { public static void main (String [args]) { CeldaEntero m = new CeldaEntero (); m.escribir (5); System.out.println ("((Contenidos de la celda): " + m.leer )); // La siguiente lnea seria ilegal si no estuviera comentada //porque valorAlmacenado es una componente privada //m.valorAlmacenado=0; } } TestCeldaEntero4.java (El cdigo es correcto) public class TestCeldaEntero4 { public static void main (String [args]) { CeldaEntero m = new CeldaEntero (); m.escribir (5); System.out.println ("Contenidos de la celda: " + m.leer ()); // La siguiente lnea seria ilegal si no estuviera comentada //porque valorAlmacenado es una componente privada //m.valorAlmacenado=0; } }

d) Bosquejo y algoritmo de ejemplo


Bosquejo del Algoritmo checkBalance (cadena de longitud n) Para cada carcter de la cadena Si el caracter actual es smbolo de apertura entonces Guardar en pila Sino, si el carcter es smbolo de cerradura Si la pila est vaca Escribir mensaje de error El smbolo de cerradura no tiene smbolo de apertura Incrementar el contador de errores

ITCM-Estructura de Datos

Dra. Laura Cruz Reyes

Sino, si no corresponde el smbolo del tope de la pila con el smbolo actual Escribir mensaje de error Los smbolos no corresponden Incrementar el contador de errores Si la pila no est vaca entonces Escribir mensaje de error Algunos smbolos de apertura no tienen smbolo de cerradura Regresar falso Sino, si hubo errores Regresar falso Sino Regresar verdadero Algorithm checkBalance (X,n): Input: an array X of n symbols, each of which is a grouping symbol Output: true if all the grouping symbols in X match 1 Let S an empty stack 2 for i=1 to n 3 if X[i] {(, [, {} then 4 S.push(X[i]) 5 else if X[i] {), ], }} then 6 if S.isEmpty() then 7 write (nothing to match with+ X[i] 8 errors errors+1 9 else if not areMatching(s.popAndTop(),X[i]) then 10 errors errors+1 11 if not S.isEmpty() then 12 write (some opening symbols were never matched) 13 return false 14 else if errors =0 then return false 15 else return true Bosquejo del Algoritmo extractSymbols (archivo) Sean el conjunto de smbolos S={(, ), {, }, [, ], /, \}, un comentario-corto que se ubica en una lnea e inicia con //, y un comentario-largo que puede ocupar varias lneas y se encuentra delimitado por /* y */ Mientras el archivo tiene lneas Leer la siguiente lnea y almacenarla en una cadena Mientras no se llegue a la posicin final de la cadena actual Encontrar en la cadena actual la posicin del siguiente smbolo que pertenece a S Si existe un siguiente smbolo, ste es el actual Si no est prendida la bandera de comentario-largo en proceso Si el smbolo actual y el siguiente forman un comentario-corto Mover la posicin al final de la lnea Continuar ciclo Si el smbolo actual y el siguiente forman un inicio de comentario-largo Mover la posicin despus de los smbolos que forman el inicio del comentario-largo Prender bandera de comentario-largo en proceso Continuar ciclo Sino Si el smbolo actual y el siguiente son la terminacin de comentario-largo y bandera prendida Mover la posicin despus de los smbolos que forman el fin del comentario-largo Apagar bandera de comentario-largo en proceso Sino mover la posicin al final de la cadena actual

Das könnte Ihnen auch gefallen