Hola, bienvenidos a este segundo video. Primero veremos el modelo de memoria de Java. Nos vamos a nuestro navegador de Internet y escribimos "pythontutor", entramos en esta página. En esta parte tenemos una clase llamada "Arreglos" para que vayamos viendo todos los arreglos que armemos. Un arreglo de dos dimensiones, por ejemplo, si lo queremos declarar de enteros, pondríamos el tipo del arreglo, indicaríamos que tiene dos dimensiones poniendo dos parejas de corchetes, después el nombre del arreglo que es "juegosGanados" y, en esta ocasión, le vamos a dar cinco renglones, dejando libres cuantas columnas va a tener el renglón. Lo vamos a inicializar usando la palabra "new" recordando que los arreglos son objetos, por lo tanto como este arreglo tiene enteros, le vamos a dar en qué dimensiones queremos, vamos a decir que tiene cinco arreglos y no vamos a decir cada renglón cuántas columnas tiene. Terminamos la declaración con punto y coma, eliminamos esa "n" que no va ahí. Podemos visualizar la ejecución y ver que no tenemos errores de sintaxis. Aquí aparece el código conforme lo vamos ejecutando, está antes de ejecutar esa declaración. Le pedimos que la ejecute, entonces vemos que "main" está en la línea tres, damos otro paso y aquí está "juegosGanados" con cinco elementos, cada uno de los cuales no tiene nada hecho. Puedes construir directamente el arreglo de dos dimensiones. Si, por ejemplo, le dijeras que "juegosGanados" de cinco y le ponemos tres elementos en cada columna, eso hace a cada renglón del mismo tamaño. Vemos cómo se representa en memoria. Este arreglo y lo que queda es referencia en el identificador que me apunta a un arreglo de cinco elementos, cada elemento es un arreglo. Como el arreglo es de enteros, se empieza inicializado en ceros. Regresamos a editar el código. Elegimos uno de los elementos del arreglo, por ejemplo, "juegosGanados" del renglón "i +1". Antes de eso, le ponemos un valor aquí de tres. Entonces, en esta posición podemos asignar un arreglo que sea de una dimensión de enteros y le ponemos que tenga cinco elementos, eliminamos la "m" antes de "new", ejecutamos y nos marca error. Como aquí puse una "i" que tengo que declarar, entonces declaro la "i" y le vamos a dar un valor de tres. Tratamos de visualizar y vamos a ver cómo se ejecuta. Le damos clic en "forward", aquí está antes de la ejecución de la declaración. Una vez que está la declaración, vemos cómo declaró cinco elementos de "juegosGanados" empezando con cero. Cada elemento tiene tres arreglos, si damos otro "forward", va a estar la "i" con el valor tres, lo tiene directamente acá. Esta es una referencia, mientras que este es un valor. Se proporcionan los siguientes servicios y, si damos otro clic, entonces el elemento cuatro, en lugar de tres elementos pasa a cinco elementos valiendo cero. Vamos a dictar en el arreglo de "NDIAS" que teníamos declarado, declaramos el arreglo "NDIAS" de una dimensión, lleva un arreglo de cadena, era igual a la cadena vacía para el día cero, a la cadena "Domingo" para el día uno, a la cadena "Lunes", y así sucesivamente. Si yo tomo "NDIAS" y quiero el elemento de "numDia", tengo que declarar otra vez un entero, vamos a darle el valor cinco e imprimimos el elemento "numDia", "NDIAs". Visualizamos la ejecución y nos vamos al último paso dándole click en "forward". Vemos que los días se llenaron en el lugar cero con una cadena vacía, el lugar uno con "domingo", "lunes", etcétera. Asimismo, vemos que este paquete tiene un recuadro donde aparece lo que aparecería en la consola. Cerramos nuestra pestaña y regresamos a Javadoc. Para obtener su valor, basta elegir la posición del elemento en el arreglo y usarlo en una expresión. La sintaxis de la selección de un elemento se hace también poniendo una expresión entera entre cada pareja de corchetes que tiene la declaración. Ya vimos la declaración de catálogo y si queremos el segundo elemento, obtenemos catálogo de uno. Recuerda que los arreglos empiezan en cero, posiciones en cada dimensión empiezan en cero. Insistimos, si "tam" es el tamaño del arreglo, el mayor índice es "tam" menos uno. Para obtener el número de elementos de un arreglo se usa el atributo "length". Si el arreglo es de tres dimensiones, "juegos punto length" da el número de tablas, "juegos de una tabla en particular punto length" da el número de renglones en esa tabla y "juegos de dos cuatro punto length" da el número de columnas de la tercera cara y el quinto renglón. Si escribimos un elemento a la izquierda de una asignación, se trata de la ubicación de un elemento, una variable. Si la colocamos a la derecha de una asignación, se trata de un valor. Primero, evalúa qué hay en "juegos de uno, dos" y, lo que hay ahí, lo copia a "juegos de dos cuatro. Estamos listos para programar la clase principal de esta aplicación que se llama catálogo. Regresas a la codificación de la clase con las líneas numeradas, indicas que pertenece al paquete Discos, importamos el "scanner" porque la clase Discos también usa un escáner. Importamos la clase Gregorian Calendar que se encuentra en el paquete "java punto util". A continuación, escribimos la documentación para la clase catálogo que va antes de que empiece la declaración de la clase. La documentación de Javadoc es la siguiente. Esta clase simula el uso de un catálogo de discos. En cada sesión puede construir su base de discos, agregar discos, consultar el catálogo, iniciar y terminar transmisiones registrando todas las actividades en el catálogo. El autor es Elisa Viso, agregamos un "arroba" y la versión final es la desarrollada en 2017. Finalizamos el comentario. Iniciamos con la clase que es de acceso público, se llama "Catalogo" y no implementa a ninguna interfaz. Damos su principio y fin. Es importante tener el número máximo de discos por catálogo. Colocamos un comentario donde ponemos el número máximo de discos en cualquier catálogo y terminamos el comentario, lo declaramos y lo que tenemos es un entero llamado "MAX_DISCOS" que va a tener un valor inicial de 50. El entero es público, pertenece a la clase y es una constante que no puede ser modificada. Como sabemos, las opciones que tendrá nuestro menú del catálogo, podemos escribir cada una en un arreglo de cadena que va a ser "public" de la clase, constante y un arreglo de cadena. Se va a llamar "MENU_CATALOGO" y lo vamos a inicializar con la declaración entre llaves. Empezamos a llenar los comandos en el renglón de abajo, la opción cero es "salir", la uno es "agregar disco". Noten que lo estamos colocando extendido ya que es lo que se le mostrará al usuario para que lo entienda. La opción con el número dos es "mostrar discos", después sigue "mostrar discos activos", que son aquellos que tienen una transmisión que no ha sido terminada. La siguiente opción es "pedir transmisión", la quinta opción es "terminar" una transmisión, en la opción seis está "mostrar un disco en particular", la opción siete es "mostrar el histórico de un disco en particular" y, por último, está "mostrar el histórico de todos los discos". Para finalizar, vamos a alinear las posiciones para que sea más claro. No queremos usar directamente la posición que ocupan los elementos del menú porque quita claridad al proyecto, usaremos mejor constantes simbólicas de clase para identificar a estas acciones. Si usamos constantes simbólicas podremos cambiar de posición alguna de las opciones o agregar opciones al final, y no tenemos que modificar todo el programa. Vamos a usar constantes simbólicas públicas como "acción para salir del menú". Se debe aclarar que es muy conveniente poner la opción para salir como la primera, porque es común que el usuario teclee sólo un "enter" y que el valor que se grabe sea un cero. En este caso, simplemente se acaba la ejecución y, cuando queremos agregar opciones, no tenemos que modificar cuál es la opción para salir. Entonces, vamos a declarar una variable entera llamada "salir", su valor será cero, es pública, es constante y pertenece a la clase. Vamos a la siguiente que es la opción para agregar un disco, cambiamos este punto y coma por una coma para seguir agregando opciones, colocamos "AGRGA_DISCO". Noten que estamos haciendo las palabras lo más pequeño posible pero que mantengan su significado. Su valor es igual a uno. Después tenemos la acción de mostrar el catálogo, colocamos "MSTRA_DISCOS" que es igual a dos. Pasamos a copiar y pegar para que sea más rápido. El siguiente es "MSTRA_DSCS_ACTVS" y completamos el comentario, Editamos el valor a tres. La siguiente es acción de pedir una transmisión, modificamos el nombre y el valor a cuatro. Aquí es para pedir que se termine una transmisión, modificamos la variable y el valor es cinco. La opción seis es la acción de mostrar un disco con valor de seis. La siguiente es mostrar el histórico de un disco, cambiamos la descripción y es la opción siete. Y, por último, tenemos la opción de mostrar los históricos de todos los discos con valor ocho y termina con punto y coma. Recordemos que la clase Catalogo cuenta con varias colecciones, el catálogo propiamente dicho que es un arreglo de objetos de la clase Disco. La construcción del arreglo se va a dar en los distintos constructores pero la declaración es privada. Se trata de un arreglo de la clase Disco, se llama "catalogo" con minúsculas por lo que reconoce que no tiene el nombre de la clase. Vamos a poner el catálogo de discos. Una cosa es el número total de posiciones en el arreglo que se da al construirlo y otra el número de posiciones ocupadas. Siempre cuando tenemos colecciones o arreglos, es conveniente llevar un contador de las posiciones ocupadas. No es una constante, es una variable que va cambiando, es un atributo del objeto, por lo tanto, lo declaramos privado, es un entero que se llama "numDiscos" que tiene que inicializarse siempre en cero, puesto que ningún catálogo que no haya sido construido tiene ningún disco. Entonces, es el número de discos en el catálogo. Las constantes simbólicas públicas las comentamos con Javadoc para que aparezcan en la página de la clase. Lo que es privado no aparece de todos modos en la página de la clase, por lo que usamos comentarios sencillos. Requieres de un arreglo con las fechas de inicio de cada transmisión, uno por disco, declaras un arreglo de dos dimensiones con el número de renglones, el mismo que el número de discos. El número de columnas del renglón en la posición "i" está dado por el número de transmisiones simultáneas permitidas para el disco en la posición "i", por lo tanto, no sabemos todavía cuántas transmisiones permitidas va a tener cada disco y tenemos que dejarlo indicado como un arreglo de dos dimensiones. Es privado, como va a almacenar fechas, decimos que cada uno de sus elementos es un Gregorian Calendar, es de dos dimensiones y se llama "fechas". No sabemos nada más de este arreglo, pero le colocamos un comentario que te recuerde de qué se trata. Indicamos que vamos a dar un renglón por cada disco, una columna por transmisión. Cada renglón tiene un número de columnas dado por el disco en ese renglón. El número de fechas registradas está dado por el atributo "activas" del disco. También necesitamos un arreglo para guardar el histórico de las fechas de transmisiones iniciadas y terminadas, también necesitamos un renglón por cada disco y en cada renglón pondremos dos fechas. Como todo atributo, es privado, el tipo es Gregorian Calendar, el número de dimensiones es dos y se llamará "histórico". Tendremos también una pareja de renglones por cada disco. Como requieres una pareja de renglones por cada disco, en realidad, el arreglo tendrá tres dimensiones, donde la primera dimensión es para el disco, la segunda dimensión te da el inicio de la transmisión y la tercera dimensión te da el final de la transmisión. Pero, eso lo harás hasta que tengas el número de transmisiones permitidas. El tamaño de la primera dimensión va a estar dado por el tamaño del catálogo, por lo que tendrás que esperar a saber ese tamaño que se define en los constructores. La segunda dimensión tiene tamaño dos, pero no se puede dar hasta que la primera esté definida. La tercera dimensión va a ser dos veces el número de transmisiones simultáneas permitidas. Esta última dimensión la definirás al construir el disco correspondiente. El contador "numDiscos" te sirve para saber, para el catálogo y la primera dimensión de fechas e histórico, cuántos lugares están ocupados. Puedes pensar a estos arreglos como si corrieran paralelos al catálogo de discos, entonces, tienes aquí una dimensión en el catálogo. En el catálogo de fechas tienes la primera dimensión que es paralela a ésta, y en el histórico de Gregorian Calendar tienes la primera dimensión que es paralela a ésta. Para la segunda dimensión de fechas, el tamaño está dado por el atributo "permitidas" de Disco y el número de posiciones ocupadas está dado por el atributo "activas", también de la clase Disco. Necesitas contar las transmisiones que se colocan en el histórico para cada disco. Usas un arreglo de enteros de una dimensión paralelo a catálogo donde vas registrando cada vez que se anota un histórico para este disco. Entonces, vamos a declararlo como atributo del objeto. Por lo tanto, es privado, es un entero de una sola dimensión para que vaya paralelo al catálogo de discos, y me va a decir el número de elementos que tengo declarado en un histórico. Le colocamos un comentario, "da, para cada disco, el número de transmisiones iniciadas y terminadas para ese disco". El tamaño de este arreglo lo determinarás en los constructores y se inicia cada contador en cero pero, por el hecho de declararlo entero, ya está iniciado ese contador. Nuestro esquema general de cómo quedan los archivos se encuentra en la siguiente figura. Debemos considerar que el número de elementos en "catálogo" es el mismo que el número de elementos en "fechas" e "histórico" si pensamos los elementos como la primera dimensión. Como vimos antes, los arreglos se construyen en el "Heap" cómo está en este esquema. En el siguiente video revisaremos la implementación de los distintos métodos de la clase, te espero.