Posteado por: albalba | Marzo 4, 2008

PRÁCTICA 2!

HOLA!Hemos vuelto!!si, si, temblaaaaaaaaaaaaaaad!El viernes 29 de febrero nos presentamos a la segunda práctica de oca, más puntuales que en la primera, por cierto, llegamos a clase esperando a ver que nos deparará el futuro…El profesor, Alberto, comenzó la clase explicando detalles de la primera práctica que muchos compañeros no entendían (no son palabras textuales, sólo tomamos anotaciones de lo que el profesor dice en clase, así que puede haber algún tipo de error en algún momento, por favor, pensad que somos humanos. De cualquier forma evitaremos cometer alguno; GRACIAS! XD), entonces, explicó que las excepciones, las cuales no quedaron a la mayoría de la clase muy claras, sirven para corregir errores, y hay que detectarlas mirando si el programa hace lo que queremos o no. Y no confundir con las acepciones, las cuales son predicados que se resuelven con verdadero o falso, si no es cierto que deje de hacer lo que haga.Hay que pensar siempre que un programa no se hace para el ordenador, sino para la persona que lea nuestro código en el futuro, por ello siempre hay que dejarlo todo muy claro y evitar excepciones.Acto seguido nos puso un ejemplo, que resolvimos entre todos, el cual era una crear una tabla, y se nos piden dos métodos: anchoColumna(nColumna) y esPar(fila). Así que todos empezamos a pensar. El anchoColumna medía el ancho de las columnas, y esPar decía si el número de filas era par o no. Alberto nos comentó que lo mejor es saber primero que devuelve el método, ya que la “chicha” se encuentra en rellenar su código. Una verdad como un templo. En el primero, por deducción, podía ser un entero y en el segundo, devolver un boolean. Así empezamos a rellenar el código.Después un compañero dijo que para el anchoColumna también sería necesario saber el ancho de la página, y el chaval tenía razón, no puedes hacer una tabla más grande que la hoja. Entonces el profesor añadió un nuevo parámetro al método: anchoPagina.anchoColumna quedó en la pizarra como: 

anchoColumna(nColumna,anchoPagina){       return(anchoPagina/nColumna);}

 Solución a la que mi compañero y yo no le vimos mucho sentido, pero bueno, ahí se quedo.Continuamos con el esPar: 

esPar(fila){    if (fila%2==0) return true;    else return false;} 

  Después miramos que tipo de problemas podía dar el código. En el primero si dabamos como valores a nColumna=20 ,anchoPagina=10, el método devolvería el valor ½, pero ¿y si nColumna=0 ,anchoPagina=5?, en tal caso la hemos pifiado porque nos saldría infinito y el programilla se vuelve loco. SALE UNA EXCEPCIÓN!! Con lo cual habría que hacer algo en el código para evitar que nColumna=0.Para ver mejor todo Alberto aconsejó que imprimiéramos por pantalla el nColumnas y el anchoPagina para ver si alguno es 0 y ver si por los valores introducidos vienen o no los problemas.Analizamos ahora el esPar. Si la fila=5 devolvería false, si fila=4 devolvería true, hasta aquí bien pero ¿qué pasa si metemos números negativos? Si fila=-3, devuelve false; pero si fila=-4 ¡¡DEVOLVERÍA TRUE!! Porque -4 es un número par al fin y al cabo. Debemos controlar este error poniendo en el código como condición que fila>0. Después Alberto puntualizó que en el anchoColumna no se debería retornar ningún valor, porque ninguno es válido, no habría que salir con un return. Para salir de un método al que no queremos retornar nada, colocamos un System.exit(), no es lo adecuado pero sirve. La manera que no es adecuada para salir del programa es que salten excepciones. No olvidar nunca que una excepción es un objeto y un mensaje en el que se transmite los errores. Si salta una excepción, hay que volver al que estaba manejando donde se produce el error, no al return.Como ejemplo de esta explicación volvió al anchoColumna. El programa tiene que decir cuando introduzcas el nColumna=0, que ese valor no vale y se introduzca otro. Entonces se vuelve a hacer el método pero con el nuevo valor. Lo mejor es controlar las excepciones mejor que retornar valores. Por eso es muy importante capturar las excepciones, además la mayoría de los métodos del API lanzan excepciones y hay que controlarlos. Tras finalizar esta explicación tan constructiva nos pusimos manos a la obra.  

En el EJERCICIO 1 pedían crear un directorio temporal en el que fuésemos a realizar las prácticas. Por ejemplo: C:>mkdir C:\TEMP\TSIOCA. Nosotros pusimos el comando tal cual y dentro de la carpeta TEMP, se nos creó otra carpeta llamada TSIOCA. A continuación añadimos el path de este directorio temporal creado en la variable CLASSPATH utilizando la siguiente línea de comando: C:\set CLASSPATH=C:\TEMP\TSIOCA;%CLASSPATH%. Comprobamos que podíamos utilizar los ejecutables java y javac desde esta ventana, ya que la anterior línea de comandos aplica el classpath sobre esa carpeta. Esto no tiene nada que ver con el API, el cual estuvimos mirando y es ya muy conocido para nosotros.

Encontramos la clase Math sin ningún tipo de problema. Preguntaban qué métodos de la clase Math necesitas utilizar si se quiere realizar un programa que realice el cálculo de una ecuación de segundo grado. Aunque no lo pedían, nosotros muy “apañaos”, hicimos un programa que resolviese ecuaciones de segundo grado de la forma Ax2+Bx+C=0 (nota: resuelve todas menos los complejos):

ÏÏÏimport java.io.*;
ÏÕÖ×public class EcSegGrado
Ïϧ{
ÏϧÏÞßàpublic static void main(String []args)
ÏϧÏϧ{
ÏϧÏϨ¹íÏBufferedReader br;
ÏϧÏϨ¹¹´try
ÏϧÏϧÏϧ{
ÏϧÏϧÏϨ¹¹Ïbr=new BufferedReader(new InputStreamReader(System.in));
ÏϧÏϧÏϨ¹íÏString ln;
ÏϧÏϧÏϨ¹íÏint a,b,c;
ÏϧÏϧÏϨ¹¹ÏSystem.out.println(“Introducir a”);
ÏϧÏϧÏϨ¹¹Ïln=br.readLine();
ÏϧÏϧÏϨ¹¹Ïa=Integer.parseInt(ln);
ÏϧÏϧÏϨ¹¹ÏSystem.out.println(“Introducir b”);
ÏϧÏϧÏϨ¹¹Ïln=br.readLine();
ÏϧÏϧÏϨ¹¹Ïb=Integer.parseInt(ln);
ÏϧÏϧÏϨ¹¹ÏSystem.out.println(“Introducir c”);
ÏϧÏϧÏϨ¹¹Ïln=br.readLine();
ÏϧÏϧÏϨ¹¹Ïc=Integer.parseInt(ln);
ÏϧÏϧÏϨ¹³´if(a==0)
ÏϧÏϧÏϧÏ6¾¹³¹if(b==0) System.out.println(“Sin solución.”);
ÏϧÏϧÏϧÏ6ÏÏö¹else System.out.println(-c/b);
ÏϧÏϧÏϧÏö´else
ÏϧÏϧÏϧϸ§{
ÏϧÏϧÏϧϸ¨¹íÏint rad=(b*b)-(4*a*c);
ÏϧÏϧÏϧϸ¾¹³¹if(rad<0) System.out.println(“Complejos.”);
ÏϧÏϧÏϧϸÏÏö´else
ÏϧÏϧÏϧϸÏϸ§{
ÏϧÏϧÏϧϸÏϸ¨¹íÏdouble x1=(-b+Math.sqrt(rad))/(2*a);
ÏϧÏϧÏϧϸÏϸ¨¹íÏdouble x2=(-b-Math.sqrt(rad))/(2*a);
ÏϧÏϧÏϧϸÏϸ¾¹¹ÏSystem.out.println(“x1= “+x1+” x2= “+x2);
ÏϧÏϧÏϧϸÏÏÈÏ}
ÏϧÏϧÏϧÏÈÏ}
ÏϧÏϧÏϧ}
ÏϧÏϧÏϧÏðîìcatch(IOException e)
ÏϧÏϧÏϧÏϧ{
ÏϧÏϧÏϧÏϨ¹¹ÏSystem.out.print(“error”+e);
ÏϧÏϧÏÏ©ÏÏ©}
ÏϧÏϧ 
ÏϧÏÏ©}
ÏÏ©}  

  Este programa, el cual hemos probado, funciona bien.

En definitiva, que tan solo hemos usado el método sqrt() de la clase Math, que sirve para realizar la raíz cuadrada. En el API queda mejor definido de la siguiente manera: 

sqrtpublic static double sqrt(double a)

Returns the correctly rounded positive square root of a double value. Special cases:

  • If the argument is NaN or less than zero, then the result is NaN.
  • If the argument is positive infinity, then the result is positive infinity.
  • If the argument is positive zero or negative zero, then the result is the same as the argument.

Otherwise, the result is the double value closest to the true mathematical square root of the argument value. Parameters: a – a value. Returns: the positive square root of a. If the argument is NaN or less than zero, the result is NaN. 

  Lo siguiente por lo que nos preguntan es si existe algún método que permita generar valores aleatorios y que escribamos un pequeño programa que imprima en pantalla un valor aleatorio.

Nosotros sabemos de otras experiencias “programables” que el método random() de la clase Math devuelve números aleatorios entre el 0.0 y 1.0, descrito en el API así:

randompublic static double random()Returns a double value with a positive sign, greater than or equal to 0.0 and less than 1.0. Returned values are chosen pseudorandomly with (approximately) uniform distribution from that range. When this method is first called, it creates a single new pseudorandom-number generator, exactly as if by the expression new java.util.RandomThis new pseudorandom-number generator is used thereafter for all calls to this method and is used nowhere else. This method is properly synchronized to allow correct use by more than one thread. However, if many threads need to generate pseudorandom numbers at a great rate, it may reduce contention for each thread to have its own pseudorandom-number generator. Returns: a pseudorandom double greater than or equal to 0.0 and less than 1.0.

See Also:

Random.nextDouble()

Una pequeña muestra de lo que hace este método se puede ver en este sencillísimo programilla, porque no se le puede ni llamar programa, que hemos hecho:

ÏÕÖ×public class Aleatorio
Ïϧ{
ÏϧÏÞßàpublic static void main(String []args)
ÏϧÏϧ{
ÏϧÏϨ¹íÏdouble x=Math.random();
ÏϧÏϨ¹íÏdouble y=x*10;
ÏϧÏϨ¹íÏdouble z=y+3;
ÏϧÏϨ¹¹ÏSystem.out.println(“Un número aleatorio es: “+x);
ÏϧÏϨ¹¹ÏSystem.out.println(“El número aleatorio multiplicado por 10 es: “+y);
ÏϧÏϨ¹¹ÏSystem.out.println(“El número aleatorio multiplicado por 10 y                             sumándole 3 es: “+z);
ÏϧÏÏ©}
ÏÏ©}  

Apareciéndonos por pantalla el siguiente número aleatorio:

aleatorio.jpg

    Pues bien, seguimos con el EJERCICIO 2, como siempre, tras leer, miramos el código para ver si lo entendíamos y, si es muy sencillo, pero se nos pasó algo por alto.

 if (x<0) {  System.out.println(“Error: valor negativo de x”);  System.exit(1);} 

De la anterior práctica sabíamos que exit() salía del programa, hasta que caímos ¿por qué a veces es exit(0) y otras exitr(1)? Alberto lo explicó para toda la clase ya que no fuimos los únicos a los que nos pasó tal desliz. Exit() es un método para que el programa termine exitosamente o con un fallo, lo cual se indica pasándole como parámetro un 0 ó un 1 respectivamente. Ésto es uno de esos convenios no escritos pero que todo el mundo sabe, como lo de no ligarse a la novia de tu mejor amigo. En el API esta convención no viene explicada. En los sistemas operativos como Windows se sigue ésta, mientras que en Linux, por ejemplo, es distinta.

En el API el método exit() viene definido:

exitpublic static void exit(int status)Terminates the currently running Java Virtual Machine. The argument serves as a status code; by convention, a nonzero status code indicates abnormal termination. This method calls the exit method in class Runtime. This method never returns normally. The call System.exit(n) is effectively equivalent to the call:  Runtime.getRuntime().exit(n) Parameters: status – exit status. Throws: SecurityException – if a security manager exists and its checkExit method doesn’t allow exit with the specified status. See Also: Runtime.exit(int) 

Nos dijo que era importante que entendiésemos el funcionamiento de exit() y System.err ya que iban a aparecer mucho.

 

A continuación nos piden compilar el código de ErrorDivision y ejecutarlo.

ÏÕÖ×public class ErrorDivision {
ÏϧÏÞßàpublic static void main(String[] args) {
ÏϧÏϨ¹íÏboolean continuar=true;
ÏϧÏϨ¹íÏint a=3;
ÏϧÏϨ¹íÏint b=3;
ÏϧÏϨ¹íÏint c=4;
ÏϧÏϨ¹íÏint d=0;
ÏϧÏϨ¹¹ÏSystem.err.println(“Empezando la depuración”);
ÏϧÏϨ¹¹Ïa+=b;
ÏϧÏϨ¹¹ÏSystem.err.println(“Vamos a ver si el programa divide bien”);
ÏϧÏϨ¹¹Ïb+=c/d;
ÏϧÏϨ¹¹ÏSystem.err.println(“El programa funciona bien”);
ÏϧÏÏ©}
ÏÏ©}

 

Nos preguntan: ¿Ha compilado correctamente?

Si, compila correctamente, pero en principio lo hicimos mal porque pusimos javac ErrorDivision.java ¡¡SIN TILDE!! Como unos verdaderos paletos, hasta que nos dimos cuenta de nuestro error y al poner la maravillosa tilde, todo compiló y funcionó.

Después lo ejecutamos, pero nos saltó un error.

errordivision.jpg

  Y es lógico si tenemos en cuenta que al dividir por cero cualquier número el resultado es infinito. Pero ¿en qué parte del código ha finalizado?, pues finaliza en la línea en la que se produce el error, es decir, en la operación b+=c/d.

  Buscamos información sobre la excepción que se ha producido en el API.

java.lang
Class ArithmeticException
java.lang.Object  java.lang.Throwable      java.lang.Exception          java.lang.RuntimeException              java.lang.ArithmeticException All Implemented Interfaces: Serializable  public class ArithmeticException extends RuntimeExceptionThrown when an exceptional arithmetic condition has occurred. For example, an integer “divide by zero” throws an instance of this class. Since: JDK1.0 See Also: Serialized Form 

Añadimos una aserción al código de forma que no se produjese de nuevo el error anteriormente descrito. Con tan solo cambiar el valor inicial de d a cualquier otro que no sea 0, no se producirá más el error, pero como nos piden una aserción, lo mejor sería poner if(d!=0):

 ÏÕÖ×public class ErrorDivisión2 {
ÏϧÏÞßàpublic static void main(String[] args) {
ÏϧÏϨ¹íÏboolean continuar=true;
ÏϧÏϨ¹íÏint a=3;
ÏϧÏϨ¹íÏint b=3;
ÏϧÏϨ¹íÏint c=4;
ÏϧÏϨ¹íÏint d=1;
ÏϧÏϨ¹¹ÏSystem.err.println(“Empezando la depuración”);
ÏϧÏϨ¹¹Ïa+=b;
ÏϧÏϨ¹¹ÏSystem.err.println(“Vamos a ver si el programa divide bien”);
ÏϧÏϨ¹³´if(d!=0)
ÏϧÏϧ϶¾¹¹Ïb+=c/d;
ÏϧÏϨ¹¹ÏSystem.err.println(“El programa funciona bien”);
ÏϧÏÏ©}
ÏÏ©} 

Probamos compilándolo que de la manera que pensamos no saltase ni la excepción anterior ni ninguna más.

errordivision2.jpg

 Continuamos creando una clase LogTrace que facilitase la inclusión y eliminación automática de aserciones y trazas de depuración para cualquier programa, disponiendo de los métodos: assertion(boolean condicion, String mensaje). Este método dependiendo de lo que fuese el parámetro de tipo boolean, presentaba una u otra cosa, en el caso de que sea un true presentaba el mensaje de que el programa ha ido correctamente, o de lo contrario, un mensaje indicando que ha ocurrido un error y finaliza la ejecución de la aplicación. El otro método a rellenar era log(String mensaje). Este método simplemente imprime por pantalla el String que se le pase como parámetro. Así quedó el código de nuestra clase LogTrace con los métodos, anteriores:

           ÕÖ×public class LogTrace
Ïϧ{
ÏϧÏÞßàpublic static void main(String[] args)
ÏϧÏϧ{
ÏϧÏϨ¹¹Ïlog(“programa incorrecto”);
ÏϧÏϨ¹¹Ïlog(“programa correcto”);
ÏϧÏϧ //assertion(false,”program kill”);
ÏϧÏϨ¹¹Ïassertion(true,“todo ok”);
ÏϧÏϧ
ÏϧÏϧ
ÏϧÏÏ©}
Ïϧ
ÏϧÏÞßàpublic static void assertion(boolean condicion, String mensaje)
ÏϧÏϧ{
ÏϧÏϨ¹³´if(condicion==true)
ÏϧÏϧÏ6§{
ÏϧÏϧÏ6¨¹¹ÏSystem.out.println(mensaje);
ÏϧÏϧÏ6¾¹¹ÏSystem.exit(0);
ÏϧÏϧÏ6Ï}
ÏϧÏϧÏ6Ï
ÏϧÏϧÏö´else
ÏϧÏϧϸ§{
ÏϧÏϧϸ¨¹¹ÏSystem.out.println(mensaje);
ÏϧÏϧϸ¾¹¹ÏSystem.exit(1);
ÏϧÏϧÏÈÏ}
ÏϧÏÏ©}
Ïϧ
Ïϧ
ÏϧÏÞßàpublic static void log(String mensaje)
ÏϧÏϧ{
ÏϧÏϨ¹¹ÏSystem.out.println(mensaje);
ÏϧÏÏ©}
ÏÏ©}

Pues bien, acto seguido con la clase LogTrace añadimos aserciones  a ErrorDivision. Tuvimos que pensar un poco como resolver esto, pero finalmente entre los dos lo sacamos. Los números que utilizamos en ErrorDivision2 son generados por el método random() de la clase Math. Tras compilarlo, ‘el poder’ de la ventana de comandos nos pedía un casting, ya que el método random() devuelve un double y nosotros pusimos a a,b,c y d del tipo int. Después nos comenzó a salir el mensaje “el número es cero” impreso. Al principio dijimos:”cachiiiiiiiiiiis, casualidad la nuestra, que nos sale el cero de un número aleatorio”, PERO NO, siempre salía el cero porque no hay que olvidar que random() devuelve un número aleatorio, si, pero entre 0.0 y 1.0. Por supuesto no íbamos a tener tanta suerte para que nos saliese el 1.0, la gran mayoría devolvería un 0. Por ello, multiplicamos por 10 cada término que lo requería. De esta forma podría salir cualquier número. De modo que el código quedó así:

ÏÕÖ×public class ErrorDivision2
Ïϧ{
ÏϧÏÞßàpublic static void main(String[] args)
ÏϧÏϧ{
ÏϧÏϨ¹íÏLogTrace2 corrige=new LogTrace2();
ÏϧÏϧ
ÏϧÏϨ¹íÏboolean continuar=true;
ÏϧÏϨ¹íÏint a=(int)(Math.random()*10);
ÏϧÏϨ¹íÏint b=(int)(Math.random()*10);
ÏϧÏϨ¹íÏint c=(int)(Math.random()*10);
ÏϧÏϨ¹íÏint d=(int)(Math.random()*10);
ÏϧÏϨ¹¹ÏSystem.err.println(“Empezando la depuración”);
ÏϧÏϨ¹¹Ïa+=b;
ÏϧÏϨ¹¹ÏSystem.err.println(“Vamos a ver si el programa divide bien”);
ÏϧÏϨ¹³´if(d==0)
ÏϧÏϧÏ6§{
ÏϧÏϧÏ6¾¹¹Ïcorrige.assertion(false,“El numero es 0″);
ÏϧÏϧÏ6Ï}
ÏϧÏϧÏö´else
ÏϧÏϧϸ§{
ÏϧÏϧϸ¨¹¹Ïcorrige.assertion(true,“numero valido”);
ÏϧÏϧϸ¾¹¹Ïb+=c/d;
ÏϧÏϧÏÈÏ}
ÏϧÏϨ¹¹ÏSystem.err.println(“El programa funciona bien”);
ÏϧÏÏ©}
ÏÏ©}

Y al ejecutar y compilar esta vez todo fue perfecto J.

errordivision2.jpg

   Cuando llegamos al EJERCICIO 3 Rodri y yo lo flipamos en colorines!! Nos quedamos en un bucle infinito repitiéndonos el uno al otro: “Mi no entender”.

Respecto a comprensión del código nos pareció un salto muy grande la sencillez de lo anterior con lo que se nos presentaba ante la pantalla.

Sobre todo, lo que más nos llamó la atención fue esa maldita línea que decía: len = in.read(buf). Decíamos: “vale, len es un entero que tiene como valor el leer en in…eh?¿qué pinta aquí un array?¿por qué va sin sus monos corchetes?¿leer un fichero mediante un array?¿en todo caso se leerá una línea de fichero?¿no habría que poner la posición del array con el buf? No entendemos esa línea.

Alberto estaba muy ocupado con otros compañeros a los que, como nosotros, la cabeza les daría vueltas por culpa de esa línea. Así que apareció otro profesor, al que, sinceramente, no entendimos mucho aunque el pobre lo intentó. Lo único que más o menos nos quedó claro es que in era un fichero de entrada y out otro de salida. Lo que estaba en in se guardaba en buf[], y de buf[] se copiaba a out, esto se hace así debido a que no se puede copiar de un fichero a otro directamente.

Quizá nadie estaba ya concentrado porque era la hora de acabar con la clase y todo el mundo tenía algo que hacer. Agradecemos tu esfuerzo, otro profesor del que no sabemos tu nombre.

Ejercicio 4 

¿Qué excepción salta cuando accedemos a una posición no especificada en un array? Definid un array de 10 posiciones y tratad de acceder a la posición -1 y a la 10. ¿Se os ocurre alguna forma de controlar este problema?

Cuando hacemos referencia a una posición de un array y nos salimos de la dimension del array nos da la siguiente excepcion:

ArrayIndexOutOfBoundsException, esto quiere decir que el índice con el que accedemos a las distintas posiciones no puede acceder.

¿Qué sucede si hacemos uso de una referencia que está puesta a null? Prueba el siguiente código:        


public class NullError {
    public static void main(String[] args) {
     String str=new String();
        str=null;
        str.length();
   }
}

Cuando hacemos una referencia a null nos da siempre la exceptcion NullPointerException.

Controla todas las excepciones que se pueden producir en el siguiente código:


public class ExcepciónApp {
    public static void main(String[] args) {
        String str1="20";
     String str2="0";
        String respuesta;
     int numerador, denominador, cociente;
        try{
            numerador=Integer.parseInt(str1);
            denominador=Integer.parseInt(str2);
            cociente=numerador/denominador;
            respuesta=String.valueOf(cociente);
        }catch(...){
        }
        System.out.println(respuesta);
    }
}

Para controlar las excepciones tenemos que poner el siguiente codigo.

  

ÏÕÖ×class ExcepciónApp
Ïϧ{
ÏϧÏÞßàpublic static void main(String[] args)
ÏϧÏϧ{
ÏϧÏϨ¹íÏString str1 = “20″;
ÏϧÏϨ¹íÏString str2 = “0″;
ÏϧÏϨ¹íÏString respuesta;
ÏϧÏϨ¹íÏint numerador, denominador, cociente;
ÏϧÏϨ¹¹´try
ÏϧÏϧÏϧ{
ÏϧÏϧÏϨ¹¹Ïnumerador = Integer.parseInt(str1);
ÏϧÏϧÏϨ¹¹Ïdenominador = Integer.parseInt(str2);
ÏϧÏϧÏϨ¹¹Ïcociente = numerador / denominador;
ÏϧÏϧÏϨ¹¹Ïrespuesta = String.valueOf(cociente);
ÏϧÏϧÏϧ}
ÏϧÏϧÏϧÏðîìcatch (IOException e) //por si se produce un error durante la ejecución
ÏϧÏϧÏϧÏϧ{
ÏϧÏϧÏϧÏϨ¹¹ÏSystem.err();
ÏϧÏϧÏϧÏÏ©}
ÏϧÏϧÏϧÏðîìcatch (NumberFormatException e) //por si hay el dato recogido no es un número
ÏϧÏϧÏϧÏϧ{
ÏϧÏϧÏϧÏϨ¹¹ÏSystem.err();
ÏϧÏϧÏÏ©ÏÏ©}
ÏϧÏϨ¹¹ÏSystem.out.println(respuesta);
ÏϧÏÏ©}
ÏÏ©}

Ponemos el IOException por si hay algún error al ejecutar, y ponemos el NumberFormatException por si el dato que recogemos desde le teclado no es un numero.

 Ejercicio 5

Nos piden que implementemos el juego del ahorcado, dándonos las siguientes condiciones.

“El juego de El ahorcado que queremos debe interactuar con el usuario únicamente por medio del teclado y la pantalla del ordenador en modo texto. Antes de comenzar el juego, se escogerá una palabra secreta obtenida de un fichero de texto cuya longitud en caracteres debe ser superior a 1, y se le indicarán al usuario el número de letras de que se compone dicha palabra. El usuario entonces podrá realizar preguntas sobre posibles subcadenas de la palabra secreta, cada una de las cuales le penalizará en una oportunidad de las 6 disponibles. En caso de que la consulta este contenida dentro de la palabra secreta, la aplicación debe mostrar la posición en que se encuentra. El máximo tamaño de una consulta que puede realizar el usuario debe ser igual a la longitud de la palabra secreta, con lo que debe indicársele al usuario cuando ha incumplido esta condición. Igualmente tampoco podrá realizar una consulta de una palabra vacía (“”). En caso de que el juego termine, debe indicarle el resultado al usuario y, tras solicitarle si desea volver a jugar, realizar otro juego en caso afirmativo. También mencionar que el número de oportunidades posibles es de 6 intentos.” 

Como vamos un poco atrasados con los ejercicios simplemente vamos a colgar el código, si alguien tiene una duda que nos lo diga. 

ÏÏimport java.io.*;ÏÕÖ×public class DatosJugador
Ïϧ{
ÏϧÏíÏprivate String nombre=“”;
ÏϧÏíÏprivate String apellidos=“”;
Ïϧ
ÏϧÏÞßàpublic void ponNombre(String nombre)
ÏϧÏϧ{
ÏϧÏϨ¹¹Ïthis.nombre=nombre;
ÏϧÏÏ©}
Ïϧ
ÏϧÏÞßàpublic String getNombre()
ÏϧÏϧ{
Ïϧ¹Ĺ¹Ïreturn nombre;
ÏϧÏÏ©}
Ïϧ
ÏϧÏÞßàpublic String getApellido()
ÏϧÏϧ{
Ïϧ¹Ĺ¹Ïreturn apellidos;
ÏϧÏÏ©}
ÏϧÏÞßàpublic void ponApellidos(String apellidos)
ÏϧÏϧ{
ÏϧÏϨ¹¹Ïthis.apellidos=apellidos;
ÏϧÏÏ©}
Ïϧ
ÏϧÏÞßàpublic void printEstado()
ÏϧÏϧ{
ÏϧÏϨ¹¹ÏSystem.out.println(“\n\nTe llamas: “+nombre+” “+apellidos);
ÏϧÏÏ©}
Ïϧ
Ïϧ // Lee una línea de texto introducida desde el teclado
Ïϧ //
Ïϧ // Entrada: No posee
Ïϧ // Salida: Línea de texto leída
ÏϧÏÞßàpublic String pedirEntrada(String mensaje)
ÏϧÏϧ{
ÏϧÏϨ¹íÏBufferedReader in = new BufferedReader(new InputStreamReader(System.in));
ÏϧÏϨ¹íÏString entrada=null;
ÏϧÏϧ
ÏϧÏϨ¹¹´try
ÏϧÏϧÏϧ{
ÏϧÏϧÏϧ// Con este bucle, nos aseguramos de que hemos recibido alguna entrada
ÏϧÏϧÏϧ// a través del teclado
ÏϧÏϧÏϨ¹¹±while ((entrada==null)||(!(entrada.length()>0))) {
ÏϧÏϧÏϧÏÏ7¹¹ÏSystem.out.print(mensaje);
ÏϧÏϧÏϧÏÏ5
ÏϧÏϧÏϧÏÏ5// Lee una línea de texto introducida por el teclado
ÏϧÏϧÏϧÏÏ7¹¹Ïentrada=in.readLine();
ÏϧÏϧÏϧÏϰ}
ÏϧÏϧÏϧ}
ÏϧÏϧÏϧÏðîìcatch (java.io.IOException ioe)
ÏϧÏϧÏϧÏϧ{
ÏϧÏϧÏϧÏϨ¹¹ÏSystem.err.println(“Error al leer entrada desde el teclado”);
ÏϧÏϧÏϧÏϨ¹¹Ïentrada=null;
ÏϧÏϧÏÏ©ÏÏ©}
Ïϧ¹Ĺ¹Ïreturn(entrada);
ÏϧÏÏ©}
Ïϧ
ÏÏ©}

Ïimport java.io.*;/**
*La clase FicheroLectura, lee desde un fichero
*o desde un array de String interno una serie de palabras
*@author Alba & ROdrigo
*@version 1.0
*/
ÏÕÖ×public class FicheroLectura
Ïϧ{
ÏϧÏíÏprivate File lectura;
ÏϧÏíÏString direccion;
ÏϧÏíÏprivate String[] palabras;
Ïϧ
Ïϧ
Ïϧ/**
Ïϧ*Direccion del fichero
Ïϧ*@param String nueva
Ïϧ*@see java.lang.String
Ïϧ*/
ÏϧÏÞßàpublic FicheroLectura(String nueva)
ÏϧÏϧ{
ÏϧÏϧ
ÏϧÏϨ¹¹Ïdireccion=“C:/”+nueva+“.txt”;
ÏϧÏϨ¹¹ÏLectura();
ÏϧÏÏ©}
Ïϧ
Ïϧ /**
Ïϧ *Si creamos un objeto sin argumentos utilizamos una diccionario interno
Ïϧ */
ÏϧÏÞßàpublic FicheroLectura()
ÏϧÏϧ{
ÏϧÏϨ¹íÏString[] conjunto={“mariposa”,
ÏϧÏϧÏÏÏÏÏÏÏÏÏ“laguna”,
ÏϧÏϧÏÏÏÏÏÏÏÏÏ“reverberante”,
ÏϧÏϧÏÏÏÏÏÏÏÏÏ“almohada”,
ÏϧÏϧÏÏÏÏÏÏÏÏÏ“barroco”,
ÏϧÏϧÏÏÏÏÏÏÏÏÏ“cascada”,
ÏϧÏϧÏÏÏÏÏÏÏÏÏ“albores”,
ÏϧÏϧÏÏÏÏÏÏÏÏÏ“girasol”,
ÏϧÏϧÏÏÏÏÏÏÏÏÏ“nogal”,
ÏϧÏϧÏÏÏÏÏÏÏÏÏ“salamandra”,
ÏϧÏϧÏÏÏÏÏÏÏÏÏ“sombrío”,
ÏϧÏϧÏÏÏÏÏÏÏÏÏ“claustro”,
ÏϧÏϧÏÏÏÏÏÏÏÏÏ“anzuelo”,
ÏϧÏϧÏÏÏÏÏÏÏÏÏ“carabina”,
ÏϧÏϧÏÏÏÏÏÏÏÏÏ“franco”,
ÏϧÏϧÏÏÏÏÏÏÏÏÏ“cariz”,
ÏϧÏϧÏÏÏÏÏÏÏÏÏ“mandarina”,
ÏϧÏϧÏÏÏÏÏÏÏÏÏ“serenidad”,
ÏϧÏϧÏÏÏÏÏÏÏÏÏ“almohada”,
ÏϧÏϧÏÏÏÏÏÏÏÏÏ“clarinete”,
ÏϧÏϧÏÏÏÏÏÏÏÏÏ“sonrisa”,
ÏϧÏϧÏÏÏÏÏÏÏÏÏ“fascinante”,
ÏϧÏϧÏÏÏÏÏÏÏÏÏ“atardecer”,
ÏϧÏϧÏÏÏÏÏÏÏÏÏ“letanía”,
ÏϧÏϧÏÏÏÏÏÏÏÏÏ“caballería”,
ÏϧÏϧÏÏÏÏÏÏÏÏÏ“andaluz”,
ÏϧÏϧÏÏÏÏÏÏÏÏÏ“pergamino”,
ÏϧÏϧÏÏÏÏÏÏÏÏÏ“alevosía”,
ÏϧÏϧÏÏÏÏÏÏÏÏÏ“sugestivo”,
ÏϧÏϧÏÏÏÏÏÏÏÏÏ“seductor”,
ÏϧÏϧÏÏÏÏÏÏÏÏÏ“chocolate”,
ÏϧÏϧÏÏÏÏÏÏÏÏÏ“tempestad”,
ÏϧÏϧÏÏÏÏÏÏÏÏÏ“milagro”,
ÏϧÏϧÏÏÏÏÏÏÏÏÏ“desnuda”,
ÏϧÏϧÏÏÏÏÏÏÏÏÏ“sutil”,
ÏϧÏϧÏÏÏÏÏÏÏÏÏ“cielo”,
ÏϧÏϧÏÏÏÏÏÏÏÏÏ“caracolear”,
ÏϧÏϧÏÏÏÏÏÏÏÏÏ“espacio”,
ÏϧÏϧÏÏÏÏÏÏÏÏÏ“plural”,
ÏϧÏϧÏÏÏÏÏÏÏÏÏ“boreal”,
ÏϧÏϧÏÏÏÏÏÏÏÏÏ“placer”,
ÏϧÏϧÏÏÏÏÏÏÏÏÏ“ilógico”,
ÏϧÏϧÏÏÏÏÏÏÏÏÏ“desinhibidor”,
ÏϧÏϧÏÏÏÏÏÏÏÏÏ“libido”,
ÏϧÏϧÏÏÏÏÏÏÏÏÏ“obviamente”,
ÏϧÏϧÏÏÏÏÏÏÏÏÏ“ende”,
ÏϧÏϧÏÏÏÏÏÏÏÏÏ“naturalmente”,
ÏϧÏϧÏÏÏÏÏÏÏÏÏ“constipado”,
ÏϧÏϧÏÏÏÏÏÏÏÏÏ“postura”,
ÏϧÏϧÏÏÏÏÏÏÏÏÏ“pulcro”,
ÏϧÏϧÏÏÏÏÏÏÏÏÏ“sensatez”};
ÏϧÏϧ
ÏϧÏϨ¹¹Ïpalabras=conjunto;
ÏϧÏÏ©}
Ïϧ
Ïϧ
Ïϧ/**
Ïϧ*Con este método leemos el fichero
Ïϧ*@exception IOException
Ïϧ*@exception NullPointerException
Ïϧ*/
Ïϧ
ÏϧÏÞßàpublic void Lectura()
ÏϧÏϧ{
ÏϧÏϧ
ÏϧÏϨ¹¹ÏCreaFichero();
ÏϧÏϧ
ÏϧÏϨ¹¹´try
ÏϧÏϧÏϧ{
ÏϧÏϧÏϧ
ÏϧÏϧÏϨ¹íÏint i=0;
ÏϧÏϧÏϨ¹¹Ïpalabras=new String[50];
ÏϧÏϧÏϨ¹íÏBufferedReader lectura=new BufferedReader(new FileReader(direccion));
ÏϧÏϧÏϨ¹¹®do
ÏϧÏϧÏϧÏÏ5{
ÏϧÏϧÏϧÏÏ7¹¹Ïpalabras[i]=lectura.readLine();
ÏϧÏϧÏϧÏÏ7¹¹Ïi++;
ÏϧÏϧÏϧÏÏ5
ÏϧÏϧÏϧÏÏ5
ÏϧÏϧÏϧÏÏò}while(i<palabras.length-1);
ÏϧÏϧÏϧ
ÏϧÏϧÏϧ
ÏϧÏϧÏϧ}
ÏϧÏϧÏϧ
ÏϧÏϧÏϧÏðîìcatch(IOException e)
ÏϧÏϧÏϧÏϧ{
ÏϧÏϧÏϧÏϨ¹¹ÏSystem.out.println(“Error en el fichero”);
ÏϧÏϧÏϧÏÏ©}
ÏϧÏϧÏϧ
ÏϧÏϧÏϧÏðîìcatch(NullPointerException e)
ÏϧÏϧÏϧÏϧ{
ÏϧÏϧÏϧÏϨ¹¹ÏSystem.out.println(“Fichero vacio, no hay datos a leer”);
ÏϧÏϧÏÏ©ÏÏ©}
ÏϧÏϧ
ÏϧÏÏ©}
Ïϧ
Ïϧ
Ïϧ/**
Ïϧ*Con este método verificamos que el fichero existe
Ïϧ*en el caso de que no exista saldremos del programa
Ïϧ*@see System.exit();
Ïϧ*/
Ïϧ
ÏϧÏÞßàpublic void CreaFichero()
ÏϧÏϧ{
ÏϧÏϨ¹¹Ïlectura=new File(direccion);
ÏϧÏϨ¹³´if(lectura.exists()!=true)
ÏϧÏϧÏ6§{
ÏϧÏϧÏ6¨¹¹ÏSystem.out.println(“\n—–El fichero no existe, no se puede ejecutar el juego—–”);
ÏϧÏϧÏ6¾¹¹ÏSystem.exit(1);
ÏϧÏϧÏ6Ï}
ÏϧÏϧÏ6Ï
ÏϧÏϧÏö´else
ÏϧÏϧÏȾ¹¹ÏSystem.out.println(“Fichero listo”);
ÏϧÏÏ©}
Ïϧ
Ïϧ/**
Ïϧ*regresa el contenido del array String
Ïϧ*@return String[]
Ïϧ*/
ÏϧÏÞßàpublic String[] getPalabras()
ÏϧÏϧ{
Ïϧ¹Ĺ¹Ïreturn palabras;
ÏϧÏÏ©}
Ïϧ
ÏÏ©}

Ïimport java.io.*;
/**
*Recibe como parámetro un array de String, y hace operaciones con ella
*@author Alba & Rodrigo
*@version 1.0
*/
ÏÕÖ×public class Extrae
Ïϧ{
ÏϧÏíÏprivate String[] palabras;
Ïϧ/**
Ïϧ*Recibe como parámetro una array de String
Ïϧ*@param String[]
Ïϧ*/
ÏϧÏÞßàpublic Extrae(String[] palabras)
ÏϧÏϧ{
ÏϧÏϨ¹¹Ïthis.palabras=palabras;
ÏϧÏÏ©}
Ïϧ
Ïϧ
Ïϧ /**
Ïϧ *Devuelve un String con una palabra aleatoria
Ïϧ *obtenida array de String que tiene la clase como atributo
Ïϧ *@return String
Ïϧ *@see Extrae#NumAleatorio()
Ïϧ */
ÏϧÏÞßàpublic String PalabraAleatoria()
ÏϧÏϧ{
Ïϧ¹Ĺ¹Ïreturn palabras[NumAleatorio()];
ÏϧÏÏ©}
Ïϧ
Ïϧ
Ïϧ /**
Ïϧ *Genera un número aleatorio que se encuentre dentro de las
Ïϧ *dimensiones del array
Ïϧ *@return int
Ïϧ */
ÏϧÏÞßàpublic int NumAleatorio()
ÏϧÏϧ{
ÏϧÏϨ¹íÏint ref=(int)(Math.random()*10);
ÏϧÏϧ
ÏϧÏϨ¹³´if(ref>=(palabras.length))
ÏϧÏϧÏ6§{
ÏϧÏϧÏ6¾¹¹Ïref=NumAleatorio();
ÏϧÏϧÏ6Ï
ÏϧÏϧ϶Ï}
ÏϧÏϧ
Ïϧ¹Ĺ¹Ïreturn ref;
ÏϧÏÏ©}
Ïϧ
Ïϧ
Ïϧ /**
Ïϧ *Recibe como parámetros un caracter y un String,
Ïϧ *busca en cada posición del String el caracter
Ïϧ *@param char
Ïϧ *@param String
Ïϧ *@return Integer[]
Ïϧ */
ÏϧÏÞßàpublic Integer[] Busca(char caracter,String cadena)
ÏϧÏϧ{
ÏϧÏϨ¹íÏInteger[] coincide=new Integer[cadena.length()];
ÏϧÏϧ
ÏϧÏϨ¹¹±for(int i=0;i<cadena.length();i++)
ÏϧÏϧÏÏ5{
ÏϧÏϧÏÏ7¹³´if(caracter==cadena.charAt(i))
ÏϧÏϧÏÏ5Ï6¾¹¹Ïcoincide[i]=i;
ÏϧÏϧÏÏ5Ïö´else
ÏϧÏϧÏÏ5ÏȾ¹¹Ïcoincide[i]=null;
ÏϧÏϧÏÏ5
ÏϧÏϧÏϰ}
ÏϧÏϧ
Ïϧ¹Ĺ¹Ïreturn coincide;
ÏϧÏÏ©}
Ïϧ
Ïϧ
Ïϧ
Ïϧ
Ïϧ /**
Ïϧ *Verifica si a una pregunta, la respuesta es afirmativa o negativa
Ïϧ *@return boolean
Ïϧ *@exception IOException
Ïϧ *@exception StringIndexOutOfBoundsException
Ïϧ */
ÏϧÏÞßàpublic boolean Continuar()
ÏϧÏϧ{
ÏϧÏϨ¹íÏboolean ok=false,interna=false;
ÏϧÏϨ¹íÏString son=null;
ÏϧÏϨ¹íÏchar afir;
ÏϧÏϨ¹íÏBufferedReader datos=new BufferedReader(new InputStreamReader(System.in));
ÏϧÏϧ
ÏϧÏϨ¹¹®do
ÏϧÏϧÏÏ5{
ÏϧÏϧÏÏ7¹¹´try
ÏϧÏϧÏÏ5Ïϧ{
ÏϧÏϧÏÏ5ÏϨ¹¹Ïson=datos.readLine();
ÏϧÏϧÏÏ5ÏϨ¹¹Ïson=son.toUpperCase();
ÏϧÏϧÏÏ5Ïϧ
ÏϧÏϧÏÏ5ÏϨ¹³´if(son.length()>=2)
ÏϧÏϧÏÏ5ÏϧÏ6§{
ÏϧÏϧÏÏ5ÏϧÏ6¨¹¹Ïinterna =false;
ÏϧÏϧÏÏ5ÏϧÏ6¾¹¹ÏSystem.out.print(“\nIntroduzca S o N :”);
ÏϧÏϧÏÏ5ÏϧÏ6Ï}
ÏϧÏϧÏÏ5ÏϧÏö´else
ÏϧÏϧÏÏ5Ïϧϸ§{
ÏϧÏϧÏÏ5Ïϧϸ¨¹¹Ïafir=son.charAt(0);
ÏϧÏϧÏÏ5Ïϧϸ§
ÏϧÏϧÏÏ5Ïϧϸ¾¹³´if((afir==‘S’)||(afir==‘N’))
ÏϧÏϧÏÏ5ÏϧϸÏÏ6§{
ÏϧÏϧÏÏ5ÏϧϸÏÏ6¾¹³´if(afir==‘S’)
ÏϧÏϧÏÏ5ÏϧϸÏÏ6ÏÏ6§{
ÏϧÏϧÏÏ5ÏϧϸÏÏ6ÏÏ6¨¹¹Ïok=true;
ÏϧÏϧÏÏ5ÏϧϸÏÏ6ÏÏ6¾¹¹Ïinterna=true;
ÏϧÏϧÏÏ5ÏϧϸÏÏ6ÏÏ6Ï}
ÏϧÏϧÏÏ5ÏϧϸÏÏ6ÏÏö´else
ÏϧÏϧÏÏ5ÏϧϸÏÏ6Ïϸ§{
ÏϧÏϧÏÏ5ÏϧϸÏÏ6Ïϸ¨¹¹Ïok=false;
ÏϧÏϧÏÏ5ÏϧϸÏÏ6Ïϸ¾¹¹Ïinterna=true;
ÏϧÏϧÏÏ5ÏϧϸÏÏ6ÏÏÈÏ}
ÏϧÏϧÏÏ5ÏϧϸÏÏ6Ï
ÏϧÏϧÏÏ5ÏϧϸÏÏ6Ï}
ÏϧÏϧÏÏ5ÏϧϸÏÏ6Ï
ÏϧÏϧÏÏ5ÏϧϸÏÏö´else
ÏϧÏϧÏÏ5ÏϧϸÏϸ§{
ÏϧÏϧÏÏ5ÏϧϸÏϸ¨¹¹ÏSystem.out.print(“\nIntroduzca S o N :”);
ÏϧÏϧÏÏ5ÏϧϸÏϸ¾¹¹Ïinterna=false;
ÏϧÏϧÏÏ5ÏϧϸÏÏÈÏ}
ÏϧÏϧÏÏ5ÏϧϸÏ
ÏϧÏϧÏÏ5ÏϧϸÏ
ÏϧÏϧÏÏ5ÏϧÏÈÏ}
ÏϧÏϧÏÏ5Ïϧ
ÏϧÏϧÏÏ5Ïϧ
ÏϧÏϧÏÏ5Ïϧ}
ÏϧÏϧÏÏ5Ïϧ
ÏϧÏϧÏÏ5ÏϧÏðîìcatch(IOException e)
ÏϧÏϧÏÏ5ÏϧÏϧ{
ÏϧÏϧÏÏ5ÏϧÏϨ¹¹ÏSystem.out.print(“Error presione S o N: “);
ÏϧÏϧÏÏ5ÏϧÏϨ¹¹Ïinterna=false;
ÏϧÏϧÏÏ5ÏϧÏÏ©}
ÏϧÏϧÏÏ5Ïϧ
ÏϧÏϧÏÏ5ÏϧÏðîìcatch(StringIndexOutOfBoundsException e)
ÏϧÏϧÏÏ5ÏϧÏϧ{
ÏϧÏϧÏÏ5ÏϧÏϨ¹¹ÏSystem.out.print(“Error presione S o N: “);
ÏϧÏϧÏÏ5ÏϧÏϨ¹¹Ïinterna=false;
ÏϧÏϧÏÏ5ÏÏ©ÏÏ©}
ÏϧÏϧÏÏ5
ÏϧÏϧÏÏ5
ÏϧÏϧÏÏò}while(interna==false);
ÏϧÏϧ
Ïϧ¹Ĺ¹Ïreturn ok;
ÏϧÏÏ©}
Ïϧ
Ïϧ
ÏÏ©}

import java.io.*;
/**
*Ejecuta el juego “El Ahorcado”
*trabaja con objetos de la clase FicheroLectura,Extrae y DatosJugador
*@author Alba & Rodrigo
*@version 1.0
*@see FicheroLectura
*@see FicheroLectura#getPalabras
*@see Extrae
*@see Extrae#PalabraAleatoria
*@see Extrae#Busca
*@see Extrae#continuar
*@see DatosJugador
*@exception IOException
*/
ÏÕÖ×public class PruebaAhorcado
Ïϧ{
ÏϧÏÞßàpublic static void main (String[] args)
ÏϧÏϧ{
ÏϧÏϨ¹íÏboolean ok=false;
ÏϧÏϨ¹íÏboolean salida=false;
ÏϧÏϨ¹íÏString buscar=null;
ÏϧÏϨ¹íÏString letra=null;
ÏϧÏϨ¹íÏchar busca;
ÏϧÏϨ¹íÏInteger[] posicion;
ÏϧÏϨ¹íÏInteger[] guarda;
ÏϧÏϨ¹íÏint oportunidades=6;
ÏϧÏϨ¹íÏFicheroLectura palabra=new FicheroLectura();
ÏϧÏϨ¹íÏExtrae prueba=new Extrae(palabra.getPalabras());
ÏϧÏϨ¹íÏDatosJugador nombre=new DatosJugador();
ÏϧÏϧ
ÏϧÏϧ
ÏϧÏϨ¹¹´try
ÏϧÏϧÏϧ{
ÏϧÏϧÏϨ¹¹ÏSystem.out.println(“\n\n*************Empezamos el juego!!!*************************”);
ÏϧÏϧÏϨ¹¹Ïnombre.ponNombre(nombre.pedirEntrada(“\nEscribe tu nombre: “));
ÏϧÏϧÏϧ
ÏϧÏϧÏϧ
ÏϧÏϧÏϧ
ÏϧÏϧÏϨ¹¹®do
ÏϧÏϧÏϧÏÏ5{
ÏϧÏϧÏϧÏÏ7¹¹Ïbuscar=prueba.PalabraAleatoria();
ÏϧÏϧÏϧÏÏ7¹¹Ïposicion=new Integer[buscar.length()];
ÏϧÏϧÏϧÏÏ7¹¹Ïguarda=new Integer[buscar.length()];
ÏϧÏϧÏϧÏÏ7¹íÏBufferedReader datos=new BufferedReader(new InputStreamReader(System.in));
ÏϧÏϧÏϧÏÏ5
ÏϧÏϧÏϧÏÏ5
ÏϧÏϧÏϧÏÏ7¹¹ÏSystem.out.println(“\n***********Puedes jugar “+oportunidades+” partidas**********”);
ÏϧÏϧÏϧÏÏ5
ÏϧÏϧÏϧÏÏ7¹¹ÏSystem.out.println(“\n\nLa palabra tiene “+buscar.length()+ ” letras”);
ÏϧÏϧÏϧÏÏ5
ÏϧÏϧÏϧÏÏ7¹¹±for(int indice=0;indice<buscar.length();indice++)
ÏϧÏϧÏϧÏÏ5ÏÏ5{
ÏϧÏϧÏϧÏÏ5ÏÏ5
ÏϧÏϧÏϧÏÏ5ÏÏ7¹¹®do
ÏϧÏϧÏϧÏÏ5ÏÏ5ÏÏ5{
ÏϧÏϧÏϧÏÏ5ÏÏ5ÏÏ7¹¹´try
ÏϧÏϧÏϧÏÏ5ÏÏ5ÏÏ5Ïϧ{
ÏϧÏϧÏϧÏÏ5ÏÏ5ÏÏ5ÏϨ¹¹ÏSystem.out.print(“\n\nIntroduzca una letra: “);
ÏϧÏϧÏϧÏÏ5ÏÏ5ÏÏ5ÏϨ¹¹Ïletra=datos.readLine();
ÏϧÏϧÏϧÏÏ5ÏÏ5ÏÏ5Ïϧ
ÏϧÏϧÏϧÏÏ5ÏÏ5ÏÏ5ÏϨ¹³´if(letra.length()>=2)
ÏϧÏϧÏϧÏÏ5ÏÏ5ÏÏ5ÏϧÏ6¾¹¹Ïok=false;
ÏϧÏϧÏϧÏÏ5ÏÏ5ÏÏ5ÏϧÏö´else
ÏϧÏϧÏϧÏÏ5ÏÏ5ÏÏ5ÏϧÏȾ¹¹Ïok=true;
ÏϧÏϧÏϧÏÏ5ÏÏ5ÏÏ5Ïϧ
ÏϧÏϧÏϧÏÏ5ÏÏ5ÏÏ5Ïϧ
ÏϧÏϧÏϧÏÏ5ÏÏ5ÏÏ5ÏϨ¹¹Ïposicion=prueba.Busca(letra.charAt(0),buscar);
ÏϧÏϧÏϧÏÏ5ÏÏ5ÏÏ5Ïϧ}
ÏϧÏϧÏϧÏÏ5ÏÏ5ÏÏ5Ïϧ
ÏϧÏϧÏϧÏÏ5ÏÏ5ÏÏ5ÏϧÏðîìcatch(StringIndexOutOfBoundsException e)
ÏϧÏϧÏϧÏÏ5ÏÏ5ÏÏ5ÏϧÏϧ{
ÏϧÏϧÏϧÏÏ5ÏÏ5ÏÏ5ÏϧÏϨ¹¹Ïok=false;
ÏϧÏϧÏϧÏÏ5ÏÏ5ÏÏ5ÏÏ©ÏÏ©}
ÏϧÏϧÏϧÏÏ5ÏÏ5ÏÏ5
ÏϧÏϧÏϧÏÏ5ÏÏ5ÏÏ5
ÏϧÏϧÏϧÏÏ5ÏÏ5ÏÏò}while(ok!=true);
ÏϧÏϧÏϧÏÏ5ÏÏ5
ÏϧÏϧÏϧÏÏ5ÏÏ5
ÏϧÏϧÏϧÏÏ5ÏÏ7¹¹±for(int i=0;i<buscar.length();i++)
ÏϧÏϧÏϧÏÏ5ÏÏ5ÏÏ5{
ÏϧÏϧÏϧÏÏ5ÏÏ5ÏÏ5
ÏϧÏϧÏϧÏÏ5ÏÏ5ÏÏ5
ÏϧÏϧÏϧÏÏ5ÏÏ5ÏÏ7¹³´if((posicion[i]==null)&&(guarda[i]==null))
ÏϧÏϧÏϧÏÏ5ÏÏ5ÏÏ5Ï6§{
ÏϧÏϧÏϧÏÏ5ÏÏ5ÏÏ5Ï6§
ÏϧÏϧÏϧÏÏ5ÏÏ5ÏÏ5Ï6¾¹¹Ïguarda[i]=null;
ÏϧÏϧÏϧÏÏ5ÏÏ5ÏÏ5Ï6Ï}
ÏϧÏϧÏϧÏÏ5ÏÏ5ÏÏ5Ïö´else
ÏϧÏϧÏϧÏÏ5ÏÏ5ÏÏ5ϸ§{
ÏϧÏϧÏϧÏÏ5ÏÏ5ÏÏ5ϸ¾¹¹Ïguarda[i]=i;
ÏϧÏϧÏϧÏÏ5ÏÏ5ÏÏ5ϸÏ
ÏϧÏϧÏϧÏÏ5ÏÏ5ÏÏ5ÏÈÏ}
ÏϧÏϧÏϧÏÏ5ÏÏ5Ïϰ}
ÏϧÏϧÏϧÏÏ5ÏÏ7¹¹ÏSystem.out.print(“\t\t\t\t”);
ÏϧÏϧÏϧÏÏ5ÏÏ5
ÏϧÏϧÏϧÏÏ5ÏÏ7¹¹±for(int i=0;i<buscar.length();i++)
ÏϧÏϧÏϧÏÏ5ÏÏ5ÏÏ5{
ÏϧÏϧÏϧÏÏ5ÏÏ5ÏÏ5
ÏϧÏϧÏϧÏÏ5ÏÏ5ÏÏ5
ÏϧÏϧÏϧÏÏ5ÏÏ5ÏÏ7¹³´if(guarda[i]==null)
ÏϧÏϧÏϧÏÏ5ÏÏ5ÏÏ5Ï6§{
ÏϧÏϧÏϧÏÏ5ÏÏ5ÏÏ5Ï6¾¹¹ÏSystem.out.print(“*”);
ÏϧÏϧÏϧÏÏ5ÏÏ5ÏÏ5Ï6Ï
ÏϧÏϧÏϧÏÏ5ÏÏ5ÏÏ5Ï6Ï}
ÏϧÏϧÏϧÏÏ5ÏÏ5ÏÏ5Ïö´else
ÏϧÏϧÏϧÏÏ5ÏÏ5ÏÏ5ϸ§{
ÏϧÏϧÏϧÏÏ5ÏÏ5ÏÏ5ϸ¾¹¹ÏSystem.out.print(buscar.charAt(guarda[i]));
ÏϧÏϧÏϧÏÏ5ÏÏ5ÏÏ5ϸÏ
ÏϧÏϧÏϧÏÏ5ÏÏ5ÏÏ5ÏÈÏ}
ÏϧÏϧÏϧÏÏ5ÏÏ5Ïϰ}
ÏϧÏϧÏϧÏÏ5ÏÏ5
ÏϧÏϧÏϧÏÏ5Ïϰ}
ÏϧÏϧÏϧÏÏ5
ÏϧÏϧÏϧÏÏ7¹¹±for(int i=0;i<buscar.length();i++)
ÏϧÏϧÏϧÏÏ5ÏÏ5{
ÏϧÏϧÏϧÏÏ5ÏÏ7¹³´if(guarda[i]==null)
ÏϧÏϧÏϧÏÏ5ÏÏ5Ï6§{
ÏϧÏϧÏϧÏÏ5ÏÏ5Ï6¨¹¹ÏSystem.out.println(“\n\n**************Lo siento “+ nombre.getNombre()+” perdiste!!!***********”);
ÏϧÏϧÏϧÏÏ5ÏÏ5Ï6¨¹¹ÏSystem.out.println(“\nLa palabra que buscabas es: “+ buscar);
ÏϧÏϧÏϧÏÏ5¹ÇÏ6¾¹¹Ïbreak;
ÏϧÏϧÏϧÏÏ5ÏÏ5϶Ï}
ÏϧÏϧÏϧÏÏ5ÏÏ5
ÏϧÏϧÏϧÏÏ5ÏÏ7¹³´if(guarda[i]!=null)
ÏϧÏϧÏϧÏÏ5ÏÏ5Ï6¾¹³´if(i==guarda.length-1)
ÏϧÏϧÏϧÏÏ5ÏÏ5϶Ï϶¾¹¹ÏSystem.out.println(“\n\n**************Felicidades “+ nombre.getNombre()+ ” ganaste!!!***********”);
ÏϧÏϧÏϧÏÏ5ÏÏ5
ÏϧÏϧÏϧÏÏ5Ïϰ}
ÏϧÏϧÏϧÏÏ5
ÏϧÏϧÏϧÏÏ7¹¹Ïoportunidades–;
ÏϧÏϧÏϧÏÏ7¹³´if(oportunidades!=0)
ÏϧÏϧÏϧÏÏ5Ï6§{
ÏϧÏϧÏϧÏÏ5Ï6¨¹¹ÏSystem.out.print(“\n\nDesea jugar otra vez?, precione S o N: “);
ÏϧÏϧÏϧÏÏ5Ï6¨¹¹Ïsalida=prueba.Continuar();
ÏϧÏϧÏϧÏÏ5Ï6¾¹³´if(salida==true)
ÏϧÏϧÏϧÏÏ5Ï6Ï϶¾¹¹ÏSystem.out.println(“\n\n*************Empezamos otra vez el juego!!!*************************”);
ÏϧÏϧÏϧÏÏ5Ï6Ï
ÏϧÏϧÏϧÏÏ5Ï6Ï
ÏϧÏϧÏϧÏÏ5Ï6Ï
ÏϧÏϧÏϧÏÏ5Ï6Ï}
ÏϧÏϧÏϧÏÏ5Ï6Ï
ÏϧÏϧÏϧÏÏ5Ïö´else
ÏϧÏϧÏϧÏÏ5ÏȾ¹¹Ïsalida=false;
ÏϧÏϧÏϧÏÏ5
ÏϧÏϧÏϧÏÏò}while(salida==true);
ÏϧÏϧÏϧ
ÏϧÏϧÏϨ¹¹ÏSystem.out.println(“\n\n—————————–FIN DEL JUEGO————————”);
ÏϧÏϧÏϧ
ÏϧÏϧÏϧ}
ÏϧÏϧÏϧ
ÏϧÏϧÏϧ
ÏϧÏϧÏϧÏðîìcatch(IOException e)
ÏϧÏϧÏϧÏϧ{
ÏϧÏϧÏϧÏϨ¹¹ÏSystem.out.println(“Error de datos”);
ÏϧÏϧÏÏ©ÏÏ©}
ÏϧÏϧ
ÏϧÏϧ
ÏϧÏÏ©}
ÏÏ©}

 Y la ejecución seria la siguiente

 

11.jpg

2caub9mpq.jpg

3.jpg


Respuestas

  1. Holaaaaa!!!!bueno soy unos haxas, nos ha encantado vuestro super post, no solo xq os lo habeis currao sino también xq nos ha ayudado muxo, sobre todo en el ejercicio 3 ya que no hemos conseguimos resolverlo y no fue xq acabara la clase, os lo aseguramos…es que no teniamos ni idea, tambien intentaron explicarnoslo pero no entendimos nada…es verdad q al final esto del blog va a servir de gran ayuda,eh!
    Un saludo
    Gracias….

  2. Chicos, vuestro blog al final va a acabar convirtiéndose en un libro de texto sobre Java: está muy trabajado y además muy bien trabajado :-D

    De ésta os podéis buscar una plaza como profes en alguna parte ;-)

    (Por cierto, ¿de verdad es una cosa conocida por todo el mundo que no te puedes ligar a la novia de tu mejor amigo? :-P )


Dejar una respuesta

Su respuesta:

Categorías