| |
Boletín de problemas 10
Todos
los cádigos se han elaborado con software Java.
Fecha
de entrega: viernes 10 de mayo de 2002
Problema 1. Archivos y hashing
(dispersión), cuestión preliminar
(30%)
Este problema trata de la utilización
del método hashCode(), y menciona los métodos
toString() y equals(). También le pide que utilice
streams. No es un problema complicado; es sólo
un ejercicio para que usted trabaje con los métodos
que cada clase ha heredado de la clase Java Object,
la cual, por lo general, debería invalidarse
para alcanzar una implementación completa. También
le muestra como Java calcula por defecto códigos
hash, y le pide que escriba una función
hash para una clase. No se preocupe por el hecho
de que el código que escriba para este problema
no haga nada especialmente útil.
Consejo: si lee o escribe archivos,
le sugerimos que primero cree una variable que indique
la ruta completa al directorio donde el archivo resida.
Por ejemplo,
// class variable that gives the path where my text files
are
public static final String path = "C:\\java\\sampledir\\PS10"
Así, en su método
puede crear uno o más objetos File utilizando
dicha ruta:
// first create file object
File myFile = new File(path, "myfile.dat");
BufferedReader reader = new BufferedReader(new FileReader(myFile));
Si no utiliza una ruta completa,
verá que es posible que Forte no encuentre el
archivo.
Escriba un programa (puede hacerlo
con el método main()) para:
- Abrir un archivo llamado "indata.dat".
Cree este archivo con un editor de texto.
- Leer en el archivo dos Integers,
dos Doubles, cuatro chars y dos Strings. Diseñe
el archivo como prefiera.
- Escribir una clase nueva, llamada
CharPair, que tenga los siguientes métodos:
- Un constructor que tome dos
chars
- Método toString() que
permita que los objetos CharPair se muestren utilizando
"println"
- Método equals() que
responda verdadero si el primer char y el segundo
char son iguales en dos objetos CharPair. Véase
págs. 204-206 en el texto.
- Método hashCode() que
identifique objetos CharPair con los mismos chars
en el mismo código hash, y cumpla
con los requisitos generales de una función
hash.
- Sólo puede utilizar
el método getNumericValue() de la clase Character;
en caso contrario debe utilizar los chars originales
de su clase.
- Crear dos objetos CharPair y
una referencia a cada uno. Crear también
una referencia para uno de sus Strings, Integers y
Doubles. ("Crear una referencia" significa
simplemente que declare una variable y la asigne al
objeto. Utilizará la referencia que se da más
abajo).
- Invocar el hashCode() en todos
los objetos y referencia de su programa y mostrar
los resultados.
- Invocar los métodos equals()
y toString() en sus objetos CharPair.
- Elevar el primer Double al primer
poder Integer, y el segundo Double al segundo poder
Integer.
- Mostrar los nuevos Doubles,
uno de los Strings leidos, y los nuevos CharPairs
a un archivo llamado "outdata.dat"
Es conveniente que utilice las
clases BufferedReader y StringTokenizer para leer desde
su archivo.
Problema 2. Diccionario (70%)
Construirá un diccionario
de palabras para realizar la función de corrector
ortográfico y luego lo utilizará para
corregir un texto en un archivo de prueba.
- Lea el diccionario desde un
archivo y construya una tabla hash con todas
las palabras. El diccionario se encuentra en el archivo
"dictionary.dat" de sitio Web de curso y
contiene las 250 palabras inglesas más frecuentes.
Utilice las clases BufferedReader y StringTokenizer
para procesar el diccionario. Escoja un tamaño
de tabla hash apropiado para un diccionarios
de 250 a 300 palabras.
- Lea un segundo archivo para
añadirlo al diccionario. Este archivo, dictionary2.dat,
contiene algunas palabras comúnmente mal escritas,
basadas en un estudio de los grupos de debate de Usenet.
Cada línea del archivo contiene una palabra
mal escrita seguida por un tabulador y la ortografía
correcta de la palabra. Por ejemplo,
minascule minuscule
millenium milennium
...
[¿Sabía que la palabra millennium
se escribe mal el 57% de las veces?]
- Escriba un tercer archivo, cuya
ortografía se va a comprobar de un modo sencillo: leerá
todas las palabras del archivo y las buscará
en el diccionario. También buscará
las variaciones en la palabra: eliminar los finales
en `s', `es', `ing' o `ed' si es que existen. Puede
utilizar el archivo de prueba "testfile.dat". Para
hacer el problema más fácil, no es necesario
que se preocupe por las palabras que incluyen múltiples
finales. (Por ejemplo, la palabra "endings"
tiene las desinencias `ing' y `s', pero su solución
puede considerarla como una palabra desconocida, aunque
la palabra `end' aparezca en el diccionario). No
es necesario que su solución tenga en cuenta
el caso al comprobar una palabra, no hace falta que
mantenga el caso original en el resultado; basta con
que muestre todos los resultados en minúscula.
- Si encuentra la palabra o una
de sus variedades en el diccionario, asuma que está
escrita correctamente o que es una falta de ortografía
común que sabe como corregir. Si es una falta
de ortografía, la corregirá, como se
indica más abajo. Tenga cuidado con las
desinencias alternativas de palabras comúnmente
mal escritas.
- Si no encuentra la palabra,
asuma que está mal escrita y que no sabe como
corregirla.
- Muestre como resultado un archivo,
llamado "checked.dat" que sea una copia
del tercer archivo de entrada con las siguientes diferencias:
i. Si una palabra está
mal escrita y sabe como corregirla, muestre la palabra
correctamente escrita.
ii. Si una palabra está
mal escrita y no sabe como corregirla, muestre la palabra
mal escrita TODA EN MAYÚSCULAS.
iii. Si la palabra está
escrita correctamente, muéstrela `tal como es'.
iv. Mantenga la misma
disposición de las líneas que en el archivo
original, pero no es necesario que mantenga las mayúsculas
u otros espacios en blanco.
- Recuerde cerrar los archivos. Del
mismo modo, trate las IOExceptions de un modo sencillo;
imprimir el seguimiento de pila es suficiente.
- Se trata de un corrector extremadamente
primitivo. No indicamos si una palabra es un
nombre, un verbo, etc., lo que limitaría las
desinencias válidas. No hay mayúsculas
ni puntuación. Todo esto se puede manejar,
pero requiere un esfuerzo adicional sustancial. Sin
embargo, este problema demuestra el enfoque general
adoptado por los programas correctores.
Ponemos a su disposición
las clases HashTable y HashNode y la interfaz SimpleMap
para que las utilice en este problema. Se encuentran
en el sitio Web del curso.
Nota extra
Si desea obtener un máximo
de 40 puntos extra, escriba una interfaz gráfica
de usuario (IGU) para el programa principal del boletín
de ejercicios. Tiene la posibilidad de hacerlo en cualquier
boletín de problemas del 6 al 10; pero sólo
en uno de ellos. En general, es libre de diseñar
la IGU que usted quiera; como si se tratase de un ejercicio
en una 'hoja de papel en blanco'. No podrá utilizar
System.out.println en su solución; todas las
entradas y salidas de datos deben hacerse con Swing.
Si opta por crear la interfaz gráfica de usuario
ha de entregar dos soluciones:
- El trabajo general, sin la IGU,
tal y como se describe en el encargo, lo que nos permite
calificar la parte principal de trabajo sin tener que
preocuparnos por los posible errores introducidos por
la IGU.
- La solución completa con
la IGU. En esta segunda entrega sólo se tendrá
en cuenta, a efectos de calificación, la IGU,
hasta un máximo de 40 puntos. Sólo se
calificará la IGU (y sus interfaces inmediatas
con el resto del código). Recibirá entre
0 y 40 puntos; aunque reciba 0 su nota general en el
trabajo no se verá perjudicada o reducida.
Requisitos específicos para
el boletín de problemas 10: su programa
debería utilizar los mismos archivos que antes
para leer las palabras del diccionario, pero en lugar
de leer el texto para corregir desde testfile.dat, su
IGU ha de permitir al usuario que introduzca el texto
directamente utilizando componentes Swing. Otros requisitos
son que muestre el resultado en Swing y que la interfaz
sea fácil de utilizar.
A continuación, se muestra
una interfaz de muestra. El usuario puede introducir
texto en la zona de texto de la izquierda. La zona de
texto es una instancia de JTextArea, que es similar
a JTextField, pero permite al usuario introducir múltiples
líneas de texto. Haciendo clic sobre el botón
"Spellcheck Text" se ejecuta el corrector
sobre el texto en la zona de la izquierda, y muestra
el resultado en la zona de la derecha. Esta zona no
es editable.
Entrega
Requisitos de entrega
·
Copia en papel y copia electrónica de TODO el
código fuente (todos los archivos .java).
·
Incluya en TODOS los archivos que presente su nombre,
el nombre de usuario, la sección, el nombre del
profesor ayudante, el número de trabajo y una
relación de las personas con las que haya comentado
el boletín de problemas.
·
NO entregue copias electrónicas o en papel de
código compilado (archivos .class).
Colaboración
En este boletín de problemas,
puede trabajar en conjunto con otra persona más
de la clase, como máximo. Si decide trabajar
con un colaborador, debe incluir su nombre en el trabajo
entregado. (Si tienen ustedes ayudantes técnicos
diferentes, asegúrese de que incluye los nombres
de los dos ayudantes en el boletín). No se le
permitirá añadir el nombre del colaborador
una vez entregado el trabajo. Sólo podrá
entregar el boletín UNA VEZ.
Sanciones
- Por pérdida de copia
en papel: -10% de la puntuación del boletín
de problemas.
- Por pérdida de copia
electrónica: -30% de la puntuación del
boletín de problemas.
- Por entrega fuera del plazo:
-20% de la puntuación del boletín de
problemas si es un día de retraso. Por
más de un día de retraso = NO SE PUNTUARÁ
.
|