JYOC JAVA Anexo1 Ejercicios

JYOC - JAVA - Ejercicios Separados por capítulos según temática Iñaki Martín JYOC - JAVA - EJERCICIOS 1 INDICE INDI

Views 428 Downloads 5 File size 2MB

Report DMCA / Copyright

DOWNLOAD FILE

Recommend stories

Citation preview

JYOC - JAVA - Ejercicios Separados por capítulos según temática

Iñaki Martín

JYOC - JAVA - EJERCICIOS

1

INDICE INDICE

2

Objetivos

3

Calificación de los ejercicios

3

Pautas para una buena programación de los ejercicios:

3

1. EJERCICIOS DE TIPOS DE DATOS Y ENTRADA - SALIDA

4

2. EJERCICIOS DE BIFURCACIONES

7

3. EJERCICIOS DE BUCLES

9

4. EJERCICIOS DE ARRAYS

13

5. EJERCICIOS DE MÉTODOS

24

6. EJERCICIOS DE STRINGS

27

7. EJERCICIOS DE POO - CLASES Y OBJETOS

34

8. EJERCICIOS DE POO - PRINCIPIOS POO

48

9. EJERCICIOS DE MODIFICADORES Y GENERICOS

59

10. EJERCICIOS COLECCIONES

63

11. EJERCICIOS DE EXCEPCIONES

70

12. EJERCICIOS DE RECURSIVIDAD

72

13. EJERCICIOS DE PERSISTENCIA - FICHEROS CORRIENTES

75

14. EJERCICIOS DE COLAS Y PILAS

80

15. EJERCICIOS DE PROCESOS

82

50. EJERCICIOS COMPLETOS, DE VARIAS MATERIAS

86

90. CÓDIGOS DE AYUDA PARA LOS EJERCICIOS

96

JYOC - JAVA - EJERCICIOS

2

Objetivos El interés de la resolución de estos ejercicios es estrictamente didáctica, por lo que se ha evitado en muchas ocasiones abreviar expresiones, se usan algoritmos sencillos y claros, y se proponen desarrollos más largos que eficientes, en aras a facilitar la comprensión y asimilación. Sin embargo, se alienta al alumno a que mejore, afine y depure los ejercicios propios o estas soluciones, y que con ello se adquieran además prácticas de revisión y mejora.

Calificación de los ejercicios Para agilizar el proceso formativo, se ha aplicado un factor de dificultad a los problemas, de modo que; ✤ El color verde indica ejercicios de nivel inicial ✤ El color azul indica ejercicios de nivel medio ✤ El color rojo indica ejercicios de nivel alto

Pautas para una buena programación de los ejercicios: ✦

✦ ✦

✦ ✦



✦ ✦

Escribir el código con una correcta indentación y presentación. Se recomienda la utilización de estas opciones : • En Eclipse: Menu Source -> Format (atajo de de teclado: CTRL + SHIFT + F ). • En NetBeans: Menu Source -> Format (atajo de de teclado: ALT + SHIFT + F ). • En IntelliJ: Menu Code -> Reformat Code (atajo de de teclado: CTRL + ALT + L ) Si hay atributos, no se deben declarar como públicos. Las operaciones de entrada de datos por teclado, acompañarlas de mensajes claros que soliciten la información al usuario. Usar métodos getters y setters sólo si son necesarios, los que no se necesiten, no se construyen. Deben usarse nombres significativos para los identificadores (nombres de clases y métodos, de variables y atributos). No llamar a una variable “x", si es mejor poner “cantidad” Preferible usar métodos auxiliares si estos implementen tareas comunes a varios métodos, y de esa forma, se puede evitar la duplicidad de código. Escribir código eficiente que no realice operaciones innecesarias. Esta desaconsejado el uso de return o break dentro de un bucle

JYOC - JAVA - EJERCICIOS

3

1. EJERCICIOS DE TIPOS DE DATOS Y ENTRADA - SALIDA • Ejercicios básicos (hacer todos los ejercicios y probarlos) i. Crear un programa que pide un nombre por Scanner y escribe en consola “buenas tardes, Sr XX” ii. Crear un programa que pide un numero por Scanner y escribe en consola “el numero es X” iii. Crear un programa que pide dos numero por Scanner y escribe en consola “los números son X e Y” iv. Crear un programa que pide dos números por Scanner y escribe en consola la suma de ambos, con el texto “XX mas YY son ZZ” v. Crear un programa que pide dos valores, el nombre y la edad de una persona, y escribe en consola “me llamo XXX y tengo FF años” vi. Crear una variable de tipo int, darle valor, almacenar luego dicha variable int en una variable double, y escribir en valor de las dos variables vii. Crear una variable de tipo double, darle valor, almacenar luego dicha variable double en una variable int, y escribir en valor de las dos variables viii.Crear una variable de tipo int, darle valor, almacenar luego dicha variable int en una variable short, y escribir en valor de las dos variables ix. Crear una variable de tipo double, darle valor, almacenar luego dicha variable double en una variable short, y escribir en valor de las dos variables x. Crear un programa con una constante PI con un valor. Escribir su valor. Intentar cambiar el valor y ver si nos lo permite. xi. Escribir un programa que escriba por pantalla un numero al azar entre 0 y 99. xii. Escribir un programa que escriba por pantalla dos números al azar entre 10 y 20.

1.a. EJERCICIOS NIVEL INICIAL 1.a.1. Solicitar por teclado el radio de un círculo, guardarlo en un int, y calcular el área del círculo.

MEJORA: El número Pi se usa como una constante. 1.a.2. Similar al anterior, pedir por teclado el radio de una circunferencia y calcular su longitud. L=2*PI*r 1.a.3. Escribir un programa que crea e inicializa dos variables con números enteros y muestre : "El "El "El "El

numero numero numero numero

[poner [poner [poner [poner

aquí aquí aquí aquí

el el el el

primer primer primer primer

numero] numero] numero] numero]

sumado a [poner aquí el otro numero] da [poner resultado]" restado a [poner aquí el otro numero] da [resultado]" multiplicado por [poner aquí el otro numero] da [resultado]" dividido entre [poner aquí el otro numero] da [resultado]”

1.a.4. Escribir un programa que cree y asigne valor a una variable (double) y guardar en ella el valor de una

temperatura en grados Celsius. Transformar este valor a Fahrenheit, y mostrar el resultado por consola. Usar la fórmula : f = (9/5) * C + 32 1.a.5. Escribir en un papel es el resultado de evaluar cada una de las siguientes expresiones. ¿Qué valor tiene

x al final de todas las acciones? (Suponemos que se ejecutan todas seguidas) boolean h; int x=1; h = (x > 1) & (x++ < 10) h = (1 >= x) && ( 1 < x++) h = (1 == x) | (10 > x++) h = (2 == x) || (10 > x++) x = (++x) + x; x = x + (++x)

JYOC - JAVA - EJERCICIOS

//caso //caso //caso //caso //caso //caso

a b c d e f

4

1.a.6. Crear un programa que genera tres números enteros aleatorios (a, b, c) comprendidos entre 65 y 90,

ambos inclusive. Los mostraremos en pantalla. 1.a.7. Escribir un programa que escriba este texto por consola, utilizando secuencias de escape, con una sola

instrucción System.out: Estas líneas son difíciles, necesito poner una \ , pero no se si será más fácil decir "una barra", ayudadme !!!

1.a.8. Pedir un número entero por teclado y escribir por consola (sustituyendo X e Y por lo que corresponda) “El doble de X es Y”

1.a.9. Pedir el precio de un producto por teclado, y decir el precio con IVA añadido (suponer un IVA único

del 21% ) 1.a.10.Crea un programa con el tipo de datos más correcto para guardar los siguientes datos:

a) Si un empleado está casado o no. b) Valor no modificable: 17569885. c) El día de la semana (del 1 a 7). d) El día del año (del 1 al 365). e) Sexo: sólo guardará una letra para indicar el sexo, 'V' o 'M'. f) Milisegundos transcurridos desde el 01/01/1970 hasta nuestros días. g) Almacenar el total de una factura h) Población mundial del planeta tierra. Utiliza el operador de asignación para inicializar una variables que tu te inventes a los valores que correspondan. Hacer un programa que muestre el siguiente resultado con las variables del ejercicio anterior :  ----- EJERCICIO DE VARIABLES Y TIPOS DE DATOS ----El valor de la variable casado es true El valor de la variable MAXIMO es 999999 El valor de la variable diasem es 1 El valor de la variable diaanual es 300 El valor de la variable miliseg es 1298332800000 El valor de la variable totalfactura es 10350.678 El valor de la variable poblacion es 6775235741 El valor de la variable sexo es M

1.b. EJERCICIOS NIVEL MEDIO 1.b.1. Escribir un programa que crea una variable int y le asigna un número de segundos y nos dice a

cuántas horas, minutos y segundos corresponde dicha cantidad de segundos. Por ejemplo, si en el programa se define un int seg =3734, después nos dice; 3734 segundos son 1 horas 2 minutos y 14 segundos.

1.b.2. Pedir un número por teclado y mostrar el carácter que le corresponde en la tabla ASCII. Por ejemplo,

si se escribe 65, muestra : ”es una A”

1.c. EJERCICIOS NIVEL ALTO 1.c.1. Pedir por teclado un número de 4 cifras y mostrarlo con las cifras al revés. JYOC - JAVA - EJERCICIOS

5

1.c.2. Realizar un programa que pida al usuario dos números, correspondientes a un número de mes (del 1 al



12) y de un número de día (del 1 al 30). Calcular el número de días completos que faltan hasta el día de Nochevieja (suponer que todos los meses del año tienen 30 días).

JYOC - JAVA - EJERCICIOS

6

2. EJERCICIOS DE BIFURCACIONES • Ejercicios básicos (hacer todos los ejercicios y probarlos) i. ii. iii. iv. v.

Crear un programa que declare una variable de tipo entero y pida al usuario por teclado un valor para ella. A continuación muestra un mensaje indicando si el valor de dicha variable es positivo o negativo (Consideraremos el 0 como positivo) Idem ejercicio anterior, ahora nos indica si la variable escrita es par o impar Idem ejercicio anterior, ahora nos indica si la variable escrita es múltiplo de 5 Idem ejercicio anterior, ahora nos indica si la variable escrita es par o impar Crear un programa que declare dos variables de tipo entero y pida al usuario por teclado un valor para cada una de ellas. A continuación muestra un mensaje indicando si ambos valores son iguales

2.a. EJERCICIOS NIVEL INICIAL 2.a.1. Pedir por teclado dos números y mostrarlos ordenados de mayor a menor. 2.a.2. Pedir por teclado una nota de 0 a 10 y mostrarla de la forma: Insuficiente, Suficiente, Bien... 2.a.3. Pedir por teclado tres número: el día, mes y año de una fecha. Indicar si la fecha es correcta,

imaginando estas reglas para que una fecha sea correcta; • Ha de ser del siglo XXI (el año debe estar entre 2000 y 2099) • Todos los meses del año tienen 30 días, (el día no puede ser ni 0 ni menor que 0, ni mayor que 30) • Hay doce meses en el año (el mes es menor que 12 y mayor que 0) 2.a.4. Pedir por teclado el día, mes y año de una fecha e indicar si la fecha es correcta. Similar al ejercicio

anterior, pero considerando ahora que hay en realidad meses de 28, 30 y 31 días. Para simplificar consideremos que no existen años bisiestos. 2.a.5. Pedir por teclado el día, mes y año de una fecha correcta y mostrar la fecha del día siguiente. Suponer

que estamos en un planeta donde hay 12 meses al año y todos los meses del año tienen 30 días. 2.a.6. Usando Switch, escribir un programa que pida por teclado un número de 1 a 10, y nos diga si es par o

impar. Si el número no esta comprendido entre 1 y 10, debe decir “Número no válido”. 2.a.7. Escribir un programa que pida por teclado tres enteros y que emita un mensaje que indique si están o

no en orden numérico creciente 2.a.8. Explicar qué hace este programa e indicar que se escribe por la consola, suponiendo que a la variable

nota se le asignan diferentes valores en diferentes ejecuciones del programa (los valores que se han de probar son 3,4, 5, 6, 7, 8, 9 y 10). Si se ve algún error en la lógica o en la ejecución del programa, proponer una solución: public static void main(String[] args) { int nota = 7; if (nota >= 5) { System.out.print("El resultado es aprobado "); switch (nota) { case 5: case 6:break; case 7: case 8:System.out.println(“ con Notable"); break; case 10:System.out.println(“ con Matrícula");

JYOC - JAVA - EJERCICIOS

7

}

}

case 9:System.out.println(“ y con Sobresaliente");

} else { System.out.println("El resultado es suspenso"); }

2.b. EJERCICIOS NIVEL MEDIO 2.b.1. Pedir por teclado un número entre 0 y 9.999 y decir cuántas cifras tiene. 2.b.2. Pedir por teclado dos fechas y mostrar el número de días que hay de diferencia. Suponiendo que

estamos en un planeta donde todos los meses son de 30 días, donde hay 12 meses por lo que los años tienen siempre 360 días. Suponer también que la primera fecha es anterior a la segunda. 2.b.3. Pedir por teclado dos números enteros correspondientes a un número de mes y un número de año.

Calcular el número de días que tiene dicho mes. Se debe comprobar que el valor introducido para el mes esté comprendido entre 1 y 12. Se de be controlar que un año sea bisiesto (un año es bisiesto si es múltiplo de 4 y no de 100, pero si son bisiestos los múltiplos de 400)

2.c. EJERCICIOS NIVEL ALTO 2.c.1. Pedir por teclado tres números y mostrarlos ordenados de mayor a menor 2.c.2. Pedir por teclado un número de 4 cifras y decir si es capicúa. 2.c.3. Pedir por teclado un número entre 30 y 90, y mostrarlo escrito en letras. Por ejemplo, para 56 mostrar:

cincuenta y seis. 2.c.4. Crear un programa que asigne a dos variables enteras dos números aleatorios (llamémosles numA y

numbB). No se muestran los datos por pantalla. El usuario debe intentar adivinar cuál de los dos números es el mayor. Para ello, el programa pedirá por teclado al usuario que escriba por quién apuesta (que escriba A o B). Una vez el usuario haya introducido su apuesta, el programa mostrará el valor de A y B, dirá si se ha ganado la apuesta (si ha acertado el número más alto) o si ha perdido

JYOC - JAVA - EJERCICIOS

8

3. EJERCICIOS DE BUCLES • Ejercicios básicos (hacer todos los ejercicios y probarlos) i. Escribir todos los números, del 1 al 100, de 4 en 4. ii. Escribir todos los números, del -100 al 100, de 3 en 3. iii. Escribir todos los números, del 100 al 0, de 7 en 7. iv. Escribir la tabla del 5 con un bucle v. Escribir un bucle que elige en cada vuelta un número al azar, y al final nos dice la suma de todos ellos. vi. Escribir un bucle que elige en cada vuelta un número al azar, y al final nos dice cuantos pares salieron. vii. Escribir un bucle que elige en cada vuelta un número al azar, y al final nos dice si salieron mas pares que impares. viii.Pedir por teclado un número (llamémosle num1), y mostrar todos los números desde el 1 hasta num1

3.a. EJERCICIOS NIVEL INICIAL 3.a.1. Pedir por teclado un número e indicar si es positivo o negativo y si es par o impar.. El proceso se

repetirá hasta que se introduzca un 0. 3.a.2. Pedir por teclado un número (llamémosle num1), y mostrar todos los números desde el 1 hasta num1. 3.a.3. Hacer un programa que muestre el producto de los 10 primeros números impares positivos (no de los

impares menores de 10, sino de los primeros 10 números mayores que 0 que sean impares) 3.a.4. Pedir por teclado 10 sueldos. Mostrar su suma y cuántos hay mayores de 500€. 3.a.5. Escribir los primeros 20 números seguidos, tanto con un FOR, con un WHILE y con DO WHILE

MEJORA 1: cada lista se deber mostrar en una sola línea, separados los números por comas 3.a.6. Programa que pide por teclado números, de manera continua, hasta que se introducen dos números

iguales seguidos. 3.a.7. Programa que pide por teclado dos números, numNotas y numMinima.

• numNotas es el número de calificaciones que van posteriormente a pedir, y • numMinima una nota mínima que se va a controlar luego. Hacer un bucle que le pida a los usuarios todas la calificaciones, e indicar finalmente cuántas calificaciones han igualado o superado la nota mínima antes mencionada. 3.a.8. Hacer un programa que lea un número entero por teclado y escriba los números enteros impares

que hay desde el 1 hasta el número leído (éste incluido), pero escribiendo solo 5 números por línea. Ejemplo para el 26: 1 3 5 7 9 11 13 15 17 19 21 23 25

3.a.9. Programa que pide dos números por teclado, a y b. A continuación, escribe todos los números

menores de 100 que son múltiplos de a y de b a la vez. 3.a.10.Programa que escribe todos los números múltiplos de 4 menores de 100, pero en una sola línea,

separados por comas, pero sin que haya ultima coma tras el ultimo número

JYOC - JAVA - EJERCICIOS

9

3.a.11.Pedir por teclado un número y mostrar su cuadrado, repetir el proceso hasta que se introduzca un

número negativo. 3.a.12. Realizar un programa que pida al usuario un número, positivo y mayor que 1. A continuación, el

programa escribirá los números de la serie Conjetura de Ullman (en honor al matemático S. Ullman). La conjetura consiste en lo siguiente: 1. Empieza con cualquier entero positivo (el que el usuario ha indicado por teclado). 2. Si el numero es par, se divide entre 2; se imprime, y se vuelve al punto 2, ahora a procesar el nuevo numero obtenido 3. Si el numero es im par, se divide entre 2, se multiplica por 3 y se agrega le agrega 1. Se imprime, y se vuelve al punto 2, ahora a procesar el nuevo numero obtenido 4. Se continua hasta obtener el número 1, momento en el que acaba la serie. La susodicha seria confirma que, sea cual sea el numero inicial elegido, al final se obtendrá el número 1. Por ejemplo, cuando el entero inicial elegido por el usuario es 26, la secuencia que se ha de escribir es esta: 26, 13, 40, 20, 10, 5, 16, 8, 4, 2, 1

3.b. EJERCICIOS NIVEL MEDIO 3.b.1. Pedir números por teclado hasta que se teclee un 0, mostrar la suma y la media de todos los números

introducidos. 3.b.2. Programa que pide por teclado 5 números, y en el caso en el que el primero introducido sea igual al

último, nos muestra la media. En caso contrario, no se mostrará nada. 3.b.3. Pedir 10 números enteros por teclado. De todos ellos, mostrar la media de los números que sean pares,

mostrar la media de los que sean negativos, y la cantidad de números cero que se hayan introducido. 3.b.4. Se solicita una número por teclado, y nos dice si es primo o no lo es (ayuda: un primo se puede definir

como un número que tiene algún divisor además de 1 y de si mismo) 3.b.5. Hacer un programa que pide un número al usuario, y escribe en pantalla el mes correspondiente a tal

número (si el usuario introduce 2, el programa escribe “Febrero”). Si el numero no es válido, lo indica igualmente. Tras ello, se le pregunta al usuario si quiere repetir, y si dice “si”, se vuelve a repetir el proceso anterior 3.b.6. Programa que pide por teclado un número y muestra la suma de sus divisores, sin incluir el propio

número entre sus divisores. 3.b.7. Programa que pide por teclado al usuario 6 números positivos comprendidos entre el 10 y 50, ambos

inclusive. En el caso en el que algún número introducido no se encontrara dentro del rango de 10 a 50, se mostrará un mensaje de error y seguirá pidiendo números. El programa finalizará cuando se hayan introducido 6 números válidos y mostrará el número máximo introducido de los 6 válidos. Además indicará cuántos números de los introducidos no han sido válidos. 3.b.8. Programa que genera los N primeros números de la serie de Fibonacci. El valor N deberá ser leído por

el teclado. NOTA: Los dos primeros números son 1, y el resto se obtiene sumando los dos anteriores: 1,1,2,3,5,8,13,21

JYOC - JAVA - EJERCICIOS

10

3.b.9. Programa que pide por teclado cantidades y precios de varios productos. Se van a pedir estos datos

hasta que en la cantidad de un producto se indique 0. Al final indicar el total de la factura. Si el importe supera los 1000€ se aplicará un descuento del 5%. 3.b.10. Realizar un programa que pida por teclado números enteros positivos hasta que se escriba un 0.

Después deberá mostrar la media de todos ellos. Comprobar que funcione si no se escribe ningún número negativo 3.b.11. Realizar un programa que pida por teclado al usuario dos números, que serán el numerador y el

denominador de una fracción. Reducir luego la fracción a su mínima expresión, y escribir la fracción resultante. Por ejemplo, si se escriben 24 y 30, debe escribir “Fracción reducida: 4/5”. 3.b.12. Mostrar por pantalla todos los números primos que hay entre 1 y 200

3.c. EJERCICIOS NIVEL ALTO 3.c.1. Pedir por teclado un número y calcular su factorial. 3.c.2. Encontrar y mostrar todos los números de cuatro cifras que cumplan la condición de que la suma de

las cifras de orden impar es igual a la suma de las cifras de orden par. 3.c.3. Hacer un programa que pida un número, y nos diga el primer número primo más grande que el

número introducido. 3.c.4. Escribir un programa que encuentre el primer número perfecto tras uno inicial indicado por teclado.

Un número perfecto es un entero positivo que es igual a la suma de todos los enteros positivos (excluido él mismo) que son sus divisores. El primer número perfecto es 6, ya que sus divisores son 1, 2, 3 y 1 + 2 + 3 = 6. 3.c.5. Escribir un programa que muestre esto por pantalla:

* ** *** **** ***** 3.c.6. Escribir un programa que muestre esto por pantalla:

***** **** *** ** * 3.c.7. Escribir un programa que muestre primero esto por pantalla:

* *** ***** ******* MEJORA; la altura de los pisos se debe pedir al usuario por teclado JYOC - JAVA - EJERCICIOS

11

3.c.8. Realizar un programa que pida la altura y la anchura de un rectángulo y lo dibuje con *. Por ejemplo,

si se da anchura 5 ya altura 4 se mostrará: ***** * * * * *****

3.c.9. Programa consistente en un juego en el que el Jugador1 introduce un número por teclado entre el 1 y

el 100 y el Jugador2 tendrá que adivinarlo en un máximo de 10 intentos. Por cada intento del Jugador2 se mostrará el mensaje “Te pasaste”, o “No llegaste”, según corresponda. El programa terminará cuando se agoten los intentos y/o el Jugador2 acierte el número. Se ha de mostrar el mensaje correspondiente. 3.c.10.Idem al ejercicio anterior, pero ahora será el programa (“el ordenador”) quien debe adivinar un

número que “piense” el usuario 3.c.11.Escribir en modo matriz la hoja de calendario del mes de mayo de 1992 (ayuda: el 1 de mayo del

1992 fue viernes, y el 1 de junio 2015 fue lunes, empezar por ahi)

JYOC - JAVA - EJERCICIOS

12

4. EJERCICIOS DE ARRAYS • Ejercicios básicos (hacer todos los ejercicios y probarlos) i. Dado un array int[] vectorDeDatos = {8,2,5,4,9,1,0,8,9,3} pintar sus valores por consola ii. Dado un array int[] vectorDeDatos = {8,2,5,4,9,1,0,8,9,3} pintar por consola cuantos pares contiene iii. Dado un array int[] vectorDeDatos = {8,2,5,4,9,1,0,8,9,3} pintar por consola solo los elementos de posición impar, no los que tengan valor impar, sino los que están en posición (indice) impar iv. Crear un array de 15 enteros, rellenarlo con valores aleatorios, y pinta sus valores por pantalla v. Crear un array de 15 enteros, rellenarlo con valores aleatorios, y pintar el numero mayor de ellos por consola vi. Crear un array con un numero aleatorio de elementos, que serán números double. Se rellena con valores también aleatorios, y se pintan sus valores por pantalla. vii. Crear un programa que crea un array de 15 enteros, lo rellena con valores solicitados al usuario, y pinta todos los valores nuevamente por consola viii.Crear un programa que crea un array de 15 enteros, lo rellena con valores solicitados al usuario, y pinta solo los valores pares por consola ix. Crear un programa que crea un array de 15 enteros, lo rellena con valores solicitados al usuario, y pinta por consola solo los valores múltiplos de 3 y de 5 a la vez x. Crear un array con un numero aleatorio de elementos, que serán números double. Se rellena con valores también aleatorios, y se pinta por pantalla el primer y el ultimo de sus elementos

Arrays UNIDIMENSIONALES 4.a. EJERCICIOS NIVEL INICIAL 4.a.1. Dado un array

int[] vectorDeDatos = {8,2,5,4,9,1,0,8,9,3}

construir un programa que copie el vectorDeDatos en el array llamado copiaDeDatos, pero sumando 2 a cada elemento, y que escriba el array copiaDeDatos por pantalla, esto es, que salga : "el elemento "el elemento "el elemento "el elemento …etc…

1 2 3 4

de de de de

copiadedatos copiadedatos copiadedatos copiadedatos

es es es es

10” 4" 7" 6"

4.a.2. Hacer un bucle que pida por teclado 10 números enteros y los almacene en un array, y que se calcule

posteriormente la suma de los números que sean pares y la suma de los números que sean impares, y que nos diga por pantalla cual de las dos sumas es mayor 4.a.3. Temperaturas. Se piden por teclado la temperatura de cada uno de los 7 días de una semana. Se pide

por teclado luego una nueva temperatura, y se compara con las leídas anteriormente para decir si tal nueva temperatura se dio en algún día de la semana. 4.a.4. Realiza un programa que pida por teclado 11 números enteros y los almacene en un array, para

posteriormente mostrarlos en el orden inverso al que fueron introducidos 4.a.5. Dados estos arrays String [] nombreDeCadaAlumno = {"Luis","Jose","Carlos","Pedro","Juanjo"} int[] notasDeCadaAlumno = {8,2,5,4,9};

Hacer un bucle que nos diga los nombres de los alumnos que han aprobado y su nota, esto es, debe dar como salida por pantalla: "Luis ha aprobado con un 8"

JYOC - JAVA - EJERCICIOS

13

"Carlos ha aprobado con un 5" "Juanjo ha aprobado con un 9”

4.a.6. Escribir un programa que:



- pide por teclado un número de estudiantes - crea dos arrays para guardar nombres de estudiantes y sus notas. - con un bucle pide por teclado los nombres y las notas de cada uno de los estudiantes, y los va guardando en el array. - con otro bucle escribe qué alumnos han aprobado y cuales no - finalmente escribe la media de todas las notas introducidas Ejemplo de como funcionaria: Indique el número de estudiantes: 2 Escriba nombre del estudiante número 1: Juan Nota del estudiante número 1: 5 Escriba nombre del estudiante número 2: Pedro Nota del estudiante número 2: 2 Maria ha suspendido La media de las notas es 3,5

4.a.7. Programa que pide por teclado el nombre y edad de una serie de alumnos y los almacena en dos

arrays de 10 elementos. Se piden alumnos y notas hasta introducir como nombre de alumno “fin” o se llegue a los 10 alumnos. Posteriormente se mostrará la edad media de los alumnos y el nombre del alumno menor (puede realizarse con o sin uso de arrays) 4.a.8. Realiza un programa que lea números enteros desde teclado hasta que se introduzcan 12, o bien hasta

que se introduzca un número igual que el anterior. Muestra los números introducidos al acabar de pedir todos 4.a.9. Escribir en un papel el resultado del siguiente programa: int[] cifras15 = { 4, 5, 6, 7, 8, 9 }; int[] numeros15 = { 12, 9, 11, 20, 40, 22, 44, 53, 2, 88, 23 }; System.out.println ("- parte 1 -----------------"); for (int x = 2; x = 1; k—-) { System.out.println (numeros15[k]); } System.out.println ("- parte 3 -----------------"); for (int x = 3; x = 1; k—-){ System.out.println (numeros15[k] + cifras15[x]); } } System.out.println ("- parte 4 -----------------"); for (int x = 1; x =22 y 35, Senior. - Método para imprimir los datos de un empleado por pantalla (utilizar salto de línea \n para separar los atributos. - Un método que permita aumentar el salario en un porcentaje que sería pasado como parámetro al método. 2) Clase Programador (Heredera de Empleado). Clase que hereda de Empleado y además tiene: Atributos: - lineasDeCodigoPorHora : tipo entero - lenguajeDominante: tipo cadena Metodos: - Constructor con y sin parámetros de entrada. Desarrollar las clases y los métodos indicados, y una clase Prueba con un main() donde crear y probar objetos y métodos. 8.a.2. Escribe un programa que implemente la jerarquía de clases siguiente: existe una clase inicial llamada

Figura, de la que heredan otras tres, llamadas Circulo, Cuadrado y Rectangulo. Escribir aquellos atributos y métodos necesarios para que se pueda ejecutar el siguiente programa: public class Jerarquía {
 public static void main(String[] args) { VectorList figuras = new VectorList(); figuras.add(new Circulo(10)); // Radio=10 figuras.add(new Cuadrado(10)); // Lado=10 figuras.add(new Triangulo(10,5)); // Base=10, Altura=5; for (Figura f: figuras) System.out.println("Área: "+f.area()); } } }

Al ejecutar el programa, deberá aparecer por pantalla el área de cada una de las figuras creadas.

JYOC - JAVA - EJERCICIOS

48

8.a.3. Cuentas de Ahorro.

Define una clase Persona con los siguientes datos • Atributos privados : Nombre : String NIF : String • Y los siguientes métodos: Constructor parametrizado Métodos de acceso para los atributos Define una clase abstracta Cuenta con los siguientes datos • Atributos privados: - numerocuenta : entero largo - saldo : double - cliente : atributo de la clase Persona. • Y los siguientes métodos: - Constructor parametrizado que recibe un cliente y un número de cuenta - Métodos de acceso para los tres atributos - ingresar(double): permitirá ingresar una cantidad en la cuenta. - abstract retirar(double): permitirá sacar una cantidad de la cuenta. Define las subclases de Cuenta que se describen a continuación: CuentaCorriente: • Atributos privados: - double maximoRetirable : entero • Y los siguientes métodos: - Constructor parametrizado - Métodos de acceso para su atributo - Metodo toString() • Al retirar dinero hay que tener en cuenta que el importe a retirar sea menor o igual que maximoRetirable. CuentaAhorro: • Atributos privados: - double saldoMinimo : entero • Y los siguientes métodos: - Constructor parametrizado - Métodos de acceso para su atributo - Metodo toString() • Al retirar dinero hay que tener en cuenta que no se sobrepase el saldo mínimo Crea una clase Prueba que cree varias cuentas y pruebe sus características. 
 8.a.4. Coches Matriculados. Usar la clase Coche con





Atributos: - String marca: se carga en el constructor y no se modifica nunca - String color: se carga en el constructor y se puede modificar - int km: al principio vale 0, y se puede incrementar - double precio: se carga en el constructor y se puede modificar - double factor_contaminación: se carga en el constructor y no se puede modificar - int anio : se carga en el constructor y no se puede modificar - String matricula: no se crea con el coche, no se puede cambiar después. - double impuestoMatriculacion: no se crea con el coche, se puede cambiar después. - String dniTitular: no se crea con el coche, se puede cambiar después. Métodos: - comprarCoche(String titular)

JYOC - JAVA - EJERCICIOS

49



Construir la clase Cochematriculado que hereda de coche, con los siguientes Atributos: - atributos: - int aniomatriculacion - int mesmatriculacion - int impuestoMatriculacion - int anomatriculacion Métodos - constructor: recibe valor para asignar a los atributos matricula y dniTitular. Calcula con el método calculaImpuesto el impuesto de circulación, y aplica un recargo de 100 euros si el coche tiene más de 10 años, y da valor a los tres atributos (dniTitular, matricula e impuestoMatriculacion) - pagoIVTM (int anio, String matricula) - controlITV (String matricula, int aniomatriculacion, int mesmatriculacion)





Crear una clase con un main y probar a crear objetos de ambas clases y probar sus métodos.

8.a.5. Crear una clase llamada Empleado

• • • • •

atributos privados nombre, y teléfono, de tipo String. El constructor necesitará el nombre y el teléfono. Implementar los métodos necesarios para acceder a los atributos (getters y setters). Añadir el atributo estático y privado numeroEmpleados. Este atributo almacenará el número de instancias que se han creado de la clase Empleado. Implementar un método público para conocer el valor de numeroEmpleados. Llamarlo getNumeroEmpleados.

Crear una clase aparte con el método main: • Crear un array de 4 empleados. Los datos de cada empleado será leidos por consola. • Mostrar los datos de cada empleado del array • Llamar al método getNumeroEmpleados para mostrar el número de empleados instanciados. • 8.a.6. Nuevos métodos tipo Math. Construir una clase final Math2 que implemente una interfaz llamada IExtremos con el siguiente código fuente: public interface IExtremos { int min(int [] a); int max(int [] a); double min(double [] a); double max(double [] a); }

Desde una clase Inicio crear objetos de Math2 y probando sus métodos 1. Relaciones. Construir una interfaz IRelaciones (y posteriormente una clase que la implemente) que incluya los siguientes métodos: - boolean esMayor(Object b) ; // Devuelve verdadero si a es mayor que b - esMenor(Object b) ; // Devuelve verdadero si a es menor que b boolean - boolean esIgual(Object b) ; // Devuelve verdadero si a es igual que b 2. Profesores eméritos. Crear la clase Profesor y la subclase ProfesorEmerito. Crear el código para estas clases que cumpla los requisitos siguientes: - Como atributos de la superclase tendremos nombre (String), edad (int) y añosConsolidados (int) declarados como protected. - En la subclase se trabajará con el campo adicional int añosEmerito declarado como private. JYOC - JAVA - EJERCICIOS

50

- Un método de la subclase será double obtenerSalarioBase () que obtendrá el salario base como (925 + añosConsolidados * 12.25 + 23.40 * añosEmerito). Intentar acceder directamente al campo añosConsolidados desde la subclase (como si fuera un campo más de la subclase) para implementar este método. ¿Es posible sin utilizar una invocación a super ni un método get? ¿Qué ocurre si el atributo en la superclase se declara private? 8.a.7. Crea una clase abstracta llamada Forma:



• Con los siguientes atributos: ◦ String nombre
 ◦ float base, float altura
 ◦ float posicionX, float posicionY ◦ String color • Con el siguiente método abstracto: ◦ float calcularArea( ) • Con los siguientes métodos no abstractos: ◦ Getters y setters de los atributos.
 • Comprueba que no se puede instanciar la clase abstracta Forma.
 • Crea una clase llamada Triangulo que herede de la clase Forma. Define en ella el método calcularArea.
 • Crea una clase llamada Rectangulo que herede de la clase Forma. Define en ella el método calcularArea.
 • Crea una clase aparte con el método main para probar todas las funcionalidades de las subclases Triangulo y Rectangulo.

8.a.8. Ejercicio multiviviendas

Crear las siguientes clases y métodos, y una clase Principal que vaya probando la creación de las clases y los métodos: • Crear clase Vivienda con atributos String calle, double precio, int superficieEnMetros • Crear clase Piso (que hereda de Vivienda) con atributos int planta, int puerta • Crear clase Adosado (que hereda de Vivienda) con atributos int numPlantas • Crear clase Chalet (que hereda de Vivienda) con atributos int numParcela, boolean conPiscina. • Poner public, private o protected a los atributos segun corresponda • Crear constructores completos para cada clase • Crear en Vivienda el método calcularPrecio(), que es el valor de superficieEnMetros*1000, válido para todos los hijos menos para el Chalet, que es superficieEnMetros*200 • Crear en Vivienda un método abstracto double impuestoMunicipal(), que devuelve el importe del impuesto, que será el 5% del precio la vivienda, menos en el caso de los chalets, que ademas de ese 5%, sera de 200 euros mas si el chalet tiene piscina • Crear la interfaz IViviendas, con el método abstracto void aumentarPrecio(int aumento) y hacer que todos los hijos de Vivienda implementen dicha interfaz 8.a.9. Ejercicio Alfombras

• Crear una clase Alfombra, con atributos privados String color, int precioMetro. • Crear clase AlfombraRedonda (hereda de Alfombra) con atributo int radio • Crear clase AlfombraCuadrada (hereda de Alfombra) con atributo int lado • Hace Constructores, getters y setters para todas las clases • Hacer una interfaz IAlfombras con los métodos • void calcularSuperficie() calcula la superficie de la alfombra • void calcularPrecio() que calcula el precio de la alfombra (que será la superficie*precioMetro) Hacer un programa Main que cree objetos de las dos clases hijas y pruebe los métodos

8.b. EJERCICIOS NIVEL MEDIO JYOC - JAVA - EJERCICIOS

51

8.b.1. Recetas FastFood. Se definen los tipos IFastFood y Receta de este modo: Interface IFastFood { int tiempoDePreparacion(); boolean isVegetariano(); String tipoPreparacion(); }

// tiempo en minutos

public class Receta { private String nombre; private ArrayList ingredientes = new ArrayList(); private ArrayList pasosPreparacion = new ArrayList();

}

public Receta(String nombre,ArrayList ingredientes,ArrayList pasosPreparacion){ this.nombre = nombre; this.ingredientes = ingredientes; this.pasosPreparacion = pasosPreparacion; }

Se pide : • Definir dos clases: la clase Pizza y la clase Sandwich. Estas dos clases extienden la clase Receta e implementan la Interfaz IFastFood. •

Codificar ambas clases proporcionando los métodos necesarios y el constructor adecuado a cada una según las definiciones de la interfaz IFastFood y la clase Receta y teniendo en cuenta que: ‣ para el metodo isVegetariano: - el Sandwich es siempre vegetariano. - la Pizza es vegetariana si no tiene algún ingredientes que contenga la palabra “carne” ‣ para el metodo tipoPreparación: - la Pizza se prepara siempre al horno (“horno”) - El Sandwich se prepara siempre en plancha (“plancha”)



Definir la clase Menu, que tiene como único atributo una lista de elementos de tipo IFastFood. Como métodos solo tiene un constructor vacío.



Codificar en una clase Restaurante que tiene un atributo hashMap llamado mapaRecetasRestaurante (mapa que tendrá como clave el nombre de la receta, y como valor un objeto IFastFood). Codificar ademas estos métodos en esta clase ✦ Método para crear recetas y almacenarlas en el mapa del restaurante ✦ Método anadirRecetaAlMenu(IFastFood receta, Menu menu) , que vale para añadir una receta (de las ya existentes en el mapa de recetas) a un menu ✦ Método tiempoMedio() que calcula la media de todos los tiempos de preparación del menú. Recibe una lista de elementos IFastFood. Se lanzará una excepción en caso de que la lista esté vacía. ✦ Método porcentajeVegetariano() que calcula el porcentaje de elementos vegetarianos de un menú de un restaurante. Recibe una lista de elementos IFastFood. ✦ Método main ademas de crear un menu, debe probar el resto de métodos de la clase Restaurante: creando recetas, añadiéndolas al mapa de recetas del restaurante, y crear un menu eligiendo entre la recetas del restaurante

MEJORA: (Si se conocen Excepciones) Crear una excepción personalizada TiempoException si, cuando se añaden recetas al menu, el tiempo de preparación de todas las recetas del menu supera un cierto valor (definido como constante de clase)

8.b.2. Garage de vehículos JYOC - JAVA - EJERCICIOS

52

Se trata de gestionar un garage con diversas plazas que ocupan polimorficamente varios vehículos: a) Se debe crear la clase Vehículo con estos atributos: String matricula String marca double precio int cilindrada double consumo double impuestoCirculacion double cuotaMesGarage

b) Hay que hacer un constructor con todos los atributos menos la matricula (se inicia por defecto con valor null), la cuotaMesGarage (que es por defecto el valor de una constante de clase), la matricula y el impuestoCirculacion (éste ultimo se calcula en el constructor con el método de clase indicado más adelante) c) Incluir los setters y getters pertinentes. En el caso del setCuotaMesGarage, no se puede indicar una cuota negativa. d) Escribir estos métodos: ‣ ‣

, que es el 2% importe del coche boolean matricular(String matricula) , que da valor al campo matricula, siempre que el parámetro matricula tenga 7 caracteres. No se puede matricular un coche que ya estaba matriculado. Devuelve si ha podido dar valor a la matrícula. void calcularImpuestoCirculacion()

e) Crear clase Moto que hereda de Vehiculo. Esta clase tiene además un atributo ‣ boolean tieneSidecar que se asigna en el constructor ‣ Además para una moto, el impuestoCirculacion se incrementa en : - un 10% más al precio de la cuota normal de moto si tiene sidecar - El atributo cuotaMesGarage se aumenta en 50 % si tiene sidecar. f) Crear clase Coche que hereda de Vehiculo. Esta clase tiene además los atributos: ‣ boolean tieneRadio , que se asigna en el constructor ‣ boolean tieneNavegador , que se asigna en el constructor ‣ Además para un coche, el impuestoCirculacion se incrementa en - un 1% más al precio de la cuota normal de vehículo si tiene radio - un 2% más al precio de la cuota normal de vehículo si tiene navegador ‣ El atributo cuotaMesGarage se aumenta en 20 % si la cilindrada del coche es mayor de 2999. g) Crear una clase Garaje que tiene una colección de plazas de Vehículos. El número de plazas es una constante de la clase. Esta clase debe cumplir con la interfaz iGarage, que tiene estos métodos definidos: ‣ double calcularIngresos(); - Debe calcular la suma de ingresos mensuales de todos los vehículos existentes en el garage ‣ int calcularOcupacionPorTipoVehiculo(Vehículo v); - Indica cuantos vehículos hay del tipo pasado por parámetro en el garage h) Hacer un menú para la gestión del Garaje, con estas opciones; 1.2.3.4.5.-

Alquilar una plaza Baja de alquiler Consulta de ingresos mensuales Consulta proporción coches / motos Listado de matriculas y couta mensual y tipo vehículo

i) Se debe siempre controlar que: JYOC - JAVA - EJERCICIOS

53

‣ no se puedan alquilar más plazas de las existentes. ‣ no haya más del 80% de plazas ocupadas por motos. ‣ no se puede alquilar un vehículo si no tiene matricula. MEJORA 1: Añadir opciones al menu • 6.- Guardar vehículos en fichero (binario) • 7.- Recuperar vehículos de fichero (binario) MEJORA 2: • Añadir excepciones personalizadas que controlen las siguientes situaciones: • Intentar alquilar un vehículo que no tiene matricula (SinMatriculaException) • Intentar asignar en el método setCuotaMesGarage un importe negativo (CuotaNegativaException) • En el calculo de ingresos mensuales, cuando el importe de la suma mensual sea menor de 400 euros (VamosALaQuiebraException) MEJORA 3: • Mostrar el listado dela opción 5 ordenado alfabéticamente 8.b.3. Crea una clase llamada CajaRegistradora que implemente la siguiente interfaz: public interface ICajaRegistradora { /* @return Nombre de la caja registradora */ public String getNombre(); /* @return Número de tipos de moneda que hay en la caja. */ public int getNumTipoMonedas(); /**
 * @param tipo
 * @return Devuelve el número de unidades del tipo de moneda pasado como * parámetro. * -1 en el caso en el que el tipo de moneda no sea válido.
 */ public int getUnidadesTipoMoneda(double tipo); /**
 * Ingresa el número de monedas indicado y del tipo indicado. * @param tipo
 * @param unidades
 * @return true si los parámetros son válidos, false si no */ public boolean meterMonedas(double tipo, int unidades); /**
 * Valida un tipo de moneda
 * @param tipo
 * @return true si es válida, false si no */ public boolean monedaValida(double tipo); /**
 * Extrae de la caja el número de unidades del tipo de moneda especificado * @param tipo
 * @param unidades
 * @return true si ha sido posible, false en caso contrario.
 */ public boolean sacarMonedas(float tipo, int unidades); /*Vacía la caja registradora. */ public void vaciarCajaRegistradora(); /*@return Devuelve un array con los tipos de monedas que tiene. */ public double[] getTiposDeMonedas(); /* @return Devuelve el saldo actual de la caja */ public double getSaldo(); }

JYOC - JAVA - EJERCICIOS

54

Crear una clase Prueba e instanciar una caja registradora probar su funcionamiento con el siguiente menú: 1. 2. 3. 4. 5.

Ingresar monedas (Pedirá por teclado tipo y unidad)
 Listar Contenido ( Por cada tipo de monedas, unidades)
 Mostrar saldo.
 Extraer monedas. (Pedirá por teclado tipo y número) Salir.

8.b.4. Cartones de Bingo. Supongamos la siguiente interfaz , encargada de definir el comportamiento de los

cartones usados en el juego del Bingo:

public interface ICarton{ /** * Busca el numero en el carton y o tacha si existe * @param numero es el numero que hay que comprobar si existe en el cartón y * tacharlo si existe * @return true si se ha conseguido tachar el numero */ public boolean tacharNumero(int numero); /** * Comprueba si hay alguna linea completa en el carton * @return true si existe alguna linea completa */ public boolean hayLinea(); /** * Comprueba si están todas las lineas completa en el carton (ergo hay bingo) * @return true si hay bingo */ public boolean hayBingo(); }

Crear un clase JuegoDelBingo que implemente ICarton y que tiene que cumplir estas reglas; • El constructor de la clase recibe como único parámetro una matriz de 3 x 9 , rellena con los números de un cartón (los espacios sin números se representan con un cero) • Los números no se repiten • El carton no se valida en esta clase, se supone que viene al constructor correctamente formado • Se debe crear un metodo estático public bolean cartolValido(int [] [] carton)



que valide un cartón de acuerdo a estas reglas: ✦ el tamaño es 3x9 ✦ no se repitan los números ✦ hay cinco números en cada fila, y 4 huecos ✦ todos los números están en el rango de 1 al 90 ✦ cada columna y fila tienen los números en orden creciente (NO es necesario que cada número ocupe un lugar en su decena, esto es, no hace falta comprobar que del 1 al 9 estén en la primera columna, del 11 al 20 en la segunda, etc) Escribir una clase PruebaBingo que • Cree un cartón (no hace falta que sea aleatorio ni por teclado, puede declararse directamente, por ejemplo; int[][] c = { {0,12,0,0,43,0,60,73,85} , {5,0,22,34,0,55,0,78,0} , {9,0,0,38,45,0,69,0,90} }



Valide el cartón creado

Ejemplo de cartón: 12 JYOC - JAVA - EJERCICIOS

43

60 73 85 55

5 9

22 34 38 45

55

78 69

90

MEJORA 1 Proceso que vaya pidiendo números hasta que se cante linea, y luego vaya pidiendo números hasta que se cante bingo MEJORA 2 Crear un método que cree un cartón con números aleatorios, cumpliendo todas las reglas antes dichas adema de la colocación de cada número en su columna de decenas. 8.b.5. Dada la siguiente Interfaz public interface IAlumno { /** * @return Devuelve el nombre del alumno */ public String getNombre(); /** Añade una nota al alumno 
 * @param nota 
 * @return true si se puede añadir una nota más, false en caso contrario, ya sea * porque no caben más notas o porque la nota no es válida (nota >=0 y = 5 */
 public int getNumeroAprobados();

}

/** Elimina las notas del alumno */ public void borrarNotas();

Crear una clase llamada Alumno que implemente la interface.IAlumno: • Al constructor se le pasa el nombre del alumno. • El alumno inicialmente no tendrá ninguna nota. • El comentario predecesor de cada método en la interface indica su funcionamiento. • El número máximo de notas que puede tener cada alumno es 10. • Las notas no válidas no se añadirán. • Sólo se añadirán las 10 notas primeras válidas. Crear un programa principal que cargue desde teclado un array de 30 Alumnos, con sus nombres y sus notas, y posteriormente los liste. La entrada y salida por consola se realizará de la siguiente manera: 
 Introduzca nombre:
 Luis
 Introduzca notas separadas por espacios:
 1 2 3 5 10 22 56 9 8 5 4 3
 La nota 22 no se pudo añadir, La nota 56 no se pudo añadir Introduzca nombre: Roberto
 Introduzca notas separadas por espacios:
 56
 Introduzca nombre:
 Alfonso
 Introduzca notas separadas por espacios:
 7 8 9 10 11 10 10 5 6 5 7 9
 La nota 11 no se pudo añadir, La nota 9 no se pudo añadir 


JYOC - JAVA - EJERCICIOS

56

Listado de alumnos: 
 Nombre Número Aprobados Media Luis 10 Roberto 2 Alfonso 10 5 5.0 2 5.5 10 7.7

8.b.6. Crea una clase (no final) llamada Demo que tenga dos métodos, uno de ellos final. Crea una subclase

que herede de Demo llamada SubDemo que sobreescriba el método que no es final. Comprueba que el método final no puede ser sobreescrito en la subclase. Comprueba además que el método de la subclase ha sido sobreescrito.

8.c. EJERCICIOS NIVEL ALTO 8.c.1. Crear una clase Carta, que tiene atributos número (int) y palo (int). Crea una clase llamada que tiene

un array de 40 Cartas (baraja española), y que implemente la interfaz INaipes. Crea una clase Prueba para instanciar una Baraja y probar todas sus funcionalidades mediante un menú con elementos a tu elección. public interface INaipes { /**
 * Traduce el número de la carta por su nombre:
 * Ej.:
 * 1 = As de oros
 * 2 = Dos de oros
 * ...
 * 20 = Rey de copas
 * ...
 * @ car Carta a analizar
 * @return El nombre de la carta, o "" si unaCarta no es válido. */ public String traducir(Carta unaCarta); /** * Baraja las cartas que haya en el mazo */ public void barajar(); /** * Extrae una carta al azar de las que haya en el mazo * y disminuye el número de cartas * @return devuelve la carta */ public Carta extraerCartaAlAzar(); /** * Extrae la carta superior del mazo y disminuye el número de cartas * @return devuelve el valor de la carta (del 1 al 40)
 */ public Carta extraerCartaArriba(); /** * Extrae la carta con la posición dada del mazo y disminuye el número de cartas * @param posicion (las posiciones comienzan desde la 1, hasta el número * de cartas que tenga el mazo en cada momento)
 * @return null si no encuentra la posicion o una carta en esa posición
 */ public Carta extraerCarta(int posicion); /** * Añade la carta indicada por parámetro sobre el mazo
 * @param numCarta (las cartas válidas van del 1 al 40)
 * @return false si la carta ya existe, true si se añade correctamente */ public boolean ponerCarta(Carta unaCarta); /** * Devuelve el número de cartas existentes.
 * @return Número de cartas actuales en el mazo. */ public int getNumCartas();

JYOC - JAVA - EJERCICIOS

57

}

JYOC - JAVA - EJERCICIOS

58

9. EJERCICIOS DE MODIFICADORES Y GENERICOS 9.a. EJERCICIOS NIVEL INICIAL 9.a.1. Crear una clase llamada ClaseGenerica con estas características:

• • • • • • • •

Con dos atributos privados llamados a y b de tipo genérico. Al constructor se le pasarán los valores iniciales de a y b. Implementar todos los getters y setters. Crear el método public void intercambiaAB() que intercambia los valores de los atributos a y b. Crear el método public String nombreClase() que devuelve el nombre del tipo de clase con el que se ha instanciado el objeto. Crear una clase aparte con un método main que haga lo siguiente: Instanciar la clase genérica con al menos un tipo Integer y otro String. Probar los métodos.

9.a.1. Crear una clase Utilidades con los siguientes métodos estáticos genéricos: 


• El siguiente método invertirá el orden de los elementos del array: 
 public static void alReves(T[] elementos) • El siguiente método mostrará por consola los elementos del array: 
 public static void muestraVector(T[] elementos) • El siguiente método inicializará el array del primer parámetro con el valor del segundo parámetro. 
 public static void inicializa (T[] elementos, T elemento) • Crear una clase Prueba que pruebe los métodos con un array numérico y otro de tipo String. 9.a.1. Crear una clase llamada Calcula. Implementar los siguientes métodos estáticos, que devolverán en

cada caso el menor o mayor número de los pasados como parámetros. En el caso de las cadenas devolverá la de mayor o menor longitud. 




• • • • •

int mayor(int [] num ) double mayor(double [] String mayor(String [] int menor(int [] num ) double menor(double [] String menor(String []

num) cadena) num) cadena)

Crear una clase aparte con el método main para probar todas las funcionalidades de la clase Calcula. 9.a.2. Hacer una función buscar que localice un elemento en un array de elementos. El array y el numero a

buscar se le pasan como argumentos. Hacer un prueba con números enteros. Hacer la función genérica, para cualquier tipo de objetos. Probarla con varios objetos distintos (si no se usan clases estándar Java o envoltorios, recordar que los objetos han de tener un método equals(obj o) que compara el objeto actual (this) con el objeto que recibe como parámetro, y que este método devuelve true si son iguales y false si no lo son).

JYOC - JAVA - EJERCICIOS

59

9.b. EJERCICIOS NIVEL MEDIO 9.b.1. Crear una clase llamada 


Almacen capaz de guardar n elementos (n se pasará en el constructor), y que no permita valores repetidos. La clase almacén ha de tener los siguientes métodos: /** Añade un elemento a la estructura * @param T * @return true si lo añade, false si ya existe o no cabe */ public boolean anadir(T t) ; 
 /** Elimina la primera aparición de un elemento de la estructura * @param T * @return true si lo elimina, false si no lo encuentra */ public boolean eliminar(T t) ; /** Busca un elemento * @param T elemento a buscar * @return true si lo encuentra, false en caso contrario */ public boolean existe(T t) ; /** Conocer los elementos que hay. * @return array del tamaño ajustado con los elementos ordenados */ public Object[] getElementos() ; /** Conocer cuántos elementos hay. * @return número de elementos que hay */ public int getNumeroElementos() ; /** Conocer el número máximo de elementos. 
 * @return número máximo de elementos que puede haber */ public int getCapacidad() ;

Se proporciona la interface IComparador: public interface IComparador { public boolean esMayor(Object o); public boolean sonIguales(Object o); }



Crear un programa Main que haga lo siguiente: * Instancie un Almacen y guarde Alumnos. * Compruebe el correcto funcionamiento de los métodos. * Instancie otro Almacen y guarde Rectangulos.

JYOC - JAVA - EJERCICIOS

60

NOTA: Almacén y Rectángulo deben modificarse para que implementen la interfaz IComparador 
 9.b.2. Desarrollar un programa que calcule el consumo total de potencia eléctrica consumida por todos los

aparatos eléctricos conectados a nuestro sistema. Para ello hemos de crear una clase que se llame AparatosElectricos, la cual tendrá como atributos el consumo del aparato eléctrico conectado y su estado. Dentro de la misma clase tendremos un atributo el cual nos indicará el consumo total de los aparatos conectados. Las clase tendrá los siguientes métodos: • encenderAparato() el cual nos incrementará el consumo total de potencia y pondrá el estado del aparato a “true”. En el caso de que trataremos de encender un aparato que ya encuentra encendido, en este caso no incrementaremos el valor total. • apagarAparato() el cual nos decrementará el consumo total de potencia y pondrá el estado del aparato a “false”. En el caso de que el aparato ya se encuentre apagado, no decrementaremos el valor total. • ConsultarConsumoTotal() el cual nos devolverá el valor de la potencia total consumida en se momento. • ConsultarEstadoAparato() que nos devolverá “true” o “false” en función de si el aparato está apagado o encendido. • Constructor: El constructor ha de inicializar el valor del consumo del aparato eléctrico conectado. Por ello desde la clase principal se ha de informar al constructor del consumo en watios el aparato eléctrico. 9.b.3. Se tienen en un proyecto las siguientes clases:

public class GranjaAnimal { private E unanimal; public void setAnimal(E x) { unanimal = x; } public E getAnimal() { return unanimal; } } public class Animal{ } public class Gato extends Animal { } public class Perro extends Animal { } Si se ejecutan desde una clase del mismo proyecto estas lineas : a. GranjaAnimal unaGranja = new GranjaAnimal(); b. GranjaAnimal unaGranja = new GranjaAnimal(); c. GranjaAnimal unaGranja = new GranjaAnimal(); unaGranja.setAnimal(new Gato()); d. GranjaAnimal house = new GranjaAnimal(); unaGranja.setAnimal(new Perro());

¿Cuál cree que será la solución? :

JYOC - JAVA - EJERCICIOS

61

• • • •

Fallará en compilar, Compilará con una advertencia, Generará un error en tiempo de ejecución, o ninguna de los anteriores (compilará y correrá sin problemas.)

JYOC - JAVA - EJERCICIOS

62

10.EJERCICIOS COLECCIONES 10.a. EJERCICIOS NIVEL INICIAL 10.a.1. Hacer una colección de tipo List con la clase que desee. La colección debe rellenarse con 10 String.

Luego debe recorrerse para mostrar su contenido con un For, un While y un For-each. 10.a.2. Menú de lista de palabras. Escribe un programa que utilizando una colección ArrayList permita, a

través de un menú, gestionar una lista de palabras. El número de palabras es ilimitado y el orden de las mismas totalmente irrelevante: 
 MENU 1.-Introducir palabra 2.-Listar palabras 3.-Mostrar tamaño 0.-Salir

MEJORA 1: Añadir al menú la opción: 4.-Borrar todas

MEJORA 2: Añadir al menú la opción: 5.-Eliminar palabra

MEJORA 3: Al dar de alta una palabra (introducirla en la lista) no se permitirán palabras repetidas, esto es, no se puede dar de alta una palabra si ya existe 10.a.3. Menú de lista de enteros. Hacer el mismo ejercicio anterior, pero donde la lista no tendrá palabras

sino números enteros 10.a.4. Separar listas. Hacer un ejercicio que pida al usuario 9 números y los guarde en un arrayList (llamado

todosLosNumeros) Crear luego dos arrayList nuevos (llamados soloPares y soloImpares). Colocar en el array soloPares los números de todosLosNumeros que sean pares, y en el arrayList soloImpares los números de todosLosNumeros que sean impares Informar finalmente de cual de los dos arraylist (soloPares o soloImpares) tiene mas elementos Hacer finalmente el mismo ejercicio pero en vez de usar ArrayList, usar TreeSet 10.a.5. Escribe un método que elimine los pares de una colección de cadenas arrayList. Por ejemplo:

ArrayList inicial: 5 6 7 19 2 4 ArrayList final: 6 19 4
 El prototipo de la función es la siguiente: 
 public static eliminaParesArrayList(ArrayList listaCadenas)

10.a.6. Escribe un método que a partir de una lista de enteros (ArrayList) y mueva el mínimo valor al frente

de la lista preservando el orden de los elementos. Por ejemplo, si tenemos una lista con los valores: {3, 8, 92, 4, 2, 17, 9}, si llamamos a este nuevo método, la lista final tendrá los siguientes valores: {2, 3, 8, 92, 4, 17, 9}. Se asume que la lista debe almacenar al menos un valor. 10.a.7. Escribe un método que reciba como parámetro un ArrayList de Strings y reemplace cada cadena en

dos iguales. Es decir, si la lista de cadenas es {“como”, “estas”, “tu”}, la nueva lista contiene los valores {“como”, “como”, “estas”, “estas”, “tu”, “tu”}. El prototipo de la función es el siguiente: public static void doubleList(ArrayList listaCadenas)

JYOC - JAVA - EJERCICIOS

63

10.a.8. Escribe un método en Java que tome como parámetro un ArrayList de cadenas y elimine los

duplicados de la lista, devolviendo la nueva lista sin duplicados. Por ejemplo, si la lista contiene los valores: {“ser”, “ser”, “es”, “no”, “o”, “pregunta”, “que”, “el”, “a”, “a”}, la lista final deberá contener los valores: {“ser”, “es”, “no”, “o”, “pregunta”, “que”, “el”, “a”}. El prototipo del método debe ser el siguiente: public ArrayList eliminaDuplicados(ArrayList listaElementos)

10.a.9. Escribe un método que dada una colección Set de Strings, retorne la longitud de la cadena más larga

de dicho conjunto. Si el método recibe una colección vacía, debe retornar 0. El prototipo de la función es el siguiente: public static int maxLength(Set setStrs)

10.a.10. Escribe un método que dado una colección List de enteros como parámetro, devuelva el número de

enteros únicos de la lista. Por ejemplo, si la lista contiene los valores {3, 7, 3, -1, 2, 3, 7, 2, 15, 15}, el método debe retornar el valor 5. Utiliza una colección Set para el almacenamiento temporal en este ejercicio. El prototipo del método tiene que ser el siguiente: public static int countUnique(List listaEnteros)

10.a.11. Escribe un método que tome dos colecciones List de enteros y devuelva el número de enteros único

que tenga ambas listas. Por ejemplo, si una lista contiene los valores {3, 7, 3, -1, 2, 3, 7, 2, 15, 15} y la otra lista tiene los valores {-5, 15, 2, -1, 7, 15, 36}, el método debe retornar 4 (los elementos -1, 2, 7 y 15 se encuentran en ambas listas). El prototipo de la función es el siguiente: public static int countCommon(List listaEnteros1, List listaEnteros2)

Utiliza uno o más colecciones Set para el almacenamiento temporal. 10.a.12. Escribe un método que tenga como parámetro un Map y devuelva un nuevo

Map que sea el invertido del original. Si hay más de una clave en el Map original que tiene el mismo valor, el valor de la clave del Map que se devuelve será el último valor iterado del Map. Por ejemplo, si el método recibe como parámetro el siguiente Map: {42=Marty, 81=Sue, 17=Ed, 31=Dave, 56=Ed, 3=Marty, 29=Ed}, el método debe retornar el siguiente Map {Marty=3, Sue=81, Ed=29, Dave=31}. El prototipo de la función es el siguiente: public static Map reverse(Map mapStr)

10.a.13. Implementa un método en Java que a partir de un ArrayList de String ́s, retorne un Map ordenado

que asocie cadenas con el número de repeticiones en la lista. Por ejemplo, si el método es llamado con la lista {“hola”, “examen”, “hola”} retornará un Map ordenado que asociaría a la cadena “examen” el valor 1 y a la cadena “hola” el valor 2. El prototipo del método es el siguiente: 


public static Map retornaMapAsociado(List listaStr)

10.a.14. Escribe un método en Java que tenga como parámetro un Map que asocia cadenas con enteros y

que devuelva un conjunto Set de cadenas que tienen asociado un número par. El prototipo de la función es el siguiente: public static Set listaAsociadaNumeroPar(Map map)

JYOC - JAVA - EJERCICIOS

64

10.a.15. La moda es el valor (o valores) de una serie de números que más veces se repite. Por ejemplo, la

moda de la serie {2, 3, 3, 3, 4, 5, 4, 6, 4} es {3, 4}. En el caso de que no se repita ningún valor la serie no tiene moda. Implementa un método que reciba como parámetro una lista de números de tamaño variable y devuelva una lista que contenga la moda de dicha serie. El prototipo de la función tiene que ser el siguiente: 


public static List obtieneListaModa(List listaElementos)

10.a.16. Escribe un método genérico que reciba como parámetro una colección de elementos y retorne una

nueva colección formada por los elementos de la original sin repetidos. El prototipo del método debe ser el siguiente: public static Set retornaElementosSinRepeticion(Collection listaElementos)

10.a.17. Escribe un programa un método genérico que acepte como parámetro un Map y

devuelva un Set con los valores almacenados en el Map. EL prototipo de la función tiene que ser el siguiente: public static Set retornaElementosMap(Map map)

10.a.18. Crear la clase MiTuiter, con atributos Vector, y con los métodos:

que añade un texto al vector que elimina el texto numeroDeOrden del vector • void consultarMensajes() que lista por consola todos los textos Hacer un programa Main que cree objetos de las clases y pruebe los métodos •

void anadirMensaje(String m)



void borrarMensaje(int numeroDeOrden)

10.a.19. Crear la clase Mensaje, con atributos privados String texto, int telefonoOrigen.

Crear la clase MiWasap, con atributos Vector, y con los métodos: • void anadirMensaje(Mensaje m) que añade un mensaje al vector de mensajes • void anadirMensaje(int numeroDeOrden) que elimina el mensaje numeroDeOrden del vector de mensajes • void consultarMensaje() que lista por consola todos los mensajes Hacer un programa Main que cree objetos de las clases y pruebe los métodos

10.b. EJERCICIOS NIVEL MEDIO 10.b.1. Gestión de la Vendedores

Crea una clase Vendedor con los siguientes atributos y constructor: private String nombre; 
 private double sueldo; public Vendedor(String nombre, double sueldo)

Además tendrá los siguientes métodos: public String getNombre() public double getSueldo()

Escribe un programa que utilizando una colección HashSet permita, a través de un menú, gestionar una lista de empleados de número ilimitado donde no se permitirán nombres de vendedores repetidos y siendo el orden de los mismos totalmente irrelevante Opciones
 1.-Introducir vendedor


JYOC - JAVA - EJERCICIOS

65

2.-Listar vendedor
 3.-Eliminar vendedor
 4.-Borrar todos
 5.-Mostrar número de vendedor 6.-Buscar vendedor
 7.-Salir

• Para introducir un vendedor hará falta también introducir su sueldo. Al listar los vendedores se mostrará su nombre y sueldo. • Para eliminar un vendedor será necesario introducir su nombre. • El programa no será sensible a mayúsculas. 10.b.2. Crear HashSet de palabras. Escribe un programa que utilizando una colección HashSet permita, a

través de un menú, gestionar una lista de palabras de número ilimitado donde no se permitirán palabras repetidas y siendo el orden de las mismas totalmente irrelevante: Opciones 1.-Introducir palabra 2.-Listar palabras 3.-Eliminar palabra 4.-Borrar todas 5.-Mostrar tamaño 6.-Buscar 7.-Salir

MEJORA1: Cambiar el modelo de tipo de almacenamiento para que los elementos se ordenen alfabéticamente 10.b.3. Escribe un programa que utilizando una colección VectorList lea desde teclado una serie de palabras:

• El número de palabras será indefinido y serán leídas en una única línea separadas por espacios. Se 
 permitirán palabras repetidas. Después mostrará las palabras ordenadas alfabéticamente. 
 Posteriormente las revolverá de manera aleatoria y las volverá a mostrar. • A continuación se pedirá una palabra desde teclado que será insertada en la posición 0 para mostrar de nuevo la lista. • Luego se pedirá por teclado una palabra a eliminar y de nuevo será mostrada la lista resultante. Se eliminará solamente la primera coincidencia encontrada. • Después se eliminará la última palabra de la lista y se mostrará de nuevo la lista. • Finalmente se mostrarán la primera y la última palabra por orden alfabético. • Ejemplo de funcionamiento: 
 Introduce palabras separadas por un espacio: 


uno dos tres cuatro cinco seis siete ocho 
 Las palabras introducidas y ordenadas alfabéticamente han sido: cinco cuatro dos ocho seis siete tres uno
 Las palabras introducidas y revueltas han sido:
 tres uno ocho cuatro seis dos cinco siete 
 Introduce una palabra a introducir en la posición 0: 
 cero 
 Las palabras introducidas después de la inserción: cero tres uno ocho cuatro seis dos cinco siete Introduce una palabra a eliminar:
 ocho 
 Palabra eliminada.
 Las palabras introducidas después de la eliminación:
 cero tres uno cuatro seis dos cinco siete
 Las palabras introducidas después de eliminar la última palabra: cero tres uno cuatro seis dos cinco
 La primera palabra por orden alfabético es cero
 La última palabra por orden alfabético es uno

10.b.4. Crear un programa que utilizando una colección TreeMap gestione un grupo de alumnos y las notas

de cada una de las tres evaluaciones a través del siguiente menú de opciones: JYOC - JAVA - EJERCICIOS

66



Opciones:
 1.- Listar alumnos
 2.- Introducir alumno
 3.- Introducir nota de alumno 4.- Eliminar alumno
 5.- Eliminar todos
 6.- Salir

• El número de alumnos es indefinido.
 • Por cada alumno a introducir se pedirá por teclado un número de expediente, que será único por alumno, y el nombre.
 • Los alumnos se listarán de manera ordenada por número de expediente.
 • En el listado de alumnos aparecerá el número de expediente, el nombre y las notas de cada una de las evaluaciones, en caso de existir.
 • Al introducir la nota de un alumno se pedirá por teclado el número de expediente, la evaluación y la nota, que será un número entero entre 0 y 10.
 • Para eliminar un alumno se pedirá por teclado el número de expediente.

10.b.5. Escribe un programa que utilizando una colección TreeSet permita gestionar objetos de la clase

Jugador:
 La clase Jugador estará definida de la siguiente manera: Atributos: private String nombre; private int estatura;

Constructor:


public Jugador(String nombre, int estatura)

Métodos:


public String getNombre() public int getEstatura()

El programa principal ofrecerá el siguiente menú de opciones: Opciones: 1.-Introducir jugador 2.-Listar jugadores 3.-Eliminar jugador 4.-Borrar todos 5.-Salir

El número de jugadores es indeterminado.
 Los nombres no se podrán repetir y serán insensibles a mayúsculas/minúsculas. La lista estará en todo momento ordenada alfabéticamente por el nombre. Para eliminar un jugador se pedirá por teclado el nombre del mismo. 10.b.6. Escribe un programa que utilizando una colección TreeSet lea desde teclado una serie de números

enteros: • El total de números es indefinido y serán leídos en una única línea y separados por espacios. • Se podrán introducir números repetidos pero no serán almacenados, aunque sí se mostrará un aviso por cada repetido. • Ante cualquier error en la lectura de un número, se procesará el número siguiente. • Finalmente se mostrarán los números ordenados ascendentemente y sin repetir. • Ejemplo de funcionamiento:

Introduce números: 
 10 5 X 99 0 5 40 12 7 340 87 33 2888 9 
 El número 5 está repetido.
 Los números ordenados ascendentemente y sin repetidos son: 0 5 7 9 10 12 33 40 87 99 340 2888

10.b.7. Escribe un programa que utilizando un HashMap lea desde teclado una serie de productos: • Compuestos por un código numérico entero que deberá ser único y una descripción.

JYOC - JAVA - EJERCICIOS

67

• Si se introdujera un código repetido, se actualizará la descripción del producto.
 El orden es irrelevante.
 Finalizará la inserción de productos cuando se introduzca el código -1. • Una vez introducidos se listarán con su código y descripción, indicando además en una cabecera el número total de inserciones.
 Después se volverán a listar, pero preguntando por cada uno de ellos si se desea borrar o no.
 Finalmente se volverán a listar todos los productos salvo los que hayan sido borrados. • Ejemplo de funcionamiento: Código: (-1 para terminar)234 Descripción:Magdalena
 Nuevo producto insertado. Código: (-1 para terminar)67 Descripción:Bizcocho Nuevo producto insertado. Código: (-1 para terminar)85 Descripción:Galleta
 Nuevo producto insertado. Código: (-1 para terminar)67 Descripción:Bizcocho de chocolate Descripción actualizada. Código: (-1 para terminar)-1
 Total productos insertados (3):
 Código : 85 Valor : Galleta
 Código : 234 Valor : Magdalena
 Código : 67 Valor : Bizcocho de chocolate Borrado de productos: Código: 85 Descripción: Galleta ¿Borrar? (s/n):s
 Código: 234 Descripción: Magdalena ¿Borrar? (s/n):n
 Código: 67 Descripción: Bizcocho de chocolate ¿Borrar? (s/n):n Productos restantes (2):
 Código : 234 Valor : Magdalena
 Código : 67 Valor : Bizcocho de chocolate

10.b.8. Escribir un programa que use una baraja de cartas españolas orientado a objetos.

Una carta tiene un número entre 1 y 12 (el 8 y el 9 no los incluimos) y un palo (espadas, bastos, oros y copas) La baraja estará compuesta por un conjunto de cartas, 40 exactamente. Las operaciones que podrá realizar la baraja son: • barajar: cambia de posición todas las cartas aleatoriamente • siguienteCarta: devuelve la siguiente carta que está en la baraja, cuando no haya más o se haya llegado al final, se indica al usuario que no hay más cartas. • cartasDisponibles: indica el número de cartas que aún puede repartir • darCartas: dado un número de cartas que nos pidan, le devolveremos ese número de cartas (piensa que puedes devolver). En caso de que haya menos cartas que las pedidas, no devolveremos nada pero debemos indicárselo al usuario. • cartasMonton: mostramos aquellas cartas que ya han salido, si no ha salido ninguna indicárselo al usuario • mostrarBaraja: muestra todas las cartas hasta el final. Es decir, si se saca una carta y luego se llama al método, este no mostrara esa primera carta.

10.c. EJERCICIOS NIVEL ALTO 10.c.1. El juego del tubo mágico consiste en una serie de bolas numeradas del 1 al 4 que son introducidas en

un tubo mágico. El tubo mágico tiene una capacidad de bolas par y mayor o igual a 2. Funcionamiento: • El jugador introduce bolas de manera consecutiva que podrán tener el número 1, 2, 3 ó 4, según decida. Las bolas se introducen por el final del tubo. Si la bola introducida coincide en número con la última existente en el tubo, ambas bolas desaparecen. En caso contrario la bola permanece en el tubo. • La partida termina cuando: JYOC - JAVA - EJERCICIOS

68

1. Se llena completamente el tubo. El jugador pierde. 2. Se vacía del todo el tubo. El jugador gana. Crear una clase llamada TuboMagico que implemente la siguiente interface ITubo. La clase no puede tener ningún otro método más. Al constructor de TuboMagico se le pasará la capacidad, que deberá ser par y mayor de 2. public interface ITubo { /** * Introduce una bola en el tubo si cabe y es válida. * @param bola Valores válidos 1, 2, 3 ó 4 */ public void meterBola(int bola);

}

/** * @return Número de bolas que contiene el tubo. */ public int numeroBolas();

Crea una clase Main que instancie un TuboMagico y permita jugar una partida según las reglas de funcionamiento indicadas.


JYOC - JAVA - EJERCICIOS

69

11.EJERCICIOS DE EXCEPCIONES 11.a. EJERCICIOS NIVEL INICIAL 11.a.1. Si se tiene la siguiente clase: import java.util.Scanner; public class Excepciones { public static void main(String[] args){ final int NUM = 5; 
 int[] enteros = new int[NUM]; 
 int posicion = 0; Scanner sc = new Scanner(System.in); int cont = 0; 
 int divisor = 0; 
 while(cont < NUM){ System.out.print("Introduce una posición del array:"); posicion = Integer.parseInt(teclado.nextLine()); System.out.print("Introduce un divisor:"); 
 divisor = Integer.parseInt(teclado.nextLine()); enteros[posicion] = 5 / divisor; cont++; } System.out.println("El contenido del array de enteros es:"); for(int valor : enteros) System.out.println(valor); } } }

Modificar el código para que el programa capture las excepciones que se pudieran producir, mostrando los mensajes correspondientes a cada error para después continuar con la ejecución del programa. 11.a.2. Realizar un método leerInt() que, utilizando la clase Scanner, permita repetir la petición de datos por

teclado de un número hasta que lo introducido por el usuario sea realmente un número entero válido. Guardar el método como estático en una clase de Utilidades. Crear una clase Prueba con un main que llame y compruebe el funcionamiento del método anterior.

11.b. EJERCICIOS NIVEL MEDIO 11.b.1. Crear la clase Alumno con los siguientes atributos private String nombre; private int edad; private double nota;

Y el siguiente constructor, que deberá lanzar una excepción cuando la edad sea inferior a 0. public Alumno(String nombre, int edad) ...

La clase tendrá los siguientes métodos: public double getNota() 
 public void setNota(double nota) public String getNombre() 
 public int getEdad()

El método setNota no deberá asignar notas inferiores a 0 o superiores a 10, y se protegerá lanzando una excepción cuando la nota sea errónea. Crear una clase con un método main que lea desde teclado un array de 5 alumnos con sus notas y posteriormente muestre la información de cada uno de ellos. Se deberán capturar todas las excepciones que se pudieran generar y mostrar los mensajes correspondientes a cada tipo de excepción. MEJORA 1: Añade las siguientes excepciones: • EdadNoValidaException : Añadirla al código anterior para que sea lanzada cuando se intenta construir un alumno con edad inferior a 0. Asígnale un mensaje de error. JYOC - JAVA - EJERCICIOS

70

• NotaNoValidaException, que será lanzada cuando la nota pasada como parámetro al método setNota no sea válida (inferior a 0 o superior a 10). Asígnale un mensaje de error. • Modificar los bloques try-catch del método main del código anterior para que sean capturadas exactamente esas excepciones y mostrados los mensajes de error. 11.b.2. Crear un método que recibe dos números y calcula la diferencia entre ambos. Emite excepciones si:

• • •

Algún número es menor que cero (MenorQueCeroException) La diferencia entre ambos números es mayor de 50 (DiferenciaErrorException) Probar el método mediante la llamada desde otra clase

11.b.3. Crear un método que lee las lineas que tiene un fichero de texto, cuyo nombre recibe como un

parámetro de tipo String. • El método devuelve las palabras que tiene el fichero. • Provoca una excepción SinLineasException si el fichero no tiene contenido 11.b.4. Crear un método que recibe un array, dos enteros (bordeInferior y bordeSuperior) y dos char (orden y

parOTodos) y devuelve otro array, con los números del primer array que estén dentro de del intervalo bordeInferior-bordeSuperior (inclusive ambos). Otras reglas: • El valor del parámetro orden puede ser ‘c’ o ‘d’, para construir el nuevo array ordenado creciente o decrecientemente • El valor del parámetro parOTodos puede ser ‘t’ o ‘p’, para construir el nuevo array incluyendo todos los números (t) o solo los pares (p) creciente o decrecientemente • Hay que mostrar mensajes de error: ‣ Si el límite inferior es mayor o igual que el superior. ‣ Si los caracteres introducidos no están entre los esperados. • Probar el método mediante la llamada desde otra clase 11.b.5. Crear un método q llamado compruebaDni, que comprueba si un DNI que recibe como parámetro

es correcto o no. Este método lanza la excepción NumberFormatException si lo que se le pasa como parámetro no es un entero, y además, crea y lanza las siguientes excepciones personalizadas: • LongitudInvalidaException. Con mensaje "El DNI debe tener una longitud total de 9 caracteres”. • LetraInvalidaException. Con mensaje "La letra del DNI no es válida”. • LetrasNoValidasException. Con mensaje "Hay letras donde debería haber dígitos”. El método compruebaDNI, cada vez que alguna comprobación del DNI no sea correcta, propagará/ lanzará la excepción adecuada (LongitudInvalidaException, LetraInvalidaException, LetrasNoValidasException) y serán los métodos que llamen a compruebaDNI los que se encarguen de mostrar el mensaje de error correspondiente, capturando las excepciones y mostrando el mensaje de cada una de ellas mediante el método e.getMessage(). Probar todos los casos.

JYOC - JAVA - EJERCICIOS

71

12.EJERCICIOS DE RECURSIVIDAD 12.a. EJERCICIOS NIVEL INICIAL 12.a.1. Escribir un método recursivo que calcule una multiplicación por sumas sucesivas 12.a.2. Escribir un método recursivo que reciba un número positivo n y devuelva la cantidad de dígitos que

tiene. 12.a.3. Crear un método recursivo static int potencia (int a, int n) que calcule a*n . Crear una clase Prueba

donde demostrar el método 12.a.4. Calcular el cociente de dos números enteros de forma recursiva. 12.a.5. Pasar de decimal a binario de forma recursiva. 12.a.6. Calcular el número de cifras de un número entero de forma recursiva. 12.a.7. Calcular la suma desde 1 hasta un número entero N de forma recursiva. 12.a.8. Sumar dos números enteros de forma recursiva. 12.a.9. Calcular el resto de la división de forma recursiva

12.b. EJERCICIOS NIVEL MEDIO 12.b.1. Construir un método recursivo int factorial (int num) que calcule el factorial de n. Crear una clase

Prueba donde demostrar el método 12.b.2. Crear un método recursivo static int maximo (int t[], int pos) que calcule el valor máximo del array

pasado como argumento. Crear una clase Prueba donde demostrar el método 12.b.3. Escribir un método recursivo que encuentre el elemento mayor de un ArrayList. 12.b.4. Escribir un método recursivo para escribir dos veces los elementos que aparecen en un String (o de

un array). Ejemplo con un String: doblar (“1, 3, 3, 7”, 0)

da como resultado

“1, 1, 3, 3, 3, 3, 7, 7”

Ejemplo con un array: int [] arr = {1,3,3,7} ;



doblar (arr, 0)

da como resultado “1, 1, 3, 3, 3, 3, 7, 7”

MEJORA 1: El método no imprime los números, sino que devuelve un String con los números doblados JYOC - JAVA - EJERCICIOS

72

12.b.5. Escribir un método recursivo que calcule la secuencia de Fibonacci 12.b.6. Multiplicación por el método ruso. Escribir un método recursivo que tome dos enteros k y w, que

devuelva k veces w utilizando el método ruso. Este método ruso consiste en: 1) Hacer dos columnas. Escribir el número más grande en la primera columna y el más pequeño en la segunda. 2) En la primera columna, dividir el número por 2 repetidamente hasta llegar a 1. En la segunda columna, multiplicar el número por 2 hasta que tenga las mismas filas que en la primera columna. 3) Tachar las filas cuyo valor en la primera columna sea un número par (x% 2 ==0) 146

37

73 36

74 148

18 9 4

296 592 1184

2 1

2368 4736

4) Finalmente, sumar los números no tachados en la segunda columna. Resultado = 74+592+4736 = 5402 La solución recursiva usará un método al que se le pasen los dos números a multiplicar, y se llamará a sí misma recursivamente, dividiendo por dos el primer argumento, y multiplicando por dos el segundo. Una vez sabido esto, las claves están en: - ¿Cuál es el caso base? - ¿Cómo aplicarás el punto 4 “sumar los números en la segunda columna” al recibir el resultado de la llamada recursiva? Piensa en lo que ocurre en cada caso: • Si estás en “mult(9, 592)”, “mult(4,1184)” te va a devolver 4x1184=4736 (ya que sabes que te va a devolver el producto correcto), pero tienes que devolver 9x592=5328. • Si estás en “mult(4, 1184)”, “mult(2,2368)” te va a devolver 2x2368=4736, que es exactamente lo que tienes que devolver.

12.c. EJERCICIOS NIVEL ALTO 12.c.1. Crear un método recursivo int busca (int t[], int elem, int primero, int ultimo) que realice la búsqueda

dicotómica en un array. Crear una clase Prueba donde demostrar el método. 12.c.2. Escribir un método que recibe un objeto File que es un directorio, y lista los contenidos del mismo,

pero si este contiene directorios, lista también su contenido, y si contiene más directorios, igualmente, y así sucesivamente 12.c.3. Escribir un método recursivo calcule el n-ésimo número triangular

(en el caso de n, sería 1 + 2 + 3 + ... + n). 12.c.4.Escribir un método recursivo que reciba como parámetros, al menos, dos strings, y devuelva una lista

con las posiciones en donde se encuentra el segundo dentro del primero. Ejemplo: Al ejecutar el método con esta llamada: dondeEsta(“Un coco y coco sin Coco", “co") da como salida : [3, 5, 10, 12, 21]

JYOC - JAVA - EJERCICIOS

73

12.c.5.Escribir un método recursivo que busque un número en un array. Debe devolver la posición en que se

encuentra la primera aparición del número en el array, o -1 si no se encuentra 12.c.6.Escribir un método recursivo que invierta un número positivo, por ejemplo, si se le pasa al método el

número 4358, debe devolver el número 8534 (un número, no un String)

JYOC - JAVA - EJERCICIOS

74

13.EJERCICIOS DE PERSISTENCIA - FICHEROS CORRIENTES 13.a. EJERCICIOS NIVEL INICIAL 13.a.1. Escribe un programa que muestre por pantalla, linea a linea, el contenido de un fichero de texto,

pasado como parámetro desde línea de comando. 13.a.2.Escribe un método que recibe un String que es el nombre de un fichero, y nos devuelve el numero de

lineas que tiene el fichero. Si el fichero no existe, devuelve el numero -1. 13.a.3. Escribe un programa que ordene alfabéticamente las líneas de texto de un fichero pasado como

parámetro. Puede haber líneas repetidas. 13.a.4.Escribe un programa que añada al final de un fichero de texto unas líneas con las siguientes

estadísticas del propio fichero:

------------------------Número de líneas: XX Número de palabras: XX

13.a.5. Ejercicio Censura en ficheros: Se necesita crear una clase censura con un método 'aplicaCensura()'

que modifique ciertas palabras de una fichero. El método toma una fichero de texto de entrada y compara sus palabras contra un array de palabras prohibidas (el cual también se recibe por parámetro). Si encuentra una palabra prohibida, la sustituye por “*******”. El método devuelve un nuevo fichero creado con la censura aplicada. Cread una clase Prueba que compruebe el uso del método. 13.a.6.Crear una clase con un método contarPalabras(String

nombrefich)

que cuente las palabras existentes

en un archivo de texto cuyo nombre es el pasado como parámetro. 13.a.7. Se piden continuamente nombres de ficheros/directorios y se muestra si existen o no, y si son

directorios o ficheros. Los ficheros/directorios pueden escribirse con su path o no. Se acaba cuando se indican tres ficheros seguidos inexistentes 13.a.8.Se tiene una colección de objetos de la clase Currante (clase que tiene dos atributos, nombre y edad).

Guardar en un fichero binario la colección. Leer posteriormente el fichero creado, y escribir en un nuevo fichero binario solo aquellos currantes que son menores de edad 13.a.9.Crea una aplicación que pida por teclado un número y el nombre de un fichero. Este fichero se creará

conteniendo tantos valores aleatorios (entre 10 y 20) como el número solicitado previamente. Se ha de crear el fichero usando DataOutputStream. Posteriormente se lee el fichero con DataInputStream y se muestra su contenido por pantalla. MEJORA 1: Cada vez que ejecutemos la aplicación añadiremos números al fichero sin borrar los anteriores. 13.a.10. Realizar el ejercicio anterior, pero guardando y leyendo cada objeto de Coche como un objeto

único, ObjectOutputStream y ObjectInputStream JYOC - JAVA - EJERCICIOS

75

13.a.11.Crea un programa que lea los primeros 54 bytes de un fichero BMP (su cabecera) y compruebe si los

dos primeros bytes de esos 54 corresponden a las letras B y M. Si no es así, mostrará el mensaje "No es un BMP válido"; si lo son, escribirá el mensaje "Parece un BMP válido” 13.a.12.Crear un programa que pida al usuario el nombre de un fichero y una palabra a buscar en él. Debe

mostrar en pantalla todas las líneas del fichero que contengan esa palabra, y la posición donde se encuentra dentro de la línea.

13.b. EJERCICIOS NIVEL MEDIO 13.b.1. Escribe un programa que reciba desde línea de comandos tres parámetros:

• El primero será el nombre de un fichero de texto. • Los dos siguientes serán cadenas de caracteres. • El programa deberá crear un fichero con el mismo nombre que el primero, pero terminado en “.new”, y cuyo contenido será el del fichero del primer parámetro, pero habiendo sustituido todas las apariciones de la cadena pasada como segundo parámetro por la cadena pasada como tercer parámetro. 13.b.2. Escribe un método que recibe por parámetros el nombre de un fichero de texto. El programa nos

mostrará por cada palabra contenida en el fichero el número de veces que aparece. Se mostrarán además ordenadas de mayor a menor frecuencia de aparición. 13.b.3. Escribe un programa que partiendo de un fichero de texto origen que contiene por cada línea un

número entero, lo modifique de manera que aparezcan los números ordenados ascendentemente y sin repetir. El nombre del fichero será leído en forma de argumento de ejecución. El fichero podría contener líneas que no contengan números, en cuyo caso serán omitidas. 13.b.4.Escribir un programa que extraiga el contenido de un fichero binario, copiando en un fichero de texto

todo lo que sean caracteres imprimibles (consideremos imprimibles todas las letras desde la A hasta la Z -mayúsculas y minúsculas-, junto con el espacio en blanco). 13.b.5. Escribe un programa que lea dos nombres de ficheros de texto como argumentos de ejecución. El

programa creará un fichero con el nombre especificado en segundo lugar. Este fichero creado tendrá el mismo contenido que el fichero especificado en primer lugar, pero con la palabra más frecuente en mayúsculas. El fichero original sólo contendrá minúsculas.
 13.b.6. Realizar un programa para controlar la venta de coches. Se quieren controlar tanto la venta de

coches usados como nuevos. La información para los coches se guarda en un fichero dentro del mismo proyecto. La clase Coche tendrá la siguiente información:  • Modelo.  • Año de fabricación.  • Kilómetros conducidos.  • Precio. Deberá tener:  • Constructor  • getters y setters necesarios JYOC - JAVA - EJERCICIOS

76

 • método toString sobrescrito  • un método llamado equalsTo(Coche c) que compare cada uno de los atributos del coche que recibe como parámetro con los suyos propios y devuelva true si son todos iguales y false en caso contrario. También es necesaria una clase GestionCoches que controle toda la gestión de los coches en el fichero. El fichero guarda en formato binario la información de los coches (modelo, año fabricación, kilómetros y precio) utilizando las clases DataInputStream y DataOutputStream. Esta clase deberá tener:  • Constructor: que recibe como parámetro el nombre del fichero en el que se guarda toda la información de los coches.   • Método int contarNuevosCoches(): devuelve el número de coches nuevos que hay en el fichero (son los que tienen los kilómetros a 0).  • Método Coche cocheMasCaro(): devuelve el coche más caro de todos los que hay en venta.  • Método void anadirCoche(Coche c): añade un nuevo coche al fichero.  • Método void eliminarCoche(Coche c): elimina el coche del fichero. Realiza las interfaces necesarias para simular la venta de coches. El programa tendrá las siguientes opciones:  1. Añadir coche para vender: se deben introducir todos los datos de un coche y añadirlo al final del fichero.  2. Vender coche: se muestra un listado de todos los coches que hay en venta con un numero cada uno. "Vender” que lo que hace es eliminar del fichero los coches que se hayan seleccionado.  3. Mostrar el coche más caro.  4. Mostrar cuántos coches nuevos hay a la venta. 13.b.7. Realizar un programa que gestione un diccionario español/inglés.

Las palabras estarán guardadas en un fichero (un único fichero, como String). Cada linea contiene un par de valores (vocablo español, vocablo ingles) separados por coma. Cuando se introduzca una palabra en el campo de texto de español, leerá el fichero buscando la palabra: • Si la encuentra en el fichero, devuelve la traducción. • Si no la encuentra, preguntará si desea añadirla al diccionario y si dice que sí, le pedirá cuál es su traducción en inglés y la añadirá al fichero. Las consultas y búsquedas se hacen siempre sobre el mismo fichero, esto es, no se debe guardar en colección alguna el contenido del fichero. 13.b.8.Escribe un método que recibe en un String un directorio pasado como parámetro. El método

mostrará el contenido del mismo, indicando por cada elemento si se trata de un fichero o un directorio. Crear un main en una clase distinta para invocar y probar el método. 13.b.9.Los ficheros textos1.txt y textos2.txt contienen un grupo de palabras por cada línea, separadas las

palabras por comas, pudiendo las palabras estar repetidas en el mismo fichero y también en ambos ficheros. Escribir un método que muestre por consola, las cadenas que NO son comunes a los dos ficheros, y sin repetir. No importa el orden en el que sean mostradas. Cada fichero solo podrá leerse una vez. Ejemplo: Contenido del fichero textos1.txt cero, uno dos, tres, siete tres cuatro, dos nueve uno, cero

JYOC - JAVA - EJERCICIOS

77

Contenido del fichero textos2.txt diez, uno, cuatro dos, once dos, once

Salida por consola del programa: tres siete nueve cero diez once

13.b.10. Crear una clase que contenga datos de un vehículo: matricula(String), marca (String),

tamanoMaletero (double) y modelo(String). Crear 5 objetos de la clase, y almacenarlos en un fichero binario, uno a uno los atributos usando DataOutputStream. Los datos se irán añadiendo al fichero (no se sobrescriben) cada vez que ejecutemos la aplicación. Solicitar posteriormente al usuario un numero por teclado. Indicar (leyendo el fichero con DataInputStream ) la información completa de cada coche cuyo valor en tamanoMaletero supere el numero solicitado al usuario.

13.c. EJERCICIOS NIVEL ALTO 13.c.1. Escribe un programa al que se le pase como argumentos de ejecución dos ficheros de texto. El

programa nos dirá si los ficheros son idénticos o no. En el caso de ser distintos, se indicará además el número de la primera línea en la que son distintos. 13.c.2. Escribe un método que busque una cadena dentro de ficheros de texto contenidos en un directorio.

En el directorio donde se busca solo se analizan los ficheros, no los subdirectorios que pueda contener. El método tendrá esta forma; void buscarEnDirectorio(String cadenaABuscar, String directorioDeBusqueda);

Por ejemplo, esta será la llamada al método para buscar la palabra Manzana en todos los ficheros que existan en el directorio c:/ejercicios/java buscarEnDirectorio(“Manzana”, “c:/ejercicios/java”);

Por cada resultado encontrado mostrará por consola el nombre absoluto del fichero y la línea en la que ha encontrado la primera aparición, y continuará buscando en el siguiente fichero. Si no hubiera encontrado nada en ningún fichero, el programa deberá indicarlo con un mensaje. MEJORA 1: Añadir al método un parámetro mas, la extensión de los ficheros que se deseen buscar, y que filtre que los archivos donde se busca la palabra tengan dicha extensión: void buscarEnDirectorio(String cadenaABuscar, String directorioDeBusqueda, String extension);

13.c.3. Se tiene una colección de objetos de la clase Currante (clase que tiene dos atributos, nombre y edad).

Guardar en un fichero binario la colección. Leer posteriormente el fichero creado, y escribir en un nuevo fichero binario todos los currantes ordenados por edad 13.c.4. Se creará la clase Fruta, con atributos a gusto del alumno. De ella se crearán dos clases que heredan

de Fruta, Manzana y Pera, con atributos a gusto del alumno. Se creará un ArrayList de objetos Fruta, que contendrá (polimórficamente) objetos de Manzanas y Peras. Se creará un método que recibe el ArrayList y escribe en un fichero binario la colección. JYOC - JAVA - EJERCICIOS

78

Se creará otro método que lea el fichero anterior, y guarde en dos nuevos ficheros distintos, las manzanas en uno y las peras en el otro. 13.c.5. Crear un programa que ordene las cantidades de productos existentes en un fichero llamado

existencias.txt. El fichero tiene en cada linea el nombre de un producto y varios números de unidades existentes en el almacén. Los productos ordenados y sumados han de escribirse en un nuevo fichero. Reglas; • Cada producto ha de salir en una sola lineas con todas las cantidades existentes sumadas • Un mismo producto puede aparecer en varias lineas en el fichero original • Los productos del fichero final han de salir ordenados alfabéticamente Ejemplo existencias.txt —————— peras 4 5 manzanas 3 5 uvas 3 4 9 peras 5 uva 1

JYOC - JAVA - EJERCICIOS

nuevo.txt ————— manzanas 8 peras 14 uvas 17

79

14.EJERCICIOS DE COLAS Y PILAS 14.a. EJERCICIOS NIVEL INICIAL 14.b. EJERCICIOS NIVEL MEDIO 14.b.1. Crea una lista enlazada de elementos genéricos en la cual podrá haber repetidos y cuyo orden

dependerá de cómo se inserten sus elementos. Para ello será necesario: • Una clase Nodo. • Una clase ListaEnlazada, con los siguientes atributos: private Nodo inicio; private Nodo fin; private int cont;

• el siguiente constructor: public ListaEnlazada()

y los siguientes métodos:

public void anadirAlPrincipio(T t) public void anadirAlFinal(T t) public int numElementos() 
 public void listar() //Muestra por consola los objetos public void vaciar() 
 public boolean buscar(T t) 
 public T extraerPrimero() //Extrae y elimina el primer elemento, null si no existe
 public T extraerUltimo() //Extrae y elimina el último elemento, null si no existe

Se pide hacer un programa principal que ofrezca un menú con las siguientes opciones: Opciones:
 1.-Introducir elemento al principi 2.-Introducir elemento al final 3.-Borrar todos
 4.-Buscar elemento
 5.-Ver número de elementos 6.-Listar elementos
 7.-Extraer y mostrar el primero 8.-Extraer y mostrar el último 9.-Salir

Se probara el menu instanciando la clase genérica con un String y con una clase nueva a desarrollar por el alumno (a su elección, Persona, por ejemplo)

JYOC - JAVA - EJERCICIOS

80



JYOC - JAVA - EJERCICIOS

81

15.EJERCICIOS DE PROCESOS 15.a. EJERCICIOS INVOCACION Y GESTION DE PROCESOS 15.a.1. Crear un programa que nos muestre la siguiente información del sistema:

• Número de núcleos (cores) del ordenador. • Memoria en Mb disponible y máxima en la Java Virtual Machine (jvm). • Listado de todas las propiedades del sistema que ofrezca la clase Properties. 15.a.2. Crear un programa que muestre los procesos que tiene el sistema y nos vaya preguntando por cada

uno de ellos si lo queremos eliminar. Haz que funcione tanto en Windows como en Linux. 15.a.3. Calcula el tiempo, en segundos, que tarda el ordenador en ordenar dos arrays de enteros de 100.000

elementos con números aleatorios de entre 1 y 1000. Monitoriza la CPU mientras se ejecuta. 15.a.4. Realiza el ejercicio anterior de nuevo, pero lanzando un hilo para cada proceso de ordenación.

Monitoriza la CPU mientras se ejecuta. ¿Tarda menos? 15.a.5. Suponiendo que se dispone de una máquina con 4 cores, muestra de una manera eficiente los

números primos que existen entre uno hasta un millón. Puedes crear una clase en la que al constructor se le indique el rango donde tiene que buscar los números primos. ¿Aparecerán ordenados? public class RnBuscaPrimos implements Runnable { private int _inicio; private int _fin; public RnBuscaPrimos(int inicio, int fin) { _inicio = inicio; _fin = fin; } @Override public void run() { … } }

15.b. EJERCICIOS HILOS 15.b.1. El siguiente programa rellena un array de gran tamaño con números aleatorios de tipo long y

después muestra el tiempo empleado en buscar el mayor de ellos en milisegundos. Modifica el programa para que se realice la búsqueda del número máximo usando dos hilos. Calcula también el tiempo que tarda en hacerlo de esta otra manera. Implementa esta funcionalidad en el mismo código proporcionado. import java.util.Random; public class Main { private static final int NUM = 172000000; public static void main(String[] args) { System.out.println("Rellenando aleatorios..."); long[] numeros = new long[NUM]; rellenaAleatorios(numeros); System.out.println("Array relleno. Empezando búsqueda sin hilos..."); // Guardamos el tiempo de comienzo del proceso. long timeComienzo = System.currentTimeMillis(); System.out.println("El número máximo es: " + numeroMaximo(numeros)); System.out.println("Total milesegundos empleados SIN hilos: " + (System.currentTimeMillis() - timeComienzo));

JYOC - JAVA - EJERCICIOS

82

// Guardamos el tiempo de comienzo del proceso y ahora buscamos CON DOS HILOS:. timeComienzo = System.currentTimeMillis(); ... ... System.out.println("Total milesegundos empleados usando 2 hilos: " + (System.currentTimeMillis() - timeComienzo));

}

} private static void rellenaAleatorios(long[] num) { Random rand = new Random(); for(int i=0; i max) { max = numeros[i]; } } return max; }

15.b.1.Escribe un programa que lance una carrera de 8 corredores, representado cada uno de ellos por un

hilo: • Cada corredor tendrá un número de dorsal desde el 1 hasta el 8 y tendrá que incrementar una variable de uno en uno desde el 1 hasta el 10000 (en un bucle for por ejemplo) para llegar a la meta. • Los corredores saldrán en el mismo momento en el que ejecute la aplicación. • Cuando hayan llegado los 8 corredores se mostrará un listado de resultados. Un ejemplo de ejecución podría ser el siguiente: Carrera en transcurso... Resultados: Posición: 1 corredor 5 Posición: 2 corredor 3 Posición: 3 corredor 7 Posición: 4 corredor 1 Posición: 5 corredor 2 Posición: 6 corredor 6 Posición: 7 corredor 4 Posición: 8 corredor 8

15.b.1.Escribe una clase Elementos que permita almacenar en forma de pila y sin repetir un determinado

número de elementos positivos de tipo int. El número de elementos máximo a almacenar será especificado en el constructor. • El método sacarElemento extrae un elemento y lo devuelve. Devolverá -1 si la estructura está vacía. • El método ponerElemento añade un elemento si hay espacio, no existe previamente, y es positivo o 0. Devuelve false si no lo ha podido añadir, true en caso contrario. Ejemplo de código inicial y ejecución:
 public class Main {

private static final int NUM = 4; public static void main(String[] args) throws InterruptedException { Elementos elementos = new Elementos(NUM); System.out.println(elementos.sacarElemento()); // Vacía System.out.println(elementos.ponerElemento(0)); // Añade 0 System.out.println(elementos.ponerElemento(0)); // Repetido System.out.println(elementos.sacarElemento()); // Extrae el 0 System.out.println(elementos.ponerElemento(1)); // Añade 1 System.out.println(elementos.ponerElemento(2)); // Añade 2 System.out.println(elementos.ponerElemento(3)); // Añade 3 System.out.println(elementos.ponerElemento(3)); // Repetido

JYOC - JAVA - EJERCICIOS

83

}


}

System.out.println(elementos.ponerElemento(4)); // Añade 4 System.out.println(elementos.ponerElemento(5)); // No cabe System.out.println(elementos.sacarElemento()); // Extrae 4

Salida por consola: -1 true false 0 true true true false true false 4

Una vez comprobado el correcto funcionamiento de la estructura, crea dos hilos dedicados a hacer cada uno de ellos una tarea distinta sobre una instancia de la clase Elementos: • thPonerElementos : Añadirá, indefinidamente, enteros aleatorios. • thSacarElementos : Extraerá, indefinidamente, los enteros almacenados. Para poder hacer un seguimiento de lo que está sucediendo, añade mensajes por consola en el código: • Extraído el elemento X. • Sin elementos. • Añadido el elemento X. • Elemento X ya existe. • No hay sitio.

15.c. EJERCICIOS MONITORES 15.c.1.Escribir un programa consistente en la adivinación de un número entero por parte de dos jugadores

(hilos) que se van turnando. • El árbitro escribe al azar un número oculto a los jugadores mayor que 0 y menor que 500. • El árbitro escoge al azar cuál será el primer jugador que empiece. • Cada jugador dirá un número al azar al árbitro dentro del intervalo. En caso de adivinarse se acaba la partida, y en caso contrario se pasa el turno al otro jugador. • Los jugadores no tienen ningún tipo de estrategia ya que dicen el número a adivinar al azar, eso sí, dentro del intervalo, pudiendo incluso repetir número en turnos anteriores. • No hay número de intentos, pero al acabar hay que mostrar el número de intentos que el jugador ha necesitado para adivinar el número. Ejemplo de ejecución: Arbitro: Número escrito. Comienza la partida. Arbitro: El turno es para el jugador B. Jugador B: 248 Jugador A: 128 Jugador B: 63 Jugador A: 452 Jugador B: 8 Jugador A: 1 Jugador B: 207 Jugador A: 128 Jugador B: 49 Jugador A: 66 Jugador B: 331 Jugador A: 103 Jugador B: 243 …… Jugador A: 285 Arbitro: Jugador A acierta el número después de 28 intentos.


JYOC - JAVA - EJERCICIOS

84

15.d. EJERCICIOS PRODUCTOR-CONSUMIDOR 15.d.1. Realizar un programa que simule la compra (consumidor) y la fabricación (productor) de coches.

Debe cumplir estas normas: Habra cinco tipos de compradores , identificados con un numero, de modo que el comprador numero 1 solo compre coches AUDI, el numero 2 FORD, el numero 3 SEAT, el numero 4 BMW y el numero 5 FIAT Todos los compradores intentan continuamente comprar coches, si no existen coches de su marca, debe esperar a que haya alguno Solo hay un fabricante, que fabrica continuamente coches de las 5 marcas, cada vez de una , aleatoriamente. Tarda medio segundo en fabricar un coche. El proceso continua indefinidamente. MEJORA 1: El proceso termina cuando el fabricante ha fabricado 20 coches. Al terminar todo, el programa indica cuantos coches ha comprado cada comprador

JYOC - JAVA - EJERCICIOS

85

50.EJERCICIOS COMPLETOS, DE VARIAS MATERIAS 50.a. EJERCICIOS 50.a.1. Plantilla Futbol. Realizar una aplicación que gestiona una plantilla de futbol, dadas estas clases: Clase Jugador Atributos nombre; private String dorsal; private int esComunitario; private boolean edad; private int salario; private double Metodos constructor… getters y setters… toString … abstract void renovarContrato(int porcentajeAumento)

Al renovar un contrato , un jugador junior aumenta un año su antigüedad, y aumenta un 5% el salario. Un jugador senior aumenta su salario un 10 % SI un jugador junior llega a 4 años de antigüedad, automáticamente pasa a ser senior. Su salario se triplica, y su cláusula pasa a ser 30 veces su salario.

Clase JugadorSenior (hereda de Jugador) Atributos clausula; private double Metodos Clase JugadorJunior (hereda de Jugador) Atributos antiguedadEnAños; private int Metodos int añosFaltanParaSenior()

Devuelve el numero de años que le faltan al jugador para ser Senior

Clase Direccion Atributos calle; private String cp; private int Metodos constructor… getters y setters… toString …

JYOC - JAVA - EJERCICIOS

86

Clase MiPlantilla Atributos plantilla; private ArrayList presupuesto; private double Metodos constructor… getters y setters… public static void main(String[] args)

Crea un objeto MiPlantilla. Prueba el resto de métodos de la clase MiPlantilla (Crea una plantilla, jugadores, los añade a la plantilla creada, elimina jugadores, etc )

public void crearPlantilla()

Crea la colección jugadores

public boolean añadirJugador(Jugador j)

Añade una jugador a la plantilla Una plantilla no puede tener más de 22jugadoress, si se excede ese numero, no se añade el jugador y el método devuelve false Una plantilla no puede gastarse mas del presupuesto que tenga en salario de jugadores, si se excede, no se añade el jugador y se arroja la excepción PresupuestoException Una plantilla no puede tener más de 5 jugadores juveniles, si se excede ese numero, no se añade el jugador y se arroja la excepción JuvenilesException Los dorsales no pueden repetirse, si se intenta añadir una dorsal ya existente, no se añade el jugador y se arroja la excepción DorsalRepetidoException Una plantilla no puede tener más de 3 jugadores extracomunitarios, si se excede ese numero, no se añade el jugador y se arroja la excepción ComunitariosException

public String listarPlantilla()

Devuelve un String con la lista de jugadores de la plantilla, cada uno con todos sus datos Si la plantilla no tiene jugadores, se arroja la excepción PlantillaVaciaException

public String listarPlantillaOrdenada()

Devuelve un String con la lista de jugadores de la plantilla, ordenados por su dorsal, cada uno con todos sus datos Si la plantilla no tiene jugadores, se arroja la excepción PlantillaVaciaException

public void guardarPlantillaBinario()

Guarda en un fichero binario los jugadores, uno a uno como objetos

public void LeerPlantillaBinario()

Lee los jugadores del fichero binario y los incorpora a la plantilla, sin sustituir los que ya existieran

public void eliminaExtraComunitarios()

Elimina de la plantilla a todos los jugadores extracomunitarios

void pagarClausula(Jugador j)

Resta el dinero del la cláusula al presupuesto de la plantilla Elimina el jugador de la plantilla

El método main de la clase MiPlantilla tiene un menú con las opciones siguientes (que llaman a los otros métodos de la clase MiPlantilla): Menu de opciones: 1.- crear plantilla 2.- añadir jugador (que pregunta si es senior o juvenil) 3.- listar plantilla 4.- listar jugadores 5.- eliminar jugadores comunitarios 5.- guardar plantilla en fichero binario 6.- cargar plantilla desde fichero binario

JYOC - JAVA - EJERCICIOS

87

50.a.2. Fabrica de trajes.

Un traje es una combinación de tres piezas: chaqueta, blusa y falda o pantalón. Se deben escribir las siguientes clases y sus métodos indicados, y realizar la clase FabricaTrajes que además de los métodos indicados debe tener un main con el menú descrito Clase Componente Atributos private int id; private String nombre; private String talla; private String color; private boolean escomunitario; private double precio; Metodos constructor… getters y setters… toString … equals() … componentes son iguales si tienen el mismo id compareTo() … componentes se ordenan por id Clase Traje Atributos ArrayList piezas;private String Metodos constructor… getters y setters… toString … Clase Falda (hereda de Componente) Atributos private boolean conCremallera; Metodos constructor… getters y setters… toString … Clase Chaqueta (hereda de Componente) Atributos private int numBotones; Metodos constructor… getters y setters… toString …

Clase Pantalón (hereda de Componente) Atributos private boolean conCremallera; Metodos constructor… getters y setters… toString … Clase Traje

(hereda de Componente)

Atributos private boolean mangaLarga; Metodos constructor… getters y setters… toString …

JYOC - JAVA - EJERCICIOS

88

Clase FabricaDeTrajes

Implementa la interfaz IFabricadeTrajes

Atributos private ArrayList componentesEnAlmacen privateTreeSet trajesEnAlmacen protected boolean sonRebajas=false; Metodos pintarMenu();

Muestra el menu de la aplicacion:

System.out.println("MENU FABRICA TRAJES"); System.out.println("==================="); System.out.println("1.- Añadir Componente a almacen"); System.out.println("2.- Listar Componentes del almacen"); System.out.println("3.- Crear traje y añadir a almacen"); System.out.println("4.- Listar trajes del almacen"); System.out.println("5.- Guardar almancen en fichero"); System.out.println("6.- Recuperar almancen de fichero"); System.out.println("7.- Activar/Desactivar las rebajas"); System.out.println("8.- Preparar un envio y guardarlo en fichero"); System.out.println("9.- Consultar algun envio guardado en fichero"); System.out.println("0.- Fin");

Interfaz IFabricaDeTrajes

Metodos

public añadirComponenteAAlmacen();

Pide al usuario qué tipo de componente desea añadir, y luego, los datos necesarios para construir el componente indicado. Se añade posteriormente el componente a componentesEnAlmacen, pero ha de validarse antes que cumpla estas reglas: - validar que el id del componente no exista anteriormente, si es asi, no se crea el componente y se da un IdException - no se puede añadir un componente extracomunitario si ya hay mas del 50% de componentes extracomunitarios en el almacen. Si se da esta circunstancia, se produce una excepcion MuchoExtracomunitarioException - no se puede añadir una blusa de manga larga al almacen si no existe ya en el almacen una blusa de manga corta del mismo color, y viceversa. Si se da esta circunstancia, se produce una excepcion MangaException Además, Hay que ajustar el precio del componente antes de añadirlo al almacen, con estas reglas: - Cada chaqueta debe añadir 2 euros mas al precio por cada boton que tenga - Cada pantalon o falda debe añadir 1 euros mas al precio si tiene cremallera

public listarComponentes();

Lista los componentes que hay en el almacén

public añadirTrajeAAlmacen();

Un traje es una combinación de un chaqueta, una blusa, y o bien una falda o bien un pantalón. Para crear un traje: - se listan en pantalla las blusas existentes (identificadas por su id) y se pide al usuario que elija una. - se listan las chaquetas existentes (identificadas por su id) y se pide al usuario que elija una. - se listan en pantalla las faldas y pantalones existentes (identificados por su id todos, pero indican que es cada cosa) y se pide al usuario que elija una. Antes de crear el traje, hay que verificar y cumplir estas reglas: - Un traje solo puede tener piezas del mismo color o de colores amigos. Los colores amigos son aquellos que comienzan don la misma letra (rosa y rojo, azul y amarillo…). Crear un traje que no cumpla estas reglas provoca una excepción ColoresException - todos los componentes han de ser de la misma talla, menos la falda. Crear un traje que no cumpla esta regla provoca una excepción TallaException - si el nombre del traje que se quiere crear ya existe en el almacen, se provoca una excepción TrajeYaExisteException Todo traje creado se añade al conjunto trajesEnAlmacen. Los componentes añadidos a un traje se eliminan del almacen

public listarTrajes();

Lista los trajes que hay en el almacén.

public guardarAlmacenEnFichero();

Guarda las colecciones de componentes y trajes que hay en el almacén en un fichero binario. No se pueden guardar las colecciones directamente como objetos. El nombre del fichero se le pide al usuario.

public RecuperarAlmacenDeFichero();

Lee las colecciones de componentes y trajes que hay en un fichero binario creado en el metodo guardarAlmacenEnFichero().

public activadDesactivarRebajas();

Activa o desactiva el estado de rebajas, cambiando el precio de todos los componentes y trajes del almacen. No cambia el precio de los envios ya creados.

public crearEnvío();

Un envío se compone de varios trajes existentes en el almacen. Para crear un envio: - se listan en pantalla los trajes existentes (numerados) y se pide al usuario elegir uno - el traje se quita del almacen y se añade al envio - se pide al usuario mas trajes para añadir al envio, igual proceso al descrito antes. - se guarda el envío en un fichero de objetos. Se deben guardar los trajes uno a uno Un traje incluido en un envío desaparece del almacén

public consultarEnvío();

Eligiendo por teclado el nombre de un fichero de envio ya creado, se consulta el contenido del mismo: nombre de los rtajes, precio de cada traje y precio total del envío

JYOC - JAVA - EJERCICIOS

89

50.a.3.Gran Hermanastro.

Se desea desarrollar una aplicación que simule el sistema de nominaciones del reality denominado Gran Hermanastro. La aplicación debe permitir las siguientes acciones: • Acceder a la aplicación como “Administrador” o como “Habitante de la casa” (no es necesario incluir ningún sistema de seguridad basado en contraseñas o cualquier otro tipo de control) • En caso de acceder como “Administrador” las acciones disponibles serán: ✴ Ver el resultado actual de las votaciones (un listado de los habitantes con la suma total de las nominaciones obtenidas para cada uno de ellos) ✴ Resetear las nominaciones para volver a comenzar una nueva votación • En caso de acceder como “Habitante de la casa”, las acciones disponibles consistirán en nominar a 3 habitantes para su expulsión con 1, 2 y 3 puntos • Al ejecutar la aplicación ya debe estar presente un listado que contenga el nombre de los habitantes de la casa. A modo de ejemplo, el menú que se debe mostrar al usuario de la aplicación y parte del funcionamiento debe ser algo similar a lo que se presenta a continuación: Elija el tipo de usuario que desea acceder a la aplicación: 1. Administrador 2. Habitante de la casa 3. Salir



En caso de acceder como Administrador



En caso de acceder como Habitante de la casa

Elija la acción que desea ejecutar: 1. Ver estado de las nominaciones 2. Resetear las nominaciones 3. Ir al menú de identificación de usuario

Elija la acción que desea ejecutar: 1. Nominar para su expulsión – 1 punto 2. Nominar para su expulsión – 2 puntos 3. Nominar para su expulsión – 3 puntos 4. Ir al menú de identificación de usuario

Al elegir cada una de las 3 primeras opciones, deberá aparecer un listado de los habitantes de la casa y, posteriormente, nominar con los puntos mediante el número del respectivo habitante, tal y como se muestra a continuación) Ha seleccionado la opción 1. Elija ahora el número del habitante que quiere nominar con 1 punto: 1. Pepote Ganapasta 2. Juanita Muchasbroncas 3. Chimo Chistoso 4. Anita Lenguaraz 5. Cuqui Pinocha

50.a.4. Hundir la flota.

El objetivo de este proyecto es crear un programa que implemente el conocido juego de Hundir la flota. En su modo básico, el juego estará formado por un único tablero de 5x5 casillas que representa una zona del mar donde hay ocultos barcos y donde se registran los efectos de los disparos realizados. Inicialmente todas las casillas del tablero están en blanco. El tablero debe pintarse de este modo o similar: JYOC - JAVA - EJERCICIOS

90

1 2 3 4 5

A B C D E --------------------| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ---------------------

Reglas básicas: ✓ Tras realizar un disparo la casilla puede tomar 3 valores: • ‘Agua’, el disparo no ha alcanzado ningún barco. Símbolo ~ • ‘Tocado’, el disparo ha tocado un barco pero no lo ha hundido. Símbolo * • ‘Hundido’, el disparo ha hundido un barco. Símbolo # ✓ El programa creará cuatro barcos en posiciones aleatorias. • Un barco de 3 casillas horizontal. • Un barco de 3 casillas vertical. • Un barco de 2 casillas horizontal. • Un barco de 2 casillas vertical. ✓ Los barcos no son visibles en el tablero y en ningún caso una casilla puede estar ocupada por 2 barcos a la vez. ✓ Se mostrará el tablero indicando debajo el número de disparos efectuados y el número de barcos hundidos. ✓ Se pedirá por pantalla la posición en la cual se quiere disparar, primero la fila y a continuación la columna, por ejemplo: (1,B). ✓ Se comprobará que las coordenadas son válidas y si no lo son, se pedirán de nuevo. ✓ Si son válidas, se vuelve al punto 3, mostrando el efecto del disparo en el tablero. Y se continuará sucesivamente hasta que termina la partida, cuando se hunden los cuatro barcos. ✓ Al finalizar la partida se debe mostrar el contador de partidas jugadas y se preguntará si se quiere jugar de nuevo. ✓ Ejemplo de ejecución del juego: A B C D E --------------------1 | | | | | | 2 | | | | | | 3 | | | | | | 4 | | | | | | 5 | | | | | | --------------------Numero de intentos: 0 Numero de fallos: 0 Barcos hundidos: 0 Numero de intentos: 0 Elige una fila para disparo (1-5): 1 Elige una columna para disparo (A-E): B ACERTASTE !!!!! Sigue probando, aun queda algo de ese barco por ahi... A B C D E --------------------1 | | o | | | | 2 | | | | | | 3 | | | | | | 4 | | | | | | 5 | | | | | | --------------------Numero de intentos: 1 Numero de fallos: 0 Barcos hundidos: 0 Numero de intentos: 1 Elige una fila para disparo (1-5): 1 Elige una columna para disparo (A-E): A Agua... lo siento, prueba otra vez A B C D E --------------------1 | ~ | o | | | | 2 | | | | | | 3 | | | | | | 4 | | | | | | 5 | | | | | | --------------------Numero de intentos: 2 Numero de fallos: 1 Barcos hundidos: 0 Numero de intentos: 2 Elige una fila para disparo (1-5):

JYOC - JAVA - EJERCICIOS

91

MEJORAS Propuestas: ✓ ✓ ✓





Permitir elegir el tamaño del tablero Permitir personalizar los símbolos utilizado para el efecto de vacío, agua, tocado y hundido. También se podrá decidir cuántos barcos colocar, longitud y orientación. En tal caso, se propone además indicar si no es posible crear el número de barcos elegidos en el tablero creado. Permitir elegir si se quiere que jueguen un jugador o dos jugadores, utilizando entonces 2 tableros diferentes y alternando los disparos en cada tablero. Permitir uso de tableros de 3 dimensiones (por ejemplo, de 5x5x5).

50.a.5. Taller de arreglos

(Nota: al final de este documento se adjunta el script SQL para la creación de las tablas necesarias para este ejercicio)

Un taller de reparaciones de coches almacena en una bbdd las visitas que hacen los vehículos cuando se produce una avería, así como la información relativa a los dueños y sus mecánicos.
 Las opciones que tendrá la aplicación 1. Llevar coche al taller: se teclea la matrícula. Se comprueba si es la primera vez que viene el coche al taller. En ese caso se da de alta al dueño. Si no es la primera vez se muestran los datos del dueño Debe indicarse para qué se trae el coche al taller: chapa, lunas, mecánica. Se muestra el precio y se pide conformidad. Se le asigna un mecánico según el arreglo. 2. Recoger un coche: Se pide matrícula, se comprueba que el coche está en el taller y se actualiza la bbdd para cerrar el arreglo. 3. Pedir un número de mecánico y generar un archivo con los datos de sus arreglos 4. Dado el número de matrícula de un vehículo, mostrar los datos personales de su dueño y las averías que ha tenido: fecha de entrada y de salida, importe, tipo de avería y el nombre del mecánico asignado
 50.a.6. Desde una oficina de correos se pueden realizar dos tipos de envíos: cartas y paquetes. Por cada envío

se guarda: número de envío (secuencial y calculado por el programa), la dirección, código postal y país al que va dirigido. Para un paquete se guarda además el peso y el volumen (en centímetros cúbicos).

Codificar un programa en Java con un menú que permita realizar las siguientes operaciones: 1. Dejar un envío en espera. Se piden los datos de un envío y se guarda en un array o en un vector al final de todos los envíos pendientes, sólo hay capacidad para 10 envíos pendientes. 2. Facturación de los envíos. Nos recorremos todos los envíos que están en espera y calculamos el precio de cada uno de ellos , mostrando su información por pantalla, llamando al método facturar que calcula el precio de la siguiente forma: • Si se trata de una carta: 1. Si el país de destino no es España el precio es de 5 euros . 2. Si el país de destino es España: i. Si el código postal es de Madrid ( es decir empieza por 28) el precio del envío es de 1 euro. ii. Si el código postal no es de Madrid el precio son 3 euros. • Si se trata de un paquete: Se pagan 0,25 euros por kilo. Se paga también un suplemento de 10 euros si el país de destino no es España . Según el volumen del paquete, si ocupa más de 30 centímetros cúbicos se paga un suplemento de 2 euros, y si ocupa más de 50 centímetros cúbicos de 7 euros. 3. Todos los envíos una vez facturados se eliminan del array/vector y se almacenan en un vector ordenado por país y código postal.

JYOC - JAVA - EJERCICIOS

92

4. Ha habido un problema con el peso, recorrer los envíos pendientes y volver a anotar el peso de todos los paquetes. 5. Se anota un número de envío y se muestra toda su información diciendo si se trata de un envío pendiente o facturado. 


Se valorará el uso de excepciones para controlar que las lecturas son correctas y/o el acceso correcto al array/vector de envíos pendientes.


50.a.7. Residencia de ancianos (Nota: al final de este documento se adjunta el script SQL para la creación de las tablas necesarias para este ejercicio)

Una residencia de ancianos mantiene una bbdd con la información relativa a sus residentes, empleados. Residentes Tienen dos tipos “de día”(D) (permanecen allí todo el día pero no duermen) y “completos”(C ) duermen en la residencia. Para todos los residentes guardan nombre, apellidos, dni, sexo, teléfono de contacto, cuota mes. Para los pacientes “completos” se guarda además su código de habitación, que es un texto que comienza con las dos primeras letras del nombre del paciente, un guión, un dígito indicativo de la planta en la que se encuentra la habitación, un guión y el número de la habitación (ej.LU-2-16). Los residentes“de día”pagan una cuota fija de 600€ al mes. Los residentes “completos” pagan una cuota fija de 800€ al mes y un incremento en función de su edad (no pueden ingresar pacientes con menos de 55 años), por cada año que pasan de 70 pagan 25€ más al mes. Cada paciente tiene asignado un empleado de la residencia. Empleados Se guarda nombre, apellidos, dni, teléfono de contacto, código de la función que realiza en la residencia. Cada empleado tiene asignados 10 pacientes como máximo. Funciones Cada función dispone de un código de una letra obligatoria, dos dígitos obligatorios y una letra opcional. La letra obligatoria ha de ser A, B o C. La descripción es obligatoria. Ni el código ni la descripción pueden repetirse. Se pide: 1. Diseño adecuado de las clases 2. Gestión de residentes: 2.1 Alta residente: • Se pide el dni del residente, se comprueba que no lo es ya. Si es así se genera una excepción 
 ResidenteYaDadoAltaExcepcion que se lanzará en el método de acceso a la bbdd. No se continúa con el ingreso. • Si no es ya residente, se piden el resto de datos: nombre, apellidos, teléfono, edad, sexo y tipo de 
 paciente (D/C). • Si es menor de 55 años se le indica y no se le da de alta • La cuota viene marcada por el tipo de paciente, se asigna en la clase • Si es paciente C se pedirán la planta y número de la habitación, generar el código de la misma. JYOC - JAVA - EJERCICIOS

93

• Si es un paciente C mayor de 70 años se añade una línea con su nombre , apellidos , dni y edad a un fichero mayores70.txt. • Para asignar un empleado, mostrar una lista con aquellos empleados que actualmente no tengan más de 10 residentes a su cargo. Se elegirá de dicha lista el responsable. • Se añade el residente a la tabla correspondiente 
 2.2 Baja residente: • Se pide dni del paciente y se borrar su información de las tablas correspondientes. Tener en cuenta que algún empleado lo tenía asignado. • Si no fuese residente, mostrar un mensaje indicando dni erróneo 
 3. Listado residentes. Dar la posibilidad de elegir entre los dos tipos de residentes. Mostrar los datos de los mismos 
 4. Listado de aquellos residentes que se encuentran en el fichero 50.a.8. Ruleta Rusa. Vamos a hacer el juego de la ruleta rusa en Java.

Como se sabrá, se trata de un número de jugadores que con un revolver con un sola bala en el tambor se dispara en la cabeza. Las clases a hacer son Revolver, Jugador y Juego: Revolver: Atributos: • posición actual (posición del tambor donde se dispara, puede que esté la bala o no) • posición bala (la posición del tambor donde se encuentra la bala) • Estas dos posiciones, se generaran aleatoriamente. Revolver: Funciones: • disparar(): devuelve true si la bala coincide con la posición actual • siguienteBala(): cambia a la siguiente posición del tambor • toString(): muestra información del revolver (posición actual y donde está la bala) Jugador: Atributos: • id (representa el número del jugador, empieza en 1) • nombre (Empezara con Jugador más su ID, “Jugador 1” por ejemplo) • vivo (indica si está vivo o no el jugador) Jugador: Funciones: • disparar(Revolver r): el jugador se apunta y se dispara, si la bala se dispara, el jugador muere. Juego: Atributos: • Jugadores (conjunto de Jugadores) • Revolver Juego: Funciones: • finJuego(): cuando un jugador muere, devuelve true • ronda(): cada jugador se apunta y se dispara, se informara del estado de la partida (El jugador se dispara, no ha muerto en esa ronda, etc.) El número de jugadores será decidido por el usuario, pero debe ser entre 1 y 6. Si no está en este rango, por defecto será 6. En cada turno uno de los jugadores, dispara el revólver, si este tiene la bala  el jugador muere y el juego termina. MEJORA 1: Ir escribiendo en un fichero de texto la ejecución del juego, indicando lo que va pasando paso a paso. JYOC - JAVA - EJERCICIOS

94

50.a.9. Almacén de refrescos. Nos piden hacer un almacén con programación orientado a objetos.

En un almacén se guardan un conjunto de  bebidas. Estos productos son bebidas como agua mineral y bebidas azucaradas (coca-cola, fanta, etc). De los productos nos interesa saber su identificador (cada uno tiene uno distinto), cantidad de litros, precio y marca. Si es agua mineral nos interesa saber también el origen (manantial tal sitio o donde sea). Si es una bebida azucarada queremos saber el porcentaje que tiene de azúcar y si tiene o no alguna promoción (si la tiene tendrá un descuento del 10% en el precio). En el almacén iremos almacenado estas bebidas por estanterías (que son las columnas de la matriz). Las operaciones del almacén son las siguientes:

• Calcular precio de todas las bebidas: calcula el precio total de todos los productos del almacén. • Calcular el precio total de una marca de bebida: dada una marca, calcular el precio total de esas bebidas.

• Calcular el precio total de una estantería: dada una estantería (columna) calcular el precio total de esas bebidas.

• Agregar producto: agrega un producto en la primera posición libre, si el identificador esta repetido en alguno de las bebidas, no se agregará esa bebida.

• Eliminar un producto: dado un ID, eliminar el producto del almacén. • Mostrar información: mostramos para cada bebida toda su información. • Guardar en un fichero binario un backup de la información de todos los productos. Los productos se han de guardar como objetos.

• Leer el fichero de backup (si existe) y mostrar su información por consola

JYOC - JAVA - EJERCICIOS

95

90.CÓDIGOS DE AYUDA PARA LOS EJERCICIOS 90.a. SCRIPTS MYSQL PARA CREACION DE TABLAS 90.a.1.Tablas para la bbdd de ejercicio de Residencia de Ancianos --- Base de datos: `residencia` --- ---------------------------------------------------------- Estructura de tabla para la tabla `empleadoresidente` -CREATE TABLE IF NOT EXISTS `empleadoresidente` ( `dniEmpleado` varchar(9) NOT NULL, `dniResidente` varchar(9) NOT NULL, PRIMARY KEY (`dniResidente`), KEY `dniEmpleado` (`dniEmpleado`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1; --- Volcado de datos para la tabla `empleadoresidente` -INSERT INTO `empleadoresidente` (`dniEmpleado`, `dniResidente`) VALUES ('12345678Z', '11111111A'), ('12345678Z', '33333333C'), ('87654321W', '22222222B'), ('87654321W', '44444444D'); -- ---------------------------------------------------------- Estructura de tabla para la tabla `empleados` -CREATE TABLE IF NOT EXISTS `empleados` ( `nombre` varchar(25) NOT NULL, `apellidos` varchar(80) NOT NULL, `dni` varchar(9) NOT NULL, `telefono` varchar(9) NOT NULL, `funcion` varchar(4) NOT NULL, PRIMARY KEY (`dni`), KEY `funcion` (`funcion`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1; --- Volcado de datos para la tabla `empleados` -INSERT INTO `empleados` (`nombre`, `apellidos`, `dni`, `telefono`, `funcion`) VALUES ('Gema', 'Romero Calvo', '12345678Z', '678543234', 'B10M'), ('Pedro', 'Marchena Vicente', '87654321W', '688789875', 'A12F'); -- ---------------------------------------------------------- Estructura de tabla para la tabla `funciones` -CREATE TABLE IF NOT EXISTS `funciones` ( `codigo` varchar(4) NOT NULL, `descripcion` varchar(40) NOT NULL, PRIMARY KEY (`codigo`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1; --- Volcado de datos para la tabla `funciones` -INSERT INTO `funciones` (`codigo`, `descripcion`) VALUES ('A12F', 'Fisioterapeuta'), ('B10M', 'Médico'); -- ---------------------------------------------------------- Estructura de tabla para la tabla `residentescompletos` -CREATE TABLE IF NOT EXISTS `residentescompletos` ( `nombre` varchar(25) NOT NULL, `apellidos` varchar(80) NOT NULL, `dni` varchar(9) NOT NULL, `sexo` varchar(1) NOT NULL, `telefono` varchar(9) NOT NULL, `codhabitacion` varchar(8) NOT NULL, `cuota` double NOT NULL, PRIMARY KEY (`dni`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1; --- Volcado de datos para la tabla `residentescompletos` -INSERT INTO `residentescompletos` (`nombre`, `apellidos`, `dni`, `sexo`, `telefono`, `habitacion`, `cuota`) VALUES ('José', 'Sanz García', '33333333C', 'V', '644345432', 'JO-1-12', 825), ('Laura', 'Gómez Pérez', '44444444D', 'M', '677889876', 'LA-1-15', 800); -- ---------------------------------------------------------- Estructura de tabla para la tabla `residentesdiurnos` -CREATE TABLE IF NOT EXISTS `residentesdiurnos` ( `nombre` varchar(25) NOT NULL,

JYOC - JAVA - EJERCICIOS

96

`apellidos` varchar(80) NOT NULL, `dni` varchar(9) NOT NULL, `telefono` varchar(9) NOT NULL, `sexo` varchar(1) NOT NULL, PRIMARY KEY (`dni`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1; --- Volcado de datos para la tabla `residentesdiurnos` -INSERT INTO `residentesdiurnos` (`nombre`, `apellidos`, `dni`, `telefono`, `sexo`) VALUES ('Juan', 'López Pérez', '11111111A', '677887789', 'V'), ('Ana', 'Rodrigo Bosco', '22222222B', '644565432', 'M'); --- Restricciones para tablas volcadas ---- Filtros para la tabla `funciones` -ALTER TABLE `funciones` ADD CONSTRAINT `funciones_ibfk_1` FOREIGN KEY (`codigo`) REFERENCES `empleados` (`funcion`);

90.a.1.Tablas para la bbdd de ejercicio de Taller de Arreglos --- Base de datos: `taller` --- ---------------------------------------------------------- Estructura de tabla para la tabla `arreglos` -CREATE TABLE IF NOT EXISTS `arreglos` ( `idFactura` int(11) NOT NULL, `idMecanico` int(11) NOT NULL, `matricula` varchar(7) NOT NULL, `fechaEntrada` date NOT NULL, `fechaSalida` date NOT NULL, `importe` double NOT NULL, PRIMARY KEY (`idFactura`), KEY `idMecanico` (`idMecanico`), KEY `idMecanico_2` (`idMecanico`), KEY `matricula` (`matricula`), KEY `matricula_2` (`matricula`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1; --- Volcado de datos para la tabla `arreglos` -INSERT INTO `arreglos` (`idFactura`, `idMecanico`, `matricula`, `fechaEntrada`, `fechaSalida`, `importe`) VALUES (1, 1, '1111BNJ', '2016-05-09', '2016-05-16', 250), (2, 2, '2222ABC', '2016-09-01', '0000-00-00', 350); -- ---------------------------------------------------------- Estructura de tabla para la tabla `clientes` -CREATE TABLE IF NOT EXISTS `clientes` ( `dni` varchar(9) NOT NULL, `nombre` varchar(100) NOT NULL, `telefono` varchar(9) NOT NULL, `direccion` varchar(100) NOT NULL, PRIMARY KEY (`dni`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1; --- Volcado de datos para la tabla `clientes` -INSERT INTO `clientes` (`dni`, `nombre`, `telefono`, `direccion`) VALUES ('11111111A', 'Ana Sanz', '655897678', 'Bravo Murillo, 28'), ('22222222B', 'Javier García', '677123456', 'Castellana, 78'); -- ---------------------------------------------------------- Estructura de tabla para la tabla `mecanicos` -CREATE TABLE IF NOT EXISTS `mecanicos` ( `idMecanico` int(11) NOT NULL AUTO_INCREMENT, `nombre` varchar(100) NOT NULL, `telefono` varchar(9) NOT NULL, `funcion` varchar(50) NOT NULL, PRIMARY KEY (`idMecanico`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=5 ; --- Volcado de datos para la tabla `mecanicos` -INSERT INTO `mecanicos` (`idMecanico`, `nombre`, `telefono`, `funcion`) VALUES (1, 'Pepe Pérez', '657654323', 'chapa'), (2, 'Juan Sánchez', '677887789', 'lunas'), (4, 'Luis Rodríguez', '657543444', 'mecánica'); -- ---------------------------------------------------------- Estructura de tabla para la tabla `tarifas` -CREATE TABLE IF NOT EXISTS `tarifas` ( `tipo` varchar(50) NOT NULL, `tarifa` double NOT NULL, PRIMARY KEY (`tipo`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1;

JYOC - JAVA - EJERCICIOS

97

--- Volcado de datos para la tabla `tarifas` -INSERT INTO `tarifas` (`tipo`, `tarifa`) VALUES ('chapa', 250), ('lunas', 350), ('mecánica', 500); -- ---------------------------------------------------------- Estructura de tabla para la tabla `vehiculos` -CREATE TABLE IF NOT EXISTS `vehiculos` ( `matricula` varchar(7) NOT NULL, `modelo` varchar(100) NOT NULL, `anyoMatriculacion` int(4) NOT NULL, `idCliente` varchar(9) NOT NULL, PRIMARY KEY (`matricula`), KEY `idCliente` (`idCliente`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1; --- Volcado de datos para la tabla `vehiculos` -INSERT INTO ('1111BNJ', ('2222ABC', ('3333CDF',

`vehiculos` (`matricula`, `modelo`, `anyoMatriculacion`, `idCliente`) VALUES 'Seat Ibiza', 2008, '11111111A'), 'Audi A4', 2015, '22222222B'), 'Mercedes clase A', 2014, '11111111A');

--- Restricciones para tablas volcadas ---- Filtros para la tabla `arreglos` -ALTER TABLE `arreglos` ADD CONSTRAINT `arreglos_ibfk_2` FOREIGN KEY (`matricula`) REFERENCES `vehiculos` (`matricula`), ADD CONSTRAINT `arreglos_ibfk_1` FOREIGN KEY (`idMecanico`) REFERENCES `mecanicos` (`idMecanico`); --- Filtros para la tabla `vehiculos` -ALTER TABLE `vehiculos` ADD CONSTRAINT `vehiculos_ibfk_1` FOREIGN KEY (`idCliente`) REFERENCES `clientes` (`dni`); /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;

JYOC - JAVA - EJERCICIOS

98