Documentos de Académico
Documentos de Profesional
Documentos de Cultura
8 Archivos PDF
8 Archivos PDF
IIC1103 Introducci
on a la Programaci
on
Captulo 8: Archivos
Resumen te
orico
Generalmente cuando dise namos un programa nos encontramos con la necesidad de guardar la informaci on
que este genera a un archivo, o que la informaci
on que este necesita para funcionar sea leda desde un archivo.
El querer almacenar informaci on es algo muy com un, puesto que con ello podemos guardar la informaci on
que el programa genera vol atilmente, y que de otra manera se perdera al cerrarlo. Ejemplos de esto son los
reproductores de video, editores de im agenes, editores de texto, etc.
Se llama input a la informaci on recibida desde un agente externo, y output la informaci on que es ex-
puesta al exterior. Los lenguajes de programaci on modernos generalmente ofrecen herramientas para poder
comunicarse con el exterior, acciones de I/O, especficamente Java ofrece una gran cantidad de clases que
encapsulan los procesos para lectura y escritura de informacion, escondiendo lo tedioso que podra ser, sim-
plificando la labor del programador. Estas clases son capaces de interactuar con m
ultiples fuentes, como son
archivos, internet, lnea de comando, la pantalla, etc.
Nosotros ya hemos realizado acciones de I/O, por ejemplo mostrar mensajes en pantalla, y pedir al usuario
que ingrese cierto dato. La lectura de archivos es un poco distinta, puesto que tiene ciertas reglas.
Sistema de Archivos
Los archivos dentro de un computador est
an almacenados en forma jer
arquica:
Unidades Fsicas y L
ogicas: Son el punto de partida del sistema de archivos. Por ejemplo el disco C:/
en Windows.
Carpetas: Se encuentran dentro de las unidades o de otras carpetas, tienen una funci
on de organizaci
on.
Archivos: Se encuentran dentro de las unidades o de carpetas. Estos son los elementos que guardan la
informaci
on.
Debido a esto, los archivos tienen rutas asociadas que indican la unidad, carpeta/s y el nombre del archivo
correspondiente. Por ejemplo, para acceder a un archivo llamado bar.txt en la carpeta foo del disco C,
la ruta sera C:/foo/bar.txt. A esto llamaremos ruta absoluta puesto que incluye la ruta completa desde
la unidad, no se asume nada. A diferencia de la ruta absoluta, existen las llamadas rutas relativas, estas
corresponden a la ruta desde la carpeta actual hasta el archivo. Por ejemplo, si nos encontramos dentro de
la carpeta foo (del ejemplo anterior), la ruta hasta el archivo bar.txt es simplemente bar.txt, puesto
que ya nos encontramos en la carpeta. Si nos encontr aramos en el disco C la ruta al mismo archivo sera
foo/bar.txt.
Generalmente los archivos son guardados de forma binaria en los dispositivos de almacenamiento. Estos bits
pueden ser interpretados de varias maneras: como n umeros, como caracteres, como valores booleanos, etc.
Por esto, existen las extensiones (por ejemplo .txt), que le indican al sistema operativo (encargado de la
lectura y escritura) que tipo de archivo es el que se est
a intentado abrir, de manera que sea interpretado con
el programa correcto.
Por u
ltimo, se debe tener en cuenta que las acciones sobre archivos (como muchas de I/O) pueden fallar, por
lo que se debe indicar a Java que cada metodo que utilice algun tipo de I/O puede lanzar error.
Archivos en Java
En Java los archivos son representados por la clase File, cuyo constructor recibe la ruta (absoluta o relativa)
al archivo en cuesti
on. Es importante que el archivo no necesariamente debe existir, por ejemplo si queremos
crear un nuevo archivo ingresamos la ruta al archivo que queremos crear, aunque este todava no exista.
La clase File ofrece una variedad de metodos, entre ellos revisar permisos y existencia del archivo. Algunos
ejemplos son:
import java.io.File;
o
import java.io.*;
Al igual que la clase archivo, esta ofrece una gran cantidad de metodos:
String next() - Interpreta el siguiente grupo de bits como una cadena de caracteres. Retorna la siguiente
palabra, antes de un espacio en blanco.
String nextLine() - Interpreta el siguiente grupo de bits como una cadena de caracteres. Retorna la
siguiente linea, antes de un salto de lnea.
La clase Scanner viene en el paquete java.util por lo que hay que importarlo usando:
import java.util.Scanner;
Adem as, como dijimos antes, la lectura puede fallar, por lo que hay que avisar a Java que el m
etodo que
contiene al Scanner puede lanzar errores, esto se hace agregando la etiqueta throws IOException entre la
definici
on del metodo y la llave que comienza el c
odigo interno.
En tanto, para escritura utilizamos la clase FileWriter, cuyo constructor, al igual que el Scanner, acepta un
String con la ruta al archivo o un objeto tipo File.
Criterios de soluci
on
Observamos que el programa debe cumplir con los siguientes requisitos:
Cargar la informaci
on pasada del programa, en caso de que se haya ejecutado antes
Mostrar al usuario lo escrito y pedir la siguiente linea a escribir. Repetir hasta encontrar el String
;SALIR;.
Guardar lo escrito al finalizar el programa.
El primer punto es f acil de lograr, solo verificar si existe el archivo a escribir, y de existir, leerlo antes de
empezar a escribir. Lo que leamos debemos guardarlo a un String que representar a la informacion final que
debe contener el archivo. Luego debemos realizar un loop, que muestre la informaci on actual, y pida al
usuario la siguiente linea a escribir. En caso de que la linea sea ;SALIR;debemos salir del loop.
Finalmente debemos escribir el String guardado al archivo.
Posible soluci
on
import i i c 1 1 0 3 P a c k a g e. Usuario ;
import java . io . File ;
import java . io . F i l e W r i t e r;
import java . io . I O E x c e p t i o n;
import java . util . Scanner ;
// Leer el archivo e x i s t e n t e
if ( file . exists ()) {
while ( dataIn . hasNext ()) {
actual += dataIn . nextLine ();
// Esto es para que no agregue un salto de linea extra al final del texto
if ( dataIn . hasNext ()) {
actual += " \ n " ;
}
}
}
Criterios de soluci
on
Debemos:
Por simplicidad, optaremos por guardar el contenido completo del archivo, luego pasar a un arreglo de
Strings, donde cada posici
on es una lnea, la que luego invertiremos.
Adem as, manejaremos todos los posibles errores al mismo tiempo (encerrando el c
odigo en un gran try/catch).
Posible soluci
on
import java . util .*;
import java . io . File ;
import i i c 1 1 0 3 P a c k a g e .*;
import java . io .*;
public class P r i n c i p a l {
1 m
as detalles en http://es.wikipedia.org/wiki/Leonardo da Vinci
// cerramos las c o n e x i o n e s
escribir . close ();
lector . close ();
// m a n e j a m o s los errores
} // el archivo no se e n c u e n t r a
catch ( F i l e N o t F o u n d E x c e p t i o n e ) {
Usuario . mensaje ( " No se e n c u e n t r a el archivo : " + entrada );
} // algun error de entrada / salida
catch ( I O E x c e p t i o n e ) {
Usuario . mensaje ( " Error de tipo entrada / salida " );
} // C U A L Q U I E R tipo de error
catch ( E x c e p t i o n e ) {
Usuario . mensaje ( " Error ! " );
}
}
}
4
Chile
Honduras
Espa~
na
Suiza
Usando arreglos y archivos, escriba un programa que para cada equipo pregunte al usuario los partidos
ganados, partidos perdidos, partidos empatados, goles a favor y goles en contra. Al finalizar, debe crear el
archivo tablaDePosiciones.txt con el siguiente formato:
TABLA DE POSICIONES
La tabla de posiciones debe ordenarse por puntos y diferencia de goles (en caso de tener igual cantidad de
puntos).
Criterios de Soluci
on
Para almacenar los datos de cada uno de los equipos (nombre, partidos ganados, partidos perdidos,
partidos empatados, partidos jugados, goles a favor, goles en contra y diferencia de goles) crearemos la
clase Equipo.
Crearemos un arreglo de Equipos.
Leeremos desde el archivo los nombres de cada uno de los equipos.
Iteraremos sobre cada uno de los equipos y le pediremos al usuario que ingrese los valores de PG, PP,
PE, GF y GC.
public class T a b l a P o s i c i o n e s {
private static String A R C H I V O _ E Q U I P O S = " equipos . txt " ;
private static String A R C H I V O _ T A B L A = " t a b l a D e P o s i c i o n e s. txt " ;
private static Equipo [] equipos ;
// o r d e n a m o s la tabla
o r d e n a r T a b l a();
}
return false ;
}
}
5 0 4 8 3 10
hola, como este finalmente aqui
has es otro archivo esta
estado donde la clave: iic1103
hoy? esta el otro.txt nombre
segundo.txt de archivo
bien
y que realiza la invocaci on busqueda("inicial.txt"). Entonces busqueda lee la primera linea del archi-
vo inicial.txt y determina que debe ir a la fila 5 y columna 15 de este archivo, y leer la palabra que
este en esa posici
on. Como esta palabra es segundo.txt, entonces su metodo debe ir al archivo con nom-
bre segundo.txt. Como la primera linea de este archivo tiene los valores 4 y 8, entonces su metodo debe
ir a la fila 4 y columna 8 del archivo, y leer la palabra que este en esa posici on. Como esta palabra es
otro.txt (tambien termina en .txt), su metodo debe abrir el archivo otro.txt. En este caso, despues de
leer la primera fila el metodo sabe que debe ir a la fila 3 y columna 10, donde ahora se encuentra la palabra
iic1103. Como esta palabra no termina en .txt, entonces busqueda la retorna ya que es la palabra buscada.
Importante: En esta pregunta puede suponer que los archivos utilizados siempre existen, y que tiene
el formato adecuado. En particular, si en la primera linea de una archivo se indica que debe ir a la fila i y
columna j, entonces puede suponer que esta posicion existe en el archivo.
Criterios de soluci
on
Posible soluci
on
public String busqueda ( String inicio ) throws I O E x c e p t i o n {
File archivo = new File ( inicio );
Scanner lector = new Scanner ( archivo );
int i , fila , columna ;
String linea , palabra ;
boolean t i e n e _ p u n t o;
while ( true ) {
fila = lector . nextInt ();
5
s2 9 10 11 9 9
s23 8 8 7 10 6
s211 9
s12 8 7 6 9 9
s14 10 10
El primer n umero en el archivo indica el n umero de sensores que estuvieron registrando temperaturas (5
en el ejemplo), y las siguientes lneas almacenan las temperaturas registradas por cada sensor. Cada una
de estas lneas tiene el identificador del sensor seguido por una lista de temperaturas. Por ejemplo, para el
sensor con identificador s12 se registraron las temperaturas 8, 7, 6, 9 y 9.
En este ejercicio usted debe crear las funciones necesarias para leer la informacion contenida en el archivo
mediciones.txt, extraer para cada sensor la temperatura mnima que registr o y almacenar esta informacion
ordenada de menor a mayor temperatura en el archivo medicionesmin.txt, que tiene el siguiente formato:
s23 6
s12 6
s2 9
s211 9
s14 10
Notese que en el archivo medicionesmin.txt se almacena para cada sensor su identificador y la temperatura
mnima que registro, y esta informaci
on se encuentra ordenada desde el sensor que registr
o la menor tempe-
ratura hasta el que registro la mayor.
Para resolver este ejercicio, usted debe implementar las tres funciones que son detalladas a continuaci
on. En
la construcci
on de estas funciones, usted debe usar la clase Tupla que fue creada para almacenar el identificar
de un sensor y una temperatura registrada por el (en el desarrollo de este ejercicio, usted va a almacenar la
menor temperatura registrada por el sensor usando la clase Tupla):
Implemente la funci on Extraer: public Tupla[] Extraer() throws IOException que retorna un arre-
glo de objetos de tipo Tupla que corresponden a los sensores mencionados en el archivo mediciones.txt junto
con las temperaturas mnimas registradas para cada uno de ellos. Para resolver esto suponga que cada sensor
mencionado en el archivo mediciones.txt tiene registrado al menos una temperatura y estas temperaturas se
encuentran separadas por un espacio. Por ejemplo, si mediciones.txt es el archivo mostrado al principio de
esta pregunta, entonces el arreglo retornado por Extraer debe tener 5 objetos, siendo el primero un objeto
de tipo Tupla con identificador s2 y temperatura 9 (que corresponde a la menor temperatura del sensor s2)
y el segundo un objeto de tipo Tupla con identificador s23 y temperatura 6.
Implemente la funci on Almacenar: public void Almacenar(Tupla[] lista) throws IOException que
recibe como parametro una lista de objetos de tipo Tupla, los ordena de manera ascendente de acuerdo
a la temperatura asociada a cada uno de estos objetos (que corresponde a la temperatura asociada a un
sensor) y finalmente los almacena en el archivo medicionesmin.txt. Por ejemplo, si Almacenar recibe como
parametro el resultado de la funci
on Extraer, entonces medicionesmin.txt es el archivo mostrado al princi-
pio de esta pregunta, el cual almacena ordenados de menor a mayor temperaturas las temperatura mnimas
registradas por los sensores.
Importante: Para resolver este ejercicio no se puede utilizar el metodo split de la clase String.
Criterios de soluci
on
Posible soluci
on
if ( min > c a n d i d a t o) {
min = c a n d i d a t o;
}
actual = s i g u i e n t e;
}
return ( min );
}
}
Las siguientes son las clases involucradas en el problema. Usted debe utilizarlas sin modificarlas.
public class L i s t a C o m p r a {
// Retorna la lista con los codigos de los p r o d u c t o s a comprar
public String [] g e t P r o d u c t o s (){...}
// Retorna la cantidad de p r o d u c t o s para el codigo pasado como p a r a m e t r o
public int g e t C a n t i d a d( String codigo ){...}
public String g e t N o m b r e C l i e n t e (){...}
}
public class S u p e r m e r c a d o {
private Producto [] l i s t a P r o d u c t o s;
public class S u p e r m e r c a d o {
private Producto [] l i s t a P r o d u c t o s;
Su programa deber a ser capaz de cargar el mapa, mostrarlo y permitir hacer consultar sobre los vecinos
de una cierta construccion.
Incremento 1
En este subconjunto su programa deber
a ser capaz de cargar el mapa desde un archivo, as como tambien
mostrar el mapa en la consola.
El archivo con el mapa mantendr a siempre el siguiente formato. En la primera lnea vendr a el numero
de filas y el n
umero de columnas que forman el mapa. Luego en la siguiente lnea vendr a el n
umero de
construcciones que contendra el mapa. Luego de ello, el archivo contendr
a una lnea que describe a cada una
de las construcciones que forman el mapa, esta lnea estar
a formada por el nombre de la construcci on, la fila
y la columna de ubicacion dentro del mapa (esquina superior izquierda), el n umero de filas y el n
umero de
columnas que utiliza la construcci
on, y por u
ltimo la cantidad de pisos de la construcci
on.
A continuaci
on se muestra el contenido de un archivo de ejemplo:
10 6
8
hospital 0 2 3 4 6
casa1 4 2 1 1 1
casa2 9 1 1 1 1
edificio 7 1 3 2 18
policia 3 4 2 2 1
colegio 8 3 2 3 3
universidad 1 0 6 2 4
mall 5 3 3 3 4
Su programa debe mostrar en la consola el mapa, para lo cual debe mostrar la matriz que lo represen-
ta, poniendo una X en los espacio que no hay construcciones, y el nombre de la construcci on en conjunto
con el n
umero de pisos, en los lugares utilizados por una construcci
on. Por ejemplo, para el archivo anterior
se debera mostrar lo siguiente:
En este incremento deber a crear un main donde se le pide al usuario que ingrese el nombre del archivo a
cargar y luego se muestre el mapa cargado.
Incremento 2
En este incremento deber a agregar a su programa la funcionalidad para poder ver los vecinos de una cons-
truccion particular. Para ello deber
a pedirle al usuario que ingrese el nombre de la construcci
on y en base a
ella debera mostrar en la consola los nombres de las construcciones vecinas. Si el nombre entregado no existe
se le debe indicar esto al usuario. Una construccion es vecina de otra cuando comparten al menos un vertice
en com un.
Para el archivo anterior, si se ingresa casa1 se debera mostrar universidad y mall, si se ingresa mall
se debera mostrar casa1, edificio, policia y colegio. Tenga en consideraci
on que al mostrar los vecinos
se debe mostrar el nombre de cada vecino una sola vez, y no se puede mostrar nuevamente el nombre de la
construccion sobre la cual se esta trabajando.
Ahora su main luego de pedir el nombre del archivo y cargar el mapa, debe mostrar un men u desde donde el
usuario pueda elegir ver el mapa, ver los vecinos de una cierta construcci
on, o salir. Este men
u debe aparecer
constantemente hasta que el usuario seleccione salir.
Criterios de soluci
on
Posible soluci
on
import java . io .*;
import java . util .*;
import i i c 1 1 0 3 P a c k a g e .*;
Usuario . m e n s a j e C o n s o l a( mapa );
}
public class P r i n c i p a l {
public static void main ( String [] args ) throws I O E x c e p t i o n {
// Pedimos el nombre del archivo e i n i c i a l i z a m o s el mapa
String n o m b r e A r c h i v o = Usuario . texto ( " Ingrese el nombre del archivo con el mapa " );
Mapa ciudad = new Mapa ( n o m b r e A r c h i v o);
int opcion = 1;
while ( opcion != 3) {
opcion = Usuario . entero (" S e l e c c i o n e una opcion :\ n (1) Ver Mapa \ n (2) Ver vecinos \ n (3) Salir " );
if ( opcion == 1) { // Ver mapa
ciudad . M o s t r a r M a p a ();
} else if ( opcion == 2) { // Ver vecinos
String n o m b r e S i t i o = Usuario . texto ( " Ingrese el nombre del sitio " );
if (! ciudad . M o s t r a r V e c i n o s( n o m b r e S i t i o)) {
Usuario . mensaje ( " El sitio i n g r e s a d o no existe . " );
}
}
}
}
}
public class Sitio {
private String nombre ;
private int filas ;
private int columnas ;
private int pisos ;
public Sitio ( String nombre , int filas , int columnas , int pisos ) {
this . nombre = nombre ;
this . filas = filas ;
this . columnas = columnas ;
this . pisos = pisos ;
}
Cada encomienda se caracterizara por su nombre, sus dimensiones (largo, ancho y alto que requiere su
embalaje) y por si es de naturaleza fragil o no.
Incremento 1
En este subconjunto su programa deber a ser capaz de obtener el plano de la bodega desde un archivo, as co-
mo tambien distribuir en su interior las encomiendas iniciales.
El archivo con la bodega mantendr a siempre el mismo formato. En la primera lnea se indicar a el n
umero de
filas y columnas de la bodega. Luego el archivo contendr a la descripcion de cada celda de su superficie, donde
el caracter - indicar a un espacio vaco, y el caracter + indicara un espacio reservado. A continuaci on, el
archivo contendr a el n
umero de encomiendas a distribuir inicialmente, seguido por el detalle (en cada linea
subsiguiente) de cada uno de estas. Para cada encomienda se encontrar a su nombre (puede asumir que nunca
contendr a espacio), el largo, el ancho y el alto de su embalaje, y un u ltimo dato que dara cuenta de si es
fragil (1) o no (0).
A continuaci
on se muestra el contenido de un archivo de ejemplo:
12 15
- - - - + + - - - - - - - - -
- - - - + + - - - - - - - - -
- - - - + + - - - - - - - - -
- - - - + + - - - - - - - - -
+ + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + +
- - - - + + - - - - - - - - -
- - - - + + - - - - - - - - -
- - - - + + - - - - - - - - -
- - - - + + - - - - - - - - -
- - - - + + - - - - - - - - -
- - - - + + - - - - - - - - -
10
bicicleta 2 1 1 0
comedor 3 4 1 1
lavadora 1 1 1 1
refrigerador 2 2 2 1
computadores 7 6 2 0
maletas 3 5 2 0
muebles 5 4 2 1
En el archivo anterior, la bodega posee 12 filas y 15 columnas, donde los + indican los espacio que siempre
deben estar libres, y los - indican los espacios que pueden ser utilizados por las encomiendas.
Su programa deber a asignar las encomiendas a la bodega, para lo cual debera buscar la primera ubicaci
on
con la cantidad de espacios vacos que permita posicionar cada encomienda respetando las dimensiones de su
embalaje. Debe mostrar en la consola el nombre de las encomiendas que no haya podido guardar en la bodega.
En este incremento deber a crear un main donde se le pide al usuario que ingrese el nombre del archivo
a cargar y se cargue el archivo asignando la distribuci
on correspondientes.
Incremento 2
En este incremento deber a agregar a su programa la funcionalidad que permita mostrar el estado de la
bodega posterior a la distribuci on de las encomiendas. Para esto debe mostrar la matriz que la representa,
poniendo una + en los espacio libres, un - en los espacio vacos y el identificador de la encomienda en
las celdas que esten utilizadas por una. Por ejemplo, para el archivo anterior se debera mostrar lo siguiente:
1 3 4 4 + + 2 2 2 2 6 6 6 6 6
1 - 4 4 + + 2 2 2 2 6 6 6 6 6
9 9 9 - + + 2 2 2 2 6 6 6 6 6
9 9 9 - + + - - - - - - - - -
+ + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + +
7 7 7 7 + + 8 8 8 8 10 10 10 - -
7 7 7 7 + + 8 8 8 8 10 10 10 - -
7 7 7 7 + + 8 8 8 8 10 10 10 - -
7 7 7 7 + + - - - - - - - - -
7 7 7 7 + + - - - - - - - - -
- - - - + + - - - - - - - - -
Adem as, debera complementar la asignaci on de espacios realizada anteriormente, de manera que ahora su
programa sea capaz de rotar (probar intercambiando su largo con su ancho y viceversa) una encomienda
en caso que no sea posible asignarle una posicion de acuerdo con el criterio anterior. Por ejemplo, para el
archivo anterior se debera mostrar lo siguiente:
1 3 4 4 + + 2 2 2 2 6 6 6 6 6
1 - 4 4 + + 2 2 2 2 6 6 6 6 6
9 9 9 - + + 2 2 2 2 6 6 6 6 6
9 9 9 - + + - - - - - - - - -
+ + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + +
7 7 7 7 + + 5 5 5 5 5 5 5 - -
7 7 7 7 + + 5 5 5 5 5 5 5 - -
7 7 7 7 + + 5 5 5 5 5 5 5 - -
7 7 7 7 + + 5 5 5 5 5 5 5 - -
7 7 7 7 + + 5 5 5 5 5 5 5 - -
- - - - + + 5 5 5 5 5 5 5 - -
Finalmente, deber a complementar nuevamente la asignaci on de espacios permitiendo que ahora su programa
sea capaz de ubicar una encomienda sobre otra ya asignada a la bodega en caso que no sea posible asignarle
una posicion de acuerdo con los criterios anteriores. Para ello, deber
a considerar que la encomienda sobre la
que se dispondra otra NO sea fragil, que tanto el largo como el ancho de la encomienda que quedar a arriba
sean menores o iguales que el ancho y que el largo de la que quedar a abajo, y que la altura de la nueva pila
no sea superior a 5. Considere que sobre una encomienda puede apilar s olo 1 encomienda. Por ejemplo, para
el archivo anterior se debera mostrar lo siguiente:
No fue posible asignar la encomienda: armario
1 3 4 4 + + 2 2 2 2 6 6 6 6 6
1 - 4 4 + + 2 2 2 2 6 6 6 6 6
9 9 9 - + + 2 2 2 2 6 6 6 6 6
9 9 9 - + + - - - - - - - - -
+ + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + +
7 7 7 7 + + 8(5) 8(5) 8(5) 8(5) 5 5 5 - -
7 7 7 7 + + 8(5) 8(5) 8(5) 8(5) 5 5 5 - -
7 7 7 7 + + 8(5) 8(5) 8(5) 8(5) 5 5 5 - -
7 7 7 7 + + 5 5 5 5 5 5 5 - -
7 7 7 7 + + 5 5 5 5 5 5 5 - -
- - - - + + 5 5 5 5 5 5 5 - -
Criterios de soluci
on
Posible soluci
on
public class P r i n c i p a l {
public static void main ( String [] args ) throws I O E x c e p t i o n {
// Pedimos al usuario el nombre del archivo
String n o m b r e A r c h i v o = Usuario . texto ( " Ingrese el nombre del archivo : " );
Bodega bodega = new Bodega ( n o m b r e A r c h i v o);
bodega . M o s t r a r B o d e g a ();
}
}
Su programa deber
a ser capaz de cargar la informaci
on, mostrarla y permitir hacer consultar sobre el estado
del terreno.
Incremento 1
En este subconjunto su programa deber
a ser capaz de cargar el mapa desde un archivo, as como tambien
mostrar el mapa en la consola.
El archivo con el mapa mantendr a siempre el siguiente formato. En la primera lnea vendra el numero
de filas y el n
umero de columnas que conforman el terreno. Luego en cada lnea siguiente viene descrita la
informaci on para cada fila del mapa, indicando la altura para cada area, seguida de un y la calidad de
oxgeno; la informaci
on para cada area viene separada por un espacio.
A continuaci
on se muestra el contenido de un archivo de ejemplo:
3 3
1000*60 1000*70 1000*60
1000*80 3000*40 2000*70
1000*80 1000*80 2000*60
El archivo anterior muestra un terreno que en la primera fila tiene una altura de 1000 metros con densidades
de oxigeno de 60 %, 70 % y 60 %, la segunda fila tiene una altura de 1000, 3000 y 2000 metros con densidades
de oxigeno de 80 %, 40 % y 70 % y la tercera fila tiene una alturas de 1000, 1000 y 2000 metros con densidades
de oxigeno de 80 %, 80 % y 60 % .
Su programa debe mostrar en la consola el mapa de cotas y de oxigeno, para lo cual debe mostrar la
matriz que los representa, debe preguntar al usuario si desea ver las alturas o las densidades de oxigeno. Por
ejemplo, para el archivo anterior se debera mostrar el siguiente mensaje si desea ver las alturas:
ALTURAS
| 1000 | 1000 | 1000 |
| 1000 | 3000 | 2000 |
| 1000 | 1000 | 2000 |
OXIGENO
| 60 | 70 | 60 |
| 80 | 40 | 70 |
| 80 | 80 | 60 |
Incremento 2
En este incremento deber a agregar a su programa la funcionalidad para poder ver los terrenos vecinos de
un area en particular. Para ello deberan pedirle al usuario que ingrese una posicion y en base a ella deber
an
mostrar en la consola las alturas junto con la densidades de las areas que la circundan. Un area es vecina de
otra cuando comparten al menos un vertice en com un. Tambien debe indicar si el area consultada es cima
(
area mas alta de entre las que la circundan), valle (area mas baja de entre las que la circundan) o nada en
particular.
Ahora su main luego de pedir el nombre del archivo y cargar el mapa, debe mostrar un men u desde donde
el usuario pueda elegir cargar mapa, ver el mapa (por alturas o densidades de oxigeno), ver los vecinos de
una cierta posicion (junto con consultar si el area es cima, valle o nada), o salir. Este men
u debe aparecer
constantemente hasta que el usuario seleccione salir.
Criterios de soluci
on
Posible soluci
on
public class Area {
}
import java . io .*;
import java . util .*;
import i i c 1 1 0 3 P a c k a g e .*;
// r e v i s a m o s derecha1
if ( j <= areas [ i ]. length - 2) {
nombres += " , " + areas [ i ][ j + 1]. g e t O x i g e n o() + " %("
+ areas [ i ][ j + 1]. g e t A l t u r a() + " ) " ;
if ( areas [ i ][ j + 1]. g e t A l t u r a() < areas [ i ][ j ]. g e t A l t u r a ()) {
valle = false ;
} else if ( areas [ i ][ j + 1]. g e t A l t u r a() > areas [ i ][ j ]. g e t A l t u r a ()) {
cima = false ;
}
}
nombres = nombres . s u b s t r i n g(0 , nombres . length () - 1);
Usuario . m e n s a j e C o n s o l a( nombres );
if ( cima ) {
Usuario . m e n s a j e C o n s o l a( " El area c o n s u l t a d a es cima . " );
} else if ( valle ) {
Usuario . m e n s a j e C o n s o l a( " El area c o n s u l t a d a es valle . " );
} else {
Usuario . m e n s a j e C o n s o l a( " El area c o n s u l t a d a no es nada . " );
}
}
}
import i i c 1 1 0 3 P a c k a g e .*;
import java . io . I O E x c e p t i o n;
public class P r i n c i p a l {
int opcion = 1;
String filename = Usuario . texto ( " Ingrese el nombre del archivo a cargar " );
Mapa map = new Mapa ( filename );
while ( opcion != 4) {
opcion = -1;
while ( opcion < 1 || opcion > 4) {
opcion = Usuario . entero ( " que desea hacer ? " + " \ n1 Cargar mapa . "
+ " \ n2 Ver mapa " + " \ n3 Ver vecinos \ n " + " \ n4 Salir " );
}
if ( opcion == 1) {
map = new Mapa ( Usuario . texto ( " Ingrese el nombre del archivo a cargar " ));
}
if ( opcion == 2) {
int tipo = 0;
while ( tipo != 1 && tipo != 2) {
tipo = Usuario . entero ( " Desea ver :\ n1 Altura ? \ n2 Oxigeno ? " );
Incremento 1
En este subconjunto su programa deber
a ser capaz de cargar la habitaci
on desde un archivo, as como tam-
bien asignar los muebles a ella.
El archivo con la habitacion mantendra siempre el mismo formato. En la primera lnea se indicar a el n
umero
de filas y columnas de la habitaci on. Luego el archivo contendr a la descripcion de cada celda de la sala,
donde el caracter - indicar
a un espacio vaco, y el caracter X indicar
a un espacio marcado como libre.
Luego de eso, el archivo contendr a el numero de muebles a distribuir, para despues contener en cada li-
nea la descripcion de cada uno de los muebles. Para cada mueble se encontrara el nombre del mueble (puede
asumir que nunca contendr a espacio), el tama
no en filas y el tama
no en columnas.
A continuaci
on se muestra el contenido de un archivo de ejemplo:
8 11
- - X - - - - - X - -
- - X - - - - - X - -
- - X X X - - - X - -
- - - - X - - X X - -
- - - X X - - X - - -
- - - X X - - X - - -
- - - X X X X X - - -
- - - - - X X - - - -
10
silla1 2 2
silla2 2 2
sillon1 4 2
mesa1 5 3
velador 1 2
sofa1 2 3
mesa2 2 5
sofa2 2 3
sillon2 2 3
silla3 2 2
En el archivo anterior, la sala posee 8 filas y 11 columnas, donde las X indican los espacio que siempre deben
estar libres, y los - indican los espacios que pueden ser utilizados por los muebles.
En este incremento deber a crear un main donde se le pide al usuario que ingrese el nombre del archivo
a cargar y se cargue el archivo asign
andose los muebles correspondientes.
Incremento 2
En este incremento deber a agregar a su programa la funcionalidad que permita mostrar el estado de la sala
posterior a la distribuci
on de los muebles. Para esto debe mostrar la matriz que lo representa, poniendo una
X en los espacio libres, un - en los espacio vacos y el nombre del mueble en los lugares utilizados por un
mueble. Por ejemplo, para el archivo anterior se debera mostrar lo siguiente:
Adem as su programa deber a ser capaz de, al momento de asignar un mueble, en caso de no ser posible
asignarlo, rotarlo y volver a probar. Por ejemplo si las dimensiones del mueble son 3 filas y 2 columnas y no
es posible asignarlo, se debe probar la asignaci on para 2 filas y 3 columnas. En este caso, la asignaci
on al
archivo anterior sera la siguiente:
Por u ltimo, su programa deber a mostrar en consola las dimensiones del mueble m as grande que podra ser
asignado, buscando el espacio (rectangular) m as grande dentro de la sala. Por ejemplo, para el archivo an-
terior el espacio mas grande es 3, 1.
El main debera pedir al usuario el nombre del archivo, cargar el mapa asignando los muebles, mostrar
el mapa y luego mostrar el espacio m
as grande en la sala.
Criterios de soluci
on
Posible soluci
on
import java . io .*;
import java . util .*;
import i i c 1 1 0 3 P a c k a g e .*;
public class P r i n c i p a l {
public static void main ( String [] args ) throws I O E x c e p t i o n {
// Pedimos al usuario el nombre del archivo
String n o m b r e A r c h i v o = Usuario . texto ( " Ingrese el nombre del archivo : " );
Sala h a b i t a c i o n = new Sala ( n o m b r e A r c h i v o);
h a b i t a c i o n. M o s t r a r S a l a ();
h a b i t a c i o n. E s p a c i o M a y o r ();
}
}
Incremento 1
En este subconjunto su programa deber
a ser capaz de cargar el mapa desde un archivo, as como tambien
mostrar el mapa en la consola.
El archivo con el mapa mantendr a siempre el siguiente formato. En la primera lnea vendr a el n
umero
de filas y el numero de columnas que forman el mapa. Luego en la siguiente lnea vendr a el tipo de flor
seguido por un espacio, y por el n umero de hectareas que tienen plantada esa flor. Luego de ello, se indi-
car
a la fila, columna y densidad de cada una de las hectareas correspondientes al tipo de flor indicado. Esta
estructura se repite para los tres tipos de flor.
A continuaci
on se muestra el contenido de un archivo de ejemplo:
3 3
rosa 3
1 1 10
1 2 20
1 3 30
clavel 2
2 1 40
2 3 60
tulipan 3
3 1 70
3 2 80
3 3 90
En el archivo anterior, se encuentran rosas plantadas en la primera fila con densidades del 10 %, 20 % y 30 %,
claveles en la segunda, con densidades del 40 % y 60 %, y tulipanes en la tercera con densidades del 70 %,
80 % y 90 %,.
Su programa debe mostrar en la consola el mapa, para lo cual debe mostrar la matriz que lo represen-
ta, poniendo una X en los espacio que no hay plantaciones, y, el nombre de la plantaci on en conjunto con su
densidad, en las hect
areas plantadas. Por ejemplo, para el archivo anterior se debera mostrar lo siguiente:
Incremento 2
En este incremento debera agregar a su programa la funcionalidad para poder ver las densidades promedio
de los vecinos de una hect
area particular. Para ello deber
an pedirle al usuario que ingrese una posici
on y
en base a ella debera mostrar en la consola los nombres de los tipos de flores plantadas alrededor de ella
junto con las densidades promedio para ellos. Una hectarea es vecina de otra cuando comparten al menos
un vertice en com
un.
Ahora su main luego de pedir el nombre del archivo y cargar el mapa, debe mostrar un men u desde donde el
usuario pueda elegir cargar mapa, ver el mapa, ver los vecinos de una cierta posicion, o salir. Este men
u debe
aparecer constantemente hasta que el usuario seleccione salir.
Criterios de soluci
on
Posible soluci
on
public class Hectarea {
private String tipo ;
private int densidad ;
public class P r i n c i p a l {
public static void main ( String [] args ) throws I O E x c e p t i o n {
int opcion = 1;
String filename = Usuario . texto ( " Ingrese el nombre del archivo a cargar " );
Mapa p l a n t a c i o n = new Mapa ( filename );
while ( opcion != 4) {
opcion = -1;
while ( opcion < 1 || opcion > 4) {
opcion = Usuario . entero ( " que desea hacer ? "
+ " \ n (1) Cambiar mapa . " + " \ n (2) Ver mapa "
+ " \ n (3) Ver densidad promedio vecinos \ n "
+ " \ n (4) Salir " );
}
if ( opcion == 1) {
p l a n t a c i o n = new Mapa ( Usuario . texto ( " Ingrese el nombre del archivo a cargar " ));
} else if ( opcion == 2) {
p l a n t a c i o n. Imprimir ();
} else if ( opcion == 3) {
int fila = Usuario . entero ( " Ingrese la fila " );
int columna = Usuario . entero ( " Ingrese la columna " );
p l a n t a c i o n. D e n s i d a d V e c i n o s( fila , columna );
}
}
}
}
Se le pide implementar una clase, CombateNaval, que simule un juego de combate naval simplificado. Ademas,
existen dos clases mas que ya est
an implementadas: InterfazGrafica, que permite mostrar gr aficamente el
juego, y Principal, que contiene el main del programa.
La clase InterfazGrafica ya est a creada por lo que usted NO DEBE IMPLEMENTARLA. Tiene los
siguientes metodos que usted puede utilizar:
La interfaz gr
afica muestra smbolos en el tablero; la leyenda es la siguiente:
= agua o desconocido
o = parte de un barco
+ = parte de un barco da
nada
* = bomba que dio en el agua
CombateNaval: Esta clase simular a un juego de combate naval, en donde el computador tendr a un tablero
con barcos repartidos en el, cuyas posiciones el jugador no conocer
a. El jugador tendr
a un lmite maximo de
bombas a utilizar para intentar destruir los barcos del computador, adivinando sus posiciones.
Adem
as, esta clase debe tener los siguientes metodos
6
3
0 1 1
0 0 0
1 1 0
public boolean RevisarSiGano(): metodo que revisa si el jugador destruy o todas las partes de todos
los barcos. Debe revisar los tableros, y si da
no todas las partes de todos los barcos, retorna true; si no,
retorna false.
public void IniciarJuego() throws IOException: el metodo principal del juego, debe tener un
ciclo constante en el que obtiene la opci
on del usuario a traves del objeto de InterfazGrafica (mos-
trando el tablero al mismo tiempo), y realiza la acci
on indicada por el usuario (mas abajo se definir
an
los metodos de la clase InterfazGrafica). Las acciones son las siguientes, dependiendo del entero que
se reciba:
(1) Atacar: usa el objeto InterfazGrafica para obtener las coordenadas de fila y columna en donde
lanzar una bomba, y usa la funci on interna de esta clase Atacar() para atacar en un lugar. Revisa
el exito de Atacar(); si da no un barco, muestra el mensaje Da naste un barco!; si no, muestra
el mensaje Al agua. Posteriormente usa la funci on interna de esta clase, RevisarSiGano(); si
retorna true, muestra el mensaje Destruiste todos los barcos! Ganaste!, y termina el programa.
Debe adem as revisar si se acabaron las bombas; en ese caso, debe mostrar el mensaje Te quedaste
sin bombas! Perdiste el juego. y terminar el programa. No debe detectar cuando se destruye 1
barco; solamente debe avisar cuando se destruyen todos.
A continuaci
on se muestran las dos clases ya implementadas
import i i c 1 1 0 3 P a c k a g e .*;
import i i c 1 1 0 3 P a c k a g e .*;
import java . io .*;
public class P r i n c i p a l {
Criterios de soluci
on
Posible soluci
on
import i i c 1 1 0 3 P a c k a g e .*;
import java . io .*;
import java . util . Scanner ;
public class C o m b a t e N a v a l {
int [][] t a b l e r o B a r c o s;
int [][] t a b l e r o J u g a d o r;
int n u m B o m b a s;
I n t e r f a z G r a f i c a GUI ;
/* * C o n s t r u c t o r */
public C o m b a t e N a v a l() {
GUI = new I n t e r f a z G r a f i c a ();
}
// O b t e n e m o s cantidad de bombas
n u m B o m b a s = bLector . nextInt ();
// Llenamos tablero
for ( int i = 0; i < tamano ; i ++) {
for ( int j = 0; j < tamano ; j ++) {
// O b t e n e m o s valor
int valor = bLector . nextInt ();
// G u a r d a m o s y pasamos a sgte
t a b l e r o B a r c o s[ i ][ j ] = valor ;
}
}
// Cerramos
bLector . close ();
/* * Realiza un ataque
* @param x la posicion entre 1 y max en fila
* @param y la posicion entre 1 y max en columna
* @return si dio en un barco o no */
public boolean Atacar ( int x , int y ) {
// D i s m i n u y e el total de bombas
numBombas - -;
Se le pide implementar una clase, BuscaMinas, que simule un juego de buscaminas simplificado.
BuscaMinas: Esta clase simular a un juego de buscaminas, en donde el computador tendr a un tablero
oculto con minas o bombas instaladas en algunos casilleros. El jugador deber a marcar las posiciones que
cree con minas, y puede mostrar el contenido de las posiciones donde cree que no hay minas. Al mostrar un
lugar, si es una mina, el jugador pierde el juego; si no lo es, se muestra un n
umero que indica cu
antas minas
hay en la vecindad. El jugador gana si al terminar de marcar tantos casilleros como minas haba, marc o las
minas reales, y no se equivoco marcando casilleros sin minas. Si no, pierde. NOTA: Como simplificaci on del
juego real, no se puede desmarcar un casillero una vez marcado y al mostrar el contenido de un casillero
sin minas adyacentes, solamente se muestra ese casillero, a diferencia del juego real, donde automaticamente
muestra todos los casilleros sin minas adyacentes.
Adem
as, esta clase debe tener los siguientes metodos:
public void IniciarJuego() throws IOException: el metodo principal del juego, debe tener un
ciclo constante en el que obtiene la opci
on del usuario a traves del objeto de InterfazGrafica (mos-
trando el tablero al mismo tiempo), y realiza la acci
on indicada por el usuario (mas abajo se definir
an
los metodos de la clase InterfazGrafica). Las acciones son las siguientes, dependiendo del entero que
se reciba:
(1) Marcar mina: usa el objeto InterfazGrafica para obtener las coordenadas de fila y colum-
na en donde marcar como minado, y usa la funci on interna de esta clase MarcarMina() para
marcar ese lugar. Si se han marcado tantas minas como total de minas haba, usa la funci on
interna de esta clase, RevisarSiGano(); si retorna true, muestra el mensaje Encontraste todas
las minas! Ganaste!, si no, muestra el mensaje Terminaste de marcar, y marcaste una o m as
minas equivocadamente. Perdiste!. En ambos casos muestra el tablero con minas, y termina el
programa.
(2) Mostrar contenido: usa el objeto InterfazGrafica para obtener las coordenadas de fila y co-
lumna en donde marcar como minado, y usa la funci on interna de esta clase MostrarContenido()
para destapar ese lugar. Si al destapar se retorn
o false (encontr
o una mina), muestra el mensaje
Explotaste! Perdiste el juego., muestra el tablero con minas y termina el programa.
La clase InterfazGrafica ya est a creada, por lo que usted NO DEBE IMPLEMENTARLA. Tiene los
siguientes metodos que usted puede utilizar:
La clase Principal, que contiene el main del programa, ya est a creada, por lo que NO DEBE IMPLEMEN-
TARLA. A modo de explicaci on, se indican las acciones realizadas:
A continuaci
on se muestran las dos clases ya implementadas
import i i c 1 1 0 3 P a c k a g e .*;
import i i c 1 1 0 3 P a c k a g e .*;
import java . io .*;
public class P r i n c i p a l {
Criterios de soluci
on
Posible soluci
on
import i i c 1 1 0 3 P a c k a g e .*;
import java . io .*;
import java . util . Scanner ;
/* * C o n s t r u c t o r */
public B u s c a M i n a s() {
GUI = new I n t e r f a z G r a f i c a ();
m i n a s D e t e c t a d a s = 0;
m i n a s T o t a l e s = 0;
}
// Llenamos tablero
for ( int i = 0; i < tamano ; i ++) {
for ( int j = 0; j < tamano ; j ++) {
// O b t e n e m o s valor y a u m e n t a m o s la cantidad de minas que vienen
int valor = bLector . nextInt ();
if ( valor == 1) {
m i n a s T o t a l e s ++;
}
// G u a r d a m o s y pasamos a sgte
t a b l e r o M i n a s[ i ][ j ] = valor ;
}
}
// Cerramos
bLector . close ();
Se le pide implementar una clase, MasterMind, que simule un juego de mastermind simplificado.
Ademas, existir
an dos clases m
as que ya est
a implementadas: InterfazGrafica, que permite mostrar gr
afi-
camente el juego, y Principal, que contiene el main del programa.
MasterMind: Esta clase simular a un juego de MasterMind, en donde el computador tendr a un codigo
compuesto por una serie ordenada de n umeros, no conocidos por el jugador. El jugador deber a intentar
adivinar la serie de n
umeros oculta por el computador. En cada intento, el programa indicar a cu
antos nume-
ros acerto en el lugar correcto (fama), y cu antos numeros acerto pero en el lugar equivocado (toque).
Por ejemplo, si el codigo oculto es 2 3 4 5, y el jugador ingresa 2 4 3 1, se le indicar a que tuvo un
valor correcto en el lugar correcto (el 2), y 2 valores correctos pero en lugares equivocados (el 3 y el 4). Sin
embargo, NO se le indica que n umeros son los correctos, solamente la cantidad de aciertos. El juego termina
cuando el jugador acierta al codigo, o cuando se acaba el tablero sin que haya adivinado.
NOTA: Como simplificaci on del juego real, no se pueden repetir los numeros dentro del c
odigo; es decir,
no sera valido 2 2 3 4 (pues tiene el 2 repetido), pero s 2 1 5 4.
Adem
as, esta clase debe tener los siguientes metodos
6
10
4
2 4 3 6
La clase InterfazGrafica ya est a creada, por lo que usted NO DEBE IMPLEMENTARLA. Tiene los
siguientes metodos que usted puede utilizar:
La clase Principal, que contiene el main del programa, viene ya creada, por lo que NO DEBE IMPLE-
MENTARLA. A modo de explicaci on, se indican las acciones realizadas:
A continuaci
on se muestran las dos clases ya implementadas.
import i i c 1 1 0 3 P a c k a g e .*;
/* * Pide al usuario los numeros del codigo , y retorna un arreglo con ellos
* @param rangoMax el entero maximo que puede ingresar
* @param c a n t N u m e r o s la cantidad de numeros a pedir
* @return */
public int [] o b t e n e r I n t e n t o( int rangoMax , int c a n t N u m e r o s) {
int [] intento = new int [ c a n t N u m e r o s];
for ( int i = 0; i < c a n t N u m e r o s; i ++) {
int numero ;
do {
numero = Usuario . entero ( " Ingrese el numero " + ( i + 1)
+ " del codigo ( entre 1 y " + rangoMax
+ " , sin repetir ): " );
} while ( numero < 1 || numero > rangoMax || YaEsta ( numero , intento ));
intento [ i ] = numero ;
// Armamos ayuda
t a b l e r o M o s t r a d o += " |";
for ( int j = 0; j < t a b l e r o A y u d a s[ i ]. length ; j ++) {
switch ( t a b l e r o A y u d a s[ i ][ j ]) {
case -1:
t a b l e r o M o s t r a d o += " o";
break ;
default : // Caso buen numero y buen lugar
t a b l e r o M o s t r a d o += " " + t a b l e r o A y u d a s[ i ][ j ];
break ;
}
}
t a b l e r o M o s t r a d o += " |\ n " ;
}
return t a b l e r o M o s t r a d o;
}
}
import i i c 1 1 0 3 P a c k a g e .*;
import java . io .*;
Criterios de soluci
on
Posible soluci
on
import i i c 1 1 0 3 P a c k a g e .*;
public class M a s t e r M i n d {
private int [] codigo ;
private int [][] t a b l e r o J u e g o;
private int [][] t a b l e r o A y u d a s;
private I n t e r f a z G r a f i c a GUI ;
private int n u m I n t e n t o s;
private int rangoMax ;
/* * C o n s t r u c t o r */
public M a s t e r M i n d() {
GUI = new I n t e r f a z G r a f i c a ();
n u m I n t e n t o s = 0;
rangoMax = 0;
}
// Creamos tablero , i n i c i a l i z a d o en -1
t a b l e r o J u e g o = new int [ alto ][ ancho ];
for ( int i = 0; i < alto ; i ++) {
for ( int j = 0; j < ancho ; j ++) {
t a b l e r o J u e g o[ i ][ j ] = -1;
}
}
// Creamos codigo
codigo = new int [ ancho ];
// Leemos codigo
for ( int j = 0; j < ancho ; j ++) {
// O b t e n e m o s valor , g u a r d a m o s y pasamos a sgte
int valor = bLector . nextInt ();
codigo [ j ] = valor ;
// Cerramos
bLector . close ();
return true ;
} else {
return false ;
}
}
// R e v i s a m o s si gano
boolean gano = false ;
if ( t a b l e r o A y u d a s[ n u m I n t e n t o s ][1] == codigo . length ) {
gano = true ;
}
// A v a n z a m o s y r e t o r n a m o s
n u m I n t e n t o s++;
return gano ;
}
Se le pide implementar u nicamente la clase Laberinto que simula un juego de laberinto simplificado.
Adem as, existir
an dos clases ya implementadas: InterfazGrafica, que permite mostrar gr
aficamente el
juego, y Principal, que contiene el main del programa.
Laberinto: Esta clase simula un juego de Laberinto cuya estructura no sera conocida por el jugador. El
jugador conocer a el punto de inicio y el de fin del laberinto, y deber a intentar avanzar en distintas direcciones
para llegar al final. A medida que avanza, se le ir a mostrando la estructura del laberinto. El jugador tiene
una cantidad limitada de turnos, por lo que ganar a si llega al final antes de que se le acaben los turnos, o
perdera si se le acaban los turnos sin haber llegado al final.
Tablero de juego: Es una matriz que almacena el estado del laberinto mientras se juega. Cada casillero
en la matriz tendr
a los siguientes valores posibles:
-1 = casillero oculto, jugador no sabe su contenido
-2 = casillero descubierto, se mostrar
a el contenido del laberinto en ese lugar
-3 = casillero donde est
a el jugador
Tablero del laberinto: Es una matriz que almacena la estructura del laberinto. Cada casillero en la
matriz tendr
a los siguientes valores posibles:
0 = existe un camino despejado
1= existe una muralla
2 = la entrada del laberinto
3 = la salida del laberinto
Un entero para almacenar la cantidad m
axima de turnos disponibles para el jugador.
Un entero para almacenar la cantidad de turnos ya usados por el jugador.
Un entero para almacenar la fila actual donde est
a el jugador en cada momento.
Un entero para almacenar la columna actual donde est
a el jugador en cada momento.
Un objeto de tipo InterfazGrafica para mostrar los tableros.
Adem
as, esta clase debe tener los siguientes metodos:
public Laberinto(): El constructor crea un nuevo Laberinto, inicializando el atributo de tipo InterfazGrafica
y poniendo en cero los atributos enteros.
public boolean CargarTablero(String nombreArchivo) throws IOException: metodo que lee un
archivo con la informacion del juego y la estructura del laberinto. El nombre del archivo a abrir se
recibe como parametro en nombreArchivo. Debe retornar false si el archivo no existe y si existe, debe
leerlo y almacenar los valores ledos en los atributos correspondientes de la clase: cantidad de turnos,
tama no del tablero, y matriz con la estructura del laberinto. El siguiente es el formato del archivo:
InterfazGrafica: Ya esta creada por lo que usted NO DEBE IMPLEMENTARLA. Tiene los siguientes
metodos que usted puede utilizar:
La clase Principal, que contiene el main del programa, viene creada por lo que NO DEBE IMPLEMEN-
TARLA. A modo de explicaci on, se indican las acciones realizadas:
A continuaci
on se muestran las dos clases implementadas:
import i i c 1 1 0 3 P a c k a g e .*;
return t a b l e r o M o s t r a d o;
}
import i i c 1 1 0 3 P a c k a g e .*;
import java . io .*;
public class P r i n c i p a l {
Criterios de soluci
on
Posible soluci
on
import i i c 1 1 0 3 P a c k a g e .*;
public class L a b e r i n t o {
private int [][] t a b l e r o J u g a d o r;
private int [][] t a b l e r o L a b e r i n t o;
private I n t e r f a z G r a f i c a GUI ;
private int t u r n o s D i s p o n i b l e s;
private int posFila ;
private int posCol ;
// O b t e n e m o s cantidad de turnos
t u r n o s D i s p o n i b l e s = bLector . nextInt ();
// Llenamos tablero
for ( int i = 0; i < tamano ; i ++) {
for ( int j = 0; j < tamano ; j ++) {
// O b t e n e m o s valor
int valor = bLector . nextInt ();
t a b l e r o L a b e r i n t o[ i ][ j ] = valor ;
// Vemos si e n c o n t r a m o s inicio
if ( valor == 2) {
posFila = i ;
posCol = j ;
t a b l e r o J u g a d o r[ posFila ][ posCol ] = -3;
} else if ( valor == 3) {
t a b l e r o J u g a d o r[ i ][ j ] = -2; // Dejamos salida d e s c u b i e r t a
}
}
}
return true ;
} else {
return false ;
}
}
// A v a n z a m o s solo si no es muralla
if ( t a b l e r o L a b e r i n t o[ n u e v a P o s F i l a][ n u e v a P o s C o l] != 1) {
t a b l e r o J u g a d o r[ posFila ][ posCol ] = -2; // Lo deja como d e s c u b i e r t o
posFila = n u e v a P o s F i l a;
posCol = n u e v a P o s C o l;
t a b l e r o J u g a d o r[ n u e v a P o s F i l a][ n u e v a P o s C o l] = -3; // Indica el jugador
}
Se le pide implementar un programa que pueda servir como un editor de texto. Debe ser capaz de abrir
un archivo existente, hacer diversas modificaciones, y guardar el archivo. En particular, se le pide implemen-
tar la clase EditorTexto, que se encargara de organizar la edici
on, y el metodo main de la clase Principal.
Adem as, tendr
a a su disposici
on dos clases ya creadas: InterfazUsuario, para las funcionalidades m as co-
munes de interacci on con el usuario, y Documento, con informaci on y operaciones de un documento.
Clase Documento: la siguiente clase ya viene definida e implementada, por lo que usted NO DEBE IM-
PLEMENTARLA. Esta clase encapsula la informaci on necesaria sobre documento en edicion. A continuaci
on
se describen sus metodos p
ublicos para que usted pueda utilizarlos:
Clase InterfazUsuario: la siguiente clase ya viene definida e implementada, por lo que usted NO DEBE
IMPLEMENTARLA. Esta clase tiene metodos para pedir y mostrar la informaci on necesaria al usuario. A
continuacion se describen sus metodos p
ublicos para que usted pueda utilizarlos:
Clase EditorTexto: la siguiente clase debe ser implementada por usted. Esta clase es la encargada de
buscar una palabra en archivos, y formatear y exportar los resultados. Puede tener todos los atributos y
metodos privados que usted considere necesarios. Debe tener los siguientes metodos p
ublicos:
Clase Principal: el metodo main de esta clase debe ser implementado por usted. Debe consistir en el
funcionamiento principal del programa, que debe realizar las siguientes funciones:
A continuaci
on se muestra el c
odigo de las clases ya implementadas
public class D o c u m e n t o {
// A t r i b u t o s
private String nombre ;
private String fechaAct ;
private String texto ;
private int cursor ;
// C o n s t r u c t o r
public D o c u m e n t o( String nuevoNombre , String n u e v a F e c h a A c t) {
nombre = n u e v o N o m b r e;
fechaAct = n u e v a F e c h a A c t;
cursor = 0;
}
// Carga un texto en el d o c u m e n t o
public void c a r g a r T e x t o( String n u e v o T e x t o) {
texto = n u e v o T e x t o;
}
// Retorna la fecha
public String getFecha () {
return fechaAct ;
}
// Retorna el cursor
public int g e t C u r s o r() {
return cursor ;
}
import i i c 1 1 0 3 P a c k a g e .*;
public class I n t e r f a z U s u a r i o {
/* * Muestra el d o c u m e n t o y un menu de opciones , y retorna la opcion elegida
* @param un string con el c o n t e n i d o del archivo , i n c l u y e n d o posicion del cursor
* @return un numero con la opcion elegida */
public int C o n t e n i d o Y M e n u( String c o n t e n i d o A r c h i v o) {
int opcion ;
do {
opcion = Usuario . entero (" Archivo :\ n \ n "
+ contenidoArchivo
+ " \ n \ nElija una opcion :\ n (1) Elegir archivo a abrir \ n (2) Mover cursor \ n " +
" (3) Insertar texto \ n (4) Eliminar texto \ n (5) Juntar con otro archivo \ n " +
" (6) Guardar archivo \ n (7) Salir " );
} while ( opcion < 1 || opcion > 73);
return opcion ;
}
Criterios de soluci
on
Posible soluci
on
public class E d i t o r T e x t o {
/* * Arma un arreglo de strings con los nombres de los archivos e x i s t e n t e s
* @return un arreglo de strings con los nombres de archivos e x i s t e n t e s
* @throws I O E x c e p t i o n */
public String [] g e t L i s t a D o c u m e n t o s() throws I O E x c e p t i o n {
// Cuenta cuantos archivos hay
boolean fin = false ;
int i = 1;
int t o t a l A r c h i v o s = 0;
do {
// Abre archivo s i g u i e n t e y revisa
File a r c h i v o A c t u a l = new File ( " archivo " + i ++ + " . txt " );
if ( a r c h i v o A c t u a l. exists ()) {
t o t a l A r c h i v o s ++;
} else {
fin = true ;
}
} while (! fin );
// Arma arreglo
String [] docs = new String [ t o t a l A r c h i v o s];
for ( i = 0; i < t o t a l A r c h i v o s; i ++) {
docs [ i ] = " archivo " + ( i + 1) + " . txt " ;
}
return docs ;
}
// Leemos fecha
String fecha = bLector . nextLine ();
// Leemos c o n t e n i d o
String texto = " " ;
while ( bLector . h a s N e x t L i n e()) {
texto += bLector . nextLine () + " \ n " ;
}
// Cerramos archivos
bLector . close ();
/* * Guarda un d o c u m e n t o
* @param doc el d o c u m e n t o a guardar
* @throws I O E x c e p t i o n
*/
public void g u a r d a r D o c u m e n t o( D o c u m e n t o doc , String fecha )
throws I O E x c e p t i o n {
// Abrimos archivo a escribir
File archivo = new File ( doc . g e t N o m b r e ());
F i l e W r i t e r escritor = new F i l e W r i t e r( archivo );
P r i n t W r i t e r p E s c r i t o r = new P r i n t W r i t e r( escritor );
p E s c r i t o r. close ();
escritor . close ();
}
/* * Agrega el c o n t e n i d o de un d o c u m e n t o a otro
* @param doc1 el d o c u m e n t o base
* @param doc2 el d o c u m e n t o agregado
* @return */
public D o c u m e n t o j u n t a r D o c u m e n t o s( D o c u m e n t o doc1 , D o c u m e n t o doc2 ) {
doc1 . c a r g a r T e x t o( doc1 . getTexto () + " \ n " + doc2 . getTexto ());
return doc1 ;
}
import i i c 1 1 0 3 P a c k a g e .*;
import java . io .*;
public class P r i n c i p a l {
// Main del programa
public static void main ( String [] args ) throws I O E x c e p t i o n {
// V a r i a b l e s internas
I n t e r f a z U s u a r i o GUI = new I n t e r f a z U s u a r i o ();
E d i t o r T e x t o editor = new E d i t o r T e x t o ();
String c o n t e n i d o = " No hay d o c u m e n t o abierto " ;
D o c u m e n t o d o c A c t u a l = null ;
// Ciclo p r i n c i p a l
boolean salir = false ;
while (! salir ) {
int opcion = GUI . C o n t e n i d o Y M e n u( c o n t e n i d o);
switch ( opcion ) {
case 1: // Elegir d o c u m e n t o para abrir
String [] lista = editor . g e t L i s t a D o c u m e n t o s ();
String a r c h i v o A b r i r = GUI . E l e g i r D o c u m e n t o A b r i r( lista );
d o c A c t u a l = editor . a b r i r D o c u m e n t o( a r c h i v o A b r i r);
Usuario . mensaje ( " D o c u m e n t o " + d o c A c t u a l. g e t N o m b r e()
+ " abierto . " );
break ;
case 2: // Mover cursor
if ( d o c A c t u a l != null )
// Cargamos c o n t e n i d o a mostrar
if ( d o c A c t u a l != null ) {
c o n t e n i d o = editor . g e t T e x t o C o n C u r s o r( d o c A c t u a l);
}
}
}
}
Se le pide implementar un programa que pueda buscar palabras dadas por el usuario en una serie de archivos
de texto plano, y retornar resultados ordenados, los que podr an ser exportados a un archivo. En particular,
se le pide implementar la clase Buscador, que se encargara de hacer la busqueda de la palabra, y el metodo
main de la clase Principal. Adem as, tendr
a a su disposici
on dos clases ya creadas: InterfazUsuario, para
las funcionalidades mas comunes de interaccion con el usuario, y Resultado, con informacion de resultados
de la busqueda.
Clase Resultado: la siguiente clase ya viene definida e implementada, por lo que usted NO DEBE IM-
PLEMENTARLA. Esta clase encapsula la informaci on necesaria sobre un resultado de una b
usqueda. A
continuacion se describen sus metodos p
ublicos para que usted pueda utilizarlos:
Clase InterfazUsuario: la siguiente clase ya viene definida e implementada, por lo que usted NO DEBE
IMPLEMENTARLA. Esta clase tiene metodos para pedir y mostrar la informaci on necesaria al usuario. A
continuacion se describen sus metodos p
ublicos para que usted pueda utilizarlos:
public int MenuOpciones(): muestra un men u con opciones al usuario, y retorna la opci
on elegida.
No realiza ninguna acci
on asociada; solamente retorna el n
umero de la opcion indicada por el usuario.
Las opciones que presenta son:
(1) Indicar archivos: para elegir en que archivos buscar; si es elegida, retorna 1.
(2) Buscar en archivos: para buscar una palabra en archivos; si es elegida, retorna 2.
(3) Salir: para terminar el programa; si es elegida, retorna 3.
public String[] ObtenerNombreArchivos(): pide al usuario indicar en cu antos archivos quiere bus-
car, y le pide el nombre de cada uno. Luego retorna un arreglo con todos esos nombres.
public String ObtenerPalabra(): pide una palabra v
alida al usuario para buscar, y la retorna.
public boolean MostrarYExportar(String resultados): recibe un string con los resultados for-
mateados y listos para mostrar, los muestra en pantalla, y pregunta si quiere exportarlos a archivo.
Retorna 1 si se quiere exportar, 2 si no.
Resultados para b
usqueda de palabra:
1) NombreArchivo1 { 10 veces { extracto: ...blabla palabra bla...
2) NombreArchivo2 { 8 veces { extracto: ...blablo palabra ble...
Clase Principal: el metodo main de esta clase debe ser implementado por usted. Debe consistir en el
funcionamiento principal del programa, que debe realizar las siguientes funciones:
A continuaci
on se muestra el c
odigo de las clases ya implementadas:
// C o n s t r u c t o r
public R e s u l t a d o( String archivo , int nVeces , String n u e v o E x t r a c t o) {
n o m b r e A r c h i v o = archivo ;
numVeces = nVeces ;
extracto = n u e v o E x t r a c t o;
}
// Retorna el extracto
public String g e t E x t r a c t o() {
return extracto ;
}
import i i c 1 1 0 3 P a c k a g e .*;
public class I n t e r f a z U s u a r i o {
/* * Muestra un menu de opciones , y retorna la opcion elegida
* @return un numero con la opcion elegida */
public int M e n u O p c i o n e s() {
int opcion ;
do {
opcion = Usuario . entero (" Elija una opcion :\ n (1) Indicar archivos \ n " +
" (2) Buscar en archivos \ n (3) Salir " );
} while ( opcion < 1 || opcion > 3);
return opcion ;
}
return archivos ;
}
if ( opcion == 1) {
return true ;
} else {
return false ;
}
}
}
Criterios de soluci
on
Posible soluci
on
// Leemos c o n t e n i d o
// Busca la palabra
int numVeces = B u s c a r C a n t i d a d( busqueda , texto );
String extracto = " " ;
int t a m a n o E x t r a c t o = 15;
if ( numVeces > 0) {
// Busca extracto , buscando a lo mas 10 c a r a c t e r e s antes y
// despues
int pos = texto . indexOf ( busqueda , 0);
int inicio = pos - t a m a n o E x t r a c t o;
if ( inicio < 0) {
inicio = 0;
}
int fin = pos + busqueda . length () + t a m a n o E x t r a c t o;
if ( fin > texto . length () - 1) {
fin = texto . length () - 1;
}
extracto = texto . s u b s t r i n g( inicio , fin );
extracto = extracto . replace ( " \ n " , " " );
// Armamos r e s u l t a d o
R e s u l t a d o res = new R e s u l t a d o( n o m b r e A r c h i v o s[ i ] , numVeces , extracto );
// Escribe r e s u l t a d o
p E s c r i t o r. write ( F o r m a t e a r R e s u l t a d o s( r e s u l t a d o s));
p E s c r i t o r. close ();
escritor . close ();
}
}
import i i c 1 1 0 3 P a c k a g e .*;
import java . io .*;
public class P r i n c i p a l {
// Main del programa
public static void main ( String [] args ) throws I O E x c e p t i o n {
boolean salir = false ;
I n t e r f a z U s u a r i o GUI = new I n t e r f a z U s u a r i o ();
Buscador busca = new Buscador ();
String [] n o m b r e A r c h i v o s = null ;
while (! salir ) {
int opcion = GUI . M e n u O p c i o n e s();
switch ( opcion ) {
case 1:
n o m b r e A r c h i v o s = GUI . O b t e n e r N o m b r e A r c h i v o s ();
break ;
case 2:
if ( n o m b r e A r c h i v o s == null ) {
Usuario . mensaje ( " Debe ingresar los nombres de archivos antes de " +
" buscar una palabra . " );
} else {
// O b t e n e m o s palabra y buscamos
String palabra = GUI . O b t e n e r P a l a b r a ();
R e s u l t a d o[] res = busca . Buscar ( palabra , n o m b r e A r c h i v o s);
res = busca . O r d e n a r R e s u l t a d o s( res );
// M o s t r a m o s r e s u l t a d o s y e x p o r t a m o s de ser n e c e s a r i o
boolean exportar = GUI . M o s t r a r Y E x p o r t a r( busca
. F o r m a t e a r R e s u l t a d o s( res ));
if ( exportar ) {
String n o m b r e A r c h i v o = Usuario . texto (
" Ingrese el nombre del archivo de salida " ,
" salida . txt " );
busca . E x p o r t a r R e s u l t a d o s( res , n o m b r e A r c h i v o);
Usuario . mensaje ( " R e s u l t a d o s e x p o r t a d o s. " );
}
}
break ;
case 3:
salir = true ;
break ;
}
}
}
}
Se le pide implementar un programa que pueda corregir un texto en un archivo en base a un dicciona-
rio provisto en otro archivo. En particular, se le pide implementar la clase Corrector, que se encargara de
hacer la correccion de las palabras, y el metodo main de la clase Principal. Ademas, tendra a su disposici
on
dos clases ya creadas: InterfazUsuario, para las funcionalidades m as comunes de interacci
on con el usuario,
y Diccionario, con informaci on de un diccionario.
Clase Diccionario: la siguiente clase ya viene definida e implementada, por lo que usted NO DEBE IM-
PLEMENTARLA. Esta clase encapsula la informaci on necesaria sobre un diccionario para correcci
on. A
continuacion se describen sus metodos p
ublicos para que usted pueda utilizarlos:
public Diccionario(): constructor de la clase, crea el diccionario e inicializa sus atributos internos.
Un diccionario puede almacenar a lo m
as 100 palabras.
public boolean agregarPalabra(String nuevaPalabra): agrega una palabra al diccionario; retor-
na true si pudo, false si estaba lleno y no pudo.
public void iniciarRecorrido(): prepara el objeto diccionario para recorrer todas sus palabras.
Debe ser llamado 1 vez antes de avanzar usando el metodo getSiguiente().
public String getSiguiente(): retorna la siguiente palabra del diccionario para recorrerlas todas.
Cada vez que se llame, entregar
a una palabra distinta, secuencialmente, del diccionario. Debe llamarse
una vez a iniciarRecorrido previamente. Retorna null despues de entregar la u ltima palabra.
public int getDiferencia(String palabra1, String palabra2): compara las dos palabras da-
das, y retorna un entero indicando la diferencia. Si retorna 0, quiere decir que son iguales; si retorna 1,
quiere decir que tiene una letra diferente (por ejemplo, casa con cosa), o que son iguales pero una
tiene 1 letra mas que la otra al final (por ejemplo, casa con casas). Si retorna un numero mayor,
indica cuantas letras distintas tienen, o cu
antas letras m
as tiene una que la otra.
public String getPalabraEnTexto(String texto, int inicio): busca en el texto dado, desde la
posici
on inicio, la siguiente palabra hasta un espacio ( ) o hasta el fin del texto, y la retorna.
Clase InterfazUsuario: la siguiente clase ya viene definida e implementada, por lo que usted NO DEBE
IMPLEMENTARLA. Esta clase tiene metodos para pedir y mostrar la informaci on necesaria al usuario. A
continuacion se describen sus metodos p
ublicos para que usted pueda utilizarlos:
public int MostrarMenu(): muestra un men u con opciones al usuario, y retorna la opci
on elegida.
No realiza ninguna acci
on asociada; solamente retorna el n
umero de la opci
on indicada por el usuario.
Las opciones que presenta son:
(1) Cargar diccionario: retorna 1.
(2) Corregir archivo: retorna 2.
(3) Guardar archivo corregido: retorna 3.
(4) Salir: retorna 4.
public int GetCorrecion(String[] opciones, int cantOpciones, String aCorregir): muestra
al usuario una lista de opciones (para cuando una palabra se puede corregir con varias opciones), y le
pide que ingrese el n
umero de una. Retorna ese entero (entre 1 y la cantidad de opciones).
Clase Corrector: la siguiente clase debe ser implementada por usted. Esta clase es la encargada de corregir
el contenido de un archivo en base al diccionario, y guardarlo. Puede tener todos los atributos y metodos
privados que usted considere necesarios. Debe tener los siguientes metodos p
ublicos:
Clase Principal: el metodo main de esta clase debe ser implementado por usted. Debe consistir en el
funcionamiento principal del programa, que debe realizar las siguientes funciones:
Realizar cada una de las opciones que ingrese el usuario, utilizando las clases anteriormente definidas.
En particular, dependiendo de la elecci
on, si eligi
o lo siguiente, debe hacer lo indicado:
(1) Cargar diccionario: obtener del usuario el nombre del diccionario, y cargarlo internamente,
avisando con un mensaje si pudo o no.
(2) Corregir archivo: si no se ha cargado un diccionario, avisa y no hace nada. Si se ha cargado,
debe pedirle al usuario un archivo, corregirlo, guardar internamente el texto corregido, y avisar
cuando finalice la correccion. Si el archivo no existe, debe avisar.
(3) Guardar archivo corregido: si no hay texto corregido, avisa y no hace nada. Si hay, debe
pedirle al usuario el nombre del archivo de salida, y guardar el texto corregido ah, avisando
cuando finalice. Si el archivo no existe, debe avisar.
(4) Salir: para terminar el programa.
A continuaci
on se muestra el c
odigo de las clases ya implementadas:
/* * C o n s t r u c t o r */
public D i c c i o n a r i o() {
palabras = new String [100];
c a n t P a l a b r a s = 0;
l u g a r R e c o r r i d o = 0;
}
import i i c 1 1 0 3 P a c k a g e .*;
public class I n t e r f a z U s u a r i o {
/* * Muestra un menu de opciones , y retorna la opcion elegida
* @return un numero con la opcion elegida */
public int M o s t r a r M e n u() {
int opcion ;
do {
opcion = Usuario . entero (" Elija una opcion :\ n (1) Cargar d i c c i o n a r i o \ n " +
" (2) Corregir archivo \ n (3) Guardar archivo c o r r e g i d o \ n (4) Salir " );
} while ( opcion < 1 || opcion > 73);
return opcion ;
}
/* * Avisa una c o r r e c i o n
* @param p O r i g i n a l la palabra original
* @param pFinal la c o r r e g i d a */
public void A v i s a r C o r r e c c i o n( String pOriginal , String pFinal ) {
Usuario . mensaje ( " Palabra " + p O r i g i n a l + " c o r r e g i d a a "
+ pFinal + " . " );
}
}
Criterios de soluci
on
Posible soluci
on
public class C o r r e c t o r {
/* * Carga las palabras de un archivo en un D i c c i o n a r i o
* @param n o m b r e A r c h i v o El nombre del archivo a revisar
// Creamos d i c c i o n a r i o
D i c c i o n a r i o dic = new D i c c i o n a r i o ();
// Cerramos archivos
bLector . close ();
return dic ;
} else {
return null ;
}
}
// Cerramos archivos
bLector . close ();
return texto ;
} else {
return null ;
}
}
// R e a l i z a m o s accion
if ( difs == 1) {
opciones [ c a n t O p c i o n e s++] = correcta ;
}
// Pasamos a s i g u i e n t e
// R e v i s a m o s las opciones
String c o r r e c c i o n = a C o r r e g i r;
if ( c a n t O p c i o n e s == 1) {
c o r r e c c i o n = opciones [0];
GUI . A v i s a r C o r r e c c i o n( aCorregir , c o r r e c c i o n);
} else if ( c a n t O p c i o n e s > 1) {
// Si hay muchas opciones , debe elegir
// O b t e n e m o s correcion , y si eligio corregirla , la c a m b i a m o s por
// esa palabra
int opcion = GUI . G e t C o r r e c i o n( opciones , cantOpciones , a C o r r e g i r);
if ( opcion != 0) {
c o r r e c c i o n = opciones [ opcion - 1];
}
}
// Vamos armando c o r r e g i d o
c o r r e g i d o += c o r r e c c i o n + " " ;
// A v a n z a m o s
inicio += a C o r r e g i r. length () + 1;
a C o r r e g i r = dic . g e t P a l a b r a E n T e x t o( texto , inicio );
}
/* * Guarda el archivo c o r r e g i d o
* @param t e x t o C o r r e g i d o el texto c o r r e g i d o
* @param a r c h i v o C o r r e g i d o el nombre del archivo donde guardar el texto c o r r e g i d o
* @throws I O E x c e p t i o n */
public void g u a r d a r C o r r e g i d o( String textoCorregido , String a r c h i v o C o r r e g i d o)
throws I O E x c e p t i o n {
// Abrimos archivo a escribir
File archivo = new File ( a r c h i v o C o r r e g i d o);
F i l e W r i t e r escritor = new F i l e W r i t e r( archivo );
P r i n t W r i t e r p E s c r i t o r = new P r i n t W r i t e r( escritor );
// Escribe texto
p E s c r i t o r. write ( t e x t o C o r r e g i d o);
p E s c r i t o r. close ();
escritor . close ();
}
}
import i i c 1 1 0 3 P a c k a g e .*;
import java . io .*;
public class P r i n c i p a l {
// Main del programa
public static void main ( String [] args ) throws I O E x c e p t i o n {
// V a r i a b l e s internas
I n t e r f a z U s u a r i o GUI = new I n t e r f a z U s u a r i o ();
C o r r e c t o r corrige = new C o r r e c t o r();
String c o r r e g i d o = null ;
D i c c i o n a r i o dic = null ;
// Ciclo p r i n c i p a l
boolean salir = false ;
while (! salir ) {
int opcion = GUI . M o s t r a r M e n u();
switch ( opcion ) {
case 1: // Cargar d i c c i o n a r i o
String archivo = GUI . P e d i r N o m b r e A r c h i v o ();
dic = corrige . c a r g a r P a l a b r a s( archivo );
if ( dic != null ) {
Usuario . mensaje ( " D i c c i o n a r i o cargado " );
} else {
Usuario . mensaje ( " D i c c i o n a r i o no e x i s t e n t e" );
}
break ;
Se le pide implementar un programa que pueda traducir un texto en un archivo en base a un dicciona-
rio provisto en dos archivos con palabras en dos idiomas. En particular, se le pide implementar la clase
Traductor, que se encargara de hacer la traduccion de las palabras, y el metodo main de la clase Principal.
Adem as, tendr
a a su disposici
on dos clases ya creadas: InterfazUsuario, para las funcionalidades m as co-
munes de interaccion con el usuario, y Diccionario, con informaci on de un diccionario espa nol-ingles.
Clase Diccionario: la siguiente clase ya viene definida e implementada, por lo que usted NO DEBE IM-
PLEMENTARLA. Esta clase encapsula la informaci on necesaria sobre un diccionario para traducci
on. A
continuacion se describen sus metodos p
ublicos para que usted pueda utilizarlos:
public Diccionario(int cantMax): constructor de la clase, crea el diccionario e inicializa sus atri-
butos internos. Puede almacenar a lo m
as cantMax palabras.
public boolean agregarPalabra(String nuevaPalabra, String traduccion): agrega una pala-
bra y su traducci
on al diccionario; retorna true si pudo, false si estaba lleno y no pudo.
public int getCantPalabras(): retorna la cantidad de palabras almacenadas.
public String getPalabra(int lugar): retorna una palabra del diccionario (no su traducci on), la
que este en la posici
on indicada por lugar (que es un entero entre 0 y la cantidad de palabras
almacenadas). Retorna null si es un lugar no v
alido.
public int traducir(String palabra): busca la palabra en el diccionario, y retorna su traducci
on.
Si no la encuentra, retorna null.
public boolean swapPalabras(int lugar1, int lugar2): intercambia las palabras en los lugares
indicados de posici
on. Hace lo mismo con sus traducciones.
public String getPalabraEnTexto(String texto, int inicio): busca en el texto dado, desde la
posici
on inicio, la siguiente palabra hasta un espacio ( ) o hasta el fin del texto, y la retorna.
Clase InterfazUsuario: la siguiente clase ya viene definida e implementada, por lo que usted NO DEBE
IMPLEMENTARLA. Esta clase tiene metodos para pedir y mostrar la informaci on necesaria al usuario. A
continuacion se describen sus metodos p
ublicos para que usted pueda utilizarlos:
public int MostrarMenu(): muestra un men u con opciones al usuario, y retorna la opci
on elegida.
No realiza ninguna acci
on asociada; solamente retorna el n
umero de la opci
on indicada por el usuario.
Las opciones que presenta son:
(1) Cargar diccionario: retorna 1.
(2) Traducir archivo: retorna 2.
(3) Guardar archivo traducido: retorna 3.
(4) Salir: retorna 4.
public void AvisarNoEncontrada(String palabra): muestra un mensaje avisando que una palabra
no se tradujo pues no se encontr
o en el diccionario.
public String PedirNombreArchivo(): pide un nombre de archivo al usuario, y lo retorna.
Clase Traductor: la siguiente clase debe ser implementada por usted. Esta clase es la encargada de traducir
el contenido de un archivo en base a un diccionario, y guardarlo. Puede tener todos los atributos y metodos
privados que usted considere necesarios. Debe tener los siguientes metodos p
ublicos:
Clase Principal: el metodo main de esta clase debe ser implementado por usted. Debe consistir en el
funcionamiento principal del programa, que debe realizar las siguientes funciones:
public class D i c c i o n a r i o {
// A t r i b u t o s
private String [] palabras ;
private String [] t r a d u c c i o n e s;
private int c a n t P a l a b r a s;
/* * C o n s t r u c t o r
* @cantMax la cantidad maxima de palabras que soporta */
public D i c c i o n a r i o( int cantMax ) {
palabras = new String [ cantMax ];
t r a d u c c i o n e s = new String [ cantMax ];
c a n t P a l a b r a s = 0;
}
import i i c 1 1 0 3 P a c k a g e .*;
public class I n t e r f a z U s u a r i o {
/* * Muestra un menu de opciones , y retorna la opcion elegida
* @return un numero con la opcion elegida */
public int M o s t r a r M e n u() {
int opcion ;
do {
opcion = Usuario . entero (" Elija una opcion :\ n (1) Cargar d i c c i o n a r i o \ n " +
" (2) Traducir archivo \ n (3) Guardar archivo t r a d u c i d o \ n (4) Salir " );
} while ( opcion < 1 || opcion > 73);
return opcion ;
}
/* * Muestra el c o n t e n i d o de un d i c c i o n a r i o
* @param dic el d i c c i o n a r i o */
public void M o s t r a r D i c c i o n a r i o( D i c c i o n a r i o dic ) {
String mensaje = " D i c c i o n a r i o cargado y ordenado . C o n t e n i d o:\ n " ;
for ( int i = 0; i < dic . g e t C a n t P a l a b r a s (); i ++) {
mensaje += " \ n " + ( i + 1) + " ) " + dic . g e t P a l a b r a( i ) + " - "
+ dic . traducir ( dic . g e t P a l a b r a( i ));
}
Usuario . mensaje ( mensaje );
}
}
Criterios de soluci
on
Posible soluci
on
public class T r a d u c t o r {
/* * Carga las palabras de los archivos para hacer un d i c c i o n a r i o
* @param a r c h i v o E s p a n o l El nombre del archivo en espanol
* @param a r c h i v o I n g l e s El nombre del archivo en ingles
* @return un objeto Diccionario , o null si no existia el archivo */
public D i c c i o n a r i o c a r g a r P a l a b r a s( String archivoEspanol ,
String archivoIngles , int c a n t M a x i m a) throws I O E x c e p t i o n {
// Abrimos archivo y r e v i s a m o s si existe
File a r c h i v o E s p = new File ( a r c h i v o E s p a n o l);
// Creamos d i c c i o n a r i o
D i c c i o n a r i o dic = new D i c c i o n a r i o( c a n t M a x i m a);
// Cerramos archivos
b L e c t o r E s p. close ();
b L e c t o r I n g. close ();
return dic ;
} else {
return null ;
}
}
/* * Ordena un d i c c i o n a r i o a l f a b e t i c a m e n t e
* @param dic el d i c c i o n a r i o
* @return el d i c c i o n a r i o ordenado */
public D i c c i o n a r i o o r d e n a r D i c c i o n a r i o( D i c c i o n a r i o dic ) {
// Usamos s e l e c t i o n sort para el orden
for ( int i = 0; i < dic . g e t C a n t P a l a b r a s (); i ++) {
int min = i ;
for ( int j = i + 1; j < dic . g e t C a n t P a l a b r a s (); j ++) {
if ( dic . g e t P a l a b r a( j ). c o m p a r e T o( dic . g e t P a l a b r a( min )) < 0) {
min = j ;
}
}
// Hacemos swap
dic . s w a p P a l a b r a s(i , min );
}
return dic ;
}
// Cerramos archivos
bLector . close ();
return texto ;
} else {
return null ;
}
}
/* * Traduce un texto
* @param texto el texto a traducir
* @param d i c c i o n a r i o el d i c c i o n a r i o
* @return el texto t r a d u c i d o */
public String traducir ( String texto , D i c c i o n a r i o dic , I n t e r f a z U s u a r i o GUI ) {
String t r a d u c i d o = " " ;
// Vamos armando c o r r e g i d o
t r a d u c i d o += t r a d u c i d a + " " ;
// A v a n z a m o s
inicio += a T r a d u c i r. length () + 1;
a T r a d u c i r = dic . g e t P a l a b r a E n T e x t o( texto , inicio );
}
/* * Guarda el archivo t r a d u c i d o
* @param t e x t o T r a d u c i d o el texto t r a d u c i d o
* @param a r c h i v o S a l i d a el nombre del archivo donde guardar el texto t r a d u c i d o
* @throws I O E x c e p t i o n */
public void g u a r d a r T r a d u c i d o( String textoTraducido , String a r c h i v o S a l i d a)
throws I O E x c e p t i o n {
// Abrimos archivo a escribir
File archivo = new File ( a r c h i v o S a l i d a);
F i l e W r i t e r escritor = new F i l e W r i t e r( archivo );
P r i n t W r i t e r p E s c r i t o r = new P r i n t W r i t e r( escritor );
// Escribe texto
p E s c r i t o r. write ( t e x t o T r a d u c i d o);
p E s c r i t o r. close ();
escritor . close ();
}
}
import i i c 1 1 0 3 P a c k a g e .*;
import java . io .*;
public class P r i n c i p a l {
// Main del programa
public static void main ( String [] args ) throws I O E x c e p t i o n {
// V a r i a b l e s internas
I n t e r f a z U s u a r i o GUI = new I n t e r f a z U s u a r i o ();
T r a d u c t o r traduce = new T r a d u c t o r();
String t r a d u c i d o = null ;
D i c c i o n a r i o dic = null ;
// Ciclo p r i n c i p a l
boolean salir = false ;
while (! salir ) {
int opcion = GUI . M o s t r a r M e n u();
switch ( opcion ) {
case 1: // Cargar d i c c i o n a r i o
dic = traduce . c a r g a r P a l a b r a s( " espanol . txt " , " ingles . txt " , 100);
dic = traduce . o r d e n a r D i c c i o n a r i o( dic );
if ( dic != null ) {
GUI . M o s t r a r D i c c i o n a r i o( dic );
} else {
Usuario . mensaje ( " Archivos de d i c c i o n a r i o no e x i s t e n t e s" );
}
break ;
case 2: // Traducir archivo
if ( dic != null ) {
String a r c h i v o A T r a d u c i r = GUI . P e d i r N o m b r e A r c h i v o();
String c o n t e n i d o = traduce . g e t C o n t e n i d o( a r c h i v o A T r a d u c i r);
if ( c o n t e n i d o != null ) {
t r a d u c i d o = traduce . traducir ( contenido , dic , GUI );
Usuario . mensaje ( " Texto t r a d u c i d o" );
} else {
Usuario . mensaje ( " Archivo a traducir no e x i s t e n t e" );