Hola, bienvenidos a esta última lección de este curso. Lo que nos falta hacer es interaccionar con el usuario para que decida cuál de las opciones elegir. En esta lección veremos otras iteraciones y la condicional enumerativa. En la tarjeta de responsabilidades tenemos un método para conectarnos con el catálogo, que es el encargado de la interacción entre el usuario y el catálogo. Nos vamos al final del archivo para agregar aquí el método. De acuerdo a lo que nos dice la tarjeta de responsabilidades, podemos hacer el comentario de Java Doc. Este método inicia la comunicación con el usuario, que puede ser el dueño del catálogo, o bien, un cliente que quiera solicitar servicios del catálogo. Mediante esta línea de comunicación, se agregan discos al catálogo si es que se trata del dueño, o si se trata de un cliente se piden transmisiones y se terminan transmisiones. Como vemos en la entrada correspondiente de la tarjeta de responsabilidades, el método no recibe nada de parámetro, trabaja todo con los atributos del catálogo y no entrega nada. El encabezado es el siguiente. El método se llama "ConectaCatálogo, no recibe nada, es "void", público, ya que es parte de los servicios que va a dar el catálogo. Colocamos su inicio y final. Al principio del archivo escribiste un arreglo que nos daba las opciones del catálogo. Escribimos también la posición que ocupa cada una de esas opciones en el arreglo anterior. Usamos constantes simbólicas para identificar estas opciones. Al mostrar este menú, cada opción se debe imprimir precedida de su número de opción, y la ejecución deberá elegir el curso a seguir de acuerdo a la opción dada por el usuario. Debes notar que salir es la opción cero. Esto es conveniente, pues si quieres agregar algunos servicios que pudiera dar el catálogo, los agregarías al final y salir quedaría sin modificarse. En cambio, si salir fuera la última opción, cada vez que agregas una opción a los servicios, terminas teniendo que modificar la opción salir en cuanto a su número y ejecución. Recordando que tienes esto ya declarado, seguimos programando al método. El menú se deberá mostrar repetidamente hasta que el usuario decida la opción de salir. El proceso de mostrar el menú y actuar de acuerdo a la opción elegida, debe estar dentro de una iteración. Esta iteración no cuenta el número de veces, ni el número de opciones y no tiene un tope en el número de veces que debe ejecutarse. Una iteración "for" no es la adecuada en este caso. Te introduciremos a dos nuevas iteraciones gobernadas, únicamente, por una expresión booleana. Estas dos iteraciones se van a ejecutar mientras la expresión booleana sea verdadera, y se conocen como "while" y "do while". La iteración "while" tiene la siguiente sintaxis. La palabra "while" seguida entre paréntesis por una expresión booleana y con un enunciado o bloque que se va a repetir mientras la expresión booleana se evalúe a verdadera. Si la expresión booleana es falsa en la primera evaluación, el bloque o enunciado no se ejecuta ni una sola vez. Veamos el esquema de su ejecución. Llegamos al "while", se evalúa la expresión booleana, si es falsa el bloque no se ejecuta, y se sale de la iteración siguiendo adelante con lo que sigue a la misma. Si la expresión es verdadera, se ejecuta el bloque y, a continuación, se regresa a evaluar la expresión booleana. En la expresión "while" podemos no ejecutar el bloque ni una sola vez. Veamos ahora la otra iteración conocida como "do while". Su sintaxis es la siguiente, tenemos un "do" después un bloque o un solo enunciado y termina con "while", una expresión booleana entre paréntesis, termina el "do while" con punto y coma. En cambio, el "while" anterior termina con el enunciado o el bloque. Esta iteración garantiza que el bloque o enunciado se ejecuta, al menos, la primera vez antes de evaluar la expresión booleana. Veamos cómo funciona. Se llega a la iteración, es decir, al "do", se ejecuta el bloque o enunciado por primera vez, de ahí se pasa a evaluar la expresión booleana. Si la expresión booleana es falsa, se sale de la iteración y se sigue adelante. Si el resultado es verdadero, regresa a ejecutar el bloque o enunciado. La secuencia que debe repetir con el usuario es la siguiente. Uno. Saludar al usuario. Dos. Mostrarle el menú. Tres. Pedirles su opción. Cuatro. Dependiendo de la opción, elegir el bloque que corresponda. Debes notar que se trata de una iteración. Dentro de la iteración primero hay que recibir la opción. Después de ejecutar la opción, se verifica si hay que salir de la iteración. Claramente, se debe programar con una iteración "do while". Podemos saludar al usuario una sola vez antes de entrar a la iteración. Harás todas las declaraciones al principio del método para que sirvan en todo el bloque. Lo primero será colocar un escáner llamado "cons". Lo construimos montándolo sobre la terminal "System.in" que nos da Java gratis. También sabemos que debemos elegir una opción, y esta opción es un entero. Es para recibir la opción del usuario. Procedemos a saludar al usuario. Le escribimos un mensaje en la pantalla donde le estemos diciendo de qué se trata esto. Es molesto para el usuario enfrentarse a una pantalla en blanco, por eso siempre es conveniente indicarle exactamente dónde se encuentra. Enseguida entras a la primera vuelta de la iteración mostrando el menú y pidiendo la opción. Vamos a entrar a un "do" y lo que tenemos va a ser un bloque, un conjunto de instrucciones. Empezamos el bloque. Le mostramos al usuario que está trabajando con las opciones con las que puede elegir y terminamos con un cambio de línea. Vamos a desalinear un poco el texto para que podamos subrayar con doble línea y el "print line" se encarga de cambiar de línea. Ahora vamos a mostrar el menú, es un "for", vamos a recorrer nuestro arreglo con "i", la inicializamos en cero, mostramos todos los métodos mientras "i" sea menor que catálogo menos uno. En cada iteración vamos a pasar al siguiente método. En este caso, estamos recorriendo el menú y va a ser una sola instrucción. Sí queremos imprimir entre corchetes la posición del menú, pero queremos que queden alineados, por lo tanto vamos a meter una condicional aritmética si la "i" tiene un solo dígito. Es decir, que sea menor que diez, agregamos un blanco y sino, no agregamos nada. Después procedemos a poner los corchetes para meter ahí la posición que ocupa, que es la opción que tiene que elegir, si es que desea esa opción. Escribimos lo que tenemos en el menú de catálogo que mostramos arriba, en la posición "i" cerramos el "print line" y terminamos el enunciado. En este punto terminamos de mostrar el menú, por lo tanto pasamos a pedirle su opción al usuario. Le damos un mensaje. Como queremos que al final nos escriba la respuesta, hacemos un "print" y le pedimos que nos de una opción, la cual debe terminar con "Enter". Cerramos el paréntesis. Le decimos entre qué y qué debe estar la opción. Debe estar entre cero y la última opción que puede pedir el usuario es el tamaño del catálogo, su atributo "length" menos uno, terminamos con el corchete que cierra y le colocamos una flechita. Dejamos un espacio para que no empiece abruptamente. Es importante poner aquí , "MENU_CATALOGO punto length menos uno" entre paréntesis, porque el menos no es un operando de cadenas. Entonces, si no pusiéramos el paréntesis, nos daría un error al compilar, y nos diría que no podemos poner un menos entre cadenas. En cambio, si lo ponemos entre paréntesis primero evalúa esto como una cadena y luego lo entrega bien. Lo que sigue ahora es pedir la opción, y dependiendo de la opción, seguir con un "while". Esto es lo que muestra en la pantalla al empezar a ejecutarse la opción. En la iteración, una vez que mostramos el catálogo nos falta terminar el "do". Cuando colocamos aquel cursor nos marca todo el bloque, que es el correspondiente al "do". Ponemos la condición y este bloque se debe ejecutar mientras que la opción elegida por el usuario no sea cero. El cursor está atorado al final de la flecha, entonces llegamos acá para pedirle al usuario que elija una opción. Esto lo haremos con el método "nextInt". Le pedimos que nos dé un entero, lo asignamos a opción. A continuación, como le pedimos que teclee un "Enter" al terminar el entero, nos tenemos que tragar ese "Enter" para que se procese y no se quede atorado. Cuando leemos la opción de esta manera, puede el usuario darnos un número equivocado, entonces usamos el método "pideNum". Le pasamos una cadena vacía porque no queremos que nos dé nada. También le pasamos el entero que queremos que nos lea y, a continuación, le damos los límites que queremos a "pideNum". Estos son los mismos que le indicamos al usuario, el tamaño del arreglo menos uno. Nos tragamos la línea y como estamos verificando con "pideNum" que esté en rango, no tenemos que hacer nada, solo verificar que esté en rango en la selección enumerativa. Se debe elegir el bloque que corresponda a la opción del usuario. Podremos elegir el bloque preguntando si la opción es el primer valor. Si no, preguntamos si la opción es el segundo valor, y así nos seguimos hasta que si no es ninguno de los valores que hemos mencionado, hacemos el bloque correspondiente a valores distintos de los que se comparan explícitamente. Estas expresiones booleanas únicamente verifican que una variable contenga alguno de los valores considerados. Estos valores son llamados "discretos", los podemos contar y son un número finito. Los valores son enteros, caracteres, booleanos o, inclusive, cadenas pequeñas. Java cuenta con una condicional enumerativa llamada "switch" que, dada una expresión, elige un punto de entrada que esté etiquetado con el valor al que se evalúe la expresión, y ejecuta a partir de ahí lo que reste del bloque del "switch". La sintaxis de este método es como sigue. Empieza con la palabra reservada "switch". Le sigue entre paréntesis una expresión selectora, en este caso quién va a seleccionar esa opción. Después, vamos a tener una sucesión de casos dentro de un bloque donde se empieza con la palabra "case", y luego se sigue con una constante con la que queremos evaluar. A continuación del "case" un enunciado. Aquí nuestra primera opción es salir, que es una constante simbólica de la clase. Podemos hacer una lista de valores posibles para opción, y al final vamos a terminar con una etiqueta llamada "default" que es en el caso en que queramos hacer algo si no se cumple ninguno de los valores antes mencionados. Como funciona en "switch" es de la siguiente manera. Se llega a la palabra "switch", se evalúa el selector, que puede ser una expresión cualquiera que entregue una variable de tipo discreto o una cadena pequeña. Si el valor es cero entra en la lista de enunciados que está etiquetada con este valor. Si el valor es uno, entra a partir de la lista de enunciados que tiene ese valor, y así sucesivamente. Si no es ninguno de los valores, va a entrar por la etiqueta de "default". Puede no haber etiqueta de "default", pueden no ser consecutivas, pero tienen que ser una constante. Como ya mencionamos, lo que nos da es un punto de entrada al "switch", no elige el enunciado, entonces tenemos que tener una forma de salir del "switch" para que sólo ejecute lo que corresponde a cada enunciado. Lo que podemos poner al final de cada "switch" es un enunciado "break", que nos sacaría del "switch", o bien podemos ponerle un enunciado "continue" que nos lleva a la evaluación de la expresión booleana que sigue al "switch". Si aparece un "return" el sistema se sale del método que está, y continúa después de la llamada del método. Con cualquiera de estos enunciados salimos del "switch", de la iteración o del método. Tenemos también un método "exit" que recibe un entero. Está en la clase "System", lo podemos usar pero es una salida de toda la clase. En tu caso, el selector es la opción que queremos. Si usas "break", la ejecución continúa al final de la condicional. Si usas "continue", la iteración continúa al final del "while" y regresa a verificar si la opción es igual a cero. Vas a usar las constantes simbólicas que declaraste para indicar la posición de cada opción en el arreglo de opciones, para las cuales ya tenemos todos los métodos que queremos hacer. Vamos a llenar el "switch" con las etiquetas correspondientes. La segunda etiqueta es agrega disco y le ponemos el "break". Falta todo el código, pero con esto ya se puede compilar. Después muestra discos activos, agregamos el "break". Ahora pide transmisión. Noten que en las constantes simbólicas quitamos las vocales para ahorrar trabajo. La siguiente etiqueta es "termina transmisión", muestra un disco y su "break", muestra histórico, y muestra históricos. Si tenemos dos etiquetas con el mismo nombre, no compilaría. Y por último, el "default" donde ya no tenemos que poner nada. Aquí está el final del "switch". Cuando queremos salir vamos a usar un "continue", porque queremos que nos saque al final del "while". En este caso, no es importante porque no se hace nada entre el final y el "while". Esto es equivalente a un "break". Desarrollaremos ahora cada una de las opciones de la condicional, pues ya tenemos todos los servicios que el disco puede hacer. Si vamos a salir, lo que conviene es decirle al usuario que eligió esta opción y que, por lo tanto, le imprimimos un mensaje de despedida diciendo que ya termina la sesión, le agregamos un caracter para que cambie de renglón y terminamos el "print line". Es lo único que haremos en esta opción puesto que opción vale cero. Nos vamos a volver a evaluar la expresión booleana lo cual, como la opción ya no es distinta de cero, va a salir del método. En "agrega disco" tenemos que construir un nuevo disco. No es conveniente poner declaraciones dentro del "switch" porque no se van a ejecutar, a menos que se elija esa opción. Entonces, como dijimos antes, trataremos de poner todas las opciones al inicio del método. Aquí tenemos un escáner, tenemos declarada una opción, vamos a declarar un objeto de la clase "disco" que nos sirva para construir discos nuevos, o bien para localizar algún disco que quisiéramos hacer. Estando esto así lo regresamos a "agrega disco". Lo primero que haremos es pedirle al usuario que nos dé un disco. Recordemos la construcción. Si pedimos un objeto de la clase de disco sin parámetros, el método constructor de la clase "disco" le pedirá al usuario un nuevo disco. Tenemos que agregar el disco al catálogo. Recordemos el método "add catálogo " de disco nuevo, nos regresa un valor booleano. Por lo tanto, podemos preguntar si "add catálogo" del disco que acabamos de construir es verdadero. Cómo este método regresa un booleano, no tenemos que hacer nada más. Le avisamos al usuario que se agregó ese disco, escribimos en la pantalla el nombre del disco que acabamos de agregar, seguido de la palabra agregado, y le agregamos un cambio de línea. Si el método no pudo agregar el disco, escribimos al usuario que no se pudo agregar el disco debido a la falta de espacio, le agregamos el nombre del disco. Tanto el "if" como el "else" tienen un solo método. Ya terminamos con "break" entonces veremos "muestra discos activos". Antes de seguir compilemos. Nos marca un error. Revisemos cuál fue el error, nos dice que falta el final de la llave de la clase. Compilamos y aún no se ha resuelto. En "pideNum" lo primero que le tenemos que pasar es la consola que declaramos arriba. Después le pasamos una cadena vacía. Luego, el primer y último valor válido. Esto nos verificará que es válido. Aquí nos faltó la A de muestra, compilamos y ya no nos marca ningún error. Corremos "Java doc" y nos dice que se generó correctamente, y ya tenemos todos los encabezados del método. Elegimos catálogo y se muestran las variables que tenemos en el catálogo. Seguimos con la siguiente opción a desarrollar, que es "muestra discos activos". Primero, debes verificar que el catálogo exista. Preguntamos si el catálogo es nulo, o bien si "numDiscos" es menor o igual que cero. Le avisamos al usuario que no hay discos registrados, por lo tanto no hay nada que mostrar, y salimos de la opción. Voy a volver a compilar para saber por qué no nos lo está dando alineado. Nos dice que está bien, y lo hacemos nosotros para que no se salga del bloque. Si llegamos aquí quiere decir que hay algo en el catálogo y, como se trata de la opción "muestra discos activos", vamos a proceder a mostrarlos. Tenemos el método "muestra activos" que le pasamos como parámetro el encabezado que queremos que le muestre al usuario. Subrayamos lo que queremos que le muestre y empezamos una cadena para que sea del mismo tamaño. Como lo vamos a llamar dentro de un "print line" el caracter se va a cambiar de renglón. Nos regresa una cadena que podemos imprimir en la pantalla con "System out print line". Con este paréntesis empezamos el "print line" y nos falta uno para cerrarlo. Sigamos ahora con la opción "pide transmisión". Vamos a llamar al método "muestra catálogo" para que nos diga de qué disco quiere la transmisión. Le ponemos cuáles son los discos disponibles al método y recibe como entrada el título. Queremos que nos imprima el resultado y, como "muestra catálogo", regresa una cadena, lo podemos imprimir usando el "print line" y terminamos con un punto y coma. Ahora tenemos que elegir el disco que queremos que nos dé el usuario. Regresamos a nuestras declaraciones y agregamos una declaración al principio del método, que va a ser la opción elegida por el usuario. Regresamos a "pide transmisión" y colocamos cuál disco es igual. Usamos "pideNum", le pasamos como primer parámetro la consola. El mensaje es, "elige el número de disco", "pideNum" muestra al usuario los límites en los que queremos que pase. Los límites son cero y "numDiscos" menos uno. Tenemos la seguridad de que el número es válido, excepto que "pideNum" nos pudo haber entregado un menos uno. Entonces, preguntamos y nos regresó un menos uno, y si fue así tenemos que salir de la iteración puesto que no es un valor adecuado. Le escribimos al usuario que el disco que eligió no existe, y salimos del "switch". Esto sólo lo ejecutamos si es que la opción fue inválida. Si sigues dentro de esta opción quiere decir que tienes en cuál disco, un disco válido. En esta opción vamos a dar de alta una transmisión, por lo tanto, tenemos que saber en el arreglo "fechas" en dónde le toca esa transmisión. Regresamos al principio del método y vamos a declarar una variable para guardar ahí el número de transmisión que me toca dar de alta. Esa variable es entera y se llama "siguiente dato", y es la posición de la siguiente transmisión a registrar en ese disco. Regresamos al caso de pedir una transmisión. Ya sabemos que el disco elegido es adecuado, entonces pediremos que nos dé transmisión en ese disco. Obtenemos la transmisión para "siguiente dato" que es igual a "según el catálogo de discos", tomamos el disco que está en la posición seleccionada, y a ese disco le pedimos que nos dé cuántas transmisiones activas tiene. Ahora que tenemos ese dato, pedimos la transmisión al disco elegido, que lo tenemos guardado en "cuál disco". Este método nos va a regresar un valor de verdadero o falso. Se encarga. Si es que puede, de llenar el arreglo "fechas" de "cuál disco", "siguiente dato". Se puede usar el método en una condicional, si esto nos regresa verdadero le mostramos al usuario la hora y fecha en la que la transmisión empezó. Por lo tanto, escribimos en la pantalla lo siguiente. Le decimos que el disco en la posición que ocupa "cuál disco", cerramos corchetes, le dejamos un espacio, agregamos el nombre del disco, se lo pedimos al disco, limpiamos al método con "trim", decimos que está transmitiéndose y empezando, le pedimos a "da calendario" que nos diga para "fechas" de "cuál disco" en el lugar "siguiente disco", que es donde se acaba de registrar el usuario, cerramos el paréntesis y terminamos con un cambio de línea. En cualquiera de los dos casos, ya sea que la transmisión sea verdadera, en cuyo caso se escribe el mensaje que acabamos de imprimir, o que sea falso. Ya nos toca salir del método. Compilamos y nos dice que en la línea 580 "muestra catálogo" no puede encontrar esto, pero fue porque le dimos demasiadas vocales. Compilamos, y no se resolvió el problema. Revisemos la lista de métodos que tenemos arriba. Buscamos todos los "muestra" que tenemos. Aquí está y se llama "muestra catálogo". Compilamos y nos vuelve a marcar error. Nos vamos arriba para verificar por qué está el error. Encontramos el error, es que se llama "muestra catálogo completo". Vamos a corregirlo, compilamos, y está correcto. Nos vemos en el siguiente video, donde seguiremos interactuando con el usuario. Te espero.