Saltar navegación

2025-01-27-Programacion - Contenido educativo

Ajuste de pantalla

El ajuste de pantalla se aprecia al ver el vídeo en pantalla completa. Elige la presentación que más te guste:

Subido el 27 de enero de 2025 por Jose Manuel M.

22 visualizaciones

Tarea tema 5

Descargar la transcripción

vale pues alguna cosita por ahí alguna pregunta que queráis que tengáis antes de arrancar a 00:00:01
contaros yo cosas pues había pensado normalmente cuando cerramos un tema pues me gusta repasar la 00:00:08
tarea ya para dejarlo concluido el tema por completo y bueno pues ahora que vamos haciendo 00:00:24
la tarea pues siempre es buena oportunidad para ir repasando un poco los conceptos que hemos visto 00:00:29
durante la tarea esta, así que si os parece pues resolvemos, aunque ya tenéis una versión 00:00:35
también abierta incluso en el aula virtual resuelta, pues la trabajamos aquí y así 00:00:41
pegamos un último repaso y la semana que viene pues ya hablamos de cosas del tema 00:00:47
que justo está recién abierto esta semana. En particular, bueno, pues hay como dos bloques 00:00:53
en el tema 6, uno que sigue hablando de cosas 00:00:58
de Java, bueno todo es Java 00:01:01
lógicamente, pero cosas más 00:01:04
de clases en sí de Java, habla de la clase 00:01:07
Stream con un montón de métodos que tiene 00:01:10
es una clase muy interesante 00:01:12
porque se utiliza muchísimo y los métodos 00:01:16
nos pueden ayudar a resolver bastantes cosas 00:01:19
y luego tiene otro bloque que habla de expresiones regulares 00:01:21
que no es una cosa ni mucho menos exclusiva 00:01:25
de Java, aunque también se pueden integrar las expresiones regulares en los programas 00:01:28
de Java. Y bueno, conocerlas es también porque 00:01:32
da mucha potencialidad a la posibilidad 00:01:36
de hacer filtros o de hacer búsquedas, tanto 00:01:40
dentro de un lenguaje como, por ejemplo, en accesos 00:01:44
a base de datos, con instrucciones de consulta, 00:01:48
como consultas desde lenguajes 00:01:53
de programación. Conoceremos un poco las expresiones 00:01:56
regulares también y como hay clases que tenemos en las librerías 00:02:00
disponibles que nos permiten integrar estas expresiones regulares 00:02:04
dentro de nuestro código. ¿Os parece bien el plan? ¿Arrancamos 00:02:08
con la tarea del tema anterior? 00:02:14
Vale, pues nadamos con ello. 00:02:19
Una cosilla respecto a la tarea, ni mucho menos es bronca 00:02:23
y no es que me moleste mucho. En algunas tareas, que no todas, pues bueno, pues se ve mucho la mano de ChaGPT. 00:02:27
Yo que sé, a mí me resulta un poco incómodo ponerme a corregir una tarea e intentar sacar algunos comentarios 00:02:37
o expresar mis puntos de vista sobre alguna de esas tareas cuando sé que en realidad se la estoy corrigiendo a ChaGPT, ¿no? 00:02:41
Entonces me parece que no resulta útil en verdad para nadie, ni para quien la entrega. 00:02:47
Y bueno, para mí el rato ese, bueno, no es que me importe porque al final tengo mi horario para hacer estas cosas de corrección de tareas, pero sí que me parece que resulta poco útil. Me refiero a algunos casos particulares. Simplemente lo lanzo ahí y ya está. Yo no me voy a poner a discutir con nadie, creo que tu tarea está entregada por ChagPT o no, o inteligencia artificial equivalente a ChagPT. 00:02:52
entonces bueno, yo os invito a los que trabajéis las tareas 00:03:16
pues que si no entendéis cosas 00:03:20
pues utilizad los foros, preguntadlas 00:03:23
aunque sean incluso de la propia tarea que tenemos abierta 00:03:25
si no me importa, si lo útil de las tareas 00:03:28
es que vayáis aprendiendo de cara a luego el examen 00:03:30
que es donde de verdad sin posibilidades de herramientas adicionales 00:03:34
vais a tener que escribirlo y además 00:03:38
afortunado o desafortunadamente va a ser en un papel 00:03:39
entonces el entrenamiento de las tareas os puede venir bien para eso 00:03:43
y un copy y paste de chat GPT no va a ayudar en nada. 00:03:46
Entonces, bueno, si os complican algunas de las prácticas, 00:03:52
es normal, estamos ahí en el proceso de ir aprendiendo. 00:03:55
Aprovechar los foros y ya os digo, 00:03:59
aunque cuando lo vayamos comentando 00:04:02
no pongamos el resultado total de la tarea en ese momento, 00:04:04
pero bueno, pues puede resultar interesante 00:04:08
para ir viendo ciertas cosas o ir avanzando en la práctica 00:04:10
o ir entendiendo algunos aspectos. 00:04:13
creo que para vosotros incluso puede resultar más útil. 00:04:16
Bueno, ¿por qué os lo digo? Bueno, pues alguna de las tareas, pues ves cosas por ahí que salen bastante de un poco el modelo 00:04:21
o un poquillo del modelo de cómo vamos viendo nosotros la programación. 00:04:30
Y es cierto que algunos de vosotros podéis tener también experiencia previa y saber programar muy bien, muy bien en Java. 00:04:34
entonces, bueno, pues como me descuadra un poco 00:04:39
pues yo también soy capaz de coger el enunciado, ponerlo en ChagPT 00:04:43
y bueno, pues ves que la propuesta que te ofrece ChagPT 00:04:46
pues es muy parecida a la que a lo mejor está entregada 00:04:50
cuando está incluyendo ciertas cosas 00:04:52
que realmente no se ajustan al modo en el que estamos 00:04:54
un poco contándolas aquí en clase 00:04:58
bueno, simplemente es una reflexión 00:05:00
ya os digo, hacer un poco lo que queráis 00:05:03
las prácticas son para vuestro entrenamiento 00:05:05
A mí no me, bueno, me cuesta un rato, lógicamente, corregirlas, pero forma parte de mi trabajo, con lo cual, bueno, pues lo hago gustosamente. Pero quien se base un poco en esta línea, pues realmente no va a sacar el rendimiento que de verdad podría sacar trabajándolo con la práctica. 00:05:07
Pero bueno, dicho esto, simplemente por expresarlo. Vamos al ataque, a leer el enunciado y vamos a ver cómo planteamos el ejercicio. 00:05:25
Mirad este ejercicio, lo hemos enunciado un momento así de forma rápida, tiene un poquito de blablabla por aquí, una calle peatonal, en definitiva, hay tres tipos de actividades en academias, de música, inglés y baile. 00:05:41
Proponemos que cada una de las actividades tenga dos horarios los sábados, que son de 10 a 11 y de 11 a 12, y en cada una de las clases entra un máximo de dos personas. 00:05:58
Y luego, en el total de actividades que se pueden reservar un sábado, aunque haya plazas porque no se cubran entera, de forma completa, pues proponemos que haya un máximo de cuatro alumnos. 00:06:11
A lo mejor los cuatro alumnos han decidido ir a esa mañana a clase de música, repartidos en los dos horarios, y a inglés y baile no va nadie. Pero bueno, bloqueamos en el enunciado hasta un máximo de cuatro alumnos. 00:06:23
Nos da dos opciones, que lo comentaba a una pregunta que me hacía un compañero ahí en el foro. Nos da la posibilidad de gestionar también el máximo este de cuatro y luego, además, para probar en línea general ese programa, metiendo cuatro alumnos en cada ejecución, nos permite probar prácticamente todas las cosas con dos o tres ejecuciones y así no nos pasamos mucho rato metiendo datos hasta un máximo de doce, 00:06:37
que sería el máximo de alumnos que podría entrar dentro de las tres academias cualquiera de los sábados. 00:07:05
Además propone que cuando estamos metiendo hasta un máximo de cuatro alumnos, 00:07:14
pues se pueda dejar inscribir a la actividad alumnos poniendo la palabra fin. 00:07:19
Bueno, pues un control más que hay por ahí. 00:07:25
En el desarrollo, pues bueno, se propone que se haga en dos clases, Academia y Agenda. 00:07:27
Digamos que la Agenda sería la clase donde se inicia el programa y tiene instancias, digamos, de objetos, 00:07:38
instancias de la clase, de las diferentes clases Academia, y el código de la clase Academia que sea común 00:07:47
y, bueno, pues podamos diferenciar una academia u otra en función de sus atributos. 00:07:54
Y el nombre que en particular diferencia unas academias de otras, pues es el atributo nombre. 00:08:00
Entonces, para la clase agenda, pues lo que propone es que sea desde donde inicia, aquí con el main, 00:08:06
que tenga tres atributos, que tenga tres instancias, perdón, tres objetos, 00:08:14
de los objetos que podemos crear en la clase 00:08:19
agenda, uno para música, baile e inglés 00:08:22
al cual le asignaremos en el atributo nombre 00:08:27
la actividad para la que está dedicado. 00:08:31
Aquí dice, ¿valora si estas referencias pueden ser estáticas? 00:08:35
¿Cuándo podrían ser estáticas? Cuando todos los posibles 00:08:39
objetos de la clase tuvieran 00:08:43
a ver, como os diría, si definimos 00:08:47
estas referencias dentro de la clase de academia, las podríamos, agendas, las podríamos 00:08:54
definir estáticas en el momento en el que todas las posibles 00:08:58
agendas que existiesen tuvieran, utilizasen la misma 00:09:02
academia de inglés, la misma academia de baile y la misma academia de música 00:09:05
porque todas las agendas compartirían 00:09:10
estas tres academias. Como solamente 00:09:12
consideramos una agenda, pues ella misma es capaz de compartirlo 00:09:17
con sí misma, con lo cual sería posible definir las estáticas. 00:09:22
Bueno, podemos no hacerlo durante el desarrollo del ejercicio o sí. 00:09:26
Pero ya os digo, como todas las agendas comparten las mismas 00:09:33
academias, de hecho, en este caso es así porque solamente existe 00:09:36
una agenda, entonces la comparte consigo mismo y con nadie más, 00:09:41
estas academias podrían llegar a ser estáticas. 00:09:45
Y luego propone que se cree un método 00:09:50
MostrarAgenda que indique con esta estructura 00:09:54
las reservas que se han hecho de cada una de las academias. 00:09:59
Digamos que la clase Agenda es la clase conductora del programa 00:10:06
y la clase Academia es de la que vamos a ir instanciando academias 00:10:10
que van a ir dando, digamos, el servicio a la clase agenda, por decirlo de alguna forma. 00:10:14
Y la clase academia, bueno, pues tiene aquí unos cuantos atributos que se nos ha ocurrido poner. 00:10:20
El nombre, podemos aplicarle si se trata de una agencia de música, inglés o baile a través del constructor. 00:10:24
Probablemente lo diga por ahí en el enunciado. 00:10:34
Dos atributos que sean el número de reservas que hay en la sesión 1 y la sesión 2. 00:10:37
Fijaros que estos dos atributos existirán para cada una de las instancias de academia, con lo cual podrá valer 1 o 2 y es un máximo de 2 porque así lo indica el enunciado por aquí, que en cada una de ellas habrá dos alumnos por sesión como máximo y ese es el motivo por el que creamos aquí una constante con valor 2 del número de alumnos que puede haber en cada una de las sesiones. 00:10:43
de cada una de las academias 00:11:13
dice que tendrá un método constructor 00:11:17
que recibe un string 00:11:20
en el cual indicamos el tipo de actividad 00:11:21
y este tipo de actividad se terminará guardando 00:11:24
en el atributo nombre 00:11:27
comprobar disponibilidad 00:11:29
en una determinada sesión 00:11:32
para ver si esa academia en particular 00:11:34
tiene disponibilidad 00:11:37
o ya se han ocupado las dos plazas 00:11:38
el método reservar plaza 00:11:40
este método reservar plaza es en principio el que llamaremos desde 00:11:42
la clase, desde métodos de la clase agenda 00:11:46
y el método infosesión que para una sesión devuelve 00:11:50
un string con la información de la sesión 00:11:56
por la que se está preguntando para esa academia en particular 00:12:00
y la idea es que este método sea el que vayamos llamando para 00:12:04
ambas sesiones de cada una de las tres academias desde el método 00:12:08
mostrar agenda de la clase agenda y luego bueno pues dice aquí pues desarrolla los getters y los 00:12:12
setters que sean necesarios. La secuencia del programa dice se solicita el nombre de los alumnos 00:12:21
por teclado, se irán introduciendo nombres hasta un número hasta un máximo de cuatro como decía por 00:12:27
aquí arriba o hasta que se meta a fin por si antes de llegar a cuatro, si llegamos a cuatro ya concluye 00:12:32
la entrada de datos verdad para reservar horas de la en las academias y si antes de llegar a 00:12:44
4 metemos fin pues terminamos el de igual forma de introducir los reservas dice cada uno de ellos se 00:12:51
le pregunta por teclado a qué actividad quiere apuntarse y en qué sesión si hay plazas disponibles 00:12:58
fijaros esto lo preguntaremos a través de teclado pues clase escáner estaremos trabajando con un 00:13:04
un bucle por aquí hasta que hayamos metido hasta cuatro alumnos o introduzcamos fin y para cada uno de ellos dentro del bucle le pediremos como decimos su nombre, le indicaremos a qué actividad y en qué sesión quiere apuntarse y haremos una llamada al método reservar plaza que lo tenemos disponible para la academia a la que se quiera apuntar y en la sesión a la que se quiera apuntar. 00:13:12
Este reservar plaza tendrá que devolver un verdadero o falso si la plaza ha sido reservada y para ello internamente tendrá que mirar a ver si hay disponibilidad y de haberla, coger y bloquear una de las plazas para quien lo está solicitando y devolver una plaza reservada para que desde el main también, desde la clase academia, sea capaz de notificarlo por pantalla. 00:13:42
Y luego después de hacer todo el recorrido para cada uno de ellos, la idea es mostrar el resumen llamando al método mostrarAgenda que hemos identificado aquí en la clase agenda y este hemos dicho que iba a recoger su información a base de llamadas al método infosesión de cada una de las academias. 00:14:09
Cuando vayamos haciendo el código, fijaros que en la clase agenda lo que vamos a hacer va a ser llamadas a métodos que identifican muy bien las funcionalidades de lo que queremos. 00:14:33
que va a ser reservar plaza y mostrar agenda. 00:14:51
O sea, desde mostrar agenda vamos a llamar a infosesión 00:14:58
y cuando lo vayamos haciendo vamos a llamar a reservar plaza, 00:15:02
¿se llama? A ver, como hemos dicho, a reservar plaza. 00:15:07
Y desde la clase agenda, que puede estar siendo desarrollada 00:15:11
por un equipo de trabajo diferente, lo único que conoceremos 00:15:14
o que deberíamos conocer de la clase academia es su interfaz. 00:15:17
El interfaz es el conjunto de métodos mediante los cuales podemos comunicar 00:15:24
con objetos de la clase academia. 00:15:30
Entonces, a través de esos métodos, nosotros pedimos que vayan pasando ciertas cosas. 00:15:34
Por ejemplo, resérvame una plaza. 00:15:39
Fijaros que desde quien esté haciendo el desarrollo de la clase agenda, 00:15:42
Si no estamos haciendo en conjunto una sola persona o un solo grupo de trabajo todo el ejercicio, no tendríamos por qué saber cómo se las arregla para ver si hay plazas disponibles y para hacer una reserva. 00:15:46
Simplemente tendremos a través de la interfaz que llamando a este método, indicándole la sesión y un nombre de quien quiera hacer la reserva, esperamos que se haga la reserva porque en la otra clase estará programado. 00:16:00
Esto es una de las características propias de la programación orientada a objetos, que es la capacidad de encapsulación y de ocultación del código. 00:16:16
¿Qué superventaja tiene esto? Pues mirad, pensad que las academias pudieran funcionar para hacer las reservas en base a ver información en unos ficheros. 00:16:24
Pues vale, nosotros desde la clase agenda llamaríamos a reservar plaza y sin saber desde la clase agenda cómo se está consultando si hay plazas libres, 00:16:36
obtendríamos un resultado Boolean diciendo si ha hecho la reserva o no se ha hecho. 00:16:45
Pensad que en la clase academia de repente hay un cambio de tecnología, se instala una base de datos 00:16:52
y ya no hacemos la lectura a través de unos ficheros, sino que necesitamos hacer unos accesos a la base de datos. 00:17:00
Lógicamente reservar plaza y comprobar disponibilidad tendríamos que modificarlo 00:17:07
porque ahora tienen que acceder a una base de datos en lugar de un fichero, pero al tener encasulado el código y ocultado para las otras clases, dando información solamente de nuestra interfaz de acceso, como esta no cambia, seguimos llamando a reservar plaza a través de la, indicando la sesión y el nombre desde el método main de agenda, 00:17:12
el resto de clases no se verían afectadas, es decir, es un cambio 00:17:34
que quedaría encerrado 00:17:39
justo en el código de la clase Academia 00:17:41
es un proyecto gigantesco que necesita hacer accesos a la Academia para las Reservas 00:17:47
desde muchos puntos diferentes 00:17:51
el nuevo mantenimiento, en este caso perfectivo, para modificar 00:17:54
el acceso a las Reservas, que antes era un fichero y ahora ha pasado a ser 00:17:59
un acceso a una base de datos, se trabaja únicamente y exclusivamente en una parcela muy clara del código. 00:18:03
Eso, claro, pues es una ventaja. Imaginaos que esto no fuese así y que el cambio de fichero a base de datos 00:18:08
implicase que, de forma desparramada por ahí por todo el código, tuviéramos que estar haciendo pequeñas actualizaciones 00:18:16
en muchos sitios, que a lo mejor ese cambio luego pudiese tener implicaciones en algunos otros. 00:18:24
Pues claro, se complicaría mucho el análisis para ver dónde hay que tocar, la actualización, la necesidad de volver a probar muchos módulos de código en lugar de única y exclusivamente la clase academia y sería muchísimo más complicado que si trabajamos con esta característica de la aprobación orientada a objetos que es la encasulación y el ocultamiento de la información mostrando cómo interactúo yo con el resto de programas 00:18:30
a través de lo que es el interfaz, que viene a ser aquellos métodos 00:18:59
y aquellos atributos que no tienen propiedad privada, 00:19:02
private, y que son accesibles desde otros puntos del código. 00:19:07
Bueno, dicho esto y contado esto, 00:19:13
vamos a programarlo y vamos a estar haciendo hincapié 00:19:16
incluso en esto que os cuento. Vamos a arrancar Eclipse. 00:19:19
Dudas que os puedan surgir me vais diciendo, 00:19:41
según estemos trabajando, se toma su tiempo 00:19:43
vamos a cerrar aquí estos ficheros de practicar de otros días 00:19:59
entiendo que no me habéis dicho nada, los vídeos podéis acceder bien, ¿verdad? 00:20:07
de las tutorías que vamos grabando, pues nada, vamos a poner aquí tarea 5 00:20:14
creamos la clase agenda 00:20:27
y la clase academia, la agenda es la que tiene 00:20:52
el inicio del programa, así vamos a crear el método main 00:21:07
Vale, como atributos, cosas que pueden caracterizar una agenda, aquí recordando un poco los ámbitos de las variables, aquí podríamos definir todos los métodos que tengan, todas las variables que tengan que ver con cualquier método incluso y como estarían definidas en este ámbito las tendríamos disponibles. 00:21:11
Pero la idea de los atributos de clase es definir aquellos atributos, aquellas características que tienen que ver justo con la clase que estamos definiendo. En este caso, ¿qué cosas podría definir una agenda en el contexto de nuestro programa? 00:21:48
pues bueno, las academias con las que podemos ir formando las reservas. 00:22:08
Por ejemplo, una variable que en un momento dado, una variable de tipo entero, inti, 00:22:13
que luego vamos a ir utilizando para recorrer un bucle, pues esta variable no caracterizaría una agenda. 00:22:17
Si la ponemos aquí y la utilizamos en el main, nos va a compilar y el programa va a funcionar, 00:22:24
pero no tendría sentido a nivel de diseño. 00:22:29
entonces por nada, definimos aquí los 00:22:32
los objetos de la clase academia 00:22:43
podemos poner academia, mi música vamos a poner 00:22:47
la academia de música 00:22:54
podemos definir un objeto de la clase academia 00:22:55
para la academia de música 00:23:07
para la segunda de las academias había una de inglés 00:23:08
verdad pues inglés y para la de baile recordad que bueno ahora me compila directamente fijaros 00:23:13
que en la clase academia no tengo nada definido aún así el constructor por defecto siempre está 00:23:28
disponible para bueno pues para permitirnos aunque no definamos ningún constructor en la 00:23:33
clase de la que instancia mos objetos pues para que para que aquello compile en el momento que 00:23:38
definamos cualquier constructor tanto el que no tiene parámetros como cualquier otro el de por 00:23:44
defecto dejaría de funcionar. Entonces sí que es cierto que hemos dicho que una de las cosas que 00:23:50
vamos a tener en las academias va a ser el atributo de nombre. Si aquí en la clase academia 00:23:55
definimos un string ese nombre, pues este nombre habíamos propuesto en el enunciado que se cargase 00:24:02
a través del constructor. Vamos a definir el constructor de momento por aquí. Fijaros, los 00:24:13
atributos, le podemos indicar, aparte del tipo, 00:24:19
le podemos indicar el alcance que tenga. Este, recordad, podría ser 00:24:24
private, protective, 00:24:27
package, para que tuviera acceso a todo el paquete si no decimos nada, 00:24:32
o public, para que esté accesible desde cualquier sitio. 00:24:35
Lo ideal es siempre restringir 00:24:40
al máximo el acceso, que dé el servicio que se 00:24:43
precisa de los atributos y los métodos al programa, pero bueno, 00:24:47
¿para qué vamos a dejar, no sé, si no tenemos necesidad, para qué 00:24:51
vamos a dejar especialmente abierto un atributo para que actualizaciones 00:24:55
en el código pudieran llegar a hacer cosas imprevisibles en nuestros atributos? 00:24:59
Pues mira, vamos a ponerle de momento aquí un private 00:25:04
y vamos a decir que sea privado, solamente tenga acceso desde la propia clase 00:25:06
y luego si durante el desarrollo del programa necesitamos desde fuera de la clase 00:25:11
acceder a este, pues creamos un getter y un setter para tener controlado 00:25:15
cómo asignamos el valor y cómo lo devolvemos. 00:25:19
La asignación, bueno, la podríamos hacer a través de un setter 00:25:27
o como lo vamos a hacer a través del constructor, pues en principio 00:25:29
no vamos a definir el setter, entonces diríamos que definimos 00:25:34
un método constructor, recordad, los métodos constructores no devuelven 00:25:37
nada, pero tampoco se lo indicamos aquí. 00:25:42
el nombre de 00:25:45
el convenio para el nombre de los métodos 00:25:49
siempre es que empiecen con minúscula y de las clases que empiecen con mayúscula 00:25:54
con la excepción de los constructores que al coincidir el nombre 00:25:58
de la clase y del método pues no puede ser a la vez mayúscula y minúscula 00:26:02
y se mantiene el criterio de la clase 00:26:06
y este método en particular, bueno pues lo empezamos con una mayúscula 00:26:09
con el mismo nombre que la clase y justo me interesa el método es que dentro de la sobrecarga 00:26:13
recibe un nombre. Entonces decimos que la variable de clase ese nombre queremos que tenga el valor 00:26:21
del nombre. Los constructores en línea general son aquellos métodos que utilizamos para inicializar 00:26:33
los objetos cuando van a empezar a funcionar, a formar parte del programa. Fijaros que la llamada 00:26:43
los constructores siempre aparecen después del new que es el que nos hace la reserva necesarias 00:26:48
en memoria ram y ha sucedido que antes me compilaba porque podíamos utilizar el constructor 00:26:54
por defecto pero en el momento en el que construimos un definimos un constructor dentro 00:27:01
de la clase deja de tener ya sentido el constructor por defecto y ya no funciona ese por defecto si 00:27:06
necesitamos un constructor que no reciba parámetros tendríamos que definirlo en el momento que ya 00:27:13
Existe otro sobrecargándolo dentro de la clase academia. 00:27:18
En principio no es necesario, los tres objetos los vamos a crear pasándole el nombre, 00:27:23
pues este constructor nos resulta suficiente. 00:27:26
Entonces vamos a crear aquí, vamos a decirle que este es el de música, 00:27:31
este es el de inglés y este es el de baile. 00:27:37
Bueno, aprovechando a pasarle al constructor para que el nombre de los objetos 00:27:41
lo sepamos asociar justo a la actividad que tienen 00:27:46
y que se guarde en el nombre de la clase. 00:27:50
Decíamos, estos objetos, los diferentes 00:28:00
objetos pueden ser estáticos. 00:28:04
Pues mira, si tuviéramos varias academias de música y de baile 00:28:08
aquí, pues resulta que si definimos 00:28:12
las cosas o si las utilizamos luego por ahí, si las 00:28:18
definimos de forma estática pues bueno pues podríamos tener ciertos problemas pero como 00:28:21
solamente hay uno no va a dar igual definirlo estático o no estático si lo definimos estático 00:28:26
es cierto que luego podríamos acceder a mi música poniendo agenda punto mi música y si no pues lo 00:28:32
ponemos así lo vamos a mantener así si os parece en el método main vamos a ir interactuando a 00:28:40
a través del teclado. Pues mira, vamos a definir un objeto de la clase Scanner, ScannerMyScan, igual a New, Scanner, SystemIn. 00:28:49
Fijaros que, bueno, de partida no me compila. ¿Por qué? Porque no tenemos, pertenece a una librería que está fuera del proyecto 00:29:02
y no la tenemos importada, aquí nos lo ofrece Eclipse 00:29:09
y decimos, si hacemos un system.out.println 00:29:13
y imprimimos algo, aquí tampoco hemos importado el system.out 00:29:21
y en cambio, no se me quejen, me compila 00:29:27
¿por qué es este motivo? 00:29:29
pues en algún momento lo comentábamos 00:29:31
todo lo que está definido en las librerías de Java 00:29:34
java lang en esa colgando esa estructura es se entiende que son funciones que son tan comunes 00:29:37
a todos los programas que directamente se importan de forma automática sin tener que ponerlo 00:29:46
explícitamente en todos los proyectos pero lo que no pertenezca a java lang si quieres utilizarlo 00:29:52
pues hay que importarlo tanto si es de un paquete en nuestro proyecto diferente al paquete en el que 00:29:57
estamos como si es desde librerías de java entonces para que no funcione 00:30:01
escáner cogemos y le metemos el java útil y ahí lo tenemos ya como vamos a ir 00:30:06
leyendo información de aquí pues podemos definir una variable 00:30:15
lectura para ir trabajando con ella fijaros recordad que decíamos que íbamos 00:30:20
a ir cogiendo información de diferentes alumnos para que se apunten a las 00:30:29
academias hasta un máximo de 4 o hasta que introduzcamos el texto fin, necesitaremos 00:30:35
llevar un contador del número de alumnos que hasta ahora están matriculados, podríamos 00:30:41
definirlo como 0 o como 1, según definamos aquí un 0 o un 1, según interpretemos que 00:30:49
esta variable recoge el siguiente alumno que se va a apuntar o los que hay apuntados hasta 00:30:56
el momento, pues la podríamos inicializar a 0 o a 1 y en consecuencia de cómo lo hagamos 00:31:01
aquí tendremos que ir trabajando luego en los 00:31:06
bucles. Vamos a ponerlo por ejemplo a cero 00:31:09
inicialmente y bueno 00:31:12
pues ahora luego vamos metiendo más variables según nos vaya 00:31:17
demandando el programa. Entonces vamos a pedir 00:31:20
para trabajar con escáner, lógicamente siempre 00:31:25
habrá que ir poniendo system out en pantalla 00:31:28
para que el usuario entienda lo que 00:31:30
tiene que ir introduciendo. Entonces vamos a decir 00:31:34
pedir al alumno información de la actividad a la que se quiere apuntar. 00:31:36
Bueno, pues ponemos aquí un System. 00:31:52
Podemos adornar un poquito el texto, podemos meter ahí un tabulador quizás, 00:32:03
o un par de tabuladores. 00:32:09
Ponemos una primera línea así que, para que nos saque aquí unos asteriscos. 00:32:11
¿Alguno de vosotros habéis metido códigos o alguno de vosotros que hacía que alguna parte se pusiera en negrita y todo esto? 00:32:18
Bueno, pues muy chulo, la verdad, os ha quedado. 00:32:26
Entonces, vamos a poner aquí, reservando, podemos poner 1, 2, reservando actividades para el próximo fin de sábado. 00:32:30
Metemos un par de tabuladores para que quede de la misma forma. 00:33:03
indica tu nombre o pulsa fin para terminar. 00:33:07
Si ponemos en el System of Print el N, nos va a saltar a la siguiente línea 00:33:16
para que introduzcamos por teclado el nombre o fin. 00:33:19
Vamos a poner un System of Print, dejamos aquí un espacio y así se me queda la misma línea. 00:33:23
Y aquí vuelvo a pegar esto y así ya me queda. 00:33:31
Indica tu nombre, aquí podemos poner incluso alumno. 00:33:38
para ir secuenciando el alumno con el que estamos trabajando 00:33:43
podemos decir alumno y utilizamos esta variable, esta variable vale 0 00:33:55
podemos poner aquí en el mensaje 00:34:00
entre paréntesis decimos la variable alumno 00:34:03
ahora lo repasamos, dice aquí alumno 00:34:08
pues al principio dirá esto vale 0, pues dirá alumno 00:34:17
1, indica tu nombre o pulsa fin para terminar y como este 00:34:21
mensaje lo iremos sacando cada vez que se meta información de uno de los alumnos 00:34:25
luego lo podemos meter en un método incluso y hacer una llamada al método 00:34:29
esto irá incrementando cada nuevo alumno que se vaya conectando 00:34:33
pues entonces cuando valga 1 nos dirá al 1 2 y después de incrementar 00:34:37
otra vez irá al 1 3, de esta forma vamos gestionándolo 00:34:42
bueno pues lo ponemos así que nos lo muestre y ahora 00:34:45
tendremos que estar recogiendo información 00:34:53
hasta que se introduzca la información de cuatro alumnos o se meta fin. 00:34:57
Pues bueno, pues podemos hacer un while aquí mientras el número de alumnos sea menor de cuatro, ¿no? 00:35:02
Es decir, entrará por aquí cuando sea cero, cuando sea uno, cuando sea dos y cuando sea tres. 00:35:17
Y tenemos que poner doble condición porque nos tendremos que salir cuando sea fin. 00:35:26
Y, bueno, aquí tendremos que utilizar la variable donde hayamos leído la información. Vamos a poner ese lectura. Recordad que string es un tipo de datos un poquito especial. Habíamos hablado de los tipos de datos referenciados y primitivos. 00:35:30
los enteros, los datos numéricos, los Boolean 00:35:56
son tipos de datos primitivos, tienen 00:36:01
características muy particulares, que es que no es necesario hacer un new cuando definimos 00:36:04
una de sus variables, digamos que se hace de forma automática 00:36:09
no disponen de métodos para trabajar con ellos, como por ejemplo 00:36:12
la clase Scanner que tiene el NSynth, si queremos trabajar con esos tipos de datos 00:36:17
tenemos que utilizar las clases Wrapper, os acordáis de las clases envoltorios que 00:36:21
cada una asociada con uno de los tipos de datos primitivos 00:36:25
de Java, pues la clase string 00:36:28
está un poquito a medias entre uno y otro. En realidad 00:36:31
es un tipo de datos referenciado, pero 00:36:34
luego tiene bastantes características que se parecen a las 00:36:37
de los primitivos. Y una de las cosas 00:36:40
que tienen los primitivos es que podemos comparar dos números 00:36:43
con igual igual o dos variables boolean 00:36:46
con igual igual, pero en cambio 00:36:49
la clase string por la característica de ser referenciada 00:36:51
no lo podemos hacer así. Entonces para hacer comparaciones podemos utilizar 00:36:55
un montón de ellas que tienen, que vemos algunas o muchas 00:36:59
de ellas ahora en el tema que tenemos abierto, pues podemos utilizar el método 00:37:03
makeEquals que nos devuelve un boolean si son iguales dos cadenas 00:37:07
o el compareTo que nos devuelve si una es mayor que otra 00:37:11
o es menor que otra o si es igual, en ese caso devolvería un número 00:37:15
que es un 0. Aquí como no queremos saber 00:37:19
la ordenación, nos vale con diferenciar si es igual o no, equals 00:37:23
nos resulta suficiente. Entonces decimos 00:37:27
que si el número es menor que 4 y 00:37:31
necesitamos comparar esto pero que no sea 00:37:36
fin, esto nos dice si es fin nos devuelve un true, pues vamos a darle la vuelta 00:37:41
a false. Si sean esas dos características 00:37:45
pues vamos a ver aquí que es lo que tenemos que hacer 00:37:49
que será intentar reservar una plaza 00:37:53
a ver, no sé, me sobra 00:37:55
uno, paréntesis 00:38:00
y aquí otro, no 00:38:02
vale, bueno, no se me están quejando los paréntesis 00:38:07
se me está quejando de que 00:38:18
esa lectura está sin inicializar 00:38:20
vamos a poner aquí 00:38:21
cuando llega esa comparación, vamos a ponerlo así 00:38:22
de momento para que me compile 00:38:26
esa lectura me interesa que tenga 00:38:27
en este momento aquí o un nombre 00:38:30
o fin, y aquí ya lo acabo de pedir 00:38:32
Vamos a capturarlo. Vamos a decir que esa lectura sea igual a mi scan. Hacemos un next line. Recibo nombre de alumno o fin. Una de dos. 00:38:34
Bueno, si hemos entrado aquí, quiere decir que estamos intentando recoger, está un alumno intentando apuntarse. 00:39:05
Lo primero que necesitaremos será conocer a cuál de las tres actividades quiera apuntarse. 00:39:11
Siguiendo un poco esta estructura, podemos separar otra línea aquí, hacer un barra N y decimos indica la actividad. 00:39:17
Si lo ponemos con print lo dejamos en la misma línea en la que estamos. 00:39:39
las actividades puede ser, se lo podríamos indicar también por teclado 00:39:45
que sea música, baile o 00:39:55
inglés. Aquí podríamos validar que la actividad es 00:39:59
una de esas tres, bueno, después lo hacemos, si nos da tiempo 00:40:05
antes de acabar la clase. De momento vamos a 00:40:15
suponer que se mete bien el nombre de la actividad 00:40:19
y bueno, pero esta actividad la tenemos que cargar 00:40:23
en algún sitio, pues entonces podemos coger y definir aquí una variable 00:40:27
fijaros, bueno, os cuento otra cosa, S, actividad 00:40:31
el reservar memoria RAM para una variable única y exclusivamente, bueno, pues 00:40:34
no supone mucho al ordenador, pero bueno, si queremos ser 00:40:41
estrictos e irnos a la teoría, hay diferencias entre definir 00:40:45
esta variable aquí, donde la tenemos ahora mismo, o definirla 00:40:49
aquí, de la misma forma que decíamos 00:40:54
O sea, en el programa antes, si mi scan yo lo defino aquí, me va a compilar y me va a ir bien porque está dentro del ámbito del main. 00:40:59
Pero mi scan es algo que caracterice las agendas? No. 00:41:06
Pues entonces vamos a definirla en el método main, que es una variable auxiliar a este método. 00:41:09
Igual que definir escáner aquí o aquí tiene sus matices, definir string es actividad aquí o aquí, pues también lo tiene. 00:41:14
mira, si la definimos aquí, esta variable 00:41:23
lógicamente va a estar disponible aquí 00:41:31
porque es una variable que hemos puesto dentro 00:41:34
del main, pero molestaremos al sistema operativo 00:41:39
en cuanto a rendimiento, probablemente sea un poquito mejor definirla aquí porque molestaremos 00:41:43
al sistema operativo para hacer una única reserva 00:41:47
bueno, con la clase string tendría sus matices, en la clase int 00:41:51
para hacer una única reserva. Si esta variable la defines aquí 00:41:55
si la defines dentro del while, cada vez estaríamos 00:41:59
pidiendo al sistema operativo, oye, hazme una reserva nueva. ¿Por qué? Porque se va 00:42:03
fuera del ámbito del while. Probablemente definir 00:42:07
las variables aquí permitirían que el programa tuviera un pelín 00:42:11
mejor rendimiento que definirlas aquí. Con el matiz 00:42:15
de que string justo no es el mejor ejemplo para lo que os estoy contando 00:42:19
porque al tratarse de una variable un poquito especial, justo en el tema 00:42:23
que estamos viendo ahora, dice que cada vez que se le asigna un valor 00:42:28
hace una reserva de memoria run, con lo cual no nos libraríamos de esto 00:42:32
que os estoy comentando, pero si estuviéramos hablando de una variable 00:42:35
de tipo int, long o de una variable de tipo objeto de una de las clases 00:42:38
que tenemos por aquí, pues se podría dar esta circunstancia. 00:42:46
Vamos a definirla aquí, esa actividad, y decimos que la actividad la vamos a capturar a través de miScan.nestLine. 00:42:49
Y lo siguiente que vamos a pedirle va a ser la sesión. 00:43:02
Pues definimos aquí también un int y sesión y se la pedimos también. 00:43:09
Vamos a poner uno o dos, luego si acaso lo vamos modificando, que va en diferentes periodos de tiempo. 00:43:29
bueno pues para hacer la lectura 00:43:37
hay varias alternativas 00:43:42
para hacer la lectura siempre asegurándonos 00:43:46
que dejamos el buffer limpio 00:43:48
una de las posibilidades podría ser 00:43:49
decir isession 00:43:52
punto igual 00:43:53
a mi scan 00:43:55
punto nest 00:43:58
podríamos hacer un nesint 00:43:59
ya sabéis que no soy especialmente amigo yo de esto 00:44:15
porque deja el enter 00:44:17
en el buffer pero si que es verdad 00:44:19
que luego puede limpiar el buffer haciendo un nestline 00:44:21
dices, bueno, pues hago luego un next line y limpio el enter, aquí cargo el número 00:44:23
y luego limpio el enter, y otra posibilidad, bueno, pues es 00:44:27
hacer aquí un string, ese aus 00:44:31
voy a decir una variable auxiliar por aquí, la leo 00:44:35
con un next line 00:44:40
y ahora hago un isesión 00:44:50
que sea igual, fijaros, tengo el número 00:44:56
cogido en una variable auxiliar, pero en realidad 00:45:00
es un número escrito de forma alfanumérica. Entonces podemos hacer 00:45:04
un integer.parseInt y aquí indicarle ese aus 00:45:08
y ya me guarda la información como una 00:45:12
variable de tipo int, que es lo que tenemos en mi sesión. 00:45:16
Bueno, pues una vez que tenemos el dato, lo que vamos a hacer va a ser 00:45:23
intentar reservar la plaza. Para la reserva de plaza 00:45:26
lo que vamos a hacer va a ser llamar a un método de la clase academia 00:45:30
entonces, a ver un momentito, como decía aquí 00:45:35
reserva la plaza, recibe la sesión y el nombre de la persona 00:45:41
que quiera hacer la plaza, y devuelve si ha sido capaz de reservarla o no 00:45:47
vamos a decir aquí, vamos a hacer 00:45:52
un public, vamos a definirla como 00:45:55
bueno, sería necesario público, si agenda está en el mismo paquete, podríamos dejarlo así 00:45:59
reserva plaza, devuelve 00:46:04
boolean, recibe 00:46:14
un int y sesión y un nombre, el nombre 00:46:21
del alumno que quiera reservarlo, ese nombre 00:46:28
Bueno, fijaros que lo que he hecho ha sido definir 00:46:30
algo que no tiene un código que sea correcto en absoluto, nos falta por desarrollar toda la 00:46:45
clase academia, pero de cara a agenda 00:46:49
ya tenemos el interfaz de un método que recibe este nombre 00:46:52
que nos va a devolver algo que va a ser un boolean 00:46:57
y que recibe estos dos parámetros de método. 00:47:00
Entonces, para el grupo de trabajo que podría ser totalmente independiente 00:47:06
de la clase academia, gracias a la encapsulación puede seguir trabajando perfectamente. 00:47:10
Y dicen los de la agenda, yo no es mi responsabilidad, yo les pido 00:47:14
que reserven una plaza, si le paso estos dos 00:47:18
atributos en la llamada, si me dice true, yo ya doy por hecho 00:47:22
que la plaza está reservada. Si luego hay problemas de reserva 00:47:26
que a los que han hecho el desarrollo de la clase academia, bueno, pues les pregunten cuál ha sido 00:47:30
el motivo. Y los de la clase academia, bueno, según lo había 00:47:34
pensado yo, la reserva plaza, o sea, 00:47:45
lo primero que voy a hacer luego aquí va a ser comprobar a ver si hay disponibilidad de forma interna 00:47:49
dentro de la clase Academia. 00:47:53
Bueno, sí. 00:47:57
Sí. 00:48:06
Bueno, bueno, sí, bueno, 00:48:09
es igual, ¿sabes? Es una cuestión 00:48:11
de interpretación, a lo mejor, del enunciado. 00:48:13
O sea, tú llamas, consideraste 00:48:15
el método que se llama 00:48:17
de la agenda, el de comprobar disponibilidad 00:48:19
y en caso de disponibilidad, hacía la llamada 00:48:21
a la reserva y yo, bueno, pues 00:48:23
lo consideraba al revés. 00:48:25
Pero vamos, que no está ni mejor 00:48:27
ni peor pensado. Que se llame 00:48:29
oye, resérvame una plaza internamente en la academia 00:48:31
que haga la comprobación y si tiene la disponibilidad se la reserve 00:48:35
y si no le diga que no ha sido capaz de reservarla. 00:48:38
Pero bueno, más o menos, 00:48:42
o sea, es una cuestión de criterio requisito, digamos, 00:48:44
de cómo se engrana un poco la reserva en sí. 00:48:48
Pero yo lo había pensado así, 00:48:51
que el método del interfaz que la academia ofrece hacia afuera, 00:48:53
hacia la clase agenda sea el método reserva plaza de hecho mi intención es que el de comprobar 00:48:58
disponibilidad sea privado para que no haya acceso desde la agenda que haga la comprobación ahora 00:49:04
aquí cuando me ponga a programar esto y en caso de que sea correcto de que no haya plazas que 00:49:11
reservar devuelva reservar plaza un falso y si existe entonces ya coja y haga él para que ponga 00:49:15
por aquí el código para concretar la reserva es como lo había pensado yo bueno entonces una vez 00:49:23
aquí ya tengo la actividad a la que me quiero conectar tengo el nombre que lo he cogido por 00:49:34
aquí también en estas tres variables tengo el nombre el nombre en esa lectura tengo el nombre 00:49:40
pues mira lo voy a cambiar aquí voy a poner ese nombre en esta variable tengo el nombre aquí tengo 00:49:50
la actividad y aquí la sesión. Pues aquí es donde puedo hacer la comprobación 00:50:05
para llamar a unos. Entonces, como cada una de las tres 00:50:11
academias tienen su reserva plaza, voy a diferenciar dentro de la agenda 00:50:15
a quién quiero solicitar la reserva de la plaza, le indico la sesión 00:50:19
y el nombre del alumno. Entonces digo sí. 00:50:23
Esto, bueno, con cualquier estructura de condición lo podríais ver, con Swiss 00:50:29
también lo podríais hacer. Entonces digo sí, la actividad que 00:50:33
la he cargado aquí, esa actividad, punto 00:50:37
recordad que para comparar utilizamos el equals 00:50:41
si resulta que es música, si esa actividad que lo he cargado 00:50:44
por aquí, recordad que no he hecho comprobación a ver si el dato 00:50:57
que habíamos introducido era correcto, aquí si nos da tiempo luego hacemos 00:51:02
una comprobación y si no pues nada, si es música 00:51:05
pues sé que a la academia sobre la que tengo que trabajar es música, pues me voy 00:51:09
al objeto de academia mi música, punto, porque no me deja aquí, me dice que lo meta aquí 00:51:13
entre un tricatch o que la ponga static, claro, el método main es static, pero lo tengo aquí 00:51:37
definido, vamos a ponerlo static, si no le ponemos ahí el tricatch, si es equals, no 00:51:48
Equals no. A ver, se me ha ido el santo al cielo. 00:52:11
Lo que hacemos es reservar, reservar plaza, ¿en qué sesión? 00:52:16
Pues en iSesión, ¿con qué nombre? Con ese nombre. 00:52:22
Esto me devolverá, me indicará si, me devolverá un verdadero o un falso 00:52:26
en función de si aquí se ha concretado la reserva de la plaza o no. 00:52:31
Entonces, para trabajar sobre eso, lo que vamos a hacer es definir aquí 00:52:37
una variable boolean, boolean de reserva realizada, 00:52:39
y lo mismo para las otras dos, si la actividad 00:52:55
no venimos aquí a la de baile y por aquí a la de inglés 00:53:14
alguien hizo algo que 00:53:32
está curioso también, que es una posibilidad para hacerlo, algunos de vosotros 00:53:44
que lo que hizo fue decir, mirad, voy a coger 00:53:48
como aquí estoy comparando si es la de música 00:53:52
y luego esta reserva o la otra, pues lo que hizo fue 00:53:56
definir una academia auxiliar para la cual 00:54:00
no hago un new ni nada, no apunta a ninguna posición de memoria de forma 00:54:08
inicial, no me puedo evitar hacer la comparación 00:54:12
es cierto, pero aquí en lugar de llamar a reserva 00:54:20
plaza de uno, de otro o de otro 00:54:34
lo que hizo fue decir que el academia aus 00:54:37
resulta que si entra por aquí por la de música de forma 00:54:41
queremos que Academia AUS apunte a donde está apuntando ya la de música, 00:54:45
a la misma posición de memoria. 00:54:51
Si es baile, que apunte a la que está apuntando ya la de baile. 00:54:57
Y si es inglés, que apunte a la que está apuntando ya la de inglés. 00:55:02
Con lo cual, AKAUS apunta en memoria RAM a la posición donde apunta 00:55:08
el objeto de la Academia de Música, si hemos introducido como actividad música, 00:55:12
a donde apunta baile, si hemos introducido baile o inglés, si hemos introducido inglés 00:55:17
y en este caso, bueno, pues como está apuntando a la que toca 00:55:21
ya sí que podemos poner aquí reserva plaza 00:55:26
bueno, pondríamos esto una sola vez, bueno, valdrá una otra 00:55:28
u otra, pero se me queja si no lo he inicializado 00:55:36
¿veis? entonces aquí llamaría una vez solamente a reserva plaza 00:55:41
para una academia auxiliar que estaría apuntando 00:55:45
de memoria RAM o bien a música o bien a baile o bien inglés. Es equivalente a un código 00:55:48
u otro. Pero bueno, me llamó la atención que 00:55:52
alguno de vosotros lo programaréis así y por compartirlo con el resto. 00:55:56
Me lo cargo esto porque es lo mismo un caso que otro. 00:56:02
Entonces, llegados aquí, esta variable, fijaros que aquí no tenemos nada 00:56:10
programado, pero el grupo de trabajo de la clase Academia 00:56:14
que ha venido a trabajar hoy de la clase Agenda, pero los de Academia todavía no han llegado, 00:56:17
llegar un poquito más tarde. Están a punto de acabar con su trabajo 00:56:21
gracias a que tienen una definición del 00:56:25
interfaz de la clase academia donde se sabe que van a llamar 00:56:29
a que existe un método con el cual pueden interactuar pasándole 00:56:33
la sesión y el nombre y que devuelve un boolean. ¿Cómo lo hayan programado 00:56:37
los de la clase academia? A los que están haciendo el trabajo de la clase agenda les da 00:56:41
un poco igual. Luego, para que funcione todo el programa, lógicamente 00:56:45
habrá que hacer este desarrollo, pero digamos que conociendo 00:56:51
la interfaz en la clase agenda de la clase academia 00:56:55
tienen suficiente. Entonces aquí decimos sí 00:56:58
la reserva ha ido correcta 00:57:02
luego ya os digo que si nos da tiempo, hacemos todo más 00:57:08
bonito. Me dice inicialízalo, aunque luego lo vamos a ir modificando 00:57:22
por aquí. Pero sí que es verdad que es posible que llegue el código aquí en una ejecución 00:57:36
si no hemos metido ni inglés, ni música, ni baile. 00:57:40
Entonces, podría llegar aquí y estar sin inicializar. 00:57:43
Es por lo que se queja esto. 00:57:46
Entonces, aquí diría clase reservada. 00:57:49
No ha sido posible reservar la clase. 00:57:57
Si hemos hecho una reserva de una clase, ¿qué es lo siguiente? 00:58:15
Tenemos que mirar más alumnos hasta que sean cuatro o se introduzca a fin. 00:58:19
Después de hacer aquí la primera de las reservas, 00:58:24
la segunda o lo que sea según la iteración del bucle que tengamos 00:58:26
pues lo que tocará será sacar otra vez este mensaje 00:58:30
que luego podemos quitar, definir un método 00:58:33
que sea un método menú y trabajar con él 00:58:36
directamente y después de sacar 00:58:39
el mensaje volver a coger el nombre 00:58:43
vemos el mensaje, cogemos el nombre, se termina 00:58:45
el while, nos venimos aquí, habrá que 00:58:54
incrementar ahora el número de alumnos que han hecho la reserva 00:58:57
y volvemos a hacer la comprobación. 00:59:00
¿En qué caso podemos incrementar el número de alumnos? 00:59:03
Pues bueno, según el criterio que tengamos en el enunciado, 00:59:07
si es cuatro intentos de nuevos alumnos, 00:59:10
pues podríamos poner aquí un y alumno más más, 00:59:14
tanto si se ha hecho la reserva de la clase como si no se ha hecho, 00:59:18
y si pretendemos que sean cuatro alumnos que efectivamente han conseguido reservar, 00:59:21
reservar, aunque recorramos el bucle 10 veces, pues lo podríamos 00:59:26
poner aquí. Vale, pues aquí terminamos el bucle, después ejecutamos 00:59:30
y ahora lo que nos dice el programa es que 00:59:38
antes de terminar el método main, pues mostremos la agenda. Dice que tiene que existir 00:59:42
en la clase agenda un método que sea mostrar agenda. 00:59:46
Entonces, ponemos aquí mostrar agenda. Bueno, no le gusta de momento 00:59:50
porque no está definido, pues vamos a definirlo. Hacemos aquí 00:59:58
lo podemos definir este método estático, ya que va a ser 01:00:02
único para todos los objetos de la clase agenda 01:00:07
y además nos ahorra tener que instanciar un objeto de la clase agenda 01:00:10
cosa que sería necesaria si no la definimos static 01:00:15
para que pueda ser llamado desde un sitio estático como es el main 01:00:18
entonces ponemos aquí 01:00:21
un public, podemos definirlo como private, void, que no devuelva nada 01:00:24
static 01:00:30
y si lo pongo en su sitio sería 01:00:31
mucho mejor aquí. Aquí la llamada 01:00:37
y aquí aunque no lo tengamos hecho, de nuevo el 01:00:43
grupo de trabajo que está desarrollando la agenda dice 01:00:52
el interfaz de la clase academia me dice 01:00:55
que va a tener un método que se llama 01:00:58
infosesión, que recibe la sesión 01:01:00
y va a devolverme un string 01:01:07
con la información de la academia. Pues entonces 01:01:10
infosesión, podemos poner aquí 01:01:16
infosesión 01:01:20
como es de la clase 01:01:23
academia, pues para cada uno de ellos 01:01:25
punto 01:01:30
y de qué sesión me interesa 01:01:31
que me devuelva, pues de la 1 01:01:33
para música de la 2 01:01:35
para inglés 01:01:43
de la 1 01:01:49
y perdón 01:01:51
inglés de la 1 01:01:52
y para baile de la 1 y de la 2 01:01:55
también, no me compila 01:01:59
lógicamente porque 01:02:04
no tengo definido el método aquí, como estoy accediendo 01:02:06
desde otra clase, pues voy a definirla 01:02:12
con una etiqueta que podría ser, bueno, pues se podría 01:02:15
package, por ejemplo, desde el mismo paquete, igual que aquí, decimos que devuelvo 01:02:20
un string, el método de infosesión y que recibe la sesión 01:02:24
para la que queremos que se nos muestre la información 01:02:28
bueno, de momento por aquí nos compila, más allá de validar 01:02:31
datos y todo esto, aquí yo creo que la clase agenda la tenemos 01:02:44
prácticamente desarrollada. Vamos a ir 01:02:48
metiendo información en la academia y luego la vamos poniendo más bonita. 01:02:51
Bueno, la clase academia tenía 01:02:59
varios atributos, nos pedía uno que fuera el nombre de la academia, 01:03:00
este ya lo hemos utilizado aquí en el constructor, luego tenía 01:03:06
enteros que nos permitían 01:03:10
saber cuántas reservas iban 01:03:14
hasta ese momento en la academia. Entonces vamos a poner 01:03:18
enum al ses uno 01:03:21
números, cuántos alumnos han reservado ya en la sesión 01:03:25
uno, en la sesión dos. 01:03:30
Lo teníamos para los nombres, string 01:03:33
es enum sesión 01:03:36
1, alumno 1, sesión 01:03:41
1, alumno 2, sesión 01:03:48
2, alumno 1 y sesión 2, alumno 2. 01:03:55
Y no sé si teníamos más atributos 01:04:02
identificados. Estas variables están hechas para guardar 01:04:05
los nombres de los alumnos que van reservando 01:04:09
en la sesión que corresponde, el primero de los alumnos y el segundo. Y para la sesión 01:04:12
dos, el primero de los alumnos y el segundo. El ejercicio nos dice 01:04:17
yo creo que sean privados y que vayamos, si es necesario, utilizando 01:04:21
getes y setters, vamos a definir los privados 01:04:25
y de momento ya tenemos aquí el código del constructor 01:04:28
aunque estas variables se inicializan por defecto, por ser de tipos 01:04:32
numéricos y alfanuméricos, tal cual la vamos a poner en el constructor 01:04:37
vamos a ponerlas en cualquier caso y las inicializamos 01:04:41
aunque sea volver a repetirlo 01:04:43
si fueran valores diferentes 01:04:47
pues entonces necesitaríamos sí o sí 01:04:49
ponerlas en el constructor 01:04:51
en este caso no lo podríamos haber ahorrado 01:04:52
disculpad 01:04:55
fijaros como 01:05:19
como bueno, están perfectamente 01:05:20
accesibles a pesar de ser privados 01:05:23
porque claro, la etiqueta privado 01:05:25
lo que hace es restringir el acceso a esas variables 01:05:27
fuera de la clase, constructores 01:05:30
de la propia clase, pues nada, sin problema 01:05:31
lo acepta. Vale, pues nada, vamos a reservar plaza. 01:05:33
Mirad, en reservar plaza, lo primero que se me ocurría a mí era 01:05:45
comprobar a ver si hay plazas. Podemos hacer un comprobar 01:05:48
plaza para una determinada sesión. ¿Para qué sesión? 01:05:52
Pues para la que me están preguntando que si puedo reservar plaza. 01:05:58
El método comprobar plaza, pues mirad, a ver si hay... 01:06:02
Bueno, en el enunciado nos decía que definamos una... 01:06:05
básicamente, bueno, no es 01:06:10
estrictamente necesario, tampoco vamos a utilizar en muchos sitios 01:06:13
el número de plazas, pero sí que en el enunciado, pues me preocupé de ponerlo 01:06:18
para que trabajaréis también y definierais dentro de la 01:06:22
tarea una variable que fuera una constante 01:06:26
que fuera de tipo final, entonces ponemos final de tipo entero 01:06:30
numplazas igual a 2 01:06:34
recordar las variables que identificamos 01:06:40
como final se convierten en constantes. Esto implica 01:06:50
a diferencia de las variables que si intentamos modificarlas durante el código 01:06:53
pues ya no nos deja. ¿Por qué? Pues porque hemos dicho que es una constante. Una constante no cambia 01:06:58
su valor. Además, esto sí por convenio, aunque no 01:07:02
por compilador de Java, se suele poner todo el nombre 01:07:08
con mayúsculas. Igual que vamos teniendo por ahí pequeñas 01:07:11
pistas de a qué se refieren, pues hemos dicho antes que los nombres de los métodos 01:07:16
empiezan con minúscula, menos el constructor, los nombres de las clases 01:07:21
empiezan con mayúscula, pues las constantes 01:07:25
todas las letras en mayúscula. Estábamos, íbamos a trabajar sobre 01:07:28
el método comprobar plaza, pues ponemos aquí 01:07:36
lo de, lo de, comprobar plaza nos puede 01:07:42
devolver un verdadero, nos devuelve un verdadero, si existe la plaza disponible 01:07:47
y un falso o sea un boolean si no lo existe podemos vamos a definir la privada de tal 01:07:51
forma que no formará parte del interfaz de la clase academia de caras afuera sino que 01:07:59
será un método de consumo interno que de hecho lo estamos definiendo para llamarlo desde el 01:08:04
método reservar plaza es privada por lo tanto entonces devuelve un boolean le damos comprobar 01:08:13
plaza y recibe la sesión 01:08:20
para la que queremos hacer la comprobación, ISES por ejemplo 01:08:24
aquí estamos haciendo esa llamada, vamos a recoger su resultado poniendo 01:08:29
aquí un boolean, B plaza disp 01:08:37
en la variable plaza disp recogemos si existe 01:08:41
disponibilidad de plazas todavía para esta sesión 01:08:47
en la academia donde se está ejecutando reservar plaza y aquí para hacer 01:08:51
la comprobación de la plaza, pues lo que podemos hacer 01:08:58
es decir que si if, si 01:09:02
y sesión, y ses, es igual 01:09:04
a 1, recordad que estamos obligando 01:09:13
estamos pidiendo por aquí, y luego si metemos algo diferente 01:09:17
y nos da tiempo, hacemos comprobaciones, pero estamos diciendo que se meta un 1 o un 2 01:09:21
según lo que introdujésemos aquí, pues habría que hacer las comprobaciones ahora 01:09:24
si la sesión sobre la que preguntamos es 01:09:28
un 1 y el número de plazas que van 01:09:32
reservadas hasta ahora, para esa sesión, que parece 01:09:40
para lo que tenemos esta variable por aquí, es menor 01:09:44
de 2, pues quiere decir que hay plazas disponibles, ¿verdad? 01:09:49
Entonces, aquí tendríamos que devolver 01:09:57
un verdadero. Si ponemos aquí un return, lo he puesto 01:10:00
no es incorrecto, lo acepta Java, ¿verdad? 01:10:04
Fijaros, un return true, pues por aquí nos tendrá que aparecer un return 01:10:08
false, que es necesario como instrucción, 01:10:12
como punto de escape de un método que devuelve algo, es obligatorio 01:10:16
ponerlo. Típicamente, a mí me lo enseñaron desde 01:10:20
siempre, se desaconseja en métodos poner 01:10:24
esparcidos a lo largo de su código diferentes returns. 01:10:27
¿Por qué? Porque estás abriendo muchas puertas de salida al método y luego ante un posible mantenimiento que tengas que hacer del código, aquí se ve muy claro porque no es nada, pero si es un método largo que hace llamadas a otros métodos y empieza a haber muchas alternativas de salida, pues muchas salidas es complicado. 01:10:31
Imaginaos que, para lo que os quiero contar, estamos en un estadio y más allá de conglomeraciones porque tenga que salir mucha gente al mismo tiempo, queremos tener un control de las personas que salen. Pues si tenemos 600 puertas, pues va a ser mucho más complicado que si tenemos una puerta solo para la salida del estadio. Matices aparte, si es un estadio grande y tiene que salir mucha gente al mismo tiempo. 01:10:50
En lo que respecta al control un poco y poder hacer un seguimiento del método, sobre todo si hay que hacer un mantenimiento, siempre se recomienda que la salida sea única. 01:11:13
¿Cómo podemos conseguir esto? Pues como de verdad tenemos aquí discrepancias entre lo que hay que devolver, que una vez será true y otra vez será false, pues lo que podemos hacer es poner aquí una variable auxiliar y decirle, por ejemplo, que sea false aquí al principio. 01:11:24
es una de las alternativas 01:11:40
y aquí 01:11:41
coger y hacer un return 01:11:44
ve aus 01:11:45
queremos comprobar 01:11:46
que si hay plaza en la sesión 1 01:11:51
para esta academia, si hay plaza en la sesión 1 01:11:54
es esto lo que tiene 01:11:56
que pasar, pues me dice 01:11:58
oye que si que hay plaza, perfecto 01:11:59
y si no hubiera plaza 01:12:01
si estamos hablando de la sesión 1 01:12:03
ahora tenemos que meter para la sesión 2 01:12:05
lo que tenemos que devolver es un false 01:12:06
necesitaríamos poner aquí un false 01:12:09
tendríamos que poner aquí un else para indicar false 01:12:11
en caso de que no haya disponibilidad, bueno pues podríamos 01:12:19
poner aquí el else en esta compruebo si hay disponibilidad true, else 01:12:23
false o directamente no ponerlo y habernos asegurado que lo inicializamos 01:12:27
aquí a false, de partida consideramos no hay plaza 01:12:31
y ahora en caso de que la haya sobre escribimos la variable y cuando llego 01:12:38
aquí si la he sobre escrito devuelvo true y si no 01:12:45
informo de lo que de partida ya consideraba. 01:12:48
Este método, en función de la sesión, 01:12:53
me tiene que validar si hay plaza en una sesión u otra 01:12:55
y aquí hemos hecho la comprobación para la sesión 1. 01:12:57
Podemos poner aquí un else. 01:13:03
Si la sesión es la 2 01:13:06
y el número de alumnos de la sesión 2 es menor que 2, 01:13:08
pues le decimos un true aquí. 01:13:17
Y podríamos poner esto o esto, 01:13:26
meter en un único if los dos, con un or 01:13:38
si ese, si en la sesión uno o en la sesión 01:13:51
dos, pues devuelvo otro, con un solo if 01:14:01
lo que pasa es que nos complica en este caso 01:14:09
la parte de evaluar el verdadero o falso y en este caso 01:14:11
es más fácil esa parte, pero lo hemos repartido en dos comprobando 01:14:17
a ver si en la sesión dos, y si no se da esa 01:14:21
o esa o el conjunto de esta, pues mantenemos el valor de inicialización 01:14:27
de falso y me dice que no es posible. De la comprobación 01:14:32
de la plaza hemos llegado por aquí. A ver por qué 01:14:36
no haya puesto el nombre bien en alguno de los dos sitios. 01:14:40
Entonces aquí ya tengo si hay plaza. Si hay plaza tendré que 01:14:48
hacer lo que toque y si quiere hacer la reserva y si no 01:14:52
pues no hacer la reserva. Aquí diríamos 01:14:56
If, si hay plaza, pues aquí tengo que hacer la reserva y me aseguraré de que reservar plaza devuelve también un verdadero. 01:15:00
¿Para qué? Para que aquí se sepa que se ha reservado la plaza en la llamada. 01:15:17
Se carga aquí. 01:15:22
Y si no se ha podido reservar la plaza, pues es porque no hay disponibilidad, entonces aquí tendríamos un else. 01:15:25
¿Cómo vamos a hacer para que haya un único return? 01:15:34
por la misma jugada de antes. Yo cojo y digo aquí, bueno, 01:15:36
este Boolean ya lo tengo aquí. Aquí cojo y digo, devuélveme 01:15:43
si se ha producido plaza. Si fue posible hacerla 01:15:48
si había disponibilidad de plaza, pues es porque la 01:15:56
va a reservar aquí. Entonces ya devuelvo directamente bien, reservada. 01:15:59
Y si no fue posible porque no había disponibilidad, pues devuelvo, no hay disponibilidad 01:16:04
de plaza. Podemos hacer esto o podríamos hacer también 01:16:08
lo siguiente, bueno en el else en verdad no hay nada de código 01:16:13
aquí tendríamos que hacer la reserva de la plaza 01:16:20
y otra posibilidad sería hacer así, mirad, if 01:16:22
sí, y llamar directamente aquí al método, comprobar 01:16:27
plaza, en lugar de estar definiendo una variable, esto sería 01:16:36
sustituyendo a este trozo, aquí estaríamos 01:16:40
diciendo, si es posible reservar plaza 01:16:47
pues ya directamente me entro el if, no lo hago en dos pasos 01:16:50
que es cargarlo en una variable booleana y luego hacer la comprobación 01:16:54
de esa variable, es cierto que si hago esto, pues pierdo esta variable 01:16:58
si usamos esta jugada, aquí 01:17:02
tendríamos que hacer la reserva de la plaza 01:17:06
y en caso de no poder reservarse, pues se iría por el else 01:17:08
que ni siquiera existe, entonces no hacemos nada 01:17:14
Entonces, bajo esta alternativa lo que haríamos sería definir una variable aquí boolean, b, plaza disp, la inicializamos a false, decimos inicial, consideramos que no hay plaza y devuelvo esto. 01:17:16
si ha habido plaza, ejecutará esto. 01:17:42
Entonces, ¿qué hago? 01:17:48
Que será la reserva de la plaza que la vamos a hacer ahora. 01:17:49
Entonces, lo que haría esto sería poner esta variable a true. 01:17:52
Entonces, digo, inicialmente considero que no hay plaza, 01:17:58
comprobo si hay plaza. 01:18:00
Este comprobar si hay plaza no lo estoy cargando en ningún sitio. 01:18:03
Si hay plaza, digo, oye, voy a sobrescribir esta variable 01:18:05
que inicialmente estaba considerando que no había plaza 01:18:08
y la ha habido. 01:18:10
De hecho, aquí voy a hacer la reserva de la plaza. 01:18:11
Y digo, ya que sí. 01:18:13
¿Que no hay plaza disponible? 01:18:16
no ejecuta el if, se viene por aquí, no hay else, devuelve lo que tiene 01:18:17
plaza disponible, que es directamente un false. 01:18:21
O si queréis hacerlo pasito a pasito, de esto, y luego hacer la comprobación 01:18:25
aquí. Ahora, está bien que lo hagáis pasito a pasito, 01:18:29
a lo mejor lo veis más claro, con el tiempo os iréis ahorrando poner líneas 01:18:34
cuando ya vais cogiendo más destreza, y a lo mejor haréis esta otra 01:18:37
alternativa. Habíamos llamado a reservar plaza, recordad, 01:18:41
comprobamos a ver si hay plaza, pues venga, si 01:18:48
hay plaza, esto devuelve verdadero, que es 01:18:54
lo que está haciendo esto con el return, y si es verdadero 01:18:58
estamos aquí dentro del if, modificamos la variable esta que vamos a utilizar 01:19:02
para el return a true, porque sí que se ha reservado la plaza 01:19:06
y hacemos un return por aquí, y en 01:19:10
el método reservar plaza toca reservarla aquí, hay plaza 01:19:14
pues vamos a reservar. Pues venga, para hacer la reserva tenemos que mirar 01:19:25
a ver en qué sesión vamos a reservar. Entonces decimos la sesión 01:19:35
en la que queríamos reservar, if, si la sesión en la que queremos reservar 01:19:39
es la 1, sabemos que hay plaza con toda seguridad, con lo cual esta variable 01:19:46
valdrá o 1 o 2, o sea, o 0 o 1 01:19:52
o no ha reservado nadie todavía, o 01:19:56
hay una reserva hecha, entonces podemos decir sí, esto es igual a 0 01:19:59
todavía no ha reservado nadie, el nombre de la reserva que estamos recibiendo 01:20:07
lo tendremos que guardar, como todavía no hay reservas, en la variable 01:20:15
sesión 1 al 1, 1, else, si el comprobar reserva estaba bien 01:20:19
y hemos sido capaces de entrar aquí a reservar plaza, quiere decir que esto 01:20:37
vale 0 o vale 1, o sea el else es que eso vale 1 sí o sí, entonces el nombre 01:20:43
se lo aplicamos a la sesión 1 01:20:48
alumno 2. Y sea el caso que sea 01:20:52
lo que hacemos es incrementar esto en 1. Esto es si la sesión es la 1 01:20:56
y si la sesión es la 2. No valdría un else si hemos 01:21:03
hecho las comprobaciones oportunas antes. Entonces sería 01:21:14
el número de alumnos de sesión 2 si es 0. Entonces 01:21:17
el nombre de la sesión 2 del 01:21:23
alumno 1 será ese nombre y el nombre de la sesión 2 01:21:27
el alumno 2 será ese nombre. 01:21:32
Y finalmente devuelvo por aquí, indico 01:21:41
que true para decir, oye, la plaza se ha realizado y 01:21:44
en ese caso devolveré por aquí, correcto, se ha realizado. Para aquí 01:21:48
la llamada al método reserva2, pues lo considero 01:21:52
por aquí. Y en la clase academia 01:21:56
si no recuerdo mal lo que nos queda por implementar 01:22:05
es sesión, entonces el texto 01:22:10
vamos a hacer un primer mensaje así rápido, luego 01:22:19
adornamos mensajes en función de como nos dé tiempo pero 01:22:22
para poder acabar el ejercicio en este 01:22:26
ratillo, vamos a decir si la sesión es 01:22:31
la sesión 1, fijaros este método 01:22:35
pues igual que los otros, va a devolver algo, va a devolver un string 01:22:43
pues si va a devolver un string, lo suyo 01:22:47
por lo que os comentaba antes, si queremos seguir ese criterio, es tener un único return 01:22:51
pero como se va a ir construyendo el mensaje que vamos a devolver 01:22:55
bajo diferentes condiciones, si fels es sesión 1, es sesión 2 01:22:59
como es una cosa u otra, pues entonces lo que vamos a hacer va a ser 01:23:03
definir aquí una variable, ese 01:23:07
InfoDev. La información a devolver 01:23:10
la podemos ir construyendo poco a poco. Entonces decimos la información 01:23:14
a devolver, podemos poner, no sé si es justo el mensaje que pone el 01:23:19
enunciado, vamos a poner Academia aquí, esta parte del mensaje 01:23:23
es común para todos, mi nombre de Academia lo tengo guardado en ese nombre 01:23:27
pues vamos a poner aquí Academia ese nombre. Sesión para la sesión 01:23:33
aquí, alumno 01:23:49
uno, bueno, esto vamos a dejarlo ya, si en la 01:24:00
sesión uno, alumno uno 01:24:07
bueno, luego vamos a ver si alumno uno lo ponemos aquí o lo ponemos a continuación 01:24:11
entonces decimos, si la sesión es la uno, lo que vamos a hacer es que 01:24:17
ese info dev sea igual a ese 01:24:21
info dev 01:24:24
para que tenga toda esta información, verdad, si es como una cualquiera de todos los 01:24:28
mensajes, más 01:24:33
alumno 01:24:34
1, y esto lo tenemos 01:24:36
sesión 1, alumno 1, lo tenemos 01:24:43
aquí, más 01:24:45
después 01:24:53
jugamos un poco para si 01:25:09
este no existe, que ponga un punto 01:25:11
después del alumno 1, pues 01:25:14
lo adornamos un poquito más 01:25:15
si nos da tiempo, ya os digo 01:25:17
que igual no, al final 01:25:19
por pegar un repaso a 01:25:21
tanto concepto teórico, al final 01:25:26
me da tiempo a cerrar el ejercicio del todo. 01:25:29
Sesión 2, alumno 1, sesión 01:25:33
2, alumno 2. 01:25:37
Y ahora devolvemos aquí 01:25:42
ese info. Bueno, vamos a hacer una ejecución a ver qué pasa. 01:25:44
Esto de meter todo el código y no hacer ninguna ejecución 01:25:54
parcial no es lo más recomendable, porque si ahora tenemos problemas 01:25:58
pues hay muchos puntos sin validar 01:26:02
antes que estaban más o menos bien y donde buscar 01:26:06
los errores, siempre es más fácil ir haciendo pequeñas pruebas 01:26:09
del código y así si tenemos luego un error pues es muy probable 01:26:13
que sea sobre el último código que hemos metido y es más fácil de localizar 01:26:18
a ver, bueno, fijaros por aquí, nos sale esto un poco descolocado 01:26:21
reservado de actividades, no me ha salido 01:26:29
mensaje para terminar para quitar este de aquí para que se me quede ahí lo tengo aquí indica 01:26:35
el nombre de alumno 1 jose indica la estabilidad música sesión 1 esto me lo pone después vale 01:26:58
pues vamos a poner fin y no me ha hecho nada con el fin vamos a ver evitar este mensaje bueno 01:27:12
cuando un programa no nos funciona, una herramienta bien útil 01:27:41
es ir poniendo trazas, a ver qué va pasando, vamos a poner aquí, vamos a poner trazas 01:27:45
system.out.println, a ver si llega aquí 01:27:49
a mostrar agenda, jose, fin 01:27:53
no, la actividad ha dicho que sea esa, vamos a decirle fin aquí 01:28:15
bueno, sí que pone mostrar agenda, vale, bueno, lógico 01:28:20
que no haya mostrado nada, sí que llega aquí al mostrar agenda 01:28:24
pero lo que hemos hecho ha sido llamar a infosesión de mi música 01:28:28
efectivamente muy bien, nos ha devuelto con el return 01:28:32
el infosesión, nos ha devuelto un string, correcto 01:28:35
pero luego aquí no hemos hecho nada con ello, entonces es normal que no aparezca 01:28:39
nada por pantalla, ahora con lo que nos devuelve a infosesión 01:28:44
lo vamos a mostrar por pantalla, vamos a ver si está correcto o no, pero 01:29:19
algo ya nos pretenderá mostrar por pantalla, a ver, entonces decimos aquí 01:29:22
José, actividad, música, sesión 1, vamos a poner un fin, bueno y por ahí aparece José, vamos a ver, José, actividad, música, 1, Ana, música, 1, dice que no va diciendo clase reservada de momento, vamos a poner Noa, música, 1, 01:29:27
y dice, no ha sido posible reservar la clase, fijaros, como solamente tenía 01:30:08
dos reservas, intenta hacer una tercera, Sandra, vamos a poner música 01:30:12
dos, clase reservada 01:30:23
todavía me sigue ofreciendo, al final había seguido el criterio de hasta reservar cuatro 01:30:26
vamos a intentar una cuarta, Rubén 01:30:31
vamos a volver a hacer música, y completamos las de música, dos 01:30:34
y no ha terminado, no he debido incrementar 01:30:38
bien el contador. 01:30:45
Vamos a poner aquí un A. 01:30:48
Ah, bueno. 01:30:51
Me ha pedido de nuevo el nombre. Sí que lo había considerado, 01:30:51
pero me ha pedido de nuevo el nombre. Pues esto sería 01:30:53
una cosa a validar. 01:30:55
Fijaros, entonces me dice por aquí José y Ana. 01:30:57
Rubén. 01:31:01
Y aquí 01:31:03
no me ha metido 01:31:03
José, Ana, Rubén. 01:31:04
Sandra. Sandra no me lo ha puesto. 01:31:11
Música 2. 01:31:13
Vale, pues vamos a revisar el código. 01:31:16
en la reserva, infosesión, comprobar 01:31:18
plaza, en la reserva, sesión 2 01:31:23
alumno 2, sospechaba que esto lo iba a haber dejado coincidiendo 01:31:30
con este, pero veo que no, no sé por qué no me ha puesto a Sandra 01:31:38
ahora vemos, vamos a corregir otra de las cosas que nos ha hecho 01:31:42
fijaros que después de 4, se ha quedado ahí 01:31:46
y nos ha vuelto a pedir otro nombre, el A y luego ha terminado, eso es porque 01:31:50
cuando ya he cuargado aquí 4, sigo pidiendo esto. 01:31:54
Pues aquí tendría que poner un if, sí. 01:32:00
Resulta que el número de alumnos ya es 4, que lo acabo de poner aquí. 01:32:04
No me vuelvas a mostrar eso porque ya lo que quiero es terminar. 01:32:09
Ese se resuelve por ahí. 01:32:18
Y vamos a hacer otra ejecución. 01:32:19
Voy a poner de nombres A, B, C y D para ir más rápido. 01:32:27
música 1 01:32:30
ahora no me ha pedido el nombre 01:32:33
claro 01:32:42
vale, no me ha pedido el nombre porque he puesto 01:32:44
esto mal aquí 01:32:47
digo, muéstralo 01:32:48
si es 4 01:32:53
no, pero lo tiene que 01:32:55
mostrar mientras 01:32:57
sea menor de 4 01:32:58
para que lo muestre con 0, con 1, con 2 01:33:03
y con 3 01:33:05
ejecutamos por aquí 01:33:06
música 1 01:33:14
B, música 1 01:33:17
C, música 2 01:33:21
D, música 2 01:33:26
Vale, ahora fue, me ha pasado lo mismo que antes 01:33:30
respecto a guardar la información, vale 01:33:36
pues vamos a ver por aquí, en academia 01:33:39
puede ser en la reserva o puede ser al crear este texto 01:33:44
donde tengamos el problema, en la reserva parece que no 01:33:48
por lo que hemos visto, reservar plaza, guarda el nombre en uno 01:33:51
y guarda en otro, en el que tenemos problemas en 2 al 1 2 01:33:56
parece que está bien, pero al informar, pues tampoco 01:34:00
porque aquí 2 al 1 1, 2 al 1 2 01:34:06
1 al 1 1, 1 al 1 2, no termino de ver 01:34:11
donde tengo el error aquí, ya sesión la 2 01:34:21
sesión uno, alumno dos, sesión uno, alumno uno 01:34:32
ah, vale, sesión dos, alumno uno, sesión dos, alumno dos 01:34:51
ah, vale, bien, el problema está aquí. Fijaros, aquí estoy incrementando 01:35:03
el número de alumnos de la sesión uno y aquí el número de alumnos de la sesión 01:35:12
uno de nuevo. Dos, aquí, sesión dos 01:35:16
copia y pega, tienes dos problemas. Vamos a hacer 01:35:21
la prueba. A, música 01:35:25
1, B, música 01:35:31
1, C, música 01:35:35
2, D, 01:35:40
música 2. Vale, ahí lo tenemos ya. 01:35:44
Ya me lo muestra bien. Vamos a hacer una reserva 01:35:47
para diferentes academias. Por ejemplo, decimos 01:35:52
A, decimos música 2, 01:35:56
B, baile 1 01:36:00
C, inglés 01:36:05
2, y ahora ponemos fin 01:36:09
vale, pues ya termina por aquí, y bueno, no recuerdo exactamente 01:36:12
yo creo que hemos dicho esta distribución, yo creo que lo he hecho bien 01:36:19
el fin parece que también funciona, nos quedan 5 o 10 minutillos 01:36:22
vamos a hacer alguna pequeña corrección por aquí 01:36:33
por ejemplo vamos a validar los datos que vamos metiendo 01:36:36
lo primero que nos pide por aquí es la actividad 01:36:41
música, baile o inglés, pues aquí podríamos hacer una 01:36:45
comprobación con el Nestline hasta que la actividad con toda seguridad 01:36:48
pues sea una de esas, entonces podríamos hacer aquí 01:36:52
while mientras, mientras la 01:36:56
actividad que estamos comprobando 01:37:03
recordad como es un string hay que utilizar el compare to 01:37:07
ponemos aquí música o baile 01:37:10
o inglés, bueno compare to 01:37:25
vamos a poner equals, el problema que me está dando es que compare to 01:37:40
devuelve un número, que no se puede transformar directamente 01:37:43
a un boolean 01:37:46
entonces mientras la actividad sea o música 01:37:48
o baile o inglés, que eso es lo correcto 01:37:52
ese es el caso en el que querría salir de aquí 01:37:55
entonces lo que voy a hacer va a ser todo el conjunto 01:37:58
negarlo, entonces si es 01:38:00
si es música o es baile o es inglés 01:38:06
es true, pero como lo que quiero es que sea 01:38:10
false, lo niego y lo convierto a false, entonces me voy del while 01:38:13
y continúo, y si no es eso 01:38:16
pues lo que diré será un system.out.println 01:38:19
repite la actividad 01:38:24
y digo aquí que sea 01:38:29
música, baile, inglés 01:38:31
y vuelvo a cargar, vuelvo a leer 01:38:41
el nombre de la alumna, vamos a poner una A 01:38:50
indica la actividad, ponemos cualquier cosa por ahí 01:39:00
y se repite, nada, no le gusta 01:39:03
ponemos baile y ya le gusta, ya continúa 01:39:06
vamos a volver a repetir esta validación 01:39:09
ponemos trin trin, no le gusta, inglés 01:39:12
sí, le gusta, ponemos fin 01:39:15
y bueno, nos ha funcionado por ahí. Entonces esto nos sirve para validar 01:39:18
la actividad. Luego podríamos jugar también 01:39:23
a que se meta en mayúsculas o minúsculas. Como estamos trabajando 01:39:26
todo el rato con minúsculas, pues podríamos coger y hacer una esa actividad 01:39:31
que sea igual a ese 01:39:34
actividad.toLowerCase y nos convierta 01:39:38
a minúsculas. Lo ponemos en los dos sitios y ahora ya 01:39:42
si al meterlo ponemos la primera letra en mayúsculas o ponemos 01:39:49
todo el texto en mayúsculas, pues también le vale. 01:39:53
Decimos A, ponemos aquí música. Vale, pues le gustó. 01:39:57
B, ponemos lo que sea por ahí. Y C, esto no me gusta. 01:40:02
Vamos a poner baile, pues también le gusta. Ya con el 01:40:06
to lowercase lo convierte a minúsculas. Para validar 01:40:11
los números, la sesión que tiene que ser 1 o 2, bueno, pues podemos 01:40:22
a hacer lo mismo, fijaros, podemos coger y decir, podemos validarlo 01:40:26
o bien una vez ya siendo un número o todavía validarlo 01:40:33
siendo cadena de caracteres, entonces podemos 01:40:36
coger aquí y decir, while mientras 01:40:41
ese aus equals a 1 01:40:44
o ese aus equals a 2, eso es lo que me gusta 01:40:48
ahora tenemos solo dos opciones, no tres, repite 01:40:52
la sesión, que sería 01:40:56
1 o 2, fuera esto 01:41:00
el tool over case este no tiene sentido, y luego hago aquí el parse 01:41:12
común, le vamos a validar también 01:41:15
el número de la actividad, ponemos aquí 01:41:19
un A, indica la actividad, música, ponemos 01:41:28
aquí cualquier texto, y le dice no, repite 01:41:34
la sesión, ponemos la sesión 9 y tampoco le gusta, decimos la sesión 2 01:41:38
y ahora ya sí le gusta, clase reservada. Vale, pues esa variación 01:41:42
también está ya. Bueno, ya es cuestión de adornar un poco 01:41:49
más los mensajes quizás. 01:42:00
Mirad aquí el mensaje, por ejemplo, para la sesión 1, pues aparece 01:42:04
la sesión 1, si está vacía o si no está. Bueno, pues aquí podríamos 01:42:08
meter un if, es decir, if si tenemos 01:42:12
un número de reservas por sesión, que lo tenemos aquí, 01:42:18
estamos dentro de la sesión 1, entonces decimos, si la sesión 01:42:22
1 es igual a 0, pues quiere decir que no hay reservas. 01:42:25
Entonces, sobre este mensaje 01:42:30
cogeríamos y diríamos, más 01:42:33
no tiene reservas. Esto valdrá 0, valdrá 1, 01:42:47
valdrá 2. Entonces, el shift, si resulta 01:42:55
que hay una reserva, pues lo que le metemos es este bloque 01:43:03
diciendo alumno 1 y else, quiere decir que aquí no había 01:43:15
reservas, aquí se había hecho una sola reserva, pues aquí ya 01:43:29
resulta que tenemos dos reservas. Este es el mensaje que 01:43:32
teníamos de antes. Entonces vamos a hacer una última 01:43:42
ejecución o una nueva ejecución de esto. 01:43:46
No hemos modificado la sesión 2, hemos mantenido lo que había antes. 01:43:52
Bueno, para probar a ver este modelo, este formato de mensaje, hemos 01:43:56
trabajado sobre la sesión 1. Entonces, fijaros, lo que vamos a hacer va a ser 01:44:00
poner A, la actividad de música en la sesión 1, reserva. B, la actividad 01:44:06
de música en la sesión 1, y C en la actividad de baile en la sesión 1, y le damos aquí 01:44:14
un fin. Entonces, en música, que están los dos, pues sale al 1-1, al 1-2-B, en inglés 01:44:23
que no hemos hecho reserva, dice la sesión 1 no tiene reservas, y en baile que hemos 01:44:33
hecho una, en este hemos hecho las dos sesiones, nos aparecen los dos bien, en este que no 01:44:37
hemos hecho reservas dice no tiene reservas y en este como hemos hecho una sola sesión pues 01:44:42
coge y dice reserva alumno 1c y bueno más allá de que nos quede un poquito más bonito el menú 01:44:47
menos pues yo creo que no nos queda mucho más por probar esto fijaros podríamos coger ya que 01:45:01
este código se repite dos veces una y dos pues podríamos coger y decir aquí un private void 01:45:07
menú fijaros para mostrar este menú necesitamos una variable entera que la estamos utilizando 01:45:20
ahí vamos a poner y nun al claro aquí tenemos un pequeño problema que el next line lo tenemos 01:45:27
aquí metido, bueno podemos poner simplemente esto 01:45:39
los mensajes en el menú, entonces llamo aquí a 01:45:42
menú, ahora lo repaso y os lo cuento 01:45:52
bueno, como teníamos el mismo código repetido dos veces y sería mucho 01:46:04
más útil si lo tuviéramos repetido un montón de veces, fijaros que si 01:46:37
queremos hacer un cambio en un código que se repite muchas veces y que además 01:46:40
tiene una funcionalidad bien identificada, como en este caso puede ser mostrar el menú 01:46:44
pues un pequeño cambio, tendríamos que modificarlos 01:46:48
en todas esas partes y si una se nos queda 01:46:51
sin modificar, pues se quedaría 01:46:54
incongruente el menú según fuera 01:46:55
llamado desde un sitio o desde otro 01:46:57
entonces en estos casos, y ya os digo 01:46:59
con una funcionalidad que se identifica 01:47:01
bien, pues puede pegar a hacer 01:47:03
un método 01:47:05
este método, como es 01:47:07
de uso para dentro de la clase agenda 01:47:09
lo podemos definir como private 01:47:11
no devuelve nada y bueno 01:47:13
pues hace este, está imprimido por 01:47:15
pantalla estos tres, estos tres mensajitos que teníamos antes dentro del código. Entonces, si le 01:47:17
damos aquí, fijaros, pues nada, el comportamiento sigue siendo el mismo, pero llamamos al menú de 01:47:23
diferentes sitios. ¿Veis? Y aquí, esta es la llamada al menú desde un sitio y esta es la llamada desde otro, 01:47:29
desde dentro del while y anterior al while. Y nada, pues esto, esta era la tarea 4. Al final he acelerado 01:47:37
un poquillo para poder terminarla, pero bueno, hemos ido despacito intentando contar, haciendo un 01:47:49
repaso a todo lo que es la parte de teoría. 01:47:54
¿Tenéis alguna 01:47:57
pregunta? ¿Alguna prueba que queréis que hagamos al código? 01:47:58
¿O alguna cosa que haya 01:48:01
quedado por ahí pendiente? ¿Qué se os ocurra? 01:48:02
Sí, dime. 01:48:09
¿Un try-catch? 01:48:26
Sí, no sé muy bien 01:48:39
por qué, la verdad. 01:48:40
Te lo pediría. 01:48:42
Luego 01:48:45
echo un ojo de nuevo 01:48:45
a tu tarea, a ver si me hago la idea 01:48:48
de por qué puede ser. 01:48:50
Porque, sí. 01:48:52
01:48:54
sé donde, vale 01:48:58
pues lo echo un ojo y a ver si me hago la idea 01:49:01
y os puedo decir, te puedo decir 01:49:04
bueno, siempre 01:49:06
siempre solemos preguntar 01:49:30
un pequeño algoritmo, no 01:49:32
muy complicado 01:49:34
pero sí, un pequeño algoritmo y claro pues 01:49:35
un poquillo, pero me fijo en las estructuras 01:49:38
de todas formas, es cierto 01:49:40
que no se puede probar, pero 01:49:43
tampoco miramos el código 01:49:44
como si tuviera que compilar, ¿sabes? 01:49:46
hombre, que se vea que es Java, que tiene sentido 01:49:48
pero bueno, pues si se escapa alguna cosilla 01:49:50
nos fijamos más 01:49:53
en la funcionalidad más que 01:49:54
en la sintaxis en ese caso, estricta 01:49:56
claro, yo que sé, pues 01:49:59
los wilds son como son, ¿no? 01:50:00
pero bueno, que si se ha escapado 01:50:02
una llave en algún sitio, pues 01:50:05
no está mal 01:50:06
bueno, pues nada, si no tenéis 01:50:07
más cosas, por aquí vamos cerrando 01:50:17
la semana que viene ya empezamos 01:50:19
a hablar sobre contenidos del 01:50:21
tema 6 y hasta el tema 6 01:50:23
lo tenemos, tenemos el examen 01:50:25
del próximo, luego en febrero 01:50:28
lo del tema 6 01:50:30
en realidad durante este tiempo 01:50:32
lo hemos venido también trabajando 01:50:34
no tiene grandes cosas nuevas 01:50:35
bueno, pues volver a repasar 01:50:38
y volver a hablar sobre 01:50:40
conceptos que tenemos ahí en Java 01:50:41
pero será un poco volver a repetir 01:50:43
con excepción de lo que sí que aparece 01:50:45
nuevo, que son las expresiones regulares 01:50:48
y es por eso que en la siguiente 01:50:49
tutoría, a no ser que me dirijáis 01:50:52
por otro lado, o tengáis especiales 01:50:54
dudas de cosas, pues sí que 01:50:56
trabajaremos un poco las expresiones 01:50:58
regulares la semana que viene 01:51:00
Bueno, pues nada, voy a cerrar por aquí ya la 01:51:01
grabación 01:51:08
Materias:
Programación
Niveles educativos:
▼ Mostrar / ocultar niveles
  • Formación Profesional
    • Ciclo formativo de grado superior
      • Primer Curso
Autor/es:
JM
Subido por:
Jose Manuel M.
Licencia:
Dominio público
Visualizaciones:
22
Fecha:
27 de enero de 2025 - 19:26
Visibilidad:
Clave
Centro:
IES ALONSO DE AVELLANEDA
Duración:
1h′ 51′ 10″
Relación de aspecto:
1.78:1
Resolución:
1920x1080 píxeles
Tamaño:
251.00 MBytes

Del mismo autor…

Ver más del mismo autor


EducaMadrid, Plataforma Educativa de la Comunidad de Madrid

Plataforma Educativa EducaMadrid