PROBLEMA Se quiere construir el índice en memoria para acceder electrónicamente a un diccionario de palabras. El diccionario se encuentra un fichero secuencial desordenado y depurado (DICCIONARIO) grabado en el disco duro. El tamaño de este diccionario justifica la creación de este índice. PROCEDIMIENTO El fichero DICCIONARIO contiene registros con todas las palabras del diccionario de la lengua española, con el siguiente diseño: PALABRA: Alfanumérico DESCRIPCIÓN: Alfanumérico Se creará en memoria un array de 27 elementos correspondientes a las 27 letras del alfabeto Español (se incluye la Ñ y se prescinde de la CH y la LL) con la siguiente estructura: Letra del alfabeto español: Carácter Puntero a palabras: Puntero a nodo A continuación se lee secuencialmente el fichero DICCIONARIO añadiendo a la lista enlazada de la letra que le corresponda, un nodo con la palabra leída y la posición que ocupa el registro dentro del fichero. La estructura de datos del índice en memoria tendrá el diseño de la figura: Letra Puntero 1 A Palabra nº Registro sig 2 B Palabra nº Registro sig .. ... .. ... 27 Z Palabra nº Registro sig T_LETRAS LISTAS ENLAZADAS DE PALABRAS - Las listas enlazadas estarán ordenadas por orden alfabético de palabras. - El nº Registro es el nº de orden del registro en el fichero: ejemplo la palabra bosque está en el registro 14.245. Por tanto nº Registro es 14.245. 1. Escribir una rutina CREA_ARRAY que cree el array T_LETRAS. Letra Puntero 1 A 2 B .. ... .. ... 27 Z NULL NULL NULL T_LETRAS COMIENZO CREA_ARRAY(T_LETRAS) TRANSFORMA T_LETRAS ES ARRAY(27) DE TIPO LETRAS ENTORNO ALGORITMO T_LETRAS(1).LETRA = ‘A’ T_LETRAS(2).LETRA = ‘B’ T_LETRAS(3).LETRA = ‘C’ ......... T_LETRAS(..).LETRA = ‘N’ T_LETRAS(..).LETRA = ‘Ñ’ ......... T_LETRAS(27).LETRA = ‘Z’ PARA(I=1;I<=27;I=I+1) T_LETRAS(I).PUNTERO = NULL FIN PARA FIN CREA_ARRAY 2 Escribir una rutina CREA_LISTAS que a partir del fichero DICCIONARIO cree y añada a las listas enlazadas de palabras, la palabra y su posición en el fichero en la correspondiente lista enlazada. NOTA: Debe utilizarse la función INDICE del tema Cadenas de Caracteres. Ejemplo: POS = INDICE (PALABRA,T_LETRAS(I).LETRA) si POS = 1, La palabra empieza por la letra si POS != 1, La palabra NO empieza por la letra DICCIONARIO Letra Puntero Palabra Palabra Palabra Palabra Palabra Palabra EOF Descripcion Descripcion Descripcion Descripcion Descripcion Descripcion 1 A Palabra nº Registro sig 2 B Palabra nº Registro sig Palabra nº Registro sig .. ... .. ... 27 Z T_LETRAS LISTAS ENLAZADAS DE PALABRAS COMIENZO CREA_LISTAS (T_LETRAS) TRANSFORMA T_LETRAS ES ARRAY(27) DE LETRAS ENTORNO PALABRA ES ALFANUMERICO //datos del fichero DESCRIPCION ES ALFANUMERICO I ES ENTERO // Contador de bucle NREG ES ENTERO //Número de registro AUX,LUG SON PUNTEROS A LISTA ST ES ENTERO ALGORITMO ABRIR (DICCIONARIO) LEER PALABRA,DESCRIPCIÓN NREG = 1 MIENTRAS (NO EOF) Y (ST != 2) I=1 MIENTRAS(I<=27) Y (INDICE(PALABRA,T_LETRAS(I).LETRA)!= 1) I=I+1 FIN MIENTRAS LLAMAR BUSCA_INSERTAR(T_LETRAS(I).PUNTERO,PALABRA,LUG,AUX) SI(LUG = NULL) LLAMAR INSPRI(T_LETRAS(I).PUNTERO,PALABRA,NREG,ST) SINO LLAMAR INSLUG(LUG,PALABRA,NREG,ST) FIN SI SI(ST = 2) ESCRIBIR “ERROR, FALTA MEMORIA” FIN SI LEER PALABRA,DESCRIPCIÓN NREG = NREG + 1 FIN MIENTRAS CERRAR (DICCIONARIO) FIN CREA_LISTAS COMIENZO BUSCA_PALABRA(T_LETRAS) RECIBE T_LETRAS ES ARRAY(27) DE LETRAS ENTORNO PAL ES ALFANUMERICO //Palabra leida del teclado I ES ENTERO //Contador de bucle LUG ES PUNTERO A LISTA //Resultado de la búsqueda ALGORITMO LEER PAL I=1 MIENTRAS(I<=27) Y ((INDICE(PAL,T_LETRAS(I).LETRA!= 1) I=I+1 FIN MIENTRAS SI(I<=27) LLAMAR BUSCA_ORDENADA(T_LETRAS(I).PUNTERO,PAL,LUG) SI(LUG!=NULL) Y (LUG->PALABRA = PAL) LEER REGISTRO (LUG->NREGISTRO) PAL,DESCRIPCIÓN ESCRIBIR DESCRIPCION SINO ESCRIBIR “PALABRA NO EXISTE EN EL DICCIONARIO FIN SI SINO ESCRIBIR “LA PALABRA ES INCORRECTA” FIN SI FIN BUSCA PALABRA COMIENZO PRINCIPAL ENTORNO T_LETRAS ES ARRAY(27) DE LETRAS SINO ES ALFANUMERICO LLAMAR CREA_ARRAY(T_LETRAS) LLAMAR CREA_LISTA(T_LETRAS) ABRIR (DICCIONARIO) REPETIR LLAMAR BUSCA_PALABRA(T_LETRAS) LEER SINO MIENTRAS (SINO = “SI”) CERRAR (DICCIONARIO) FIN PRINCIPAL