REPUBLICA BOLIVARIANA DE VENEZUELA. UNIVERSIDAD DEL ZULIA FACULTAD DE INGENIERÍA DIVISIÓN DE POSTGRADO COMPUTACIÓN APLICADA TÉCNICAS DE PROGRAMACIÓN: TAREA 2 Profesor: Ing. Daniel Finol Nombre: José V. Gómez D. CI: 10.084.584. MARACAIBO, MARZO DEL 2006. I. Tarea 2: Crear un programa que lea un texto de la entrada estándar y lo imprima a la salida estándar verificando lo siguiente: 1. Los caracteres tipo "llave": ('{', '[', '(', ')', ']', '}') concuerden, es decir, que cada "llave" que se abra se cierre (en el orden inverso al abierto). 2. Que las comillas que se abran se cierren. (Las comillas se abren y se cierran con el mismo caracter (")). 3. Dentro de la comillas los caracteres tipo llave se ignoran, es decir, no cuentan para la verificación de concordancia. En estos ejemplos: 1. Este ejemplo [aquí hay texto entre corchetes (y aquí...] hay más). 2. Si este es el { texto "esta llave } se ignora". 3. Aquí hay más texto (etcétera { más todavía "este corchete [ se debe imprimir pero ignorar" ] } ). 4. Esta frase: "abre paréntesis (" abre corchete [, abre { etcétera } ] ). Los errores serían: 1. Se cierra el corchete primero cuando se debe cerrar primero el último que se abrió (el paréntesis). 2. No se cierra la llave. 3. Hay un corchete cerrado de más. 4. Hay un paréntesis cerrado de más. Consideraciones: Se debe imprimir el texto hasta que se encuentre un error y se debe indicar el número de línea y de columna del error. El número de columna es el número de caracter de la línea donde se encontró el error. Si el error es que se llegó al final del archivo quedaron "llaves" o comillas sin cerrar sólo hay que indicar qué fue lo que quedó sin cerrar (no es necesario dar números de línea ni columna). Aunque los ejemplos son de una línea el programa debe verificar el texto completo; no línea por línea; es decir, es correcto que un paréntesis abra en una línea y cierre en la siguiente Explicación del Código fuente: En la función main se obtiene la longitud tiene cada línea del arreglo de caracteres y se le llena al mismo tiempo en line[i]. Para ello se utiliza la función getline: int getline(void) { int c, i; for (i=0; i<MAXLINE-1 && (c=getchar()) != EOF && c != '\n'; ++i) line[i]=c; if (c=='\n') { line[i]=c; i+1; } line[i]='\0'; return i; } /*cierre de la funcion getline*/ El valor que retorna i se le asigna a len (que es la longitud de la línea verificada), cuando es llamada la funcion getline desde el ciclo While en la función principal. Si el texto tiene una línea en blanco, i trae el valor de 1 (ya que en el ciclo de getline, su contador i toma el valor de 0 y 1 para asignar a line[i] el valor de ‘\n’ y luego de ‘\0’). Con el ciclo While se llama a la función getline para obtener la cadena de caracteres y verificar si tiene “(“, “[“, “{“ , “}”, “]”, “)” y comillas (“”). El ciclo For nos ayuda verificar e imprimir carácter por carácter cada línea del texto hasta que se consigue un error(llaves no cerradas correctamente) . Se verifica si se abrió una comilla para no tomarlas en cuenta en la validación cierre los caracteres “(“, “[“, “{“ , “}”, “]”, “)” con : if (comi==2) comi=0; if (line[i]=='"' || comi==1 || comi==2){ /*se cumple al estar abierto una comilla*/ if (line[i]=='"' & comi==1) comi=2; if (line[i]=='"' & comi==0) comi=1; } Sino no se abrió una comillas o se cerro una comilla abierta se hace la validación de paréntesis, corchetes y llaves - “(“, “[“,y“{“ - abiertas para ver si están cerradas correctamente . Esto se hace al conseguir un paréntesis, corchete y llave abierta en el texto y sacando del tope de la pila (con la función pop) el paréntesis, corchete o llave para compararlos y verificar así que este cerrado correctamente. Si no esta cerrado correctamente se dice cual es el error y en que línea y columna esta el mismo. El ciclo For esta dentro del ciclo While, ya que while presenta línea por línea; mientras que el for carácter por carácter. Al salirnos del for verificamos si quedo sin cerrar un paréntesis, corchete o llave y lo mostramos por lo salida estándar. CODIGO FUENTE DEL PROGRAMA: TAREA2-JOSEGOMEZ.C