100% encontró este documento útil (2 votos)
2K vistas154 páginas

Bienvenida Al Curso de Java

Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como RTF, PDF, TXT o lee en línea desde Scribd
100% encontró este documento útil (2 votos)
2K vistas154 páginas

Bienvenida Al Curso de Java

Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como RTF, PDF, TXT o lee en línea desde Scribd

Bienvenida al curso de Java

Este es un curso introductorio a la programación en Java. Como Java es un lenguaje orientado a objetos de propósito
general, revisaremos los conceptos básicos del lenguaje como clases e interfaces. Veremos los ingredientes básicos
de una clase como constantes y variables, funciones (métodos), y cómo organizar estos ingredientes dentro de una
clase. También veremos la utilización de clases de las bibliotecas de Java.

Estructura del curso


El curso consta de cinco módulos, los cuales están integrados por videos, cuestionarios y actividades para evaluar
por pares. Además, te proponemos participar en foros que complementarán el conocimiento adquirido.

Política de calificaciones
Para aprobar este curso, es muy importante que tengas en consideración los elementos siguientes:

Cuestionario
En los cinco módulos tendrás que realizar cuestionarios; con diferente valor de porcentaje en la calificación total. Es
indispensable que apruebes los cuestionarios con el 80% de calificación. Dispones de un número limitado de
intentos.       

Evaluación por pares


Además, en el módulo 1 y 2, realizarás dos actividades por pares que tendrán 20 % del valor de la calificación final.
Este porcentaje se obtiene al calificar a los compañeros que el sistema te ha asignado para su evaluación, de lo
contrario serás penalizado con un 20 % menos.
Para aprobar las evaluaciones, es indispensables que obtengas al menos el 80 %.

Criterios de acreditación
Módulo Criterio Porcentaje
Módulo 1. Cuestionario. Especificación de clases 5%
Cuestionario. ¿Qué hemos aprendido del módulo 1? 5%
Actividad por pares. La fiesta 5%
Módulo 2. Cuestionario. Atributos y métodos de una clase 5%
Actividad por pares. Clase registro 15%
Cuestionario. Uso de clases del programador 5%
Módulo 3. Cuestionario. Diferencia entre argumentos y parámetros 5%
Cuestionario. Métodos de clase u objeto 5%
Cuestionario. Métodos get 5%
Módulo 4. Cuestionario. El catálogo y sus estructuras 5%
Cuestionario. Repetición en Java 5%
Cuestionario. Enunciado condicional en Java 5%
Módulo 5. Cuestionario. Construcción y tamaño de arreglos 5%
Cuestionario. Nuevas iteraciones y condicionales 5%
Cuestionario. Usando todo lo que hiciste... 20%
Total 100 %

Fuentes de información
Arnold, K., Gosling, J. & Holmes, D. (2012). The Java (TM) Programming Language (5th ed.).
Addison-Wesley/Pearson Education. ISBN: 978-0321349804
Bloch, J. (2018). Effective Java (3rd ed.). Pearson Education, Inc. ISBN: 978-0134685991
Galaviz, J. (2004). Elogio de la pereza. México: Las Prensas de Ciencias-UNAM.
(Disponible únicamente en versión electrónica)
Java™ Platform. (2018). Standard Edition 8. API Specification. Consultado de
[Link]
Página de Oracle con todas las clases de Java 8
López, A. (2012). Introducción a la programación con Java (3.ª ed.). México: Las Prensas de Ciencias-UNAM.
ISBN: 978-6070242410
Oracle. (s. f.). The source for Java technology. Sun Corporation. Consultado de
[Link]
Viso, E. y Peláez, C. (2012). Introducción a las ciencias de la computación con Java (2.ª ed.). México: Las Prensas
de Ciencias-UNAM.
ISBN: 978-607-02-3345-6

Acompañanos a este curso


Bienvenidos al curso de introducción a la programación en Java. Soy Elisa Viso Gurovich, y tengo muchísimos años,
más de los que quisiera yo contar, enseñando a programar. Los últimos 20 años lo he hecho con el lenguaje Java,
tanto por su estructura ejemplar como por su uso generalizado., al curso de introducción a la programación en Java.
Soy Elisa Viso Gurovich, y tengo muchísimos años, más de los que quisiera yo contar, enseñando a programar. Los
últimos 20 años lo he hecho con el lenguaje Java, tanto por su estructura ejemplar como por su uso generalizado.
Java es un lenguaje ideal para aquellos que quieren llevar la programación a un nivel profesional. Si bien cada día
hay más herramientas que permiten rápidamente el uso y explotación de las computadoras, alguien tiene que
dedicarse a programar este tipo de aplicaciones, para eso está Java. Java fue pensado y diseñado para poderse usar a
través de comunicaciones entre computadoras o usuarios, aunque ha crecido para convertirse en un lenguaje de
propósito general. En este curso aprenderás los rudimentos de java, cómo construir clases y objetos, cómo utilizarlos,
combinarlos, ponerlos a trabajar para el usuario. Obtendrás bases sólidas para despegar hacia la solución de
problemas complejos usando java.

El proceso de desarrollar y ejecutar un programa


Bienvenido a la primera sesión del curso. Antes de adentrarte en la programación en Java, debes tener claro qué es
un programa.
Todo programa es un proceso que transforma información, por lo que debe tener datos de entrada y producir datos de
salida. La entrada es tu materia prima, aquello a partir de lo que vas a trabajar. Es decir, la información que pretendes
transformar.
En un videojuego o aplicación de internet, esta entrada la produces tú al estar jugando. Y cada vez que proporcionas
una entrada, se produce algún cambio en el escenario. En otro tipo de problemas, como hacer una lista de los
alumnos de un grupo, u obtener las multas que tienes acumuladas, la entrada es el número de grupo o la placa de tu
vehículo respectivamente. También podrías tener un proceso que te dijera los primeros 100 números primos. En tal
caso, el proceso no necesitaría ninguna entrada. Simplemente calcularía los números y te los mostraría. Todo
programa debe producir una salida, la cual es la información transformada. A veces la salida es continua, como en
los videojuegos. O es una respuesta a la pregunta que diste como entrada. También puede ser una respuesta que
comprendan muchos elementos. Como en el caso del proceso de una nómina, que requiere información almacenada.
Si eres un programador responsable, tu programa debe ejecutarse bien, manejar errores en la entrada y alcanzar una
muerte digna. Esto es siempre debe finalizar y bajo ninguna circunstancia debe quedarse en un ciclo del que no
salga. Todo esto se llama algoritmo y se define como un método de solución de un tipo de problema que se
caracteriza por cero o más entradas, una o más salidas, descripción completa disponible, que es finita, cada paso es
realizable, siempre termina su ejecución dando la respuesta correcta.
Ahora te hablaremos del proceso de programar en el que realizarás tres acciones. Diseñar, compilar, ejecutar. En el
caso de Java, tendrás que laborar o usar varios programas o módulos. Por ello, a partir de ahora, hablarás de
proyectos, no de programas. Construirás un proyecto para resolver un problema. Lo primero que tienes que hacer es
pensar en una solución. Siempre usando las herramientas que tienes a tu alcance. En este caso, como tu herramienta
es Java, debes pensar en una solución orientada a objetos. A este paso se le llama diseño de la solución. Que no es
directamente el programa y que puedes hacer con papel y lápiz. En el próximo módulo, aprenderás una metodología
muy sencilla para el diseño.
Una vez realizado el diseño, si está bien elaborado, lo traduces al lenguaje de programación que en este caso es Java.
Java es un lenguaje que funciona en modo compilador. Esto quiere decir que primero se tiene que traducir el
proyecto completo, llamado código fuente, a un lenguaje que la computadora puede ejecutar, llamado código objeto.
Afortunadamente, no lo tienes que hacer tú. Existen programas que llevan a cabo esta traducción y se llaman
compiladores. Una vez que tu proyecto compila bien, es decir, que no tiene errores que corresponden a sintaxis de
Java, puedes ejecutarlo.
Deberás probarlo con varios datos posibles, para ver que no suspenda su ejecución antes de darte la solución correcta
y que finalice con éxito.
Si tu proyecto no trabaja bien o te reporta errores de sintaxis, tendrás que llevar a cabo un proceso de depuración,
debugging. En ambos casos, puedes verte forzado a replantear tu diseño de la solución o traducción al lenguaje Java
y repetir los pasos, diseñar, compilar, ejecutar. Como puedes ver, estas acciones, diseñar, compilar, ejecutar, te
llevarán al camino correcto de la programación. Te espero en el siguiente video.

¡Felicitaciones! ¡Aprobaste!
CALIFICACIÓN 100 %
Lograr la ejecución de un programa
PUNTOS TOTALES DE 6
1. Contesta falso o verdadero a la siguiente afirmación:
Todo programa o aplicación recibe entradas. 1 / 1 punto
Falso (Respuesta correcta)
Verdadero
Correcto 😊Algunos programas o aplicaciones trabajan a partir de cero entradas, por lo que la afirmación es falsa.

2. Contesta falso o verdadero a la siguiente afirmación:


Todas las entradas corresponden a números. 1 / 1 punto
Verdadero
Falso (Respuesta correcta)
Correcto 😊 Algunas entradas, como las placas de un automóvil, pueden tener letras y números. Otras entradas
pueden ser preguntas con palabras clave.

3. Contesta falso o verdadero a la siguiente afirmación:


Un programador responsable rescata al programa de errores del usuario. 1 / 1 punto
Verdadero (Respuesta correcta)
Falso
Correcto 😊 El programador debe ser capaz de prever los errores del usuario y reaccionar frente a ellos, evitando que
el programa termine abruptamente sin ningún indicio de por qué terminó.

4. Contesta falso o verdadero a la siguiente afirmación:


Todo algoritmo debe producir una o más salidas 1 / 1 punto
Verdadero (Respuesta correcta)
Falso                                   
Correcto 😊 Si un proceso no produce al menos una salida ni siquiera sabemos si se llevó a cabo o no.

5. Elige la característica que posee un algoritmo. 1 / 1 punto


Siempre da una respuesta
Frente a ciertos datos puede no terminar bien
Cada paso está bien definido (Respuesta correcta)
Algoritmo es un término equivalente a programa
Correcto 😊 Para que un paso sea realizable tiene que estar claramente definido.

6. Elige la opción que responda al siguiente enunciado. Decimos que un lenguaje funciona como intérprete si cada
instrucción escrita en ese lenguaje es traducida por la computadora e inmediatamente ejecutada. Un lenguaje que
funciona como compilador: 1 / 1 punto
Guarda proyectos traducidos para poderlos usar en otros programas
Lee conjuntos de enunciados llamados algoritmos, los traduce y los ejecuta, así hasta que acaba con la traducción y
ejecución de todos los algoritmos en el programa
Lee todo el programa o clase, lo traduce y después lo ejecuta (Respuesta correcta)
Está en un ciclo “diseñar-ejecutar-traducir”
Lee un enunciado, lo traduce y lo ejecuta (Respuesta correcta)
Correcto 😊 Esta es, la definición que dimos de cómo trabaja un lenguaje que se compila como java.

¿Qué es la “Orientación a Objetos”?


Qué bueno que continúas con nosotros. En esta segunda sesión te explicaremos qué es la orientación a objetos al
diseñar y codificar un proyecto siempre tenemos que seguir el principio divide y vencerás.
Tradicionalmente en los lenguajes como C, Pascal, Cobol y Fortran, esta división se realiza fragmentando el
proyecto en términos del transcurrir del tiempo, programas, lo cuales se conforman por tareas para que se lleven a
cabo en su sesión. Y así cada una de ellas espera a que la anterior transforme la información o parte de ella.
La salida de una tarea, posiblemente con información adicional al exterior al programa es la entrada de la siguiente.
La última tarea es la que entrega el resultado final. En la orientación objetos, también divides la solución del
problema. Pero en lugar de usar un orden en el tiempo, agrupas y asignas el tipo de tareas a realizar para que los
grupos que formes colaboren en la solución. Por supuesto que esta colaboración debe ser organizada. Si cada grupo
lleva a cabo sus tareas por su cuenta sería como lo que sucede inmediatamente antes de un concierto cuando los
músicos de una orquesta afinan sus instrumentos. Tome en cuenta el ejemplo de una orquesta. Cada instrumento de
una orquesta pertenece a un grupo. En el caso de Java, lo llamarás case. La clase describe un tipo de instrumentos y
lo que estos pueden hacer. No es igual lo que hace un piano, un violín o una tarola.
La participación de cada tipo de instrumento es distinta. En una orquesta puede haber varios violines a los que les
correspondan distintas participaciones, como ser el primer violín o el segundo.
Cada violín particular es un objeto que tiene características y puede producir los sonidos de la clase a la que
pertenece. Puede ser de cierta marca y ser tocado por distintos violinistas. El concierto consiste en poner a trabajar
cada objeto y que hagan lo que saben hacer en distintos momentos. También los músicos son objetos. Las partituras
que se reparten a los músicos se refieren a su instrumento particular. aunque indican el momento en el que deben
tocar en relación con el resto de los instrumentos. Lo que hacen los músicos, es decir, los usuarios del instrumento es
verificar antes del concierto que su instrumento produzca bien el sonido que debe producir. A esto último le podrías
llamar pruebas unitarias.
Pero resulta que el músico al que hoy le tocó ser el del primer violín, no es el mismo que el de ayer. Ambos tienen
que seguir la partitura. Que es lo que corresponde a la clase y deben tocar la misma parte. Entonces el usuario de un
instrumento es al mismo tiempo un objeto al que la partitura le dice cómo se tiene que comportar. Así el primero
violín sea quien sea siempre tocará lo mismo. El comportamiento del músico al que le corresponde ser el primer
violín también constituye una clase cuya característica es poseer un violín. Por lo que además de definir la conducta,
una clase también define los atributos que debe tener todo objeto de esa clase.
Los tipos de instrumentos musicales se pueden agrupar también en términos de ser instrumentos de cuerdas, de
percusión, de aliento, entre otros. Estos segundos grupos son súper clases. También los músicos se agrupan en una
clase dentro de la cual se subclasifican en violinistas, pianistas, contrabajistas, director de orquesta, entre otros. Cada
músico con el instrumento particular que ejecuta en este concierto tiene su propia partitura que es su conducta o
comportamiento. El directo de la orquesta pertenece a la clase de los músicos, pero únicamente puede haber un
directo al realizar el concierto. Su característica principal es que se encarga de organizar a cada uno de los músicos
con sus instrumentos para que colaboren entre sí al llevar a cabo el concierto. Los ensayos para el concierto son lo
que en programación se llaman pruebas de integración. you que están presentes todos y el objetivo es integrar los
desempeños particulares como un todo.
Por último, los conciertos tienen una característica particular, su desarrollo es distribuido, pues la responsabilidad
está repartida entre el director y cada uno de los músicos. Como te diste cuenta es importante que todos los
elementos de la orquesta trabajen en armonía para lograr su fin. Te invito a revisar el siguiente video.

¡Felicitaciones! ¡Aprobaste!
CALIFICACIÓN 100 %
Clases y objetos
PUNTOS TOTALES DE 5
[Link] cuál debe ser la forma de atacar un problema. 1 / 1 punto
Elaborar una lista de entradas
Elaborar una lista de salidas
Divide al problema en subproblemas (Respuesta correcta)
Elaborar el algoritmo para su solución
Correcto 😊 “Divide y vencerás” es el principio fundamental para resolver problemas.

2. Elige la forma principal que tiene la programación estructurada (la “tradicional” en lenguajes como Pascal y C)
para facilitar el diseño de la solución a un problema: 1 / 1 punto
Decidiendo qué valores necesitan
Haciendo funciones
Viendo cuáles archivos van a usar
Definiendo en qué orden se ejecuta (Respuesta correcta)
Correcto 😊 Esto es otra forma de decir que dividimos según transcurra la ejecución de la solución.

[Link] 3 opciones que se refieren a objetos en una orquesta: 1 / 1 punto


Los instrumentos de cuerda (Respuesta correcta)
Correcto 😊 Este es un grupo de objetos.
El sonido que produce un instrumento
El Director de la orquesta (Respuesta correcta)
Correcto 😊 Es uno de los músicos en el concierto.
Una partitura (Respuesta correcta)
Correcto 😊 Mencionamos a las partituras como objetos que participan en un concierto.

4. Elige la mejor descripción de lo que es una prueba unitaria: 1 / 1 punto


Pruebas con un valor tu programa
Pruebas que cada acción de un objeto se lleve a cabo adecuadamente (Respuesta correcta)
Pones a todos los objetos en una clase para probarlos
Eliges a uno de los objetos para probarlo
Correcto 😊 A esto es a lo que se llama una prueba unitaria. Es como cuando el músico ensaya solo.

5. El término pruebas de integración se refiere a: 1 / 1 punto


Hacer pruebas de los resultados de integrar usando las tablas de integrales
Integrar los distintos instrumentos en un solo grupo para probarlos
Probar cómo se integran los distintos objetos (instrumentos) entre sí (Respuesta correcta)
Correcto 😊 En el contexto de la orquesta llamamos a los ensayos “pruebas de integración” porque se ve cómo se
escucha el concierto al interaccionar los distintos objetos.

Jerarquía de clases
Bienvenido a esta tercera sesión, en la que te explicaremos qué es un objeto en el contexto de la programación. Para
ello, continuarás con el ejemplo de la orquesta. Piensa que vas a programar el desempeño de esta. Identificarás los
términos más comunes en la programación orientada a objetos. El primer término que verás es objeto. El objeto es
un ejemplar de una clase. Mientras no se construyen objetos de una clase dada, nada existe y nada puede suceder.
Por ejemplo, el violín primero y el violín segundo de la orquesta son objetos. Por otro lado, se encuentra la clase.
Ésta describe la conducta y los atributos que deben tener los ejemplares de esa clase. Un violinista debe tener al
menos un violín.
Otro término es atributo. El atributo es lo que usa el objeto para poder realizar alguna acción o recordar información,
por ejemplo: el violín, la partitura, el lugar en la orquesta, etc.
Después están los métodos o funciones propias, que son las descripciones de lo que un objeto de una clase
determinada sabe hacer. Por ejemplo, un violinista sabe leer y tocar lo que hay en una partitura. Otro de los términos
que es necesario que comprendas es el de acceso, que significa que cada clase decide qué o quién puede tener acceso
a los atributos o servicios de sus objetos.
El violinista no permite que nadie use su violín o que se lo cambie. Su partitura es personal y no le sirve a ningún
otro miembro de la orquesta. Por otro lado, está la herencia. Como observaste en el ejemplo de la orquesta, los
individuos, es decir, los músicos e instrumentos se agrupan en superclases, y éstas, a su vez, en grupos más grandes
que comparten ciertas características. Si lo ves como una raíz, hasta arriba está el menos específico, y hasta abajo, el
más específico.
Hay una herencia simple, pero existen lenguajes como C++, que permiten la herencia múltiple. Por ejemplo, en la
orquesta, una raíz podría ser los instrumentos de cuerdas, los cuales comparten características entre sí.
Pero ¿cómo se logra que los objetos colaboren entre sí? Para ello, están los mensajes, que son solicitudes de
servicios. Por ejemplo, el director pide al primer violín que toque una melodía específica.
Si el objeto que recibe la solicitud no le entiende o no la conoce, simplemente el programa no compilará. Otra
palabra que se utiliza en la orientación a objetos es el encapsulamiento. Se refiere a que, mediante la elección del
acceso, podemos mantener a nuestros objetos aislados del mundo exterior y acceder a él únicamente mediante
mensajes. De esta manera, si conocemos la forma de los mensajes, podemos utilizar al objeto desde cualquier otra
clase. Por último, te hablamos del término polimorfismo, que quiere decir muchas formas. Un método con el mismo
nombre, por ejemplo, el método tocar, puede tener distintos significados, con respecto a lo que va a producir. La
clase instrumento debe tener la habilidad de producir sonido. Si lo hace un violín, el sonido que produce: es muy
distinto al de un tambor.
El término se refiere justo a eso, misma forma del mensaje, distinto resultado. Tú has visto los distintos términos de
la programación orientada a objetos. ¿Los recuerdas todos? Los que revisamos son: atributo, objeto, clase, métodos o
funciones propias, acceso, herencia, mensajes, polimorfismo.
Con la exposición de los términos utilizados en la programación orientada a objetos, queda una pregunta por
responder: ¿Qué quiere decir que Java sea un lenguaje orientado a objetos?
Java es uno de los lenguajes más usados hoy en día, en todo tipo de campos: juegos, ciencias, tecnología móvil,
aplicaciones de negocios, entre otros. Si bien no es el primer lenguaje orientado a objetos que se diseñó, sí es uno de
los que más influencia ha tenido. Las aplicaciones escritas en Java se implementan a través de clases. Una vez
definidas las clases, se construyen objetos y se determina la interacción entre ellos, desde un método principal, main,
que reside en alguna de las clases definidas. No puedes ejecutar nada si no tienes al menos una clase donde resida el
método principal. Java no es un lenguaje puro de objetos, pues permite el uso de algunos atributos de carácter
primitivo, como números, caracteres, símbolos diversos y variables lógicas que pueden tomar un número finito de
valores.
Esto depende de su representación en la máquina donde se ejecuta, la máquina virtual.
Como no puedes ejecutar nada que no esté en una clase, se dice que Java es un lenguaje orientado a objetos.
Te espero en el siguiente módulo, en el cual aprenderás los elementos del lenguaje Java. ¡No te lo puedes perder!

Especificación de clases
CALIFICACIÓN DEL ÚLTIMO ENVÍO
85.71%
1. Elige 2 opciones que describan para qué sirven los atributos de un objeto: 1 / 1 punto
Muestran el valor del objeto
Da las características del objeto (Respuesta correcta)
Correcto 😊 Los atributos representan a valores (que pueden ser, a su vez, objetos) que describen el estado de un
objeto.
Describen qué puede hacer un objeto
Guardan algunos valores del objeto (Respuesta correcta)
Correcto 😊 Es equivalente a las características de un objeto.

2. Elige 3 opciones que mejor describan lo que es un método o función propia. 1 / 1 punto
Instrucciones para armar un mueble que el cliente tiene que armar (Respuesta correcta)
Correcto 😊 La clase es la de los muebles de ese tipo (silla, escritorios entre otros tipos). Las instrucciones de cómo
armarlo, si se tienen las partes del mueble, corresponden a métodos.
Una receta de cocina
Tocar guitarra (Respuesta correcta)
Correcto 😊 Esto también es una acción o método.
Mostrar los valores de los atributos de un objeto (Respuesta correcta)
Correcto 😊 Como mostrar es una acción, corresponde por lo tanto un método.

3. Elige la opción que mejor describa “el violín es un instrumento de cuerdas”: 1 / 1 punto
La clase violín
hereda directamente de la clase instrumento
Un instrumento es un instrumento de cuerdas que, a su vez, es un violín.
La clase instrumento de cuerda hereda de la clase violín
Un violín es un instrumento de cuerdas, que a su vez es un instrumento (Respuesta correcta)
Correcto 😊 En efecto, un violín tiene todas las características de un instrumento de cuerda (y más); todos los
instrumentos de cuerda son instrumentos más específicos.

4. Contesta verdadero o falso según corresponda:


En un árbol de herencia de clases, la raíz del árbol contiene más información que aquellas clases que se encuentran
saliendo de ella.
1 / 1 punto
Verdadero
Falso (Respuesta correcta)
Correcto 😊 Conforme bajamos por el árbol de herencia (desde la raíz hacia las hojas) se va precisando
(aumentando) la información y las capacidades de los objetos de esa clase.

5. Elige la respuesta que describa con más precisión al comportamiento de los objetos de una clase:
0 / 1 punto
El acceso
La herencia
Los métodos
Los atributos
El polimorfismo

6. Elige la descripción más precisa de lo que es una clase. 1 / 1 punto


Una descripción de lo que sabe hacer un objeto de esa clase
La descripción de para qué sirve un objeto de esa clase
Un conjunto de atributos
Una descripción de atributos y métodos que debe tener un objeto de esa clase (Respuesta correcta)
Un conjunto de objetos
Correcto 😊 Una clase simplemente describe los atributos que debe tener todo objeto de esa clase, así como su
comportamiento o métodos.

7. Elige la opción que responda a la siguiente pregunta:


¿Por qué se dice que Java es un lenguaje orientado a objetos? 1 / 1 punto
Porque todo sucede dentro de alguna clase (Respuesta correcta)
Porque todo en Java es un objeto
Porque todo en Java son clases
Correcto 😊 Así es: Para todo se programa una clase y dentro de ella pueden existir objetos, números, métodos o
caracteres.

¿Qué hemos aprendido del módulo I?


PUNTOS TOTALES DE 11
1. Lee en Wikipedia el texto correspondiente a “Máquina Virtual de Java” (JVM por sus siglas en inglés) en:
[Link]

2. Lee el funcionamiento de intérpretes y compiladores en Wikipedia en: [Link]


%C3%A9rprete_(inform%C3%A1tica)

Con base, en lo leído con anterioridad contesta las siguientes preguntas.

Elige el principio general de diseño de la solución a un problema:


Determina las entradas que requiere la solución
Determina las salidas que debe proporcionar la solución
Divide y vencerás
Da una breve descripción del problema
Da el algoritmo que resuelva el problema

2. Da el orden en que se deben listar los componentes de la definición de un algoritmo:

a) Lista de pasos a ejecutar


b) La ejecución siempre termina con el resultado correcto
c) Cero o más entradas
d) Cada paso bien definido
e) Una o más salidas

e,d,c,a,b

c,e,a,d,b

a,b,c,d,e

3. De los pasos listados en la pregunta 2, ¿cuáles serían relacionados con la sintaxis (forma) y cuáles con la
semántica (ejecución) del algoritmo?

Sintaxis: a, b
Semántica: c, d,e
Sintaxis: c,e
Semántica: a, b, d

Sintaxis: a,d
Semántica: b,c,e

4. Elige la descripción que defina de mejor manera al diseño orientado a objetos y que sólo se aplique a este último:
En el diseño orientado a objetos se busca dividir el problema en objetivos bien identificados
En el diseño orientado a objetos se busca dividir el problema en periodos de tiempo
En el diseño orientado a objetos se busca dividir el problema en funciones propias y funciones de biblioteca (library)
En el diseño orientado a objetos se busca dividir el problema en actores y responsabilidades

5. Elige la descripción del término acceso. 1 punto


Define quién puede teclear datos al proyecto
Define quién puede usar directamente cada uno de los componentes de una clase
Define la forma en que se usan todos los atributos del objeto
Define quién puede acceder a la clase o clases del proyecto

6. Elige la mejor descripción de lo que es el polimorfismo. 1 punto


Cuando una misma acción tiene varios sinónimos
Cuando una misma acción produce resultados distintos dependiendo de quién la ejecute
Cuando una clase tiene muchas acciones que puede realizar
Cuando una variable puede tomar valores distintos

7. Elige la mejor descripción de la relación que hay entre una clase y un objeto de esa clase.
Es lo mismo una clase que un objeto
Las clases describen lo que contienen los objetos y lo que saben hacer
Los objetos describen lo que contienen las clases y lo que saben hacer
Las clases contienen a los objetos de la clase

8. Elige la opción que complete el enunciado: Un mensaje, en la orientación a objetos es:


Algo a lo que responde alguna de las clases
Un atributo de un objeto
Una cadena que se le escribe al usuario
Una solicitud de servicio (una invocación de un método)

9.
El estado
de un objeto está dado por la colección de valores que guardan sus atributos.
Si los atributos son la edad en años
cumplidos, la estatura en metros y el
color de ojos. ¿Cuál
de las siguientes opciones describe el estado de un objeto?

1 punto

(17, 12, rojo)


(edad=105, estatura=.75, ojos=verde)
(edad=17, estatura = rojo, ojos=1.75)
(ojos=azul, estatura=1.5, edad=viejo)

10.
Elige 2 opciones que respondan a la siguiente pregunta: ¿Por qué a Java se le reconoce como un lenguaje orientado a
objetos?

1 punto
Porque cuando se usa Java se diseñan las soluciones con orientación a objetos
Porque todo está definido dentro de alguna clase
Porque las bibliotecas son paquetes de clases con métodos y atributos que pueden ser usados por cualquier otra clase
Porque al resolver un problema usando Java, participan varios objetos de manera distribuida para resolver un
problema

11.
Elige 2 opciones que completen correctamente el siguiente enunciado: El encapsulamiento en la orientación a
objetos consiste en
1 punto
La clase determina la forma de la cápsula que va a poner alrededor de “sus” objetos
Cada objeto se encuentra totalmente aislado del resto de los objetos por una cápsula en la que está envuelto
Todos los objetos de la misma clase están dentro de una cápsula, se pueden ver entre sí pero no pueden ver hacia
afuera
Cada objeto está en una cápsula, donde se encuentran sus atributos y métodos y en la que decide qué es lo que
muestra de su interior y cuáles solicitudes acepta

¡Felicitaciones! ¡Aprobaste!
Para Aprobar 80 % o más Calificación 90,90 %
¿Qué hemos aprendido del módulo I?
1.1. Lee en Wikipedia el texto correspondiente a “Máquina Virtual de Java” (JVM por sus siglas en inglés) en:
[Link]
2. Lee el funcionamiento de intérpretes y compiladores en Wikipedia en: [Link]
%C3%A9rprete_(inform%C3%A1tica)
Con base, en lo leído con anterioridad contesta las siguientes preguntas.
Elige el principio general de diseño de la solución a un problema: 0 / 1 punto
Determina las salidas que debe proporcionar la solución
Da el algoritmo que resuelva el problema
Da una breve descripción del problema
Divide y vencerás
Determina las entradas que requiere la solución
Incorrecto
☹ El algoritmo consiste de los cinco elementos que mencionamos, uno de los cuales es la lista de pasos a ejecutar.

2. Da el orden en que se deben listar los componentes de la definición de un algoritmo:


a) Lista de pasos a ejecutar
b) La ejecución siempre termina con el resultado correcto
c) Cero o más entradas
d) Cada paso bien definido
e) Una o más salidas 1 / 1 punto
a,b,c,d,e
e,d,c,a,b
c,e,a,d,b
Correcto
😊 Este es el orden que se da en la definición de un algoritmo: se empieza por las entradas y se termina hablando de
la ejecución.

3. De los pasos listados en la pregunta 2, ¿cuáles serían relacionados con la sintaxis (forma) y cuáles con la
semántica (ejecución) del algoritmo? 1 / 1 punto

Sintaxis: a,d
Semántica: b,c,e

Sintaxis: a, b
Semántica: c, d,e

Sintaxis: c,e
Semántica: a, b, d
Correcto
😊 Sintaxis: La lista de pasos a ejecutar, que dice que debe ser finita, tiene que ver con la forma que debe tomar el
algoritmo, lo mismo que la especificación de cada paso, pues “bien especificado” tiene que ser de acuerdo a ciertas
reglas dadas previamente.
Semántica: Si el algoritmo recibe cero o más entradas tiene que ver con la ejecución, lo mismo que producir salidas.
Asimismo, que el algoritmo entregue la respuesta correcta (sea eficaz) tiene que ver con cómo transcurra la
ejecución.

4. Elige la descripción que defina de mejor manera al diseño orientado a objetos y que sólo se aplique a este último:
1 / 1 punto
En el diseño orientado a objetos se busca dividir el problema en periodos de tiempo
En el diseño orientado a objetos se busca dividir el problema en actores y responsabilidades
En el diseño orientado a objetos se busca dividir el problema en objetivos bien identificados
En el diseño orientado a objetos se busca dividir el problema en funciones propias y funciones de biblioteca
(library)
Correcto
😊 Los actores en el diseño de una solución orientada a objetos son los objetos, quienes se van a encargar de asumir
ciertas responsabilidades, a lo que llamamos servicios o métodos, dependiendo de la clase a la que pertenezcan.

5. Elige la descripción del término acceso. 1 / 1 punto


Define quién puede acceder a la clase o clases del proyecto
Define quién puede usar directamente cada uno de los componentes de una clase
Define quién puede teclear datos al proyecto
Define la forma en que se usan todos los atributos del objeto
Correcto
😊 Dependiendo del acceso que se asigne a cada componente (atributo o método) queda definido quienes lo conocen
fuera de la clase.

6. Elige la mejor descripción de lo que es el polimorfismo. 1 / 1 punto


Cuando una variable puede tomar valores distintos
Cuando una misma acción tiene varios sinónimos
Cuando una clase tiene muchas acciones que puede realizar
Cuando una misma acción produce resultados distintos dependiendo de quién la ejecute
Correcto
😊 Por ejemplo, la acción de producir sonido tiene resultados distintos si el sonido es el que produce un violín o la
garganta de una persona.

7. Elige la mejor descripción de la relación que hay entre una clase y un objeto de esa clase. 1 / 1 punto
Los objetos describen lo que contienen las clases y lo que saben hacer
Las clases describen lo que contienen los objetos y lo que saben hacer
Las clases contienen a los objetos de la clase
Es lo mismo una clase que un objeto
Correcto
😊 Una clase es una patrón o plantilla, como los planos de una casa, para construir objetos que tengan la forma que
la clase dice y sepan hacer lo que la clase dice que saben hacer.

8. Elige la opción que complete el enunciado: Un mensaje, en la orientación a objetos es: 1 / 1 punto
Algo a lo que responde alguna de las clases
Una cadena que se le escribe al usuario
Un atributo de un objeto
Una solicitud de servicio (una invocación de un método)
Correcto
😊 El mensaje consiste del objeto al que va dirigido con la sintaxis exacta que tenga definido el método.

9. El estado de un objeto está dado por la colección de valores que guardan sus atributos. Si los atributos son la edad
en años cumplidos, la estatura en metros y el color de ojos. ¿Cuál de las siguientes opciones describe el estado de un
objeto? 1 / 1 punto
(ojos=azul, estatura=1.5, edad=viejo)
(edad=105, estatura=.75, ojos=verde)
(edad=17, estatura = rojo, ojos=1.75)
(17, 12, rojo)
Correcto
😊 Aunque la edad nos pueda parecer mucha y la estatura poca, cada atributo tiene un valor del tipo especificado.

10. Elige 2 opciones que respondan a la siguiente pregunta: ¿Por qué a Java se le reconoce como un lenguaje
orientado a objetos? 1 / 1 punto
Porque todo está definido dentro de alguna clase
Correcto
😊 La programación en Java se hace definiendo clases y construyendo objetos de esas clases. Todo tiene que estar
definido dentro de clases.
Porque cuando se usa Java se diseñan las soluciones con orientación a objetos
Porque al resolver un problema usando Java, participan varios objetos de manera distribuida para resolver un
problema
Porque las bibliotecas son paquetes de clases con métodos y atributos que pueden ser usados por cualquier otra
clase
Correcto
😊 Java es un lenguaje centrado en clases y como las clases son las que describen a los objetos, a Java se le considera
un lenguaje orientado a objetos.

11. Elige 2 opciones que completen correctamente el siguiente enunciado: El encapsulamiento en la orientación a
objetos consiste en
1 / 1 punto

Cada objeto se encuentra totalmente aislado del resto de los objetos por una cápsula en la que está envuelto

Todos los objetos de la misma clase están dentro de una cápsula, se pueden ver entre sí pero no pueden ver hacia
afuera

Cada objeto está en una cápsula, donde se encuentran sus atributos y métodos y en la que decide qué es lo que
muestra de su interior y cuáles solicitudes acepta
Correcto
😊 Este es el principio del encapsulamiento: los atributos o variables están junto a los métodos y la clase decide qué
se puede ver desde afuera y qué no.

La clase determina la forma de la cápsula que va a poner alrededor de “sus” objetos


Correcto
😊 Dependiendo del acceso que dé a sus atributos y métodos, cada objeto queda encapsulado, dando o no acceso a
los objetos de otras clases.

Preparándonos para Java


Bienvenido.
Nos da gusto que continues con nosotros en este segundo módulo. A continuación, estudiarás los principales
elementos del lenguaje Java y una metodología de análisis de problemas y diseño de soluciones orientado a objetos
denominada tarjeta de responsabilidades. Como primer paso para el análisis, se debe realizar una breve descripción
del problema. Se ha elegido automatizar una empresa de streaming con un amplio número de CD, DVD y Bluray.
Para cada uno de ellos, existe un determinado número de transmisiones permitidas simultáneas y transmisiones
activas. Por el momento, solo nos ocuparemos en cómo complementar cada disco. El siguiente paso consiste en
describir la salida. Esta nos permite saber qué necesita como entrada, y nos señala qué debe hacer nuestra clase y la
información que requiere.

En la salida de este problema se proporciona la siguiente información. Uno, valor de la información individual de
cada disco, tipo de disco, puede ser CD, DVD o Bluray, nombre del artista, película o serie, año de grabación,
número de transmisiones permitidas, número de transmisiones activas. Ambas transmisiones cambian de acuerdo
con la ejecución del sistema. Dos, describir cada disco completo. Tres, responder la solicitud de transmisión.
Cuatro, terminar una transmisión.
Y cinco, duplicar un disco porque se agotaron las transmisiones permitidas. El tercer paso es describir las entradas
del usuario, el cual funge como dueño de la empresa. En la entrada de este problema se deben proporcionar estos
datos. Discos, solicitud para llevar a cabo estas acciones, mostrar un disco, transmitir, finalizar una transmisión y
copiar un disco. Posteriormente, se identifican los objetos y responsabilidades del problema.
A partir de las descripciones dadas, se utilizan sustantivos para identificar los objetos, y con las responsabilidades se
utilizan verbos. Después se agrupan los sustantivos y verbos cuando cumplen funciones similares. El mismo tipo de
información y comportamiento nos da como resultado una clase.
Los objetos que se encuentran en este problema son: Uno, el disco, el cual se derivan tipo de disco, transmisiones
permitidas, fecha de grabación, nombre del disco y transmisiones activas.
Dos, también se encuentra el usuario, quien posee objetos y variables diversas para manipular el sistema.
El disco será nuestra clase principal you que es el objetivo de nuestro problema porque la información está contenida
en cada disco. El usuario será nuestra clase de prueba, y los objetos y variables son para probar sus servicios. En la
identificación de responsabilidades, estos son los verbos que se encuentran. Mostrar el contenido del disco, iniciar
una transmisión, terminar una transmisión, duplicar un disco y construir un disco.
En el paso cinco, se elaboran las tarjetas de responsabilidades.
Se elabora una tarjeta por cada clase, y se determinan los atributos que posee esta clase.
En esta tarjeta, aparecen para los atributos el campo y descripciones para cada uno.
En este ejemplo, se puede observar el tipo de disco, nombre, año, transmisiones activas y permitidas.
Otra característica que definiremos es el acceso, el cual posee la información sobre quién puede la clase, campos y
funciones. Es importante que conozcas las cuatro reglas de acceso de Java. Uno, público. Se refiere a que toda clase
u objeto es visible en toda la red. Dos, paquete. Lo declarado solo puede ser visto por clases en el mismo paquete o
subdirectorio. Tres, privado. Significa que solo puede ser visto por objetos de la misma clase. Y cuatro, protegido.
Solo pueden verlo las clases que heredan de esta misma, por lo tanto, el acceso de los campos será privado para que
no sea manipulado directamente por terceros. Posteriormente, se determinarán el nombre o el identificador. Tipos y
modificadores. Para conocerlos, revisa el siguiente video. Te esperamos.

Planteando la solución
Puntos totales de 7
1. Elige la opción que describe el primer paso en el diseño de una solución orientada a objetos.
1 punto
Asignar responsabilidades a objetos
Separar objetos y responsabilidades
Elaborar la tarjeta de responsabilidades
Escribir un breve enunciado del problema a resolver
2. Elige 2 enunciados verdaderos de la siguiente lista.
1 punto
Objeto y clase es lo mismo en Java
Atributo es otro nombre para una variable del objeto de la clase
Las clases corresponden a plantillas de comportamiento y memoria
El término método se refiere a las formas en que se realizan algunas acciones.
3. Elige la opción que describe el último paso en el diseño orientado a objetos. 1 punto
Describir brevemente el problema
Decidir los campos o atributos
Elaborar la tarjeta de responsabilidades
Describir la funcionalidad del objeto
Separar los verbos de los sustantivos
4. Elige 3 opciones que describan a los sustantivos en la descripción del problema: 1 punto
Lo que debe hacer un objeto de la clase
Una descripción de la memoria del objeto
Las responsabilidades o métodos de los objetos de la clase
Los atributos y variables
Lo que debe recordar de sí mismo un objeto de la clase
5. Elige 3 opciones que describan a los verbos en la descripción del problema: 1 punto
Los métodos registrados en la clase
Los atributos y cómo manejarlos
Las responsabilidades que debe cumplir un objeto de la clase
Las acciones que debe saber realizar un objeto
La historia de acciones realizadas sobre el objeto
6. Elige la opción que represente qué es lo primero que se debe escribir en la tarjeta de responsabilidades:
1 punto
Las entradas
Que se trata de la descripción de las responsabilidades
El nombre de la clase
Las salidas
Que se trata de la descripción de los campos
7. Elige 3 opciones que son verdaderas respecto al significado del acceso private de Java: 1 punto
Se da acceso a los métodos, pero no a los campos
Generalmente se marcan con este acceso los campos o atributos de la clase
Los elementos con este acceso pueden ser vistos en la web desde cualquier clase
Los elementos con este acceso sólo pueden ser vistos dentro de la clase
Este acceso se marca para que sólo puedan cambiar los valores o invocar a los métodos los objetos de la clase

¡Felicitaciones! ¡Aprobaste! Para Aprobar 80 % o más


Calificación 100 %
Planteando la solución Puntos totales de 7
1. Elige la opción que describe el primer paso en el diseño de una solución orientada a objetos. 1 / 1 punto
Asignar responsabilidades a objetos
Elaborar la tarjeta de responsabilidades
Separar objetos y responsabilidades
Escribir un breve enunciado del problema a resolver
Correcto
😊 ¡Bien hecho! Lo primero es tener claro qué es lo que se desea resolver.
2. Elige 2 enunciados verdaderos de la siguiente lista. 1 / 1 punto
Objeto y clase es lo mismo en Java
Atributo es otro nombre para una variable del objeto de la clase
Correcto
😊 ¡Muy bien! Llamamos atributos a las variables presentes en una clase y que determinan al objeto.
Las clases corresponden a plantillas de comportamiento y memoria
Correcto
😊 Una clase describe lo que debe recordar un objeto y cómo se debe comportar.
El término método se refiere a las formas en que se realizan algunas acciones.
3. Elige la opción que describe el último paso en el diseño orientado a objetos. 1 / 1 punto
Decidir los campos o atributos
Elaborar la tarjeta de responsabilidades
Describir brevemente el problema
Describir la funcionalidad del objeto
Separar los verbos de los sustantivos
Correcto
😊 Ya que se tienen todas las características y responsabilidades a partir de la descripción del problema, se procede a
elaborar la tarjeta de responsabilidades.
4. Elige 3 opciones que describan a los sustantivos en la descripción del problema: 1 / 1 punto
Los atributos y variables
Correcto
😊 Los sustantivos se refieren a “cosas” que deben “tener” los objetos de la clase y se declaran dentro de la clase
como variables o atributos.
Una descripción de la memoria del objeto
Correcto
😊 En conjunto todos los atributos representan lo que está en la memoria del objeto.
Lo que debe recordar de sí mismo un objeto de la clase
Correcto
😊 Los atributos o variables propias se usan para registrar lo que el objeto debe conocer de sí mismo.
Las responsabilidades o métodos de los objetos de la clase
Lo que debe hacer un objeto de la clase
5. Elige 3 opciones que describan a los verbos en la descripción del problema: 1 / 1 punto
Las acciones que debe saber realizar un objeto
Correcto
😊 “Verbos” y “acciones” son sinónimos de lo que debe saber hacer un objeto de la clase.
Los métodos registrados en la clase
Correcto
😊 Para cada verbo se debe contemplar un método en la clase.
La historia de acciones realizadas sobre el objeto
Las responsabilidades que debe cumplir un objeto de la clase
Correcto
😊 Precisamente a partir de los verbos es cómo sabemos qué es lo que debe saber hacer un objeto de esa clase.
Los atributos y cómo manejarlos
6. Elige la opción que represente qué es lo primero que se debe escribir en la tarjeta de responsabilidades:
1 / 1 punto
Que se trata de la descripción de los campos
Las entradas
El nombre de la clase
Que se trata de la descripción de las responsabilidades
Las salidas
Correcto
😊 Lo primero que debe decir una tarjeta de responsabilidades es a qué clase se refiere, el nombre de la clase que
estamos construyendo.
7. Elige 3 opciones que son verdaderas respecto al significado del acceso private de Java: 1 / 1 punto
Se da acceso a los métodos, pero no a los campos
Los elementos con este acceso pueden ser vistos en la web desde cualquier clase
Este acceso se marca para que sólo puedan cambiar los valores o invocar a los métodos los objetos de la clase
Correcto
😊 Así, las modificaciones o usos de valores se hacen cómo se deben hacer.
Generalmente se marcan con este acceso los campos o atributos de la clase
Correcto
😊 Se marcan como private los campos porque generalmente tienen que tomar valores en ciertos rangos y de esta
manera se garantiza que la clase, que conoce estos rangos, no los viole.
Los elementos con este acceso sólo pueden ser vistos dentro de la clase
Correcto
😊 Así es. Es para proteger campos que sólo sean manipulados o actualizados ordenadamente en los métodos de la
clase.

¡Ahora sí!... Java


Hola, bienvenido a este video.
En el video anterior conociste a algunos de los elementos que conforman la tarjeta de responsabilidades.
Acompáñanos a revisar los elementos que la completan. Para empezar, los identificadores sirven para nombrar los
ingredientes de nuestros programas: paquetes, interfaces, clases, variables y constantes, métodos o funciones propias.
¿Qué conforman los identificadores? Letras mayúsculas y minúsculas, dígitos, guiones bajos, signo de pesos y
empiezan con letra o guion bajo. Las principales convenciones para los identificadores de Java son: general,
compuestas por una o más palabras, a partir de la segunda palabra, empiezan con mayúscula; clases e interfaces, son
sustantivos que empiezan con mayúscula; variables, son sustantivos que empiezan con minúsculas; métodos o
funciones, son verbos imperativos escritos en minúscula, seguidos por un sustantivo; constantes, se encuentran
formadas por uno o más sustantivos, exclusivamente en mayúscula, y pueden estar separadas entre sí por un guión
bajo.
Al llenarnos la tabla con los identificadores, quedaría así. Ahora, lo siguiente es determinar el tipo de cada campo.
Un tipo en Java es un conjunto de valores y operaciones definidas para ellos. Es importante que cada entrada o salida
sea de un determinado tipo. En Java existen dos tipos generales: primitivos, los cuales no pueden subdividirse como
números y caracteres; referencias, los cuales son tipos que contienen la dirección de algún objeto. Por ejemplo: uno,
número con las operaciones suma, resta, multiplicación y división; dos, cadenas, "string", con diversas funciones
como la concatenación; tres, cada clase corresponde a un tipo, conjunto de valores dados por la información que
contenga, operaciones relacionadas con las responsabilidades.
Acerca de los tipos primitivos, se encuentran los números enteros, divididos de la siguiente manera: grandes, "long";
medianamente grandes, "int"; pequeños, "short"; y, por último, los enteros más pequeños, que son los de tipo "byte".
Cuando deseamos escribir una constante entera, que sea "long", "short" o "byte", tendremos que caracterizarla. Por
omisión, Java trabaja con enteros tipo "int".
Por otro lado, los números reales se dividen de la siguiente manera: doble precisión, "double"; precisión sencilla,
"float". En el caso de los números reales, el tipo con el que trabaja Java por omisión es "double". También, tenemos
otros tipos primitivos, caracteres, identificados por la palabra "char" y utilizados para codificar los caracteres dentro
de Java con Unicode, que utilizan 16 bits.
Por otro lado, tenemos los valores lógicos, identificados por "boolean", que toman los valores de falso, "false", o
verdadero, "true", también usan 16 bits.
En los tipos referencia de Java, existe un tipo por cada clase o interfaz, una referencia por cada objeto que se declara.
Al declararlo contiene un valor "null", es decir, que es una dirección nula, los cuales se construyen fuera de la
memoria principal.
Cuando se construye un objeto, se define una referencia, la cual es la dirección en que está construido el objeto.
Procedemos, ahora, a asignar el tipo a cada uno de nuestros identificadores.
El tipo de disco es un "short", ya que es relativamente pequeño.
El nombre es un "string", el año es un "int" y activas y permitidas también son "int".
Ahora, revisaremos qué son los modificadores, los cuales se encargan de anotar donde existe lo declarado.
Puede estar en la clase compilada, en Java, esto se denota "static".
También, puede estar en cada objeto construido, en cuyo caso, no aparece este modificador.
Por otro lado, se utilizan para designar la vigencia de un valor, en este caso, tenemos dos vigencias.
Constantes, se les asigna un valor durante la creación del objeto, en Java, se utiliza el modificador "final".
Variables, se les asigna y reasigna un valor en cualquier momento, en Java, no aparece este modificador.
Observa que pueden aparecer los dos modificadores, "final" y "static", esto significa que pertenecen a la clase y son
constantes.
La sintaxis nos dice que los modificadores deben colocarse a continuación del acceso y se usan para valores y
funciones.
Ahora, marcaremos los modificadores de nuestra clase. El tipo de disco, nombre y año, corresponden a constantes,
por ello, aparece "final".
Cada objeto tiene distintos valores, por esta razón, no son "static".
Respecto a las transmisiones activas y permitidas, pertenecen a cada objeto, por lo tanto, no llevan ningún
modificador.
Con este video concluye la parte de atributos. Ahora, puedes pasar al siguiente vídeo, donde revisaremos los métodos
y funciones en nuestra tarjeta de responsabilidades.
Te esperamos.

¡Felicitaciones! ¡Aprobaste! Para Aprobar 80 % o más


Calificación 100 %
Ingredientes básicos de Java
Puntos totales de 10
1. Elige 3 opciones que corresponden a ingredientes de nuestros proyectos:
1 / 1 punto
Accesos
Funciones propias
Correcto
😊 Algunas de las clases de tu proyecto tendrán funciones propias (métodos) que definan lo que los objetos de esa
clase pueden hacer.
Constantes
Correcto
😊 Tu proyecto tendrá algunas constantes para facilitar la posible modificación de este tipo de valores.
Identificadores
Clases
Correcto
😊 Vas a construir una o más clases como parte de tu proyecto.
2. Elige 2 opciones que hablan de una diferencia entre una variable y una constante en el lenguaje de programación
Java:
1 / 1 punto
A las constantes se les debe asignar valor al construir el objeto y a las variables no
Correcto
😊 Esto es cierto si se trata de constantes de objeto, porque si se trata de constantes de clase hay que darles valor
(definirlas) en el momento de su declaración. En cambio, a las variables se les puede asignar (y reasignar) valor en
cualquier momento de la ejecución del proyecto.
Las constantes pueden aparecer en cualquier expresión, pero las variables no
Las constantes tienen el modificador final y las variables no
Correcto
😊 Esto es cierto, ya sea que sean constantes de clase o de objeto. Si son de clase, también aparece el modificador
static.
Las constantes tienen el modificador static y las variables no
Las constantes sólo pueden ser números mientras que las variables se pueden referir a cualquier tipo
3. Elige 3 afirmaciones que sean verdaderas:
1 / 1 punto
La única regla obligatoria para los identificadores es la que dice que pueden contener letras, números, guion bajo
y signo de pesos; deben empezar con letra o guion bajo.
Correcto
😊 Para Java es lo mismo que a una constante que llamas VEINTE valga 10, -5 o 25. Simplemente te pide que no
uses el mismo identificador para valores distintos.
Las constantes las identificas por estar escritas sólo con verbos
Las variables generalmente las nombras con sustantivos
Correcto
😊 También esta es una regla de educación a la que el lenguaje no obliga. Ya sea que estés nombrando objetos o tipos
primitivos, estás hablando de ‘’cosas’’ y, por lo tanto, se usan sustantivos.
Los únicos identificadores que empiezan con mayúscula son los de las constantes
Los métodos generalmente los nombras con verbos imperativos
Correcto
😊 Ya que los métodos se refieren a servicios que le puedes pedir a una clase, son ‘’acciones’’ por lo que te refieres a
ellas con verbos. La costumbre es que sean imperativos porque le vas a decir al objeto que lo haga. Esta es también
una regla de educación que el lenguaje no vigila.
4. Identifica las diferencias entre los distintos tipos enteros de Java, además del nombre de su tipo. Elige 2 opciones
que consideres correctas.
1 / 1 punto
El identificador que usas para nombrarlos
Las operaciones que se pueden hacer con cada uno de ellos
El tamaño que usa cada uno, va de mayor a menor en el orden en que están listados
Correcto
😊 Si te fijas en la tabla donde están descritos los tipos primitivos correspondientes a números, verás que el número
de bits que se usan para su representación va de mayor a menor. El rango de un entero depende de cuántos bits usas
para su representación.
Los valores que se pueden representar en cada uno de ellos
Correcto
😊 En la tabla para los números (tipos primitivos) los rangos de valores son distintos y dependen directamente del
número de bits utilizados para representarlos.
5. ¿Cuál de los siguientes no es un tipo primitivo?
1 / 1 punto
boolean
String (cadena de caracteres)
double
long
char
Correcto
😊 En efecto, éste no es un tipo primitivo pues está formado por caracteres y cada uno puede ser usado
independientemente del resto de la cadena.
6. Elige 3 opciones que sean números reales:
1 / 1 punto
0.0001
Correcto
😊 Este es un número real sin parte entera, pero lo que importa es que tenga parte decimal. Se va a representar como
un número real en la computadora.
7.0
Correcto
😊 Este es un número real pues tiene una parte fraccionaria, aunque esta parte valga 0. Su representación interna en
la computadora es la de un número real.
20017
3.141594 (aproximación de lo que se conoce como Pi)
Correcto
😊 No hay forma de representar al número Pi en la computadora pues se sospecha que los dígitos a la derecha del
punto decimal no terminan nunca. Pero como con la mayoría de los números reales, podemos representar una
aproximación satisfactoria en un double.
43210987
7. Elige la opción que complete el enunciado: Una variable que es una referencia es aquella que contiene:
1 / 1 punto
Una dirección de memoria en la que está el objeto al que se refiere la variable
Una dirección de memoria donde está la variable
Un entero
Un valor del mismo tipo que la variable
Correcto
😊 Las variables que son referencias contienen la dirección en memoria donde se encuentra el objeto construido, o
el valor nulo si no se ha asociado a ningún objeto con esta variable.
8. Elige la opción que complete el enunciado: Como para el tipo de disco sólo tenemos tres posibles valores (1, 2 o
3) el tipo más pequeño que podíamos usar es:
1 / 1 punto
short
float
int
long
byte
Correcto
😊 Este parece ser el adecuado, pues es el entero que tiene rango más pequeño, de -128 a 127.
9. Elige 2 opciones que sean verdaderas respecto a un atributo (o identificador) con el modificador static:
1 / 1 punto
Es el mismo objeto o valor para todos los objetos de la clase
Correcto
😊 Como pertenece a la clase y no a cada objeto, todos los objetos construidos para esa clase comparten esos valores.
Existe desde que se compila la clase
Correcto
😊 Como pertenece a la clase, en el momento en que existe una versión compilada de la clase se pueden usar sus
atributos static desde cualquier objeto de cualquier otra clase.
Termina de existir cuando termina de ejecutarse la clase
Existe desde que se construye un objeto de esa clase
Sólo existe para los objetos de esa clase
10. Elige 2 opciones que explican por qué se declararon el nombre, el año de grabación y el tipo de disco con el
modificador final
1 / 1 punto
Porque su valor no debe cambiar una vez ‘’grabado’’ (construido) el disco
Correcto
😊 En efecto, una vez ‘’grabado’’ (o construido) el disco, no se debe poder cambiar el valor de estos atributos.
Porque esos atributos son constantes de objeto
Correcto
😊 Como tienen el modificador final, pero no el modificador static, quiere decir que son constantes de objeto.
Porque esos atributos toman su valor durante la construcción de cada objeto
Porque esos atributos tienen el mismo valor para todos los objetos
Porque es el valor que van a tomar esos atributos al terminar la ejecución

Definiendo atributos y métodos de una clase


Hola. Bienvenido a este tercer video.
Siguiendo con la elaboración de nuestra tarjeta de responsabilidades, es momento de conocer los métodos.
Es importante mencionar que toda clase debe tener un constructor.
Empezaremos por los métodos, donde se encuentran los constructores que son públicos.
Java provee un constructor por omisión sin parámetros, que asigna cero a todo lo que esté declarado como tipo
primitivo y null a lo que esté declarado como tipo referencia.
A todo método se le asigna un identificador.
Tiene como salida algún valor y como entrada parámetros.
Veamos lo que debe hacer cada método.
El constructor que no tiene ningún parámetro regresa un disco y le solicita al usuario los campos constantes y
transmisiones permitidas.
El siguiente constructor recibe los tres campos, tipo, nombre y año.
Se encarga de construir un disco con los valores fijos, pero con cero en transmisiones permitidas y activas.
Por último, tenemos un constructor que recibe los valores para las constantes y transmisiones permitidas.
Describimos los servicios públicos que pretende dar nuestra clase.
DaTransmisión, regresa una cadena que dice hora y fecha de transmisión o una negativa en el caso de que no haya
podido dar dicha transmisión.
terminaTransmisión, regresa un valor verdadero o falso, dependiendo de si había o no transmisiones que terminar
respectivamente.
MuestraDisco, regresa una cadena con el contenido del disco y recibe como entrada un encabezado.
Otro método con que se cuenta es copiaDisco.
Debe producir un disco nuevo y no recibe nada como entrada.
toString es un método heredado de la clase object y regresa una cadena con la información del disco.
En los métodos getXXX, las tres X significan el nombre del atributo empezando en mayúscula.
El tipo de valor que regresan debe ser el mismo que el tipo del atributo.
Por último, tenemos los métodos setXXX, los cuales actualizan o modifican el valor del atributo.
Estos métodos no regresan nada, por lo tanto, se anota el tipo void y reciben como entrada el nuevo valor que deben
colocar en el atributo.
Nos falta elaborar la tarjeta de responsabilidades del usuario. Recuerda que es una clase en sí misma. El único
método que tendrá el usuario será main, principal, el cual es el punto de acceso de cualquier clase desde la consola.
Es decir, si tecleas el nombre de una clase en la terminal y si tiene un método main, este se empezará a ejecutar.
Este método no regresa nada.
Por ello, tendrá tipo void y recibirá una sucesión de cadenas al invocar a la clase. También hay que elaborar la tarjeta
de comunicación, es decir, quién se va a comunicar con cada uno de los campos y métodos.
En la siguiente tabla, puedes observar que los elementos solo se comunicarán con el objeto donde están, this, y con
todos los objetos de esta clase.
En cuanto a los métodos de acceso público, podrán ser invocados por cualquier usuario que conozca la clase Disco.
Por último, hablaremos un poco más sobre el almacenamiento de las variables durante la ejecución.
En Java tenemos tres tipos de almacenamiento que se utilizan de la siguiente manera.
Primero tenemos el almacenamiento o memoria de código.
Aquí se encuentran todas las clases compiladas y las variables o métodos declarados como static dentro de las clases.
También tenemos una pila de ejecución, utilizada por el sistema operativo para ejecutar nuestras clases.
Ahí se encuentran las variables primitivas y de referencia que se usan durante la ejecución del proyecto.
Por último, tenemos un espacio de memoria llamado heap, el cual está disponible para construir todos los objetos
durante la ejecución del proyecto.
Como pudiste observar, es muy importante tomar en cuenta todos los elementos que componen las tarjetas de
responsabilidades.
Nos vemos en el siguiente video.

¡Felicitaciones! ¡Aprobaste! Para Aprobar 80 % o más


Calificación 100 %
Atributos y métodos de una clase
Calificación del último envío 100%

1. Elige 3 opciones que describen lo que es un método. 1 / 1 punto


Una función propia
Correcto
😊 Otro nombre que damos a los métodos definidos en una clase es el de función propia, donde el adjetivo ‘’propia’’
es el que indica que pertenece a la clase.
Un servicio que proporciona el objeto
Correcto
😊 Un servicio es una acción y, por lo tanto, un verbo. En la primera parte del diseño dijimos que los verbos
corresponden a métodos.
Una característica del objeto
Una responsabilidad de la clase
Correcto
😊 En efecto, un método es algo que el objeto se compromete a realizar y, por lo tanto, una responsabilidad.
Algo que debe recordar un objeto
2. Elige 2 opciones que sean verdaderas respecto al constructor por omisión (por ausencia, por default) de Java, que
no tiene ningún parámetro: 1 / 1 punto
Sólo está disponible si no declaras ningún otro constructor
Correcto
😊 En efecto, en cuanto tú declaras algún constructor, se pierde el acceso al constructor que Java tiene por omisión.
En el caso de los discos, el constructor por omisión pondría una cadena nula en el nombre, lo cual no es
conveniente
Correcto
😊 Si todos los discos que construyes tienen una cadena nula en el nombre, cero en el año de grabación y cero como
tipo de disco, todos son iguales y no tienes manera de distinguir a uno del otro. Como estos tres atributos son
constantes de objeto, no tendrías forma de cambiarles el valor después.
Siempre está disponible
Está disponible siempre que no declares un constructor sin parámetros
3. Elige la opción que complete el enunciado: En la definición de un método llamamos parámetro a: 1 / 1 punto
El valor que regresa el método
El tipo de valor que tiene el método como salida
Todas las salidas que tiene definido el método
Cada valor que recibe el método como entrada
Correcto
😊 En efecto, llamamos parámetros (o parámetros formales) a la lista de identificadores, con su tipo correspondiente
que representan a la entrada que va a recibir un método.
4. Elige la opción que complete el siguiente enunciado: En el caso de la clase Disco, el constructor sin parámetros
que vas a declarar: 1 / 1 punto
Pone en ceros todos los campos numéricos y en nulo todos los campos de referencia
Le va a pedir al usuario los valores de las constantes de objeto y del atributo que registra las transmisiones
permitidas
Va a tomar de la entrada del método los valores para los atributos constantes del objeto
Le va a pedir al usuario los valores de las constantes de objeto, del atributo que registra las transmisiones
permitidas y del atributo que registra las transmisiones activas
Correcto
😊 Todas las constantes de objeto deben tomar un valor inicial durante la construcción del objeto. También es
conveniente que las transmisiones permitidas empiecen con un valor inicial, aunque, por no ser este atributo
constante de objeto, podría ser asignado una vez construido el objeto.
5. Elige 2 opciones que respondan a la siguiente afirmación:
El método daTransmision no tiene como entrada el disco al que se le pide la transmisión porque: 1 / 1 punto
Cuando sea invocado en ejecución, se le pedirá a un objeto particular de esta clase
Correcto
😊 En efecto, se le pedirá a un objeto particular que dé una transmisión, pero con la sintaxis de Java.
Se refiere a todos los objetos construidos hasta ese momento
Todos los métodos de una clase tienen implícito (oculto) un primer parámetro que se refiere a this, el objeto
desde el cual está siendo llamado el método (el objeto que recibe este mensaje)
Correcto
😊 Así es. This se refiere siempre, dentro de un método, al objeto al que se le pidió este servicio. No se puede pedir
la ejecución de ningún método si no es a un objeto particular construido.
Se aplica a todos los discos construidos con transmisiones permitidas distintas de cero
6. De los métodos que se enunciaron en la tarjeta de responsabilidades, elige 4 opciones que entregan como resultado
un mensaje o descripción del objeto. 1 / 1 punto
muestraDisco
Correcto
😊 Regresa una cadena que contiene toda la información del disco al que se pidió este servicio.
setNOMBRE
copiaDisco
toString
Correcto
😊 Es un método que da una descripción, en una cadena o String, del objeto con el que se le invoca. Si no se
implementa en tu clase, versiones anteriores de Java regresaban la dirección de memoria en la que está almacenado
el objeto.
daTransmision
Correcto
😊 En la columna para la salida y en la descripción del método dice que regresa una cadena de caracteres, que es un
mensaje que indica si pudo dar la transmisión con la hora y fecha, y si no pudo dar la transmisión con un mensaje
alusivo a este hecho.
terminaTransmision
getNOMBRE
Correcto
😊 Los métodos getXXX, que en este caso se trata del atributo NOMBRE, regresan un valor del tipo del atributo.
Como NOMBRE es un String (cadena de caracteres), el método debe regresar un String.
7.
Pregunta 7
Elige 2 opciones que sean verdaderas:
1 / 1 punto
Si el método no recibe ninguna entrada se usa el tipo void para indicarlo
Todos los métodos sólo pueden tener un único tipo como entrada
Si el método no entrega ninguna salida se usa el tipo void para indicarlo
Correcto
😊 Esta es la forma como Java indica que el método no va a dar ningún resultado, lo que no quiere decir que no vaya
a hacer algo.
Todos los métodos sólo pueden tener un único tipo como salida
Correcto
😊 Si un método desea regresar más de un valor, como copiaDisco, que regresa un Disco que contiene varios
valores, debe construir algún objeto que tenga todos los valores que desea regresar.
8. Elige la opción que responda a la siguiente afirmación:
La tarjeta de comunicación para cada clase indica:
1 / 1 punto
Quién esperas que pueda usar directamente cada atributo y método del objeto
Qué valores recibe y entrega la clase
Quién va a conocer a la clase
Cómo se van a comunicar con el método main del usuario
Correcto
😊 Cuando decides quién puede o no ver atributos y métodos es cuando puedes asignar el acceso. Los atributos, en
general, sólo deben poder manipularse desde dentro del objeto, por lo que son de acceso private, mientras que los
métodos listados en la tarjeta de responsabilidades, dado que son servicios que debe proveer el objeto, deben ser
public o de paquete (sin anotación para el acceso).
[Link] la opción que responda a la siguiente afirmación:
Las variables y métodos declarados en una clase como static se almacenan en:
1 / 1 punto
Memoria para la pila de ejecución
Memoria auxiliar
Memoria para el heap
Memoria de código
Correcto
😊 La Máquina Virtual de Java reparte la memoria en tres partes: En la que deposita el código compilado de las
clases que va a usar; en la que va siguiendo la ejecución de main, para lo que usa una pila; y, por último, en la que va
guardando los objetos que se van construyendo y que se llama heap (cuya traducción literal es montículo, pero es una
estructura de datos particular en programación).

¡Felicitaciones! ¡Aprobaste! Para Aprobar 80 % o más


Calificación 100 %
Caso de estudio
Puntos totales de 3

1. Lee el siguiente caso:


Tenemos una empresa de paquetería que recibe paquetes con cierto contenido y un peso determinado. Cada paquete
dice la distancia a recorrer para entregar el paquete y la persona que lo va a recibir. El costo de entregar un paquete
es una función del peso y la distancia, la misma para todos los paquetes. A cada paquete recibido se le pone un sello
con la hora a la que se recibió y un sello distinto cuando el paquete es enviado para su entrega, también con la fecha
y hora, y la persona que lo va a recibir. Las fechas y horas se toman de un reloj que tiene la empresa y que usan todos
los paquetes. Al recibir un paquete, la empresa le avisa al destinatario cuánto va a costar la entrega. Cuando el
paquete es entregado, se le pone otro sello al paquete con la fecha y hora de entrega.
Elige 3 opciones correctas. ¿Cuáles de los siguientes sustantivos pueden ser de tipo primitivo (número, booleano o
carácter)? 1 / 1 punto
paquete
contenido
peso
Correcto
😊 El peso puede representarse con un número real, que es de tipo primitivo.
destinatario
distancia
Correcto
😊 La distancia puede representarse como un número real, que es un tipo primitivo.
sello
costo
Correcto
😊 El costo puede estar representado por un número real. La orientación a objetos, sin embargo, nos dice que no
guardemos como atributo un valor que se puede calcular a partir de otros atributos de un objeto.
2. Vas a diseñar una clase para los sellos. Elige 5 opciones que respondan la siguiente pregunta: ¿Cuáles de los
atributos primitivos estarían en los objetos de esa clase? 1 / 1 punto
mes
Correcto
😊 Podemos usar un entero cuyo valor sea entre 1 y 12 para indicar el número de mes, por lo que es un tipo
primitivo. No tiene sentido usar una cadena porque va a ser difícil calcular el tiempo transcurrido entre dos meses.
hora del día (24 horas)
Correcto
😊 Es un entero que puede tomar los valores entre 0 y 23.
día del mes
Correcto
😊 Es un tipo primitivo que puede tomar un valor entre 1 y 31, dependiendo del mes del que se trate.
tipo de sello (recibido, enviado, entregado)
minuto del día
Correcto
😊 Es un entero que puede tomar los valores entre 0 y 59.
reloj
fecha
año
Correcto
😊 Es un tipo primitivo que podrá tomar un valor entre 1900 y 2999 (aunque un límite más realista sería 2099).
3. Si quisieras que el contenido del paquete pudiese estar representado por un número, suponiendo que tienes
1,000,000 de artículos posibles, ¿cuál de los tipos primitivos para números sería el más adecuado? 1 / 1 punto
short
long
float
byte
double
int
Correcto
😊 Los números de este tipo tienen aproximadamente 10 cifras decimales enteras; aunque únicamente requieres 7, el
siguiente tipo entero no alcanza para guardar 1,000,000 de claves.

bienvenidos a esta segunda lección. Por fin iniciaremos la programación en Java. Para ello, usaremos un ambiente de
desarrollo integral que tiene todo lo que se necesita para programar un lenguaje. En nuestro caso, ese ambiente de
desarrollo se llama Dr. Java, y fue diseñado para aprender a programar. Aquí mismo te coloco el link donde puedes
descargar e instalar Dr. Java, así como el compilador de Java 8, que es el que usaremos. Empezamos esta sesión con
Dr. Java you ejecutándose. Antes de seguir, enlistaremos algunos términos.
¿Cómo creamos un archivo?
Debes ir a la pestaña File, y aquí nos señala qué podemos hacer con un archivo. Este puede ser creado por el
programador o usuario en un editor de texto, o puede ser escrito en un ambiente de desarrollo como este. También,
puede ser creado por una aplicación cuando se solicita que se compile un archivo que esté ejecutándose, el cual
genera el código compilado. Los archivos se encuentran en subdirectorios. Java los denomina paquetes. Nosotros
tendremos un paquete para este proyecto que contiene nuestros archivos fuentes, que son los escritos en Java para
clases e interfaces, los archivos compilados, los que produce el compilador de Java, y los archivos de texto, que son
datos o salidas. Siguiendo la tarjeta de responsabilidades, el orden para desarrollar este proyecto en Java será, uno,
desarrollar un contrato de los métodos o servicios que el usuario pretende de nuestra clase. En el contrato aparece
cada servicio, lo que recibe como entrada y lo que produce como salida. A esto se le denomina interfaz, o en Java,
interface. Dos, documentar la interfaz para que cualquiera pueda tener acceso a ella.
Lo haremos con Javadoc. Tres, suponer que alguien programó la clase Disco y la documentó con Javadoc, y así,
contamos con los archivos correspondientes. Cuatro, hacer una clase para que el usuario pueda probar los métodos
que anuncia la interfaz. Esta clase se llamará Usuario. Cinco, por último, se codifica Disco.
Ahora veremos la interfaz en el ambiente de desarrollo.
Se deben colocar todos los archivos de este proyecto en un solo subdirectorio, es decir, en un paquete.
La primera línea del archivo que estamos construyendo debe decir a qué paquete pertenece.
En este caso, se colocará la palabra package, proporcionando un nombre para ese paquete. Se ha elegido el nombre
discos. Esto es un enunciado de Java, el cual termina en punto y coma.
Este archivo corresponde a una interfaz, y se identifica como interface, y se le asigna el nombre de servicios disco.
Al inicio de esta línea, se colocará el acceso que tiene la interfaz.
Las interfaces solo pueden ser de acceso público o de paquete.
El contenido de la interfaz se coloca entre dos llaves, una que abre y otra que cierra.
Aquí se colocarán declaraciones de encabezados de métodos de los servicios que va a proveer cualquier clase que la
implemente.
Para guardar el archivo es necesario darle clic en la pestaña Save. Lo guardaremos en algún subdirectorio llamado
discos, que hayas creado previamente. Todos los archivos de la clase o interfaz pública deben tener el mismo nombre
respectivamente. Como nuestra interfaz la llamamos servicios disco, así también denominaremos nuestro archivo.
Es importante que sepas que una interfaz nunca tiene constructores, you que la interfaz no puede saber quién la va a
implementar, y no puede proporcionar los constructores que tendrá la clase que decide obedecerla.
Veremos algunos comentarios que nos indiquen qué es lo que vamos haciendo.
El primer comentario será el escape de línea, que empieza con dos diagonales, le sigue lo que quieres decir.
Termina con el fin de línea. Sigue con nosotros en el siguiente video, en el cual revisaremos los métodos de consulta,
de actualización y de implementación.

Compilación y ejecución en DrJava


Puntos totales de 6
1. Elige 2 opciones que representen ambiente de desarrollo integrado: 1 punto
Un editor para producir documentos
Un programa que te muestra texto
El que te permite ver películas y vídeos
El programa que maneja hojas de cálculo electrónicas
El manejador de archivos de un sistema operativo
2. Selecciona la descripción de lo que es un package de Java: 1 punto
Un archivo específico que contiene varias clases
Una colección de archivos que se guardan en algún subdirectorio de Java
Una colección de archivos que se guardan en un subdirectorio con el nombre del package
La dirección de una liga (link) en la computadora
El nombre de la computadora en la que estás ejecutando DrJava
3. Elige 2 opciones que respondan a la siguiente afirmación:
Como las interfaces son contratos que anuncian servicios, tienen que tener alguno de los siguientes accesos:
1 punto
público
paquete
privado
protegido
4. Elige la opción que responda a la siguiente afirmación:
El nombre del archivo donde está declarada la interfaz con identificador NuestraInterfaz, debe ser:
1 punto
[Link]
[Link]
[Link]
[Link]
5. Elige la opción que responda a la siguiente afirmación: El comentario de escape de línea se llama así porque:
Empiezan con // y ya no se pone nada en esa línea
Ocupan una línea exactamente y todo lo que esté en esa línea es comentario
Una vez que aparece // lo que sigue en la misma línea escapa del compilador de Java
Empiezan con /* y terminan con un cambio de línea
6. Elige la opción que responda a la siguiente afirmación: La razón por la que una interfaz no tiene definidos
constructores es la siguiente:
Usa siempre el constructor por omisión que proporciona Java
Lista los atributos, pero no dice cómo se usan ni para qué sirven
Sólo lista servicios, sin decir qué clase los va a proporcionar o cuáles son los atributos que necesita
Cuando lista los servicios o métodos no da ni las entradas ni las salidas de cada método

¡Felicitaciones! ¡Aprobaste! Para Aprobar 80 % o más


Calificación 100 %
Compilación y ejecución en DrJava
Puntos totales de 6
1. Elige 2 opciones que representen ambiente de desarrollo integrado: 1 / 1 punto
El que te permite ver películas y vídeos
El programa que maneja hojas de cálculo electrónicas
Correcto
😊 Este tipo de programas puede ser considerado un ambiente de desarrollo integrado pues permite la edición,
combinación y elaboración de bases de datos (particulares), con la posibilidad de programar las hojas de cálculo.
Un programa que te muestra texto
El manejador de archivos de un sistema operativo
Un editor para producir documentos
Correcto
😊 Este sí es un ambiente de desarrollo integrado pensado para producir documentos y publicarlos. Les da formato,
te marca errores de ortografía o de composición, puede editarlos, guardarlos y muchas acciones más.
2. Selecciona la descripción de lo que es un package de Java: 1 / 1 punto
Un archivo específico que contiene varias clases
Una colección de archivos que se guardan en algún subdirectorio de Java
Una colección de archivos que se guardan en un subdirectorio con el nombre del package
La dirección de una liga (link) en la computadora
El nombre de la computadora en la que estás ejecutando DrJava
Correcto
😊 En efecto, un paquete (o package) de Java corresponde a un subdirectorio donde vas a guardar todas las clases e
interfaces relacionadas con tu proyecto, y muchas veces también los datos.
3. Elige 2 opciones que respondan a la siguiente afirmación:
Como las interfaces son contratos que anuncian servicios, tienen que tener alguno de los siguientes accesos:
1 / 1 punto
público
Correcto
😊 Como hablamos de que una interfaz anuncia servicios, tiene que hacerlo públicamente, a todo el mundo.
paquete
Correcto
😊 Puede restringir su anuncio a los miembros de su propio paquete, pero debe anunciarlo.
privado
protegido
4. Elige la opción que responda a la siguiente afirmación:
El nombre del archivo donde está declarada la interfaz con identificador NuestraInterfaz, debe ser:
1 / 1 punto
[Link]
[Link]
[Link]
[Link]
Correcto
😊 Como la interfaz se llama NuestraInterfaz, DrJava guarda el archivo con este nombre y le pone la terminación
.java.
5. Elige la opción que responda a la siguiente afirmación:
El comentario de escape de línea se llama así porque: 1 / 1 punto
Ocupan una línea exactamente y todo lo que esté en esa línea es comentario
Una vez que aparece // lo que sigue en la misma línea escapa del compilador de Java
Empiezan con /* y terminan con un cambio de línea
Empiezan con // y ya no se pone nada en esa línea
Correcto
😊 Correcto. Dondequiera que aparezca, lo que está después que las dos diagonales y hasta el cambio de línea
(return) no es tomado en cuenta por el compilador de Java.
6. Elige la opción que responda a la siguiente afirmación: La razón por la que una interfaz no tiene definidos
constructores es la siguiente: 1 / 1
punto
Usa siempre el constructor por omisión que proporciona Java
Lista los atributos, pero no dice cómo se usan ni para qué sirven
Sólo lista servicios, sin decir qué clase los va a proporcionar o cuáles son los atributos que necesita
Cuando lista los servicios o métodos no da ni las entradas ni las salidas de cada método
Correcto
😊 Puede haber muchas clases distintas y, por lo tanto, objetos con distintos atributos que implementen a una
interfaz, por lo que no se pueden construir objetos de una interfaz y no tiene sentido tener constructores.
Métodos de consulta, actualización e implementación
Como lo prometimos en este video revisaremos los métodos. Pero antes, es necesario que conozcas las entradas de
un método, también denominadas, parámetros formales, los cuales se colocan entre paréntesis a continuación del
nombre. Si no hay entradas aparecen solo los paréntesis. Cada parámetro consiste del tipo de valor y nombre de cada
entrada. Si existe más de un parámetro lo separamos en tres sí con una coma. Empezaremos con los métodos de
consulta, los cuales nos dirán el estado del objeto, es decir, el valor que tienen los atributos. Empiezan con el verbo
get, que quiere decir, obtener.
Siguen con el nombre del atributo empezando con mayúscula.
Los métodos get no reciben entrada you que son introspectivos porque el objeto se inspecciona a sí mismo.
Por las tarjetas de responsabilidades conocemos cuáles son los atributos que tienen nuestra clase.
Alfabéticamente se empieza con activas que no tienen parámetros, por lo tanto, se deben escribir paréntesis vacíos.
Posteriormente se debe colocar en los métodos de acceso qué tipo de valor regresa. En general, un método de acceso
regresa un valor del mismo tipo del atributo. como activas es un atributo de tipo int, el método regresará un int. Por
último, damos el acceso del método. Lo que hacemos es darle el mismo acceso que se le dio a la interfaz, que es
public. Se termina este encabezado con punto y coma.
El siguiente método es el que nos da el año y se llama getANHO. Tampoco reciben nada como entrada. Entrega
también un entero, porque año es un int. Colocamos que es de acceso público. Finalmente lo terminamos con un
punto y coma.
Sigamos con los métodos de acceso. get NOMBRE no tiene parámetros. Regresa una cadena, porque NOMBRE es
un string. Y es de acceso público. Ahora veremos get Permitidas. Al igual, no tiene parámetros, regresa un valor de
tipo entero, porque Permitidas es de tipo int. Colocamos que es de acceso público. Por último, get TIPO_DISCO. No
recibe nada como entrada. Regresa un entero pequeño, porque TIPO_DISCO es de tipo short. Y finalmente le
colocamos el que es de acceso público.
Es importante que todos tus enunciados le coloques un punto y coma para finalizarlos. Para revisar si posee algún
error de sintaxis podemos compilar el archivo, en la pestaña compile. Aquí nos señala que fue una compilación
exitosa. Proseguimos ahora con los métodos de actualización. Son aquellos que cambiar en valor de un atributo que
no sea constante para el objeto clase, solo tenemos dos, activas y permitidas. Siguen las siguientes reglas, siempre
empiezan con set. Y luego colocan el nombre del atributo empezando con mayúscula. En la entrada del método
setActivas se coloca qué espera el método. Como es un método que va a actualizar un valor, requiere de un nuevo
valor. La entrada debe ser del mismo tipo que el atributo a modificar. En este caso sería int.
El nombre del parámetro es arbitrario. En este caso tenemos el parámetro newActivas. Es importante que sepas que
este tipo de métodos no regresa nada, java da tipo void a los métodos que no regresan una salida.
Por último, el acceso también será público.
Este mismo proceso lo llevaremos a cabo con el met setPermitidas.
Solo que en este caso recibe una entrada que denominamos, permisos.
Otros métodos que va a ofrecer como servicio esta clase son los llamados métodos de implementación.
Los cuales son públicos.
A veces reciben entradas y a veces entregan una salida.
Empezaremos por el método copiaDisco, el cual solicita a un disco que se copie en otro. Este método también es de
introspección you que el objeto se copia a sí mismo. Y es de acceso público. Es importante que sepas que primero se
diseñan las interfaces y después se construyen las clases. Si tratamos de compilarlos marcará error. you que no
encuentra el símbolo de la clase Disco y falta un tipo primitivo o un tipo clase. Lo que haremos es sustituir Disco por
ServiciosDisco. Ahora nos dice que la compilación fue exitosa.
El siguiente método en la tarjeta de responsabilidades es daTransmision. El cual se encarga de iniciar una
transmisión. No recibe entradas. Da como salida la hora y fecha, que es una cadena. Y es de acceso público. El
siguiente método es muestraDisco. Su parámetro es el encabezado de lo que se imprima. Regresa una cadena y es de
acceso público.
Ahora veremos el método que termina una transmisión. El cual no tiene entradas. Regresa un valor que nos dice si
pudo o no terminar una transmisión. Lo que es un valor de tipo primitivo, boolean. Y también es de acceso público.
Nos falta un método que agregaremos a nuestra interfaz. Denominado, toString, el cual nos mostrará el contenido del
disco para que pueda ser leído por otro programa y que cada valor tenga una posición fija. Este método se hereda de
la clase object. Regresa una cadena No tiene entradas y es de acceso público.
En el próximo video veremos cómo documentar qué hace cada método. Te espero.

¡Felicitaciones! ¡Aprobaste! Para Aprobar 80 % o más


Calificación 80 %
Métodos: entradas (parámetros) y salidas
Puntos totales de 10
1. Elige 2 opciones que expliquen que un método sea “introspectivo”. 1 / 1 punto
Toma algunos de los valores que necesita del objeto con el que es invocado
Correcto
😊 En efecto, un método es introspectivo si para cumplir con su responsabilidad tiene que ver el interior (los valores,
el estado) del objeto desde el cuál es llamado.
No entrega ningún valor de salida
No requiere de datos de entrada
El objeto se observa a sí mismo para poder dar el servicio
Correcto
😊 Se considera introspectivo a un servicio o método que tiene que conocer el estado del objeto con el que es
invocado.
Sólo los métodos get son introspectivos
2. Si el encabezado de un método en una interfaz es el siguiente:
1 public short getMarca ( );
Elige la opción que responda a la siguiente afirmación: La clase tiene un atributo que se llama: 1 / 1
punto
getmarca
marca
Marca
getMarca
Correcto
😊 Los nombres de los atributos son sustantivos y empiezan con minúscula.
3. Elige la opción que responda a la siguiente afirmación: El tipo del atributo es: 1 / 1 punto
byte
short
int
long
float
Correcto
😊 Si el método getMarca( ) regresa un valor de tipo short, quiere decir que el tipo del atributo es, ciertamente,
short.
4. Elige la opción que responda a la siguiente afirmación:
Los atributos, generalmente, tienen acceso:
0 / 1 punto
public
private
protected
package
Incorrecto
☹ Este acceso es por omisión, o sea que no tiene registrado o escrito ningún acceso. La palabra package no es
palabra reservada o clave de Java. Si no tuviera identificación de acceso (es decir, acceso de paquete) no se
necesitaría un método get para ver su valor, sino que se podría ver directamente.
5. Elige 2 opciones que respondan a la siguiente afirmación:
No hay método que se llame setNOMBRE porque: 1 / 1 punto
En la tarjeta de responsabilidades lo marcamos como constante de clase
No puede cambiar una vez establecido su valor en la declaración
No puede cambiar una vez establecido su valor en el constructor
Correcto
😊 Como NOMBRE está declarado como constante de objeto (final), una vez asignado su valor en los
constructores, este valor ya no puede cambiar.
En la tarjeta de responsabilidades lo marcamos como constante de objeto
Correcto
😊 En la tarjeta de responsabilidades pusimos al atributo NOMBRE es constante de objeto (final).
6. Si hay 3 atributos de tipo int, de los cuáles 2 son constantes de objeto y privados; y dos de ellos atributos de tipo
double, de los cuáles ambos son de acceso privado y uno es una constante, ¿cuántos métodos get va a haber en la
interfaz de la clase (o en la clase)? Elige la opción correcta. 1 / 1
punto
4
3
2
5
Correcto
😊 Son 5 variables declaradas de acceso privado, por lo que necesitamos 5 métodos get.
7. Elige 2 opciones que sean verdaderas. 1 / 1 punto
Los métodos de implementación siempre regresan algún valor
Los métodos de implementación son los que no son get ni set
Correcto
😊 Verdadero. Si fueran get o set estarían en uno de esos grupos no serían de implementación.
Los métodos de implementación siempre tienen al menos un parámetro
Los métodos de implementación que aparecen en una interfaz son de acceso público o de paquete
Correcto
😊 Verdadero. Para aparecer en una interfaz tienen que estar declarados como públicos o de paquete.
8. Tienes esta descripción de un método:
Es un método de clase, con acceso de paquete, que recibe como entrada dos números enteros y da como salida el
producto de dos enteros
¿Cuál de los siguientes encabezados corresponde a esta descripción?
 1 static int daProducto (int a, int b);
1 public static final void getProducto ( int a, int b );
1 public int multiplica(int a, int b);
1 public int daProducto (int a);

Correcto
😊 Este encabezado sí cumple con la descripción dada, porque:
 La ausencia de palabra clave para el acceso indica que tiene acceso de paquete.
 Es un método de clase, lo que se indica con la palabra reservada static.
 Regresa un entero, lo que se indica con int antes del nombre del método.
 Recibe dos enteros como parámetros.
El nombre está bien construido de acuerdo a las convenciones de Java.
9. Queremos un encabezado de un método de objeto cuya descripción es:
Le das como entrada una cadena y da como resultado la concatenación de uno de sus atributos, que es también una
cadena, con la entrada. Es de acceso público
Elige el encabezado que
1 public int pegados (String atributo);
 1 public void pega(String entrada, String atributo);
1 public String pegados (String una, String dos);
1 public String pegados (String una);

Incorrecto
☹ No regresa nada (void) y debiera regresar una cadena. Recibe una sola entrada. La cadena con la que la pega es un
atributo que el método conoce.
10. ¿Cuál de los siguientes encabezados cumple con la siguiente definición?
Método público que imprime el mensaje que le pasan como parámetro.
 1 public void imprime (String mensaje);
1 public String impresión (Mensaje string);
1 public String imprimeMensaje ( );
1 public void muestraMensaje ( );
Correcto
😊 Este encabezado es el que representa mejor a la descripción dada.

Comentarios para Javadoc


Bienvenido a este tercer video. Para seguir completando tu archivo es importante colocar descripciones en los
métodos. Para ello se utilizará código en Java. Java tiene otro tipo de comentario que empieza con una diagonal y un
asterisco y termina con un asterisco y una diagonal. Por ejemplo, es posible indicar que el método daTransmisión
verifica si hay transmisiones disponibles.
Siempre que se abre un comentario, debes tener cuidado de cerrarlo, de no ser así, todo lo que resta se convertiría en
comentario y Java no podrá revisarlo. Los programas escritos en Java son autodocumentables, a través de lo que se
conoce como comentarios de Java doc. Estos comentarios empiezan con una diagonal, seguida de dos asteriscos y
terminan con un asterisco y una diagonal. El comentario breve que colocamos en la descripción para la interfaz es el
siguiente. Disco digital para su uso por una compañía de streaming.
A continuación, se escribe lo que se utilizará como ejemplo en algunos aspectos introductorios en Java terminando
con un punto. Posteriormente se escriben campos de documentación, los cuales se empiezan con una arroba y siguen
con una palabra reservada, referente al campo que se está comentando. En este primer caso de las clases o interfases
se coloca quién es el autor, en este caso Elisa Viso. A continuación, se muestra cuál es la versión, la versión es 1.0 y
fue escrita el primero de marzo del 2017. A continuación, se documenta los métodos de consulta, es necesario dejar
un espacio entre el encabezado de la interfaz y el comentario de get activas. El comentario se empieza con una
diagonal y dos asteriscos y termina con un asterisco y una diagonal. A continuación, describe una breve descripción
de lo que hace cada método. Este método proporciona el número de transmisiones activas, es importante que no
coloques acentos ni la letra Ñ, ya que algunos generadores de la documentación de Java no son reconocidos en
HTML.
Se tiene una etiqueta @return ya que regresa a un entero. Y a continuación de la etiqueta se da una descripción de
valor que regresa.
Se da una breve descripción de cada método, como en de getANHO, el cual proporciona el año en que fue grabado
el disco.
Por parte de getNOMBRE se coloca el nombre que tenga asociado el disco, según el tipo que sea el disco.
Se hace lo mismo con el método getPermitidas y getTIPO_DISCO. Nos regresa el tipo de disco que está entre uno y
tres.
A continuación, se comentan los métodos de modificación, los cuales se encargan de modificar el valor de
transmisiones activas.
El campo @param, describe las entradas que recibe, es necesario que haya un campo por cada parametro que tenga
el método. En este caso solo es uno, por lo tanto, solo es una linea del método.
Se hace lo mismo con el método setPermitidas, el cual modifica el valor de transmisiones permitidas y tiene el
campo param, que describe que significa permisos.
A continuación, se documentan los métodos de implementación, el primero es copia disco, el cual dúplica a este
disco, construyendo un objeto con los mismos valores, pero con identidad distinta.
Lo que regresa es un nuevo disco idéntico al que se le pidió.
El método daTransmisión, otorga una transmisión contestando con la fecha y hora en que la está dando, debe
actualizar el número de transmisiones activas.
Sí no la puede dar, responde negativamente.
La documentación demuestra disco, describe que éste método muestra de forma estética el contenido de este disco.
Su parámetro es el encabezado de lo que se imprima.
Y regresa una cadena con la información del disco.
El comentario termina transmisión, indica que es el método encargado de actualizar el número de transmisiones
activas y regresa si se pudo o no terminar dicha transmisión.
Por último, el comentario de método toString, éste indica que el método proporciona una cadena con los campos del
objeto ocupando un lugar fijo y regresa la información del disco linealizada en forma de cadena.
Es necesario guardar todos los cambios realizados, para que posteriormente se generé la documentación para cada
doc. Daremos clic la pestaña Java doc.
Aquí señala donde lo colocará, le damos aceptar, se está generando. Le damos clic aquí, en servicios disco, esta
pantalla permite visualizar el Java doc viewer.
Como puedes ver aparece la clase de nuestros métodos. Con esto, damos por terminada esta lección, para empezar a
programar al usuario. Continúa con nosotros.

Javadoc
Puntos totales de 11
1. Elige la opción que responda a la siguiente afirmación: Porque se puede escribir la documentación de una clase
integrada a la clase, se dice que Java es un lenguaje: 1 punto
autodocumentable autodocumentado
con documentación automática automáticamente documentado
Correcto
😊 Java es un lenguaje auto documentable porque tiene los mecanismos, Javadoc, para, dados los comentarios de
Javadoc correctos, generar un documento independiente al del archivo de Java, donde se encuentra toda la
documentación necesaria para usar la clase documentada.

2. Elige la opción que responda a la siguiente afirmación: Para que los comentarios de Javadoc se generen, una vez
escritos los comentarios en el archivo fuente, hay que ejecutar la pestaña (o la aplicación): 1 punto
Save Compile
Javadoc Run
Correcto
😊 Esta aplicación es la que recorre un archivo de Java (con la extensión .java) y “recoge” los comentarios hechos
para Javadoc, los organiza y publica en una página de html.

3. Elige 2 opciones que respondan a la siguiente afirmación: Los comentarios para la documentación con Javadoc
empiezan con “/**” y terminan con: 1 punto
/* */
// **/
😊 Con esto termina la documentación de Javadoc para cada uno de los elementos comentados.
Correcto
😊 El primer asterisco en realidad no forma parte de la terminación del comentario, pues se termina con un asterisco
seguida de una diagonal.

4. Elige la opción que responda a la siguiente afirmación: Cada una de las partes de un comentario para Javadoc
tiene que terminar con: 1 punto
Una etiqueta de Javadoc
Un punto
Un espacio
Un asterisco seguido de una diagonal
Correcto
😊 Es con lo que termina cada parte de un comentario de Javadoc. El punto (.) tiene que aparecer al menos una vez
en la descripción general y al terminar la descripción de cada etiqueta.

5. Tenemos el siguiente encabezado de un método que muestra el contenido de un atributo, precedido por la etiqueta
que se le pasa como parámetro.
1 public String muestraTipo (String etiqueta);
¿Cuál de los siguientes es el comentario de Javadoc que se ajusta a esta descripción?
1 /**
2 * Regresa una cadena con el valor del atributo
3 * tipo, precedido por la etiqueta que se le pasa
4 * como parámetro.
5 * @param String Una etiqueta se le pasa como
6 * entrada.
7 * @return una cadena con el tipo del parámetro
8 * precedida por la etiqueta.
9 */

1 /** muestraTipo */
2 /** Regresa una cadena con el valor del atributo
3 tipo, precedido por la etiqueta que se le pasa
4 como parámetro. **/
5 /** @param String Una etiqueta se le pasa como
6 entrada. **/
7 /** @return una cadena con el tipo del parámetro
8 precedida por la etiqueta. */

1 /**
2 * Regresa una cadena con el valor del atributo
3 * tipo, precedido por la etiqueta que se le pasa
4 * como parametro.
5 * @param etiqueta Una Cadena que se le pasa comoC
6 * entrada.
7 * @return una cadena con el tipo del parametro
8 * precedida por la etiqueta.
9 */

1 /**
2 * Regresa una cadena con el valor del atributo
3 * tipo, precedido por la etiqueta que se le pasa
4 * como parámetro.
5 * @param String Una etiqueta se le pasa como
6 * entrada.
7 * @return una cadena con el tipo del parámetro

Página 37 de 154
8 * precedida por la etiqueta.
9 */
Correcto
😊 Esta documentación está bien pues tiene todos los elementos necesarios.

6. Tenemos el siguiente encabezado de un método que vamos a documentar con Javadoc, que por su identificador
(nombre) nos dice qué va a hacer.
1 public int daMayor(int a, int b);
Elige la documentación correcta para los parámetros dentro de un comentario de Javadoc.
1 * @param a el primer numero a comparar. C
2 * @param b el segundo numero a comparar.

1 * @parameter a de tipo int.


2 * @parameter b de tipo int.

1 * @input a el primer numero a comparar.


2 * @input b el segundo numero a comparar

1 * @return el mayor de los dos números.


Correcto
😊 Este es el comentario correcto, pues da el nombre de cada parámetro, seguido de cómo se usa.

7. Elige la opción que complete el enunciado: La razón de poner un asterisco al principio de cada renglón en un
comentario (documentación) de Javadoc es:
Separar renglones
Marcar el alcance del comentario
Estética (para que se vea mejor)
Seguir el formato indicado
☹ El alcance del comentario está marcado por su inicio (/**) y su final (*/). Los asteriscos solos no son tomados en
cuenta.
8. Elige la opción que complete el enunciado: Los comentarios de Javadoc aparecen:
Entre el encabezado y lo que termina el método
Inmediatamente antes de lo que están documentando
Inmediatamente después de lo que están comentando
Incorrecto
☹ Javadoc se va a fijar si el comentario corresponde a lo que sigue, por lo que no puede estar después de lo que se
desea comentar.

9. Responde falso o verdadero a la siguiente afirmación: El comentario de Javadoc debe incluir una descripción de
cómo trabaja el método.
Falso
Verdadero
Correcto
😊 La documentación de Javadoc está dirigida para que la clase pueda ser usada en otras clases. No interesa cómo
hace lo que tiene que hacer.

Página 38 de 154
10. Elige 2 opciones que completen el enunciado: En la página web que genera Javadoc, estas son las formas en que
aparece la información:
Primero los atributos y después los métodos de la clase, junto con el acceso que tienen y la descripción de qué
hacen
Dividida en una vista general, que al menos tiene los encabezados de los métodos, y una segunda parte en la que
aparece, para cada método, más detalle
Aparecen solamente los métodos que tienen comentarios de Javadoc
En dos columnas: en la primera está el valor que regresa y en la segunda el encabezado del método y una breve
descripción. Del encabezado no aparece ni su acceso ni el tipo de valor que regresa
Correcto
😊 En la primera parte, la más compacta, aparecen en dos columnas.
Correcto
😊 Lo que hace Javadoc es recoger los comentarios, si los hay, y mostrarlos en dos tablas consecutivas. La segunda
dice los parámetros que tiene el método, con la explicación, si es que se dio y la descripción del valor que regresa.

11. Elige la opción que la siguiente pregunta: Si se pone una etiqueta con arroba (@) en el mismo renglón que la
descripción que termina con un punto, ¿qué es lo que sucede?
Javadoc marca un error al tratar de generar la página de html
Javadoc reconoce la etiqueta y la aplica bien
La etiqueta con la arroba aparece como una segunda parte de la explicación
Correcto
😊 En parte donde aparecen con detalle los métodos, la etiqueta con la arroba aparece como si fuera parte de una
descripción de lo que hace el método.

La clase Usuario
bienvenidos a esta tercera lección, en la cual aprenderás cómo codificar una clase que tenga un método que se
ejecute. A esta clase la llamaremos usuario, para lo cual usaremos nuevamente Dr. Java. Iniciamos con un archivo en
blanco sin título, y al igual que la interfaz, indicamos en la primera línea que este archivo también pertenece al
paquete discos.
Una vez hecho esto, escribimos el encabezado de la clase, que es similar a la de una interfaz, excepto que aparece la
palabra class, en lugar de interface. También le damos el acceso público. Agregamos el bloque para la codificación
de la clase. En la tarjeta de responsabilidades, únicamente tenemos al método principal, main para usuario.
El encabezado de ese método tiene una sintaxis fija para que la máquina virtual de Java lo reconozca, y empiece la
ejecución de la clase en ese método.
El nombre del método es main. Se sigue con paréntesis haya o no entrada. En el caso de main, consiste de una lista
de cadenas. Al que generalmente se le llama arg, argumentos. No regresa ningún valor. Y forzosamente es pública.
Tiene que existir en la clase compilada, para que el sistema la pueda encontrar, por lo que es static. También tenemos
que dar su codificación completa, por lo que le agregamos las llaves de principio y fin. Entre las que vamos a
escribir, lo que queremos es que haga este método.
Ahora veremos la codificación del método main. Cuando empezamos un bloque, podemos hacer declaraciones
locales de lo que vamos a necesitar para trabajar. Una declaración local tiene la siguiente sintaxis. Primero, al tipo,
después, el identificador, y terminamos con un punto y coma. También puedes inicializar al mismo tiempo que
declaras. Sigues al identificador con una operación de asignación, y a continuación, una expresión, terminando con
punto y coma.
La expresión tiene que ser del mismo tipo que el identificador. Debe poderse calcular en ese momento en ejecución,
y el tipo debe puede ser primitivo o de referencia. Un identificador tiene que estar declarado antes de ser usado, pero

Página 39 de 154
no todas las declaraciones deben estar juntas. Posteriormente, vemos la comunicación con el usuario desde main. En
el método main, nos comunicamos con el usuario usando para ello la consola y el teclado. Podemos usar objetos de
la clase System en el paquete [Link]. Para escribir, tenemos objetos you construidos de la clase System, que se
encarga de escribir. Los denominamos salida estándar, y son [Link] y [Link]. La sintaxis con el punto dice
que, de la clase System, se elige al objeto out o al objeto err. Las puedes usar directamente sin avisar, porque están en
el paquete [Link], que está incluido en el compilador. Ambos objetos son de la clase PrinstStream. Son static, por
lo que se pueden usar directamente con el nombre de la clase System. Para leer, tenemos al objeto [Link] en la
misma clase. Este objeto es de la clase InputStream, sin embargo, [Link] trabaja a nivel de caracteres, lo que
requiere mucho proceso adicional.
Implementaremos lectura de alto nivel cuando codifiquemos la clase disco. Estos tres objetos están automáticamente
conectados a la consola y a la pantalla al empezar a ejecutarse cualquier clase. Vamos a comunicarnos con el usuario
usando la consola y el teclado. Para escribir, tenemos en la clase PrintStream, entre otros, el método de String cadena
en la pantalla, quedándose donde termina de escribir sin cambiar de línea. Introduce un cambio de línea en la
pantalla. También escribe cadena en la pantalla, y al terminar, hace un cambio de línea. Regresemos a codificar el
método main. Empecemos por escribirle al usuario de nuestra clase un mensaje de bienvenida usando la tercera
variante. Ahora haremos la declaración de una cadena. Para después usarla en la impresión. Compilamos y
ejecutamos.
Noten que como argumento únicamente podemos dar solo una cadena, pero las cadenas no pueden extender por más
de una línea física.
Podemos formar cadenas a partir de otras pegándolas con un operador de suma, pegar o concatenar, y repartir las
cadenas en una o más líneas.
La que sigue es una sola cadena. También contamos con caracteres especiales que van dentro de las cadenas. Van
precedidos por un caracter de escape, como el cambio de línea y el tabulador. Hagamos un pequeño ejercicio con
cadenas en el método main. Declaramos una cadena y pegamos varias subcadenas. A continuación, escribimos esa
cadena que formamos. Compilemos. Ahora ejecutemos. Veamos el resultado.
Como no hay un espacio entre la palabra cadenas y el fin de la cadena, tampoco existe un espacio entre el principio
de la siguiente cadena, y la palabra pegadas se concatenan tal cual. Por la presencia de los caracteres especiales, hay
un cambio de reglón y un tabulador.
Borremos lo que acabamos de hacer. Dijimos que queríamos construir objetos de la clase disco. También, tuvimos a
alguien que construyó una de acuerdo a la interfaz que hiciste. Codificó también los constructores de acuerdo a la
tarjeta de responsabilidades. El nombre de los constructores es el mismo que el de la clase, y tenemos tres
constructores. Son de acceso público, y regresan precisamente un disco. El primer constructor no tiene parámetros
porque se los va a pedir al usuario desde la clase disco. El segundo constructor recibe tres parámetros en este orden.
Y el tercer constructor, además de los primeros tres parámetros, tiene las transmisiones permitidas. you tenemos el
formato de declaraciones y el encabezado de los constructores. Dejaremos un objeto usando el constructor sin
parámetros en el método main.
El tipo es disco, y el nombre que elegimos es el mío. Ahora queremos construir el objeto. Se usa el operador new, y
la firma del constructor. La firma de un método consiste del nombre del mismo, y los tipos de sus parámetros en el
orden en que están definidos. Ahora compilemos. Y ejecutemos.
Dr. Java nos va a solicitar algunos datos. Estos datos solicitados son para construir el disco. Puedes ampliar la
pantalla de interacción oprimiendo esta flecha. A continuación, te empieza a pedir los datos para construir el disco.
Siempre tienes que teclear Enter al terminar el dato. Te solicita el tipo de disco. El nombre correspondiente al tipo
del disco. El año en que fue grabado. Y por último, te pide el número de transmisiones simultáneas. Continua con
nosotros en el siguiente video, en el cual te mostraremos el uso de la clase disco en el método main. Te espero.

Uso de clases del programador


Puntos totales de 2
1.
Pregunta 1

Página 40 de 154
Baja a tu computadora el archivo [Link] (Se encuentra en el repositorio) y colócalo en tu subdirectorio discos
donde estás armando tu proyecto. Esta es la clase que alguien te hizo favor de programar y compilar.
Elige 2 enunciados print o println que pudiesen haber escrito lo siguiente en la sección de interacciones de DrJava
desde un método main (podrías programarlo para ver cuáles funcionan bien).
1 Este es un video                        muy interesante, por
2 lo que quiero
3 verlo

Supongamos las siguientes declaraciones:C


1 String mensaje1 = “Este es un video”;
2 String mensaje2 = “muy interesante,”
3 String mensaje3 = “por\nlo que quiero”
4       + “\nverlo”;

1 [Link]( mensaje1 + “\t” + mensaje2                                                          + mensaje3);


Correcto
😊 El primero y segundo mensaje están separados por una cadena que contiene un tabulador, por lo que escribe
exactamente lo mismo que aparece en la pregunta.

[Link]( mensaje1 + ‘\t’ + mensaje2                                                        + mensaje3 );

1 [Link]( “Este es un video\t”C


2                                  + mensaje2 + mensaje3):
Correcto
😊 La primera cadena que se escribe termina con un tabulador, por lo que también en este caso se escribe lo mismo
que está en la pregunta.

1 [Link](“Este es un video\t”
2                                  + “muy interesante,” + “por”);
3 [Link]( “lo que quiero” );
4 [Link]( “verlo” );
Esto no debería estar seleccionado
☹ La primera escritura se hace con [Link], que al terminar no cambia de renglón; por lo tanto, la segunda
escritura empieza donde terminó la primera y pega porlo que quiero, que no es lo que se pide se imprima.

2.
Pregunta 2
Supone que tienes el siguiente enunciado de impresión:
1 [Link] (linea1 + linea2);

Y lo que se escribe en la pantalla es:


2 un poco soleado.

Usando cadenas de tabulador y cambios de línea, ¿cuáles de las siguientes declaraciones de linea1 y linea2
producirían este resultado en la pantalla? (Recuerda que no puedes usar más de un blanco consecutivo en tus
cadenas). Elige 2 opciones.

1 String linea1 = “Este mes de \tdiciembre\t”


2 + “esta\n\tun poco”; C

Página 41 de 154
3 String linea2 = “\tsoleado.”;
Correcto
😊 Como únicamente se usa un println tiene que haber un cambio de renglón (\n) entre “esta” y “soleado”. También
tiene que haber tabuladores (\t) entre “de” y “diciembre”; entre “diciembre” y “esta” ; la segunda línea tiene que
empezar con un tabulador (\t) y tiene que haber un tabulador entre “poco” y “soleado.”

1 String linea1 = “Este mes de \tdiciembre\t”C


2 + “esta\n\tun poco”,
3 String linea2 = “\tsoleado.”;
Correcto
😊 Esta distribución de lo que se desea escribir es adecuada, pues las dos cadenas se pegan. La cadena resultante
tiene un cambio de línea (\n) a continuación de “esta” y los tabuladores que al imprimirse generan cada uno 8
espacios en blanco; puedes tener declaraciones e inicializaciones de más de un identificador del mismo tipo si los
separas por una coma.

1 String linea1 = “Este mes de \tdiciembre\testa”;


2 String linea2 = “\tun poco \tsoleado.”;
Esto no debería estar seleccionado
☹ Como sólo hay un println y las cadenas concatenadas no contienen ningún cambio de línea, aparece todo en una
sola línea. Los tabuladores están bien

1 String linea1 = “Este mes de \tdiciembre\t”


2 + “esta\n\tun poco”,
3 String linea2 = “\tsoleado.”;

3.1 Argumentos y parámetros


Hola, bienvenidos a este video.
En este video, utilizaremos el objeto de la clase disco que construimos.
Primero, cambiemos el nombre a transmisiones permitidas usando el método set permitidas, cuyo encabezado es.
Del objeto, el mío, elegimos el método set permitidas con el argumento 15. Declaremos un segundo disco, el tuyo.
Para definirlo, usaremos el constructor cuyo encabezado es.
Podemos observar que se trata de un DVD, pero el primer argumento debe ser short, y le estamos dando un in, por lo
que tenemos que convertirlo a un short aplicando lo que se conoce como una operación de casting, que consiste en
poner el tipo que queremos obligar entre paréntesis en frente del valor.
La película se llama descifrando enigma.
Fue filmada en 2015 y le asignamos un número máximo de transmisiones simultáneas permitidas. Son 30. Cada vez
que quieres compilar y ejecutar,
tienes que volver a dar los datos del disco El Mío.
Para que te ahorres trabajo al ejecutar, vamos a sustituir este constructor de disco por el que recibe cuatro
argumentos.
Ahora comentas el reglón que construye el disco sin parámetros. Construyes un disco con los mismos datos, con el
constructor que tiene cuatro parámetros. Tenemos you dos objetos, El Mío y El Tuyo.
Podemos ver el contenido de un objeto de tipo disco usando el método cuyo encabezado es.
Invocamos al método desde el objeto El Mío, avisando en el encabezado que se trata de este objeto. El resultado que
da el método lo asignas a la cadena Mío. Para ver el contenido, usamos System punto out punto printIn.
Para ver el resultado, compilas y ejecutas. Agrandamos nuestra pantalla de interacción. Ahora probemos el método
toString, que también muestra el contenido del objeto. Su encabezado es.
ToString convierte a cadena lo que le des como argumento. Si se trata de un objeto y toString no está definido en la
clase, imprime una descripción del objeto que incluye, entre corchetes, el nombre de cada campo, pero como lo

Página 42 de 154
implementamos en la clase disco, va a tener un comportamiento distinto al de la superclase, aunque se invoca cuando
aparece el objeto en el lugar de una cadena.
Usamos el objeto El Mío directamente dentro de println, lo que hace que se interprete como cadena después de dar
una indicación de lo que estamos haciendo. Compilamos y ejecutamos. Incrementamos directamente el número de
transmisiones activas en El Tuyo, con el médoto setActivas, pero queremos el valor que tiene que obtenemos con.
Usamos ambos métodos en el objeto El Tuyo, e incrementamos este valor en cinco. Vemos el estado de El Tuyo
usando toString agregando un mensaje alusivo. Siempre que algún objeto o dato primitivo aparece concatenado
a la derecha de una cadena, Java se encarga de convertir el objeto con toString de manera implícita a la cadena que lo
representa. Compilamos y ejecutamos.
Cambiamos el número de transmisiones permitidas y el de activas en El Tuyo.
Recuerda que el encabezado de la transmisión es. Tenemos 50 como máximo de transmisiones permitidas en El Tuyo
y 49 en activas. A continuación, solicitamos dos transmisiones a El Tuyo.
Regresa una cadena, por lo que la podemos incluir como argumento en un println. Compilamos. Ejecutamos.
A la primera solicitud responde objeto El Tuyo, transmisión dada. Mientras que la segunda solicitud responde no hay
transmisiones disponibles. Ahora, vamos a solicitar que se cancele una transmisión. Recuerda que el encabezado
para terminar una transmisión es.    Podemos usar ese valor verdadero o falso para darle un mensaje al usuario,
dependiendo de si puede o no terminar una transmisión. Usaremos para eso una expresión que se llama expresión
condicional o condicional aritmética. Su sintaxis es. Es una expresión porque simplemente asigna uno de los valores.
Escribimos el mensaje usando una expresión condicional, donde la expresión booleana es la invocación a termina
transmisión de El Tuyo.
SI el resultado es true, se imprime término en El Tuyo, y si es false, se imprime no había nada que terminar.
Mostramos el resto de la codificación del método main.
De los enunciados mostrados, el único que es necesario aclarar es el marcado. La variable El Nuestro está declarada
de tipo disco. El método copia disco regresa algo compatible con disco, pero que es servicios disco.
Como son compatibles, le podemos aplicar el casting disco, que you vimos para convertir un int a un short.
Si no ponemos los paréntesis alrededor de toda la invocación, solo aplica el casting a El Mío, porque el casting tiene
mayor precedencia que el punto. Compilamos y ejecutamos.
Una vez más, agrandamos la sección de interacción. Aquí podemos ver toda la corrida junta. En la siguiente sesión,
codificaremos a la clase disco, que es la parte más interesante de este módulo. Te espero.

Diferencia entre argumentos y parámetros


Puntos totales de 10
1. Asegúrate que el archivo [Link] (Descárgalo en el Repositorio) se encuentra en tu subdirectorio discos donde
estás armando tu proyecto. Esta es la clase que alguien te hizo favor de programar y compilar.
Elige la opción que responda al siguiente enunciado: Los valores que aparecen en una llamada de un método que
tiene parámetros se llaman: 1 punto
parámetros objetos
valores reales argumentos
2. Elige la opción que responda al siguiente enunciado: Para poder invocar a un método de objeto, además de cubrir
los requisitos del encabezado del método, el nombre del método debe ir precedido por: 1 punto
El nombre de un objeto construido El nombre de la clase
El nombre de un objeto declarado Un identificador del tipo que regresa el método
3. Elige la opción que represente la secuencia de líneas que construye un objeto llamado “paranoia”, de la clase
Disco, que corresponde a una serie de televisión, grabada en el año 2016 y que se llama “Paranoia”; este objeto se
construye en el método main de la clase Usuario; cada inciso aparecería en lugar de cualquier otro
1 short bluray = (short) 3;
2 Disco paranoia = new Disco(bluray,   
              3 “Paranoia”, 2016, 15, 0);

Página 43 de 154
1Disco paranoia = new Disco(“Paranoia”,                                                                              short)3, 2016);

1 short bluray = (short) 3;


2 String laParanoia = “Paranoia”;
3 Disco paranoia = new Disco ( bluray,                                                                                        laParanoia, 2016);

1 Disco paranoia = new Disco(bluray,


                          2                    Paranoia, 2016);
4. Supón que tienes el siguiente encabezado de un método de la clase LasSumas:
1 public double suma3 ( int uno, double dos,                                                                                    short tres);
Elige la opción que responda la siguiente pregunta: ¿Cuál es la llamada que suma los tres argumentos y da como
resultado 47.25? Puedes suponer la siguiente declaración de un objeto de esta clase, desde el que vas a llamar al
método.
1LasSumas unaSuma = new LasSumas();
o 1 unaSuma.suma3 (16, 15.25, (short)16) o 1 unaSuma.suma3 (40, 7.25, 0)
o 1 unaSuma.suma3 (0, 47.25, 0) o 1 unaSuma.suma3 (16, 15, 16.25)
5. Si usamos la siguiente llamada a suma3 dentro de un println:
1 [Link](suma3(10, 10, (short)3);
¿Cuál de los siguientes valores es el que aparece?
23.0
23
Aborta al ejecutar porque el segundo argumento no es un double
No compila porque el segundo argumento no es un double
6. Tenemos un encabezado de método en la clase LasSumas que recibe como entrada dos cadenas y regresa un
entero con las siguientes opciones:
-1: si el tamaño de la primera cadena es menor que el tamaño de la segunda cadena.
0: si el tamaño de las dos cadenas es el mismo.
1: si el tamaño de la primera cadena es mayor que el tamaño de la segunda.
¿Cuál de los siguientes encabezados corresponde mejor a esta descripción?
o 1 public byte laMayor( String una,                                                                              String dos)
o 1 public int laMayor(String tam1,                 
2                                    String tam2);
o 1 public int laMayor( int tamanho1,                                       
2                                          int tamanho2)
o 1 public byte laMayor(int cad1, int cad2);
7. Supón que tienes un método como el anterior, pero en lugar de regresar un byte regresa un boolean, con true si la
primera cadena tiene tamaño mayor o igual que la segunda. La llamada a ese método es (suponiendo las cadenas
declaradas como String e inicializadas con algún valor):
1 laMayor( cad1, ca2)
Si el método regresa verdadero quieres escribir el contenido de cad1 y si regresa falso, el contenido de cad2.
¿Cuál es la expresión condicional que elige entre las dos cadenas?
o 1String cadMayor = laMayor(cad1, cad2) ? o 1 String cadMayor = laMayor(cad1, cad2) ?
2              cad1 : cad2; 2                “cad1” : “cad2”;
o 1 String cadMayor = laMayor(cad1, cad2) o 1 String cadMayor = laMayor(cad1, cad2)
2          ? “cad1 es mayor o igual que cad2”    2        ? “cad1”         
3          : “cad2 es mayor que cad1” ; 3        :    cad2;
8. Tienes un método cuyo encabezado es el siguiente:
1 public String parteEn(String cad1,                           

Página 44 de 154
2                                        int cuantos);
que regresa los primeros cuantos caracteres de la cadena cad1, si cad1 tiene cuantos o más caracteres, o null si tiene
menos de cuantos caracteres. Queremos una condicional aritmética que escriba los primeros cuantos caracteres de la
cadena, o avise que el método regresó null.
¿Cuál de los siguientes enunciados cumple con esta especificación, suponiendo que str1 está definida? La cadena
resultante queda en especifica.
o 1 String resultado = str1; o 1 String resultado = str1;
2 String especifica =          2 String especifica =       
3 parteEn(str1, 5) == null 3 resultado == null ?       
4 ? parteEn(resultado, 5)      4 “str1 no tiene 5 caracteres”     
5 : “str1 no tiene 5 caracteres” 5 :    resultado;

o 1 String resultado = parteEn(str1, 5); o 1 String resultado = parteEn(str1,5);


2 String especifica = 2 String especifica =       
3 parteEn(str1, 5) == null          3 resultado == null ?     
4 ? “str1 no tiene 5 caracteres”            4 “str1 no tiene 5 caracteres”       
5 :    str1; 5 :    resultado;
[Link] el error en la siguiente condicional aritmética, suponiendo que i y j tienen asignado algún valor y están
declarados como int
1 int resultado = j > i
2 ? “El valor de j es mayor que el de i”
3:j+i;
Lo que está frente al : (false) es una operación, no un valor
El resultado se va a guardar en una variable tipo int, por lo que ambos valores, tanto para true como para false,
deben ser int
Los dos valores, tanto para true (?) como para false (:), deben ser cadenas
Los dos valores de la condicional aritmética deben ser del mismo tipo
[Link] verdadero o falso según lo consideres. Si esta misma condicional apareciera en un println, seguiría dando
error de sintaxis.
1 [Link]( j > i
2 ? “El valor de j es mayor que el de i”     
3 : j + i );
Falso Verdadero

Diferencia entre argumentos y parámetros


Puntos totales de 10
1. Asegúrate que el archivo [Link] (Descárgalo en el Repositorio) se encuentra en tu subdirectorio discos donde
estás armando tu proyecto. Esta es la clase que alguien te hizo favor de programar y compilar.
Elige la opción que responda al siguiente enunciado: Los valores que aparecen en una llamada de un método que
tiene parámetros se llaman: 1 punto
parámetros objetos
valores reales argumentos
Correcto
😊 Los valores que se le pasan a un método al invocarlo (llamarlo, usarlo) se llaman argumentos.
2. Elige la opción que responda al siguiente enunciado: Para poder invocar a un método de objeto, además de cubrir
los requisitos del encabezado del método, el nombre del método debe ir precedido por: 1 punto

Página 45 de 154
El nombre de un objeto construido El nombre de la clase
El nombre de un objeto declarado Un identificador del tipo que regresa el método
Correcto
😊 Todo método de objeto debe ser llamado desde un objeto construido, pues el primer parámetro oculto es el objeto
con el que se le está llamando.
3. Elige la opción que represente la secuencia de líneas que construye un objeto llamado “paranoia”, de la clase
Disco, que corresponde a una serie de televisión, grabada en el año 2016 y que se llama “Paranoia”; este objeto se
construye en el método main de la clase Usuario; cada inciso aparecería en lugar de cualquier otro
1 short bluray = (short) 3;
2 Disco paranoia = new Disco(bluray,   
              3 “Paranoia”, 2016, 15, 0);

1Disco paranoia = new Disco(“Paranoia”,                                                                              short)3, 2016);

1 short bluray = (short) 3;


2 String laParanoia = “Paranoia”;C
3 Disco paranoia = new Disco ( bluray,                                                                                        laParanoia, 2016);

1 Disco paranoia = new Disco(bluray,


                          2                    Paranoia, 2016);
Correcto
😊 Esta construcción usa el segundo constructor que tiene tres parámetros, el primero un short, el segundo una
cadena y el tercero un entero.
4. Supón que tienes el siguiente encabezado de un método de la clase LasSumas:
1 public double suma3 ( int uno, double dos,                                                                                    short tres);
Elige la opción que responda la siguiente pregunta: ¿Cuál es la llamada que suma los tres argumentos y da como
resultado 47.25? Puedes suponer la siguiente declaración de un objeto de esta clase, desde el que vas a llamar al
método.
1LasSumas unaSuma = new LasSumas();
o 1 unaSuma.suma3 (16, 15.25, (short)16)C o 1 unaSuma.suma3 (40, 7.25, 0)
o 1 unaSuma.suma3 (0, 47.25, 0) o 1 unaSuma.suma3 (16, 15, 16.25)
Correcto
😊 Esta llamada tiene bien la “firma”, que es (int, double, short). Como las constantes enteras, por omisión son de
tipo int, tienes que hacer un casting con short para que coincida el orden de los parámetros.
5. Si usamos la siguiente llamada a suma3 dentro de un println:
1 [Link](suma3(10, 10, (short)3);
¿Cuál de los siguientes valores es el que aparece?
23.0
23
Aborta al ejecutar porque el segundo argumento no es un double
No compila porque el segundo argumento no es un double
Correcto
😊 Este es el resultado correcto, puesto que como regresa un double, tiene punto decimal y al menos un dígito a la
derecha del punto decimal.
6. Tenemos un encabezado de método en la clase LasSumas que recibe como entrada dos cadenas y regresa un
entero con las siguientes opciones:
-1: si el tamaño de la primera cadena es menor que el tamaño de la segunda cadena.

Página 46 de 154
0: si el tamaño de las dos cadenas es el mismo.
1: si el tamaño de la primera cadena es mayor que el tamaño de la segunda.
¿Cuál de los siguientes encabezados corresponde mejor a esta descripción?
o 1 public byte laMayor( String una,                                                                              String dos)
o 1 public int laMayor(String tam1,                 
2                                    String tam2);
o 1 public int laMayor( int tamanho1,                                       
2                                          int tamanho2)
o 1 public byte laMayor(int cad1, int cad2); X
Incorrecto
☹ La descripción dice que los dos parámetros son cadenas, y este encabezado, no importa cómo se llamen los
parámetros, recibe dos enteros.
7. Supón que tienes un método como el anterior, pero en lugar de regresar un byte regresa un boolean, con true si la
primera cadena tiene tamaño mayor o igual que la segunda. La llamada a ese método es (suponiendo las cadenas
declaradas como String e inicializadas con algún valor):
1 laMayor( cad1, ca2)
Si el método regresa verdadero quieres escribir el contenido de cad1 y si regresa falso, el contenido de cad2.
¿Cuál es la expresión condicional que elige entre las dos cadenas?
o 1String cadMayor = laMayor(cad1, cad2) ? o 1 String cadMayor = laMayor(cad1, cad2) ? C
2              cad1 : cad2; 2                “cad1” : “cad2”;
o 1 String cadMayor = laMayor(cad1, cad2) o 1 String cadMayor = laMayor(cad1, cad2)
2          ? “cad1 es mayor o igual que cad2”    2        ? “cad1”         
3          : “cad2 es mayor que cad1” ; 3        :    cad2;
Correcto
😊 Esta condicional aritmética hace lo que se le pide: si el método regresa verdadero escribe el contenido de cad1 y
si regresa falso escribe el contenido de cad2.
8. Tienes un método cuyo encabezado es el siguiente:
1 public String parteEn(String cad1,                           
2                                        int cuantos);
que regresa los primeros cuantos caracteres de la cadena cad1, si cad1 tiene cuantos o más caracteres, o null si tiene
menos de cuantos caracteres. Queremos una condicional aritmética que escriba los primeros cuantos caracteres de la
cadena, o avise que el método regresó null.
¿Cuál de los siguientes enunciados cumple con esta especificación, suponiendo que str1 está definida? La cadena
resultante queda en especifica.
o 1 String resultado = str1;
2 String especifica =          o 1 String resultado = str1;
3 parteEn(str1, 5) == null ( X ) 2 String especifica =       
4 ? parteEn(resultado, 5)      3 resultado == null ?       
5 : “str1 no tiene 5 caracteres” 4 “str1 no tiene 5 caracteres”     
5 :    resultado;
o 1 String resultado = parteEn(str1, 5); o 1 String resultado = parteEn(str1,5);
2 String especifica = 2 String especifica =       
3 parteEn(str1, 5) == null          3 resultado == null ?     
4 ? “str1 no tiene 5 caracteres”            4 “str1 no tiene 5 caracteres”       
5 :    str1; 5 : resultado;
Incorrecto
☹ Este código hace lo contrario de lo que debe hacer. Si el resultado del método es null, va a escribir ese mismo
resultado, o sea null, y si este resultado es distinto de null, va a imprimir el mensaje incorrecto.

Página 47 de 154
[Link] el error en la siguiente condicional aritmética, suponiendo que i y j tienen asignado algún valor y están
declarados como int
1 int resultado = j > i
2 ? “El valor de j es mayor que el de i”
3:j+i;
Lo que está frente al : (false) es una operación, no un valor
El resultado se va a guardar en una variable tipo int, por lo que ambos valores, tanto para true como para false,
deben ser int
Los dos valores, tanto para true (?) como para false (:), deben ser cadenas
Los dos valores de la condicional aritmética deben ser del mismo tipo
Correcto
😊 Al compilar da un error de tipos, porque hay la posibilidad de que se trate de guardar una cadena en un int.
[Link] verdadero o falso según lo consideres. Si esta misma condicional apareciera en un println, seguiría dando
error de sintaxis.
1 [Link]( j > i
2 ? “El valor de j es mayor que el de i”     
3 : j + i );
Falso Verdader
oCorrecto
😊 Como no se está asignando a ninguna variable y println es capaz de escribir tanto una cadena como un entero, en
este caso no habría error de sintaxis

Atributos en una clase


Hola, bienvenidos a esta cuarta sesión de este módulo. En ella programaremos la clase Disco completa y aprenderás
cómo escribir todo tipo de expresiones. Abrimos nuevamente nuestro ambiente de desarrollo DrJava. Un excelente
punto para dar un esqueleto de la clase Disco es trabajar a partir de la interfaz "ServiciosDisco", que ya hicimos.
Para abrir este archivo, da clic en la pestaña "open" dentro del subdirectorio en el que estuvimos trabajando y elige el
archivo "[Link]". Después, das clic en la pestaña "file", dentro de ella, en la opción "save as" y nos
muestra el subdirectorio en el que estamos, y como nombre, por omisión, "[Link]". Sustituimos este
nombre por "[Link]" y oprimimos "guardar". La ventaja es que ya están todos los encabezados de los métodos
públicos que debes codificar y están documentados los métodos públicos. Cambiemos lo siguiente para tener un
esqueleto inicial de la clase Disco. Sustituimos "interface" por "class".
A continuación de "class", escribimos el nombre de nuestra clase, que es "Disco". Agregamos la palabra reservada
"implements" entre el nombre de la clase y "ServiciosDisco", con lo que decimos que esta clase va a respetar el
contrato hecho en "ServiciosDisco". Das clic en la pestaña "find". Estos dos recuadros son: uno, para la cadena a
encontrar; y otro, para la cadena a sustituir. Aquí, escribes punto y coma; y aquí, una llave que abre y otra que cierra,
debes colocar un salto de renglón en medio, deben estar alineados para generar un bloque para cada método. A
continuación, seleccionamos la pestaña "replace all" y todos nuestros encabezados de método ahora tienen un bloque
para implementarlos. Compilamos y nos marca el primer error. Aquí se sustituye punto y coma por las llaves que
abren y cierran. Por ser la primera línea, lo vamos a corregir. Cuando pidan los cambios, asegúrate de que el cursor
esté a partir de donde se desea hacer la sustitución. Compilamos y nos marca un error al final del método
"getActivas", ya que todo método que regresa un valor debe tener un enunciado donde regrese ese valor. El
enunciado que regresa un valor desde uno de estos métodos tiene la siguiente sintaxis. La expresión tiene que ser del
mismo tipo que regresa el método. En un método que no regresa valor, "void", también puede haber un enunciado
"return" pero sin la expresión. Al encontrarse un "return", la ejecución se sale del método en el que está y regresa al
punto donde fue el método invocado. Si el método regresa un valor, regresa al punto desde donde fue llamado y
entrega la expresión que tiene a continuación del "return". Corrijamos todos los métodos que regresan un valor para

Página 48 de 154
que tengan un "return" y puedas compilar. A los métodos que regresan un número les dirás que regresen con "0" y a
los métodos que regresan una referencia les dirás que regresen "null". El método "getActivas" regresa un "int",
agregamos "return 0". Lo mismo hacemos con los métodos "getANHO", "getPermitidas" y "getTIPO_DISCO".
Ahora veamos los métodos que regresan referencias, a los que les pedimos que regresen "null", que son
"getNombre", "copiaDisco", "daTransmision", "muestraDisco", "toString". Tenemos el método
"terminaTransmision" que regresa un valor de tipo primitivo "boolean", les asignamos "false" como valor de regreso.
Compilamos y todo va bien hasta ahora. Ahora, veremos los atributos de los objetos de la clase Disco, ya que, sin
estos atributos, los objetos no tendrán un estado particular. La tarjeta de responsabilidades nos indicó los campos o
atributos que tiene que tener esta clase para poder dar los servicios listados. Los debes declarar, para esto, las
declaraciones de atributos siguen la misma sintaxis que las declaraciones de métodos. Puedes visualizar en la tarjeta
de responsabilidades dichos atributos, los declararás en orden alfabético: primero, los atributos constantes de cada
objeto; y después, los que son variables. Empezaremos con "ANHO", es de tipo "int", es de acceso privado y
constante para cada objeto. "NOMBRE" es de tipo "String", de acceso privado y constante de objeto.
"TIPO_DISCO" es de tipo "short", de acceso privado y constante de objeto. La diferencia entre la declaración de
atributos y variables locales a un método, como las que declaramos en "Main" desde la clase Usuario, es que las
variables locales no tienen acceso ni modificador. Declaremos ahora los atributos que sí cambian de valor.
"Activas" es de tipo "int" y de acceso privado. "Permitidas" también es de tipo "int" y de acceso privado.
Es conveniente poner un límite superior a las transmisiones permitidas de todos los objetos, es de tipo entero y es
una constante. Como es la misma para todos los objetos, es una constante de clase. Debe existir desde la compilación
de la clase, tenemos que inicializarla en la declaración con el mismo formato que las inicializaciones de variables
locales. Para finalizar, debes colocar que es de acceso privado. Al compilar, te marcará algunos errores. El primero te
dice que tienes constantes de objetos declarados, pero sin valor inicial asignado. Las constantes deben tener valor
asignado, ya sea en la declaración o en la construcción de los objetos. Como "MAX_PERMITIDAS" era la misma
para todos los objetos, la inicializaste al declararla, pero falta inicializar "ANHO", "NOMBRE" y "TIPO_DISCO".
Si las inicializas en la declaración, van a tener el mismo valor para todos los objetos. Debes codificar los
"Constructores" para asignarle, ahí, valores a estas constantes que son diferentes para cada objeto. Java proporciona,
en ausencia de "Constructores", un constructor sin parámetros, "Disco", que deja en "0" los atributos primitivos y en
"null" los de referencia. Pero estos valores serían incorrectos, ya que, para constantes de objeto, los tienes que
proporcionar explícitamente en los "Constructores" del objeto.
Tienes tres encabezados para "Constructores" y que ya usaste en la clase Usuario, a los que les agregas el bloque de
implementación. El primero asigna los atributos constantes de objeto. El segundo agrega al primero la inicialización
del atributo correspondiente a transmisiones "permitidas".
El tercero le pregunta al usuario las tres constantes de objeto y el valor de "permitidas". Volvemos a compilar y
vemos que no se ha resuelto el problema de asignar valores a las constantes de objetos, entonces, la solución es que
cada uno de los "Constructores" debe asignar algún valor a las constantes de objeto y, posiblemente, a algún atributo.
Esos valores pueden darse durante la ejecución como entrada en la consola o pueden aparecer como parámetros. Es
importante, cuando se asignen valores a atributos, verificar la validez de estos valores. Para ello, debes declarar
constantes de clase que dé los mínimos en caso de que sean diferentes a "0", y los máximos de cada atributo. Por
ejemplo, para el caso del "TIPO_DISCO", puedes declarar constantes simbólicas de la clase. Para el caso del
"NOMBRE" no debe ser una cadena vacía de tamaño cero y que no sea una referencia nula, "null". En el caso del
"ANHO" consideras como primer año a 1900 y como último año a 2017, y son también constantes de la clase. Por
último, el máximo de transmisiones simultáneas permitidas está declarado como "MAX_PERMITIDAS" y es una
constante de clase. Nos vemos en el siguiente video. Te espero.

Tipos primitivos y de referencia


1. Elige la opción que complete el siguiente enunciado. Si aparece la línea de código
1 public class una implements otra {
otra debe estar declarada como:

Página 49 de 154
una variable de cadena (String) un archivo
una variable entera (int) una interfaz (interface)
una clase (class)
2. Elige la opción que complete el siguiente enunciado. Cuando un archivo que estás escribiendo en DrJava tiene un
asterisco a la derecha de su nombre en el panel a la izquierdo, quiere decir que:
el archivo no existe en el disco
el nombre del archivo no es el mismo que la clase o interfaz que se está codificando
el archivo se ha modificado desde que se abrió
el archivo no ha sido abierto
3. Si en la tarjeta de responsabilidades tienes un renglón como el siguiente:
privado entero constante número de copias
grande de clase

Elige el código que se ajuste mejor a esta descripción.


1 private final long int numCopias;
1 private static long numCopias;
1 private static final long numCopias;
1 public static final int numCopias;
4. Elige la opción que represente la declaración en Java de una variable de clase que dé el número de objetos
construidos para esa clase; debe ser visible únicamente para los objetos de esa clase.
1 private final int numObjetos = 0;
1 private static String      numObjetos;
1 public static int numObjetos = 0;
1 private static int numObjetos = 0;

5. Tienes el siguiente encabezado:


1 public String daDia( int numDia)
Elige el código que está bien respecto al return adecuado para este método
1 short jueves = numdia % 7 + 4;
          2 return jueves;
1 String jueves = numdia % 7 == 4;
          3      ? “jueves “: “no es jueves “;
          2 return jueves;         
1 String jueves = numdia % 7 + 4;
          2 return jueves;
1 int jueves = numDia % 7 + 4;
          2 return jueves;
6. Si un atributo está declarado como:
1 private int numCasos;
¿Cuál de las siguientes opciones es el encabezado correcto (que respeta las reglas de sintaxis y de convención) para
obtener el valor de la variable numCasos desde cualquier método fuera de la clase?

Página 50 de 154
1 public int getNumCasos ( ) 1 public long getNumCasos ( )
1 public int getnumCasos ( ) 1 public void getNumCasos (int numCasos )
7. Tenemos las siguientes declaraciones:
1 String cad1 = “una cadena”;
2 String cad2 = null;
¿Cuál de las siguientes expresiones causa un error en ejecución, inmediatamente después de las declaraciones
anteriores?
1 cad1 != null              1 cad1 >= [Link] ( )
          2              && ([Link]() >= [Link]())
1 [Link]( ) >= [Link]( )
1 cad1 >= cad2
8. Para las declaraciones de los siguientes constructores, elige la opción que está bien y asigna valores a los atributos
de objeto.
1 public Disco(String elNombre, short tipo,           
              2              int fecha)    {      1 public Disco( ) {           
       3 NOMBRE = nombre;                      2              NOMBRE = nombre;     
       4 ANHO = laFecha;                3 ANHO = fecha;     
      5 TIPO_DISCO = tipo;}         4 TIPO_DISCO = tipo;}       
1 public Disco( )    {      1 public Disco(String elNombre, short tipo,           
    2 ANHO =1975               2              int fecha)    {     
       3 NOMBRE = “cantante        3 NOMBRE = nombre;     
favorito”;             4 ANHO = fecha;       
       4 TIPO_DISCO = DVD;}        5 TIPO_DISCO = tipo;}
9. Elige la opción que responda la siguiente pregunta: ¿Cuál es el identificador, dentro de un método de objeto, para
referirse al objeto con el que se está llamando o construyendo?
. (un punto) this
this object self
10. Elige la opción que complete el siguiente enunciado. "Si un argumento se llama igual que un atributo del objeto y
tiene el mismo tipo, y se usa el identificador del atributo, solo, del lado izquierdo de una asignación:"
el atributo toma el valor del argumento o variable local al método
el atributo no cambia de valor
la ejecución de la clase va a abortar
la clase va a dar error de compilación
11. Elige 2 opciones que correspondan a los encabezados correctos de un constructor para una clase que se llama
Curso y que tiene dos atributos enteros y un atributo que es una cadena.
1 public Curso ( ) 1 public void Curso (int uno, int dos, String cad)
1 public curso ( ) 1 public Curso (int uno, int dos, String cad)

Métodos auxiliares y su uso

Me da mucho gusto que sigas con nosotros. Por otra parte, los métodos auxiliares son aquellos que son invocados
desde métodos públicos de la clase. Se usan para darle nombre a cálculos frecuentes, pero con valores diferente, y en
general, son privados. Si toda la información se pasa de los parámetros, no actúan sobre algún atributo de objeto,
pertenecen a la clase y podrían ser públicos.

Página 51 de 154
Veamos los métodos auxiliares de esta clase. Tiene las expresiones condicionales que evalúan si un argumento entero
está en rangos, que codificarás en un método auxiliar al que llamarás checaEntero. Regresa un entero, puede ser
público o privado, pertenece a la clase, you que no toca o invoca a nada del objeto. Sus parámetros son límite
inferior válido que es un entero. El valor del argumento que también es entero. Límite superior válido, que es entero.
El método va a regresar un valor entero mediante una condicional aritmética. Si es menor que el límite inferior,
entrega al límite inferior. Si no, verifica si es mayor al límite superior. Si lo es, entrega al límite superior, de otra
manera, entrega el argumento dado.
Las expresiones condicionales que verifican que una cadena sea válida, las codificarás en un método auxiliar
llamado checaCadena. Regresa una cadena, es de acceso público y pertenece a la clase porque no toca ninguno de
los atributos de objeto. Tiene una cadena como argumento y regresa una cadena calculada por una condicional
aritmética.
En la expresión booleana, se verifica que la referencia no sea null, o bien, que no sea una cadena vacía. Los
operandos lógicos en Java se evalúan en lo que se conoce como corte circuito, esto quiere decir que evalúa los
operandos de izquierda a derecha, hasta que tenga definido el resultado de falso o verdadero. Se evalúa la primera
expresión, y si cadena es null como el or, solo requiere a uno de sus operandos duradero, tu tiene el resultado y no
evalúa el operando derecho. Si la referencia es distinta de null, entonces evalúa si la cadena es vacía. Si el resultado
de la evaluación es verdadero, true, el argumento no sirve, y lo sustituyes por un mensaje específico. Si no es nula ni
vacía, tamaño en cero, regresas la cadena que recibiste como argumento. Java tiene dos operadores booleanos o
lógicos infijos, con dos operandos, AND y OR, y un prefijo NOT con un operando.
Ahora veremos tabla de verdad de OR, para que recuerdes cómo se combinan los operandos. En el caso de Java, deja
de evaluar si operando izquierdo es verdadero o true, porque el OR you es verdadero. En la tabla de verdad del
operando AND, en el caso de Java, deja de evaluar si operando izquierdo es falso, porque el AND you es falso.
Como acabas de ver, el orden de operandos en expresiones booleanas es muy importante.
Si la expresión booleana en el método checaCadena fuera con el orden de los operandos invertido, y la referencia
fuera nula, el programa abortaría al tratar de sacar el tamaño de una cadena que no existe. En el caso de operadores
booleanos, hay que tener cuidado en el orden de los operandos. Regresemos a la expresión booleana anterior.
tu que tienes estos métodos auxiliares, es muy fácil codificar el constructor con tres parámetros. Asignas al tipo de
disco el valor verificado de checaEntero. Asignas al nombre del disco el valor verificado del argumento nombre, y
luego le quitas los espacios de fin de cadena. Asignas al atributo del año de grabación el argumento fecha de
verificado. Compilamos y nos da algunos errores. Y te da un error de tipos, debido a que tipo disco es de tipo short, y
estás tratando de asignarle un valor de tipo int que regresa a checaEntero. Tenemos que convertir ese valor a un
short, y lo hacemos con una operación que se llama casting. Consiste en poner delante de la expresión, entre
paréntesis, el tipo que queremos forzar, que es un short. Compilamos.
Lo que pasa es que el tercer constructor solo tiene el encabezado por lo que te reclama que no le asignaste valor a
las constantes de objeto que son tipo disco, nombre y año.
Regresemos a ver algunos de los operadores de Java. Se les conoce como conectivos lógicos, tu que comparan
valores del mismo tipo y entregan el valor falso o verdadero. Son binarios infijos y su precedencia es 7.
Expresión condicional. Se escribe en expresión booleana, lo que sigue a interrogación es el valor si la expresión
booleana es verdadera, y lo que se escribe a continuación de dos puntos, es el valor, si es falso. Se pueden anidar, y
es un operador ternario infijo con precedencia 14.
Operador booleano para la operación OR. Binario infijo con precedencia 3. El símbolo de igualdad es también un
conectivo lógico. Su significado es obvio. Binario infijo con precedencia 8. Este símbolo de igual es una asignación
con una variable de lado izquierdo y una expresión del mismo tipo que la variable del lado derecho. Aparecen para
las tres constantes. Como su precedencia es 15, primero se evalúa su lado derecho para después asignarlo a la
variable del lado izquierdo.
Es un casting que tiene precedencia 3, pero la llamada a función checaEntero se evalúa antes. La llamada a método
es el que tiene mayor precedencia que cualquier otro operador, pero solo pueden aparecer en una expresión si es que
entrega algún valor. Hemos visto dos métodos de la clase string. Este operador regresa el tamaño de la cadena que lo
invoca. Este otro operador quita los blancos del principio y final de la cadena que lo invoca.

Página 52 de 154
El punto es un operador de selección dentro de una clase u objeto, tiene precedencia 1, es decir, antes que cualquier
otro, pero tiene que evaluar a sus operandos y tiene asociatividad izquierda.
Sigamos con el segundo constructor. El encabezado del constructor es el que tenemos registrado. Como tiene los
primeros tres parámetros nombrados acordemente, copias esas asignaciones tal cual del primer constructor. La cuarta
asignación sería de la siguiente forma. Nos damos cuenta que existe un error, you que permitidas en ambos lados de
la asignación se refiere al argumento, es decir, la variable local más cercana. Nosotros queremos que la de la
izquierda sea el atributo.
Tienes que identificar a permitidas del lado izquierdo de la asignación para que sea el atributo, no el parámetro. Esto
se hace con el identificador de objeto this, este objeto, el que se está construyendo en este método, seguido de un
selector de campo. Con esto terminamos el segundo constructor. Compilamos. Cambiamos de archivo de video a
video y nos vuelve a faltar el casting. Lo volveremos a corregir tras bambalinas y seguiremos con el siguiente video
con el tercer constructor. No te lo puedes perder.

Métodos de clase u objeto.


Puntos totales de 13
1. Deseas preguntar si el nombre del artista no es nulo y si tiene tamaño mayor que cero. ¿Cuál es la expresión
booleana correcta?
1 [Link]() > 0 && nombre != null 1 nombre != null && [Link] > 0
1 NOMBRE != null && [Link]() > 0    1 nombre != null && [Link]() > 0   

2. Supongamos las siguientes declaraciones con inicialización:


    1 int i = 8;
    2 double x = 8.0;
    3 String cad = “”;
para cada una de las expresiones que siguen, elige si se evalúan a falso o verdadero.
1 x >= i && cad == null
False True

3. Con base en la pregunta anterior, elige si esta expresión se evalúa a falso o verdadero según corresponda:
1 x >= i && [Link]( ) == 0
False True

4. De la siguiente expresión booleana, elige la opción que según corresponda: no compila, compila, o si puede
abortar en ejecución. Usa las declaraciones de la pregunta anterior.
1 String cad == “la primera”;
Compila Puede abortar
No compila

5. De la siguiente expresión booleana, elige la opción que según corresponda: no compila, compila, o si puede
abortar en ejecución. Usa las declaraciones de la pregunta anterior.
1 boolean mayor = cad == “la primera”;
Compila Puede abortar
No compila

6. ¿Cuáles son las diferencias entre un argumento y un parámetro? Elige 2 opciones correctas.
Para los parámetros se usan identificadores mientras que los argumentos pueden ser expresiones

Página 53 de 154
Los parámetros no pueden aparecer del lado izquierdo de una asignación dentro del método en el que están
declarados
Los parámetros aparecen en la declaración de un método y los argumentos en su llamada
No hay ninguna diferencia

7. Elige la opción que complete el siguiente enunciado. Sabemos que un método es un método de clase si:
tiene el modificador final en su encabezado
tiene el modificador static en su encabezado
tiene como nombre el de la clase
no tiene parámetros

8. Elige la opción que complete el siguiente enunciado. Los métodos que se declaran como static, en general:
no se pueden modificar en una clase que herede
tienen parámetros a partir de los cuales regresan algún valor
no pueden acceder a los atributos de objeto
no pueden acceder a los atributos de clase

9. Elige verdadero o falso según corresponda. Un método que calcula el máximo de dos valores que se le pasan
como parámetro debe ser static:
falso verdadero
10. Elige verdadero o falso según corresponda. Un método static no puede cambiar el valor de un atributo de objeto:
verdadero falso
11. Elige la opción que responda la siguiente pregunta: ¿Cuál de los siguientes es el código adecuado para un método
de clase que regresa el valor de su argumento elevado al cubo?
private static int cubo ( int num)    {    public static doublé sacaCubo (doublé num) {
   return num * num * num;} Doublé cubo = num * num * num;}
public doublé cubo ( ) {
public static int cubo ( double num)    {    Doublé num = 45.7;
   return num * num * num; } Return num * num * num;}

12. Elige el código que cumple con las siguientes especificaciones:


• regresa una cadena con 10 espacios si el argumento es una referencia nula;
• regresa los primeros 10 caracteres si la cadena tiene tamaño mayor que 10
• o regresa la cadena completada con blancos a 10, si la cadena es de tamaño menor que 10.

: cad + “                    “.substring(0,10);
public static String cad10 (String cad)    {   
  
    cad = cad + “                    “; // 10 blancos   
    }
    return cad == null ? “                    “           
    : [Link](0,10); public static String cad10(String cad)    {
    } return cad == null ? “                    “   
    : (cad + “                    “).substring(0,10);
public static String cad10(String cad)    {     
  
return cad == null ? “                    “           
    }
Página 54 de 154
            : (cad + “                  “).substring(0,10);
public    static String cad10(String cad)    {     
  
   return cad == null ? “                    “                 
    }
   : (cad >= 10 ? [Link](0,10)

13. Elige la opción que responda la siguiente pregunta: ¿Cuál de los códigos siguientes puede hacer abortar la
ejecución?

public String daCadena (String cad) {


public String dacadena ( String cad)    {
return (cad == null || [Link]() == 0)         
return cad == null ? null : cad + “?”;
                      ? null : cad + “?”;
  
  
    }
     }

public String daCadena (String cad) {


public String dacadena (String cad) {   
   return (cad != null && [Link]() > 0
    return [Link]() == 0 || cad == null     
                      ? cad + “?” : null;
          ? null : cad + “?”;}
  
     }

Lectura desde la consola

Ahora desarrollaremos el constructor Disco. En su documentación dice que interacciona con el usuario, es decir, lee
y escribe en la consola. ya usaste [Link] para escribir. Utilizaremos la clase java .util .Scanner para leer el
teclado. Como la clase Scanner pertenece al paquete [Link], Java no te da esta clase automáticamente, sino que le
tienes que avisar al compilador para que la incluya en la compilación.
Para avisarle a Java que vas a utilizar alguna clase que no está en el paquete, que estás armando, ni en [Link],
debes integrar la clase que deseas a la compilación de tu proyecto.
Esto se hace con un enunciado de importación, que va antes del encabezado de la clase o interfaz y tiene la siguiente
sintaxis. Deberá aparecer uno de estos enunciados por cada clase que importes.
Puedes importar a todas las clases de un paquete, si es que vas a usar muchas de las clases del mismo, colocando en
lugar del nombre de clase un asterisco. En este caso, quieres importar la clase Scanner, que interpreta sucesiones de
caracteres, lee cadenas y números, entre otros.
Entre los métodos principales que vamos a usar, está al menos un constructor. Entre los muchos constructores de un
escáner, tenemos el que podemos montar sobre la consola y cuyo encabezado es, construye un escáner sobre el
inputStream que se le proporcione. Lee, conforme se le vaya pidiendo, del inputStream al que se haya asociado. Le
vamos asociar a [Link], que es un inputStream. [Link] corresponde al teclado y refleja lo tecleado en la
pantalla.
Entre los métodos de lectura de escáner, que son muchos y puedes verlos en la documentación de Java 8, vamos a
usar. Regresa a la siguiente línea a partir de donde se encuentre hasta que encuentre el Enter, pero no lo incluye en la
cadena. Lee el siguiente entero, saltando espacios, tabuladores y Enter, hasta que encuentre el entero. Termina con
cualquier cosa que sea distinta a un dígito. Si lo primero que se encuentra no es un dígito, aborta con un mensaje de
error. Igual que nextInt, pero regresa un short.
Sigamos ahora con la codificación del constructor Disco. Estás dentro del bloque del constructor Disco. Para leer de
la consola, vas a utilizar un escáner. Recuerda que [Link] es precisamente un inputStream, así que puedes
construir tu objeto Scanner con montándolo sobre el teclado con eco en la consola. El objeto construido lo asignas a
un objeto de la clase Scanner. Para escribir algo en la consola tienes you [Link] y [Link]. Empiezas ahora la
comunicación con el usuario, escribiendo en [Link] y leyendo en el escáner. Le pides el tipo de disco,
indicándole primero cuáles son los tipos que tienes. El primero es printIn, por lo que cambias de renglón al terminar
la cadena. Pero el segundo es un print que se queda atorado al final de la flecha.

Página 55 de 154
Es el turno de leer el tipo de disco, un short, por lo que usas el método nextShort invocándolo desde el escáner. El
valor que regresa este método lo puedes asignar directamente al atributo TIPO_DISCO, pero es importante que
vigilemos que el valor dado por el usuario sea válido. Así que nuevamente usas el método auxiliar, cuyo encabezado
es. Compilamos. Al compilar, nos detecta un error de incompatibilidad de tipos.
Recuerda que un int no cabe en un short, por lo que tienes que hacer nuevamente un casting al valor que entregue el
método. Esperas a que el usuario teclee un Enter antes de proseguir, usando el método de clase String, que consume
entrada hasta que encuentre un Enter.
Con esto limpias la entrada y desechas todo lo tecleado después de un short, incluyendo el Enter. Debes avisarle al
usuario que ahora quieres el nombre del disco o la información general del disco. Como you tenemos el tipo del
disco, CD, DVD o Blu-Ray, dependiendo de eso haremos la pregunta. Usaremos nuevamente la expresión
condicional, usando el operador para comprar datos primitivos ==, que queda organizada de la siguiente manera.
Escribimos un mensaje general. Pregunta si se trata de un CD. Si lo es, agrega el mensaje para el cantante. Si no,
pregunta si es DVD. En cuyo caso, pregunta por la película. Si no es ninguno de los dos, pregunta por la serie. Y
termina la condicional, así que escribes la flecha.
Seguimos con la codificación del constructor disco. Nombre es una cadena string, por lo que pedirla es todavía más
sencillo. Utilizamos el método nextLine de la clase Scanner, que lee desde donde se encuentra en la entrada hasta
que se encuentra un Enter. Como you mencionamos, regresa la cadena que leyó sin el Enter. Asignas el nombre de
esta función al atributo NOMBRE. Pero como no siempre la información que teclee el usuario es la que esperabas,
quieres verificar que no te den una cadena vacía. Para ello, usas tu método auxiliar, checaCadena. Un argumento de
tipo string puede ser una función que regrese una cadena, una literal de cadena o una variable de tipo string. Ahora
solicitaremos el valor del campo año. Definiste you el rango para el año de grabación con constantes simbólicas de la
clase. Las llamaste PRIMER_ANHO para 1900 y ULTIMO_ANHO para 2020. Das un mensaje relativo a lo que
esperas del usuario usando las constantes simbólicas definidas. Tomas el valor de lo que teclee el usuario, que debe
ser un int. Debes verificar, antes de asignar, que el valor que te den esté en rango y lo asignas a la constante ANHO.
Vuelves a comerte el resto de la línea. Por último, en este constructor preguntas por el entero que representa a las
transmisiones simultáneas permitidas que, aunque no es una constante, es conveniente tenerlo al construir un disco.
Lo haces exactamente igual que las solicitudes anteriores de enteros. Primero escribes un mensaje al usuario para
decirle qué es lo que estás pidiendo. Después, lees el entero. Lo verificas con checaEntero y le asignas al atributo
permitidas. Nuevamente desechas el resto de línea. Das las gracias para despedirte.
Terminas desconectando a [Link] del escáner, cerrándolo. Con esto has terminado el constructor sin parámetros.

La clase Scanner
Puntos totales de 7
1. Elige 2 opciones que respondan al siguiente enunciado:
El constructor por omisión (default) que te da Java cumple con las siguientes aseveraciones:

El constructor tiene un valor para cada atributo que tenga declarado el objeto
Correcto
😊 Esto es cierto si pensamos que tiene el valor 0 para todos los atributos numéricos y el valor null para todos
los atributos que son una referencia.

Queda oculto si tú declaras un constructor sin parámetros


Queda accesible mientras tú no declares un constructor sin parámetros
Tiene un parámetro por cada atributo que tenga declarado para el objeto
Esto no debería estar seleccionado
☹ No tiene ningún parámetro. Si te obligara a tener un parámetro por cada atributo, ¿cómo harías para dejar sin
definir alguno de ellos?

Página 56 de 154
2. Elige el paquete de Java que el compilador incluye con tus clases sin necesidad de avisar:
1 [Link] 1 [Link]
1 [Link] 1 [Link]

Incorrecto
☹ [Link] es un paquete de clases que el compilador no incluye autómaticamente, por lo que tienes que avisar si lo
quieres importar.
3. Elige la opción que responda a la siguiente afirmación: El enunciado import se usa para avisar que:
Se va a usar alguna clase que no está en el paquete actual o en el paquete [Link]
Se van a usar otros objetos construidos por otras clases
Avisar que se van a usar otras clases del mismo paquete
Esta clase se va a importar a un determinado paquete
Correcto
😊 Todo lo que está en el paquete actual y lo que está en [Link] se incorpora automáticamenter a la compilación;
pero hay un sinfín de clases útiles que no se encuentran en este paquete, por lo que hay “importarlas”.
4. Elige la opción que responda a la siguiente afirmación: Sabes en qué paquete está la clase que estás codificando
porque:
Está dada por el subdirectorio del disco en el que estás trabajando
Se encuentra en la primera línea del listado a continuación de la palabra package
Se encuentra al principio del archivo a continuación de la palabra import
El paquete se llama, por omisión, igual que la clase
Incorrecto
☹ La palabra import indica, precisamente, que lo que estamos pidiendo no se encuentra en la clase actual.
5. Elige la opción que responda al siguiente enunciado: A la clase [Link] la vas a usar para:
Leer del teclado (y consola) elementos de más alto nivel que caracteres
Revisar lo que se tecleó para verificar que sea lo que pediste
Leer del teclado y (consola) elementos de bajo nivel, carácter por carácter
Convertir lo que vas leyendo a cadenas (String)
Incorrecto
☹ Esto es lo que hace [Link] y que queremos evitar, pues tendrías que convertir tú a números y cadenas.
6. Elige la opción que responda al siguiente enunciado: El método nextLong() de la clase Scanner va a ser:
Un carácter de cambio de línea
Un entero grande
Un tabulador
Una cadena larga
Incorrecto
☹ Los cambios de línea no hay forma de guardarlos usando un Scanner. Se tendrían que agregar “a pie”.
7. Abre en tu navegador la lista de clases de Java 8 y marca los métodos que aparecen en la clase Scanner, aunque los
parámetros no se llamen igual.
Elige las opciones correctas.
1 open( InputStream in)

Página 57 de 154
Esto no debería estar seleccionado
☹ Un Scanner no se abre con open, sino creando un objeto de la clase con new Scanner( … )
1 hasNextByte()
close( )
hasNextChar( char c)

3.5 Métodos de consulta

Ahora, veremos la codificación de los métodos "get". Estos métodos regresan el valor de cada uno de los atributos,
por ejemplo, el del atributo "activas" es así. Tenemos que regresar el valor o estado del atributo "activas", en lugar de
regresar "0", así que sustituimos el "0" con "activas". Hacemos lo mismo con "getANHO", sustituimos a "0" con el
identificador del atributo "ANHO". Ahora, con "getNOMBRE", sustituimos "null" por el identificador del atributo
nombre. Ahora, es el turno de "getPermitidas". Por último, en esta categoría de métodos nos queda
"getTIPO_DISCO", sustituimos nuevamente el "0" por el nombre del atributo, "TIPO_DISCO". Compilamos y
vemos que no hay errores de compilación. Ahora, veremos la codificación de los métodos "set", los cuales actualizan
o mutan el valor de cada uno de los atributos. Como los únicos atributos que pueden cambiar son, "activas" y
"permitidas", sólo tenemos dichos métodos.
Para "setActivas" no teníamos código porque no regresa ningún valor. Asignamos al atributo "activas" el valor del
parámetro "newActivas", pero, ya que tenemos el método que verifica que el valor está en rangos, mejor asignamos
el valor verificado y que sea menor que el número que tiene en "permitidas". Similarmente para el método
"setPermitidas", asignamos al atributo "permitidas" el valor del parámetro, que se llama "permisos", pero verificando
que el valor que asignemos sea correcto. Compilamos y todo sigue bien. Ahora, veremos los métodos de
implementación, los cuales te dan servicios del objeto, pero que no son constructores "get" ni "set". Empiezas con el
método "copiaDisco", que es el primero alfabéticamente. Su documentación dice que debe regresar un disco nuevo
con los mismos valores que el disco que lo invoca, excepto por "activas" que debe empezar en "0". Cómo tienes que
construir un disco nuevo, vas a regresar directamente el resultado de un constructor de disco. Invocas al constructor
de la clase disco que recibe cuatro argumentos, le pasas como argumentos los cuatro valores de los atributos del
disco actual: "TIPO_DISCO", "NOMBRE", "ANHO" y "permitidas". Recuerda que "Java" pasa sus argumentos por
valor, obtiene los valores antes de entrar al constructor, por lo que usa los del disco con el que se invocó el método.
Como "Disco" implementa a "ServiciosDisco", el compilador no protesta. Codificas ahora el método "muestraDisco"
que recibe un "String", tienes que regresar una cadena donde aparezca cada uno de los atributos en su propio
renglón, con su descripción. Empiezas con declarar una cadena para ir acumulando ahí lo que vamos a escribir,
inicializandola con el encabezado, pero, verificando con tu método "checaCadena" que no te haya pasado el usuario
una referencia nula, que es una variable tipo de "String" no inicializada.
Le agregamos a esta inicialización dos cambios de línea para la impresión, para subrayar el encabezado y separarlo
de los campos. A continuación, le agregamos la etiqueta para el "TIPO_DISCO", pero, como los números uno, dos o
tres, no le dicen nada al usuario, usaremos nuevamente una expresión condicional. Agregamos ahora el título para el
nombre, dependiendo del tipo de disco y a continuación el valor de "NOMBRE". Para "permitidas" y "activas" es
sencillo escribir su título y su valor. Regresas la cadena que armaste y con esto terminas el método "muestraDisco".
Seguimos con la codificación del método "terminaTransmision". Como su documentación dice, este método debe
regresar "true" si había transmisiones que terminar y "false" si no las había. Antes de salir, tienes que decrementar en
uno a las "Transmisiones activas". Lo primero es verificar si este objeto con el que se invocó tiene "Transmisiones
activas", asignando esto a una variable local booleana. Después, si "hayActivas" es verdadero, restas uno usando la
autoasignación con resta. Como el operador de expresión condicional tiene mayor precedencia que cualquiera de las
asignaciones, elige "1" o "0" para restar. Por último, regresas el valor de "hayActivas" y terminas la codificación de
este método.
Seguimos con la codificación del método "toString", la documentación dice que se construye una cadena en la que
cada campo debe ocupar un número de lugares fijo. Estos números de lugares los puedes declarar como constantes
simbólicas de la clase. Decláralas en la clase con nombres mnemónicos que digan de qué se trata.

Página 58 de 154
Para que cada valor ocupen los lugares que requieres, deberás formatearlo, debes meter espacios a la derecha para
cadenas y espacios o ceros a la izquierda para números. Necesitas dos funciones auxiliares de la clase que hagan
esto, y que son "editaNum" y "editaCad" con los siguientes encabezados. Primero veremos la codificación de
formato para números, necesitas una cadena de espacios para usarlos para rellenar, y la declaras como constante
simbólica de la clase, junto con las que ya declaraste. Harás primero "editaNum", los nombres de los parámetros son
mnemónicos. Tomas la cadena de espacios y la concatenas por la izquierda con el valor, asignándola a una variable.
Tomas la subcadena de los últimos lugares usando las funciones "length" y "substring", de la clase "String". El
método "substring" de un parámetro entero de la clase "String" toma la subcadena que empieza en el entero e incluye
hasta el final de la cadena. El método "length", de esta misma clase, regresa el tamaño de la cadena. Regresas la
cadena construida. Posteriormente, vemos la codificación de formato para cadenas.
La función "editaCad" es casi idéntica a "editaNum", en este caso, los espacios se pegan por la derecha. Se toman los
primeros lugares con el método "substring" que recibe dos enteros, "desde" y "hasta", y da la subcadena que empieza
en la posición "desde" y termina en la posición anterior a "hasta". Toma la cadena original que empieza en la
posición "cero" y los espacios agregados para tener lugares en el resultado. Regresas la cadena construida. Ya tienes
todo lo que necesitas para codificar rápidamente el método "toString". Tienes ya declaradas las constantes simbólicas
de clase que requieres. Primero, llamamos a "editaNum" con el "TIPO_DISCO" y su número de espacios. Le
pegamos "editaCad" del "NOMBRE" de disco. "EditaNum", con el "ANHO", las transmisiones "permitidas". Y al
final, las transmisiones "activas". Por último, regresamos esa cadena como valor de la función. Compilamos. Nos
marcará un error ya que al tratar de comparar "TIPO_DISCO", que es de tipo "short", con la cadena "CD", se debió
comparar con la constante simbólica "CD", por lo que debemos eliminar las comillas. Compilamos y fue exitosa la
compilación. Te veo en el siguiente video, no te lo puedes perder.

3.5 Métodos get


1. Supón que tienes una clase cuyos atributos son:
1 private int cual;
2 private boolean siHay;
3 private doublé x;

Elige 2 opciones que tengan encabezados correctos, de acuerdo con las convenciones de Java, de métodos de
consulta para estos atributos.
1 public double getCual( )
1 private doublé getX
1 public static int getCual( )
Esto no debería estar seleccionado
☹ Aunque el nombre y el tipo del valor que regresa el método son correctos pues cual es de tipo int y el nombre
empieza con el verbo get, no puede ser un método de la clase (static).
1 public double getX ( )
1 public boolean getSiHay( )
1 public double daX( )
Esto no debería estar seleccionado
☹ No sigue las convenciones de Java pues el nombre del método no empieza con el verbo en inglés get.
2. Supón que tienes una clase cuyos atributos son:
1 private final int MAX;
2 private boolean termina;
3 private final boolean empieza;
Elige 3 opciones que cumplan con las convenciones de Java para los métodos de consulta de cualquiera de estos tres
atributos.

Página 59 de 154
1 public boolean getTermina ( )
Correcto
😊 Este encabezado cumple con las convenciones de Java para un método de acceso: es público, regresa un valor
booleano ya que el atributo es de ese tipo, el nombre empieza con el verbo en inglés get y a éste le sigue el nombre
del atributo empezando con mayúscula, y tiene los paréntesis para parámetros, aunque no tenga parámetros.
1 public final boolean getTERMINA ( )
1 public boolean getEmpieza ( )
Correcto
😊 Este método debe elegirse pues es público, regresa un valor de tipo boolean, que es el tipo del atributo, su nombre
empieza con get y le sigue el nombre del atributo, y finalmente termina con la pareja de paréntesis.
1 public final int getMAX
Correcto
😊 Aunque el modificador final en los métodos tiene que ver con herencia, que no hemos visto en el código, este
método tiene un encabezado correcto: es público, regresa un entero, su nombre empieza con get y le sigue el nombre
del atributo, que en este caso tiene solo mayúsculas, y están los paréntesis para los parámetros.
1 public void getMAX
3. Supón las siguientes declaraciones de atributos en una clase:
1 private final int MAX;
2 private boolean termina;
3 private final boolean EMPIEZA;

Elige 2 opciones que correspondan a métodos de consulta de alguno de los atributos especificados:
1 public boolean getTermina ( ) {
        2 retrun termina;
    3
        4}
Correcto
😊 Este método es de consulta (empieza con get) y regresa el valor del atributo termina, que es de tipo boolean, por
lo que el método regresa un valor de tipo boolean.
1 public boolean getEMPIEZA ( ){
        2 return EMPIEZA;
    3
        4}
Correcto
😊 Es un método de consulta pues empieza con get y sigue con el nombre del atributo; regresa un valor de tipo
boolean que es el mismo tipo del atributo EMPIEZA.
1 public void getEMPIEZA ( ){
        2 return EMPIEZA;
    3
        4}
1 public boolean getEMPIEZA ( boolean newEMPZA){
        2 EMPIEZA = newEMPZA;
        3 return EMPIEZA;
    4
        5}

Página 60 de 154
1 public boolean getMAX ( ){
        2 return MAX;
    3
        4}
4. Tienes una clase con los siguientes atributos:
1 private void setCualDisco ( int disco) {
2 private final boolean SIHAY;   
3 private int cualDisco;

Elige 2 opciones que correspondan a métodos de actualización válidos para alguno de estos atributos
1 public void setCualDisco ( int disco){
        2        cualDisco = disco;
    3
        4}
1 public void setSiHay ( boolean siHay){
        2        SiHay = SiHay;
    3
        4}
Esto no debería estar seleccionado
☹ La clase no va a compilar con este método porque a las constantes (final) de objeto, sólo se les puede asignar
valor en los constructores. No puede haber una asignación en otro contexto.
1 public int setCualDisco ( ) {
        2        return cualDisco;
    3
        4}
1 public void setCuantos ( int cuantos ) {
        2        [Link] = cuantos;
    3
        4}
Correcto
😊 El método consulta el valor del atributo cuantos, es público, no regresa nada; tiene un parámetro de tipo int, que
es el tipo del atributo y lo que hace es asignar el valor del parámetro al atributo. Como el parámetro se llama igual
que el atributo distingue al atributo precediéndolo del selector de objeto this, indicando que se trata del objeto con el
que se invoca al método
1 public int setCuantos ( int nuevo ) {
        2        cuantos = nuevo;
        3        return cuantos;
    4
        5}

5. Elige 3 opciones que justifican las convenciones de Java para nombrar métodos.
Cualquier programador que vea la clase entiende de qué se trata cada método
Correcto
😊 Este es el objetivo de las convenciones, que todos estén de acuerdo respecto a los distintos significados de los
identificadores.
El idioma inglés es más común en programación que el español

Página 61 de 154
Las convenciones son para ayudar al lector humano a entender una clase, no a la computadora
Correcto
😊 Así es. Si todo mundo está de acuerdo con cómo hacer las cosas, entonces todo se entiende mejor.
Se distinguen valores constantes de variables sólo por las convenciones para asignar identificadores

El compilador de Java vigila que las convenciones se cumplan Esto no debería estar seleccionado
☹ Esto no le toca al compilador. Tú puedes llamar a un método setAlgo y que, sin embargo, sea un método de
consulta y regrese un valor o no tenga parámetros.
6.    Quieres un método que centre una cadena de cierto tamaño y quieres duplicar el tamaño de la cadena agregando
blancos a la izquierda y a la derecha. Puedes suponer que tienes una cadena constante de clase que se llama
ESPACIOS y que tiene una longitud suficiente para poner los espacios incluso a cadenas muy grandes. También
tienes un atributo de la clase que es un String y se llama cadena. ¿Cuáles de los siguientes códigos corresponden a un
método y hacen lo que se pide? Elige 2 opciones que consideres correctas.
1public String acolchona (String cadena)    {   
        2    cadena = [Link]( 0,                   
            3              [Link]() / 2)                 
        4 + cadena     
        5 + [Link]( 0,                 
                6            [Link]() / 2);   
            7 return cadena;
      8
          9}
Correcto
😊 Aunque hace más trabajo del que necesita pues obtiene dos veces el tamaño de la cadena y obtiene dos veces la
subcadena de ESPACIOS, hace lo que tiene que hacer. Al parámetro le pega los espacios necesarios por la izquierda
y por la derecha, y después regresa la cadena formada.
1 public void acolchona (String cadena)    {   
          2 String espacios = [Link]( 0,                   
              3            [Link]() / 2)                 
              4       
              5    cadena = espacios + cadena + espacios;                 
              6             
          7}
1 public String acolchona ( String cadena )    {   
          2 int tam = [Link] ( );                   
              3          int numBlancos = tam / 2;                   
              4    return [Link]( 0, numBlancos)               
              5              + cadena   
     6 + [Link](0,numBlancos );
     7
        8}
Correcto
😊 Este método hace lo que se pide. Primero obtiene el tamaño de la cadena y lo divide entre dos con una división de
enteros, que entrega un entero. Regresa una cadena formada de la siguiente forma: usa la variable local numBlancos
para obtener una subcadena de la cadena ESPACIOS, pega por la derecha la mitad de las posiciones que tiene la
cadena y al final vuelve a agregar los espacios necesarios.
1 public String acolchona ( )    {   
Página 62 de 154
          2 cadena = [Link]( 0,                   
              3            [Link]() / 2)                 
              4    + cadena     
              5    + [Link]( 0,                 
              6              [Link]() / 2);   
          7 return cadena;
     8
        9}

7. Elige 2 códigos que reciben un entero entre 1 y 3 como parámetro y regresa la siguiente cadena dependiendo del
código, usando una expresión condicional y verificando que el código sea válido.
1:    cereza
2:    mandarina
3:    naranja
1 public String diSabor( int n)    {   
          2 String sabor1 = n == 1 ? “cereza”
       3                         : “”;     
          4 String sabor2 = n == 2 ? “mandarina”                                                                                            : “”;     
          5 String sabor3 = n == 3 ? “naranja”                                                   
       6                           : “”;     
          7 String result = Sabor1 + sabor2 + sabor3;
          8 return [Link]() == 0 ? “no identificado”
              9        : result;
          10
        11 }     
Correcto
😊 Es una manera “ingeniosa” de calcular el valor y funciona bien. Si quieres, pruébalo en tu computadora.
1 public String diSabor( int n)    {   
          2 String cadena = n == 1 ? “cereza”
       3           :      n == 2 ? “mandarina”
     4                 :    n == 3 ? “naranja”
     5     : “no identificado”;
       6 return cadena;                
     7
     8 }
       
1 public int diSabor( String sabores)    {   
          2 return [Link](“cereza” ) ? 1
       3           :      [Link]( “mandarina”) ? 2
     4                 :    [Link] (“naranja”) ? 3
     5     : “no identificado”:
       6                  : 0;                       
     7
     8 }
Esto no debería estar seleccionado
☹ Este método compara la cadena que le pasan y de acuerdo con lo que sea entrega el código que corresponde. Es
exactamente lo inverso a lo que te pedimos.
1 public void diSabor(int cual)    {   

Página 63 de 154
          2 String cadena = n == 1 ?    “cereza”
       3           :      n == 2 ? “mandarina”                                :    n == 3 ? “naranja”              : “no
identificado”;
     4           
     5}
8. Tenemos una clase que tiene un atributo de tipo String llamado cadena. Elige 2 códigos que le pegue la cadena que
pasa como parámetro al atributo cadena y al mismo tiempo regrese el parámetro pegado a sí mismo.
1 public String duplica ( String cadena )    {   
        2        [Link] += cadena;
        3        return cadena + cadena;
    4
    5}

1 public String duplica ( String cadena )    {   


        2        cadena = cadena + cadena;
        3        [Link] += cadena;
        4        return cadena;
    5
    6}
Esto no debería estar seleccionado

☹ Como primero se duplica el parámetro cadena, lo que se le pega al atributo cadena, identificado por ir precedido
de this, es dos veces el parámetro, no una sola vez, aunque se regresa el valor correcto.
1 public String duplica (String cadena )    {   
        2        [Link] += cadena;
        3        cadena += cadena;
        4        return cadena;
    5
    6}
1 public String duplica ( String cadena )    {   
        2        [Link] = cadena + cadena;
        3        return cadena + cadena;
    4
    5}
Esto no debería estar seleccionado
☹ Al atributo cadena se le asigna el parámetro cadena dos veces y pierde cualquier cadena que tuviese antes, aunque
sí regresa el parámetro duplicado.
9. Supón que tienes una clase con un atributo de tipo int que se llama ultimo. Elige 2 opciones que corresponden a un
método que recibe tres parámetros de tipo int y le coloca al atributo el máximo de estos tres valores.
1 public void ponMaximo ( int primero,           
       2                             int segundo,                                             
              3                                  int ultimo )    {   
          4        [Link] = [Link]([Link](primero,                                                                                segundo),ultimo);
     5
    6}
Correcto
😊 Nuevamente se calcula el máximo utilizando dos llamadas anidadas a [Link] y directamente se asigna este
valor al atributo ultimo.

Página 64 de 154
1 public int ponMaximo( int primero,               
       2                       int segundo,                                    
       3                       int ultimo )    {       
          4      int maximo = primero > segundo ? primero                           
              5                          : segundo;       
          6      maximo = maximo > ultimo ? maximo       
              7                                                : ultimo;     
        8      ultimo = maximo;   
            9    return maximo;
          10
        11 }
1 public void ponMaximo( int primero,               
       2                           int segundo,                                     
       3                           int ultimo )    {       
        4      int maximo = [Link](primero, segundo, ultimo);                           
              5      ultimo = máximo;     
          6           
              7      }     
Esto no debería estar seleccionado
☹ El método [Link] únicamente recibe dos parámetros del mismo tipo, por lo que este método daría error de
compilación. Adicionalmente, el valor se lo estás asignando al parámetro, no al atributo, pues no usas this.
1 public void ponMaximo( int primero,               
       2                           int segundo,                                     
       3                           int ultimo )    {       
          4      int maximo = [Link](primero,                             
              5                                  [Link](segundo, ultimo));     
        6        [Link] = máximo;     
     7
              8      }     

10. Tienes un atributo de tipo int que se llama incr. Elige 2 códigos que correspondan a recibir un valor de tipo
double y regresen el valor de multiplicar el atributo por el parámetro.
1 public int multiplica (double incr)    {
          2 return [Link] * incr;
     3
    4}
1 public void multiplica (double incr)    {
          2 [Link] *= incr;
     3
    4}
Esto no debería estar seleccionado
☹ Se te pide que el método regrese un valor y este método no lo hace. En cambio, modifica al atributo, que no se
especifica que lo deba hacer.
1 public double multiplica (double incr)    {
          2 return [Link] * incr;
     3

Página 65 de 154
    4}
Correcto
😊 Este método hace lo que se te pide. El resultado de multiplicar un double por un int es un double, por lo que
regresa un double. Como tanto el parámetro como el atributo se llaman igual, tienes que usar this para referirse al
atributo.
1 public double multiplica (double dob)    {
          2 return incr * dob;
     3
    4}

3.6 Uso de clases importadas

Hola, te doy la bienvenida a este nuevo video. Te falta codificar el método "daTransmisión", la documentación del
método te dice que debe regresar una cadena con la fecha y hora en la que se solicita la transmisión, si es que hay
disponibles, además de actualizar el número de transmisiones activas en ese caso. Para dar esta salida necesitas
funciones que, cuando las invocas, regresen fecha y hora de ese momento. Revisando la documentación de Java,
encuentras una clase que se llama "GregorianCalendar" que proporciona esta información. Esta clase está en el
mismo paquete que "Scanner" por lo que también la tienes que importar. Colocas el "import" al principio del archivo,
revisamos la clase "GregorianCalendar" en la documentación de Java 8, colocamos como un documento descargable.
Se obtiene la fecha y hora al momento de construir un objeto de esta clase, el constructor que utilizaremos tiene el
siguiente encabezado. Declaramos un objeto de esta clase al inicio de la implementación del método
"daTransmisión". Al crearse un objeto usando este encabezado, se llenan los campos para fecha y hora en el
momento en que se construye el objeto. Esta clase hereda de la clase "Calendar" muchas variables estáticas, que te
van a indicar el campo donde se guarda el año, día, día de la semana, mes, hora, minutos, segundos, milisegundos.
Tiene mucha información adicional que por el momento no vas a utilizar. Vas a escribir un método auxiliar tal que,
dado un objeto de la clase "GregorianCalendar", te regrese la cadena que diga la hora del día en que ese objeto fue
construido. Verás ahora cómo se forma el encabezado del método. Es un método auxiliar de clase, por lo que es
público. El método regresa una cadena, se llama "daHora", recibe como entrada o parámetro un objeto de la clase
"GregorianCalendar". Como no toca atributos de objeto, es un método de clase, por lo tanto "static". Damos el
bloque para su implementación. Dentro de "daHora" usaremos este parámetro para obtener los datos, queremos saber
la hora que tiene registrada el objeto "cal". En general, usaremos un método de "GregorianCalendar" para obtener la
información, cuyo encabezado es, el parámetro campo elige, mediante constantes simbólicas de la clase
"GregorianCalendar" al elemento que contiene la información solicitada por el parámetro. Entre las constantes
simbólicas, todas ellas de acceso público, se encuentran "AM", "AM_PM", "DATE", "DAY_OF_MONTH",
"DAY_OF_WEEK", "MINUTE", "MONTH", "PM", "YEAR".
También tienes los nombres de los días y los meses, pero en inglés, por lo que no los vas a usar. Al usar el método
"get" te va a regresar un entero en los rangos que indica cada constante simbólica que uses para ese campo. Las
constantes simbólicas únicamente eligen el campo. El valor del campo es relativo al objeto de la clase
"GregorianCalendar" que hayas construido. Ahora veremos la codificación del método "daHora". Para obtener la
hora en este formato hacemos lo siguiente, utilizas la constante simbólica "HOUR" del calendario para obtener el
contenido de ese campo en "cal", el objeto que construiste. Asignas ese valor a una variable local al método de tipo
entero. Cuando usas alguna de estas variables de clase deberás recordar invocarlas desde la clase o desde algún
objeto de la clase, más cómodo en este caso. De la misma manera que obtuviste la hora, obtienes los minutos. Para
obtener si es "AM" o "PM", usamos nuevamente la expresión condicional y lo asignamos a una cadena.
Obtenemos el valor "[Link]" y lo comparamos con el valor dado para "AM", si es verdadera, asignamos la cadena
"AM", si es falso, asignamos la cadena "PM". Te acabas de dar cuenta que si se trata del medio día, la hora aparece
como "cero horas PM", lo corriges con un enunciado condicional. Si la hora es cero y el tiempo del día "PM", lo
cambias por un entero 12, si no, lo dejas igual. Te falta armar la cadena para regresarla, para que lo que sigue, que
son enteros, se conviertan en cadenas. Empiezas la cadena a regresar con una cadena vacía, le concatenas el número
que obtuviste para las horas, dos puntos y el número que obtuviste para los minutos, agregas un espacio. Por último,

Página 66 de 154
agregas la parte del día y regresas la cadena formada. Notas que si los minutos son menos de 10, la hora va a
aparecer como "1:5 PM". Hay que agregar el cero en este caso para que diga "1:05 PM", lo haces con otra expresión
condicional. El cálculo de "daFecha" es muy similar a "daHora", usando las constantes correspondientes. Vuelves a
declarar un método estático de la clase a la que le pasas como parámetro un "GregorianCalendar". Es necesario
revisar el código anterior, ya que tratar de indentar "daFecha" no permite moverlo. Eliminamos el paréntesis. Una
vez encontrado el error, regresamos a "daFecha" y el problema queda resuelto. Cuando observamos lo que nos
imprime "muestraDisco", vemos que nos faltaron dos cambios de línea, por lo que debemos regresar al código y
corregirlo. Obtienes el día del mes, obtienes el mes recordando que el cero corresponde a enero, y obtienes el año.
Quisieras, también, escribir el día de la semana que corresponde a esa fecha, para ello vas a programar un método
estático cuyo encabezado va a ser "nombreDia". Usas ese método y la constante "DAY_OF_WEEK", ambos de la
clase "GregorianCalendar", para obtenerlo. Regresamos la cadena con los datos de la fecha, separados por un espacio
entre comillas seguido por el día, número de mes y año, separados entre ellos por diagonales.
Para la codificación de nombre día necesitas tener los nombres de los días en una cadena, para no tenerla que crear
cada vez que se llama al método, puedes declararla como constante simbólica de la clase.
Para que puedas extraer fácilmente el nombre dado el número de día, necesitas que cada uno ocupe exactamente el
mismo número de posiciones. Eliges nueve posiciones que son las que tiene miércoles, que es el nombre más grande
y declaras una constante simbólica con este valor.
Regresamos a codificar el método que regresa el nombre del día de la semana, cuyo encabezado es "daDia". Usas el
método "substring" de la clase "string" para extraer el nombre del día que tienes. Hay que calcular en qué posición
empieza la subcadena que corresponde a "numDia", hay que brincar "TAM_DIA" a lugares por cada día que haya
transcurrido, la cadena "N_DIAS" tiene "TAM_DIA" espacios al principio, porque el número de día empieza en uno,
no en cero, la posición en la que termina es "TAM_DIA" lugares a la derecha. Tomas esa subcadena de la cadena
"N_DIAS" y le quitas los espacios del final, con el método "trim". Regresas la subcadena limpia.
Ahora regresas a la codificación de "daTransmisión", con las funciones de clase "daFecha" y "daHora" es más
sencilla esta codificación. Necesitas construir un objeto de la clase "GregorianCalendar", si no hay transmisiones
disponibles no vas a usar este objeto. Es importante colocar aquí "miCal". A continuación, debes verificar si hay
transmisiones disponibles en el disco con el que se va a invocar y asignamos esta evaluación a una variable
"booleana".
Si hay transmisiones disponibles, incrementamos activas en uno, usando la autoasignación con suma más igual,
similar al autoresta, menos igual, que ya usamos. Usando una expresión condicional, regresamos la cadena
dependiendo si hubo o no transmisiones disponibles. Puedes agregar un método "main" a esta clase para probar
algunos de los métodos que has codificado. Por ejemplo, "daHora" o "daFecha". Como los métodos "daHora" y
"daFecha" también son de la clase, entonces no necesitas construir objetos para llamarlos. Sin embargo, como
reciben un objeto de la clase "GregorianCalendar" como argumento, debes construir uno. Ahora imprimes el
resultado de llamar a "daHora" y, por último, imprimes el resultado de llamar a "daFecha". Ya utilizaste el método
"main" para probar los métodos relacionados con "GregorianCalendar", agregas ahora algunas invocaciones más
para ver cómo funcionan los métodos de la clase "Disco". Declaras y construyes un objeto de esta clase para poder
probar métodos de objeto. Ahora prueba las dos maneras de ver el contenido del disco, con "muestraDisco" y con
"twoString". Cuando observamos lo que nos imprime "muestraDisco", vemos que nos faltaron dos cambios de línea,
por lo que debemos regresar al código y corregirlo. Agregamos los cambios de línea en los enunciados
correspondientes, que es después del tipo de disco y del nombre del disco. Compilamos y ejecutamos, y vemos que
ya escribe bien con los cambios de línea. Pides tres transmisiones seguidas y, como el máximo es dos, te debería dar
las dos primeras, pero la tercera ya no. Puedes volver a ejecutar tu clase usuario, pero ahora vas a trabajar con la
versión que codificaste de la clase Disco, verás que se comporta como esperabas. En el próximo módulo veremos
repetición y selección en datos y ejecución. Espero verte en el siguiente módulo.

La clase GregorianCalendar
Puntos totales de 8

Página 67 de 154
1. Abre la documentación de Java 8 que se encuentra en: [Link] y elige la clase
Calendar, de la que hereda GregorianCalendar en el menú de clases para que te lo muestre. Una vez hecho esto,
responde las siguientes preguntas.
De las siguientes constantes simbólicas elige 3 opciones que entregan un número de campo, y que por lo tanto se
deben usar con el método estático get (campo):
DAY_OF_MONTH
APRIL
PM
DATE
AM_PM
FIELD_COUNT
AM
2. Esta clase tiene varios métodos set. El primer método listado tiene el encabezado:
1 public void set (int field, int value)
Si una vez construido un objeto cal de la clase GregorianCalendar, quisieras cambiar el mes a enero,
independientemente de cuál sea el mes en el objeto, ¿cuál de los siguientes enunciados sería el correcto?
1 [Link]([Link], [Link]);
1 [Link](GregotrianCalendar. MONTH,                                                0);
1 [Link]([Link], [Link]);
1 [Link](MONTH, JANUARY);
Incorrecto
☹ No va a compilar porque va a decir el compilador que desconoce al identificador MONTH y al identificador
JANUARY. Deben ir precedidos por el nombre de la clase (o del objeto de esa clase).
3. El método con el siguiente encabezado:
1 public int getActualMaximum (int field)
regresa el valor mínimo que el campo especificado puede tomar, dado el valor del tiempo de this Calendar. Elige 2
opciones que invocan correctamente al método citado, suponiendo que ya construiste un objeto miCal de la clase
GregorianCalendar.
1 int maxMes = [Link](MONTH);
Esto no debería estar seleccionado
☹ Está bien invocado el método, con el objeto miCal, pero no reconoce a la constante simbólica MONTH, pues no
está calificada a qué clase u objeto pertenece.
1 int maxMes = GregorianCalendar
.getActualMaximum( MONTH );
1 int maxMes = [Link](
[Link]);
1 int maxMes = [Link](
[Link]);
Correcto
😊 La llamada al método está perfectamente construida pues al método lo llama desde el objeto construido miCal,
mientras que al campo lo selecciona desde la clase GregorianCalendar, ya que es una constante simbólica de clase.
4. Tienes las siguientes constantes simbólicas de clase en una clase cualquiera:
1 public static String EDOCIVIL =

Página 68 de 154
2          “                      “ +
3          “soltero        “ +   
4          “casado          “ +     
5          “viudo            “ +   
6          “divorciado ” +   
7          “union libre”;
Supón que te dan un entero entre 1 y 5 que corresponde a los estados civiles correspondientes en el arreglo. Elige 2
opciones que dado el entero cual, coloca en una variable tipo String llamada edoCivil, la cadena que corresponde al
estado civil de ese entero, suponiendo que cual tiene un valor correcto.
1 String edoCivil = [Link](1, cual);
1 int tam = “unión libre”.length( );
        2 int desde = cual * tam;
        3 int hasta = desde + tan;
        4 String edoCivil = [Link](desde, hasta);
Correcto
😊 Como “union libre” es la cadena más larga, su tamaño nos va a dar el tamaño de cada subcadena presente en
EDOCIVIL. Teniendo este valor procede a calcular donde empieza y termina la subcadena que desea extraer y
después extrae la cadena deseada. Cabe aclarar que el uso directamente del tamaño de la cadena “union libre” no es
del todo adecuado, pues si después se agregaran otras subcadenas a EDOCIVIL y alguna mayor que la usada, se
tendría que recorrer el código para corregir donde haya sido usado este tamaño. Hubiese sido más adecuado usar una
constante simbólica para el tamaño, ya que sólo tendrías un lugar que corregir en caso de cambios.
1 String edoCivil = [Link](cual*11,
      (cual + 1) *11);
1 int tam = [Link] ( ) / 5;
        2 String edoCivil = [Link](cual*tam,                                                                        (cual*1)* tam;
Esto no debería estar seleccionado
☹ Estás considerando que como son 5 estados civiles posibles, la cadena EDOCIVIL tiene un tamaño que es
múltiplo de 5. Pero como cual puede valer de 1 a 5, para ahorrar trabajo en los cálculos se agregó una primera
cadena con blancos que corresponde a la posición 0 (cero), por lo que no se erigiría adecuadamente. Cabe aclarar
que el usar números mágicos como el 5 no es aconsejable, pues si se agregaran subcadenas a EDOCIVIL habría que
revisar toda la clase para ver dónde aparece este número (aunque se hubiese usado 6). Debería haber una constante
simbólica para todos estos números mágicos, de tal manera que si algo cambia sólo se debe modificar en un único
lugar.
5. Supón que tienes una expresión condicional que elige el sabor a partir de una variable entera que se llama sabor:
1 String daSabor = sabor == 1 ? “cereza”               
             2           : sabor == 2 ? “mandarina”   
             3               : sabor == 3 ? “naranja”         
             4                   : “indefinido”;
Elige la cadena de la que podrías extraer estos sabores mediante la expresión
1 [Link](sabor*10, (sabor + 1) * 10;
Suponiendo que se haya verificado que sabor tenga un valor de 0 a 3, con el 0 entregando el valor “indefinido”.
1 String SABORES = “                “ +       
            2         “indefinido”      +         
            3         “cereza”                +         
            4              “mandarina”    +       
            5              “naranja”;
Incorrecto

Página 69 de 154
☹ Esta cadena también tiene recorridos los sabores. Si sabor vale 0 va a entregar una cadena de espacios en blanco y
si vale 1 va a entregar la cadena “indefinido”, por lo que tampoco sirve.
1 String SABORES =       
            2             “cereza        “         
            3           +    “mandarina “     
            4                +      “naranja        “
            5              +    “indefinido”;
1 String SABORES =       
            2         “indefinido”    +         
            3         “cereza”                +         
            4            “mandarina”      +       
            5            “naranja”;
1 String SABORES =    “indefinido”   
            2         + “cereza        “         
            3         + “mandarina “             
            4              +      “naranja”;
6. Supón que tienes un atributo de una clase que es una cadena en la que estás registrando el nombre y apellido de
los participantes en el curso, pero quieres que de cada subcadena los primeros 20 posiciones se refieran al nombre y
las segundas 20 al apellido. Por ejemplo:
1 private final String PARTICIPANTES =
2            “Elisa                              “     
3            + “Viso                                “
4            + “Jaime                              “
5            + “Vazquez                          “   
6            + “Wilfrido                        “         
7            + “Martinez                        “       
8            + /* y así sucesivamente */;
Y así sucesivamente hasta que tengas 40 nombres (del que ocupa el “lugar” cero al que ocupa el lugar 39 ) Quieres
un método que reciba la posición del nombre que quieres, pero empezando en 1 (uno) y como máximo 40, y
devuelve primero el apellido y después el nombre del participante que se solicita, con un único blanco entre el
apellido y el nombre. Elige 2 opciones que funcionan como se pide.
1 public String daParticipante ( String sCual) {
        2    int donde = [Link]([Link]());   
        3    String ret = donde == -1       
        4        ? “El nombre no se encuentra”     
        5        : [Link](donde+20, donde+40)
        6            .trim() + “ “     
        7            + [Link](donde, donde + 20)                                        .trim();
        8            Return ret;}
Esto no debería estar seleccionado
☹ La especificación del método dice que recibe un entero y este método recibe una cadena. La busca en la cadena
PARTICIPANTES y regresa el primer apellido y nombre que encuentra. El problema es que está suponiendo que le
pasan el nombre (supone que localiza el nombre en alguna posición múltiplo de 40) y toma primero el apellido y
luego el nombre, pero puede ser que le pasen el apellido.
1 public String daPARTICIPANTE ( int cual)    {
          2 int tam = 40;
          3 int desdeAp = cual * tam + tam/2;
          4 int hastaAp = desdeAp + 20;

Página 70 de 154
          5 int desdeN = cual * tam;
          6 int hastaN = cual * tam + tam / 2;
          7 return [Link](desdeAp, hastaAp)
          8          + “ “
          9          + [Link](desdeAp, hastaAp);
          10    }
1 public String daParticipante( int cual )    {
          2 int desdeAp = (cual-1) * 40 + 20;
          3 int hastaAp = cual * 40;
          4 int desdeN = (cual – 1) * 40;
          5 int hastaN = (cual – 1) * 40 + 20;
          6 return [Link](desdeAp,hastaAP)
          7                              .trim() + “ “
          8      + [Link](desdeN,hastaN)
          9                .trim();
        10 }
1 public String daParticipante(int cual)    {   
          2 final int TAM = 40;   
          3 return [Link]((TAM-1)*40+20,                                                        TAM*40).trim()
          4            + “ “               
          5            + [Link]((TAM-1)*40,                                    (TAM-1)*40+20)).trim());
     6
        7 }   
Esto no debería estar seleccionado
☹ El método usa como índice en la cadena el tamaño de cada subcadena, lo cual puede resultar en un índice inválido
durante ejecución, además de no usar, para nada, la posición relativa del nombre que se desea, cual; también es
desafortunado el uso de constantes mágicas como 40 y 20 en expresiones.
1 public String daParticipante(int cual)    {
          2 final int TAM = 40;
          3 int tam = (cual - 1) * TAM;
          4 return [Link](tam + TAM / 2,                                              cual * TAM).trim()         
          5 + “ “         
          6 + [Link](tam,                                                                                                Tam + TAM / 2).trim();
     7
     8}
7. Supón que tienes, en una clase cualquiera, un atributo que es una lista de artículos. La posición que ocupa cada
artículo en la cadena, precedida por ceros hasta completar cuatro posiciones, corresponde a su clave. Por ejemplo:
1 private final String ARTICULOS =
2        “                    “    // codigo invalido
3    + “bicicleta ”    // 0001
4    + ”trampolin ”    // 0002
5    + “patines      “    // 0003
6      /* y así sucesivamente */
7    ;
8 private static TAM = 10;
Deseas un método que, dado el nombre del artículo, regrese la cadena que corresponde a su clave (el lugar que ocupa
precedido de ceros que completan el lugar). Elige el código que trabaja correctamente.
1 public String daCodigo( int cual)    {

Página 71 de 154
            2    return [Link]((cual-1)*TAM,
              3          cual*TAM).trim();
     4}
     5
1 public String daCodigo ( String sCual )    {
          2 int donde = ([Link]()).indexOf(ARTICULOS);
          3 int tamCod = “” + (donde / TAM;
          4 String codigo = ((donde == -1
              5              || donde % TAM != 0)
            6 ? “????”
            7 : (“0000” + sCod).substring(0, 4));
          8 return codigo;
    9}
        10
Incorrecto
☹ Este método va haciendo todo bien hasta que arma el código a regresar. Además de verificar que la cadena se
encuentre en la cadena ARTICULOS, también verifica que la cadena empiece en una posición múltiplo de TAM,
pero siempre va a regresar cuatro ceros.
1 public int daCodigo ( String sCual) {
          2      int cod = ([Link]()).indexOf(ARTICULOS)
              3                  / TAM;
          4      return cod;
    5}

1 public String daCodigo ( String sCual )    {


          2        int donde = ([Link]()).indexOf(ARTICULOS);
          3        int indce = donde / TAM;    // 0 si donde == -1
    4
          5        int tamCod = “” + indce;
          6        String codigo = (donde == -1
          7              ? “????”
          8              : (“0000” + tamCod)
          9                    .substring([Link]());
          10 return codigo;
        11 }
[Link] un método que, dado una cadena con un número romano entre uno y diez, regresa el número arábigo al que
corresponde. Elige el código que resuelve este problema de manera adecuada, suponiendo que como atributo de la
clase tiene la siguiente cadena declarada:
1 private final String ROMANOS =
2                                “        “
3                            + “I    “
4                            + “II    “
5                            + “III “
6                            + “IV    “
7                            + “V      “
8                            + “VI    “
9                            + “VII “
10                            + “VIII”
11                            + “IX    “

Página 72 de 154
12                            + “X      “;
13
1 public int daArabigo (String rom)    {
          2      String aBuscar = (rom + “        “).substring(0,4);
          3      int donde = [Link](ROMANOS);   
          4      return donde != -1
          5                        ? donde / 4
          6                        : donde;
        7 }   
    8
1 public int daArabigo (String rom)    {
        2          int donde = [Link](ROMANOS);   
        3          return donde != -1
        4                          ? donde % 4 == 0
        5                              ? donde / 4
        6                              : 0
        7                            : donde;
    8}
   9
1 public String daRomano( int cual)    {
          2        int desde = cual*4;
          3        int hasta = desde + 4;
          4        int donde = [Link](desde, hasta) / 4;
          5        return donde;
    6}
    7
Incorrecto
☹ Este método no cumple con las especificaciones dadas, pues recibe un entero en lugar de una cadena, y entrega
una cadena en lugar de un entero. Si cual es correcta, entrega una cadena con el número romano que corresponde al
entero que recibe.
1 public int daArabigo (String rom)    {
        2          int donde = [Link](ROMANOS);   
        3          return donde != -1
        4                            ? donde / 4
        5                            : donde;
        6    }
    7

4.1 Implementación de un catálogo de discos


Bienvenido a este nuevo módulo, vamos ahora a construir una colección de discos que será un catálogo. El objetivo
principal es programar las actividades del manejo de un catálogo de discos, de los que se pueden solicitar
transmisiones. Daremos una breve descripción, se ofrece un catálogo de discos que ofrece transmisiones. Los
servicios que debe dar ese catálogo, por ejemplo, son: agregar un disco al catálogo, iniciar el catálogo con una
colección de discos ya construidos, mostrar el catálogo de discos, iniciar una transmisión de un disco seleccionado y
registrarla, mostrar los discos que están en transmisión, para una transmisión activa de un disco dado, terminar la
transmisión y liberarla, registrar el fin de una transmisión en el histórico de transmisiones para ese disco, mostrar el
histórico de transmisiones para cada disco, mostrar un menú con las opciones disponibles. Haremos nuevamente
nuestra tarjeta de responsabilidades. La clase se va a llamar Catálogo con mayúsculas, y los datos o atributos que va

Página 73 de 154
a tener el catálogo es un identificador llamado catálogo, "c" con minúscula. Es una colección de discos y, cada disco,
es un objeto. Para el catálogo, debemos tener cuántos discos tiene el catálogo discos y, para cada disco, necesitamos
una colección de fechas que nos dará cuando está iniciando cada transmisión. Para llevar el registro, tendrás un
histórico que es para cada disco, pareja de fechas de cuándo se inició y finalizó la transmisión, también, cuántos
registros tenemos en el histórico. De las responsabilidades que queremos que tenga el catálogo, está primero
"addCatalogo" que agrega un disco al catálogo si es que hay lugar, dice si lo agregó o no, por lo tanto, la salida es
"booleana" y la entrada es un disco. "DaTransmision", registra la transmisión del disco elegido a una cierta hora,
avisa si pudo o no, como entrada recibe la posición del disco y, como salida, me dice si lo pudo registrar o no.
"TerminaTransmisión", le damos la posición del disco en el catálogo y la consola por la que nos va a comunicar,
pregunta de este disco, ¿cuál es la transmisión a eliminar? y transcribe el inicio y final al histórico, avisa si pudo o
no, por lo tanto, regresa una "booleana".
"MuestraCatalogo" te dará una cadena con la lista de discos, como entrada recibe un encabezado, y muestra la lista
de discos dados de alta. "MuestraActivos", regresa la cadena con la lista de discos en transmisión, recibe un
encabezado y da una lista de los discos activos. "MuestraActivas", le doy la posición del disco, regresa una cadena
con la lista de transmisiones activas. "MuestraHistorico", da la lista de transmisiones iniciadas y finalizadas para ese
disco, le doy como entrada la posición del disco y regresa una cadena con el histórico del disco. "MuestraHistorias",
muestra la lista de transmisiones iniciadas y finalizadas para cada uno de los discos, no le doy nada como entrada y,
como salida, me da una cadena con el histórico de todos los discos. Finalmente, tenemos "conectaCatalogo", que es
el que interactúa con el usuario y el catálogo, no recibe ninguna entrada y no entrega ninguna salida. Tenemos los
Constructores, vamos a darle un constructor sin parámetros que construye un catálogo con el máximo número de
posiciones, y todos los arreglos asociados, un constructor que recibe el número de discos, y construye la colección
para acomodar ese número de discos, un constructor que recibe dos parámetros, el máximo número de discos que
puede tener, y una colección inicial de discos, como salida me da un catálogo.
Vas a empezar a programar ese proyecto, para facilitar la lectura en DrJava, le pedirás que enumere las líneas del
archivo, y así, poder referirse a ellas directamente. En la pestaña "edit", le darás clic en preferencias, y ahí en
"Display Options", y te vas a la selección de "Show All Line Numbers", le damos en "aplicar" y al final en "OK".
Vemos que, aún, cuando el archivo está vacío, aparecen los números de líneas. Regresamos al proyecto de catálogo
de discos, tienes que hacer unas modificaciones a la clase Disco. La firma que tienes de "daTransmision" en la
interfaz Servicios Disco es la siguiente.
Vamos a cargar el archivo de Servicios Disco, vemos que el método "daTransmision" no tiene parámetros porque él
mismo calcula el calendario. Abriremos el archivo "Disco".
Ahora, necesitamos tener otro método al que le podamos pasar como entrada la fecha y hora, por lo tanto, para evitar
problemas con la interfaz de Disco, no vamos a modificar este método, sino lo que haremos es hacer uno nuevo.
Cómo sigues cumpliendo con la interfaz, todos los encabezados están contemplados y no tenemos problema en
agregar métodos públicos que no aparecen en la interfaz. La nueva clase Disco seguirá funcionando bien con el viejo
usuario, simplemente, no hará uso de este método. Copiamos el método "daTransmision" junto con su comentario y
lo pegamos a continuación del primero. Lo que tenemos que hacer es actualizar el comentario, porque este método
debe tener un parámetro de tipo "Gregorian Calendar" y viene con fecha y hora en la que se está pidiendo la
transmisión.
Tenemos que corregir, también, el encabezado, recibe un Gregorian Calendar que se llamará "miCal". Debemos
eliminar la línea donde se creaba "miCal", vamos a compilar y vemos que compila bien, cerramos ambos archivos.
La clase correspondiente a cada uno de los discos ya la tienes, empiezas con la clase que va a representar al catálogo
de discos llamada Catálogo. El catálogo de discos debe tener una colección de discos y colecciones asociadas a cada
disco, para llevar la administración de este catálogo. A las colecciones de datos, en general, se les llama estructuras
de datos. Podríamos tener un ejemplo, una bolsa de canicas, estante de discos,o una pila de platos, debes elegir qué
tipo de estructura de datos requieres para representar a las colecciones que están en el catálogo de discos. Por lo
pronto, necesitamos una colección de discos y de fechas que son de "GregorianCalendar", usarás arreglos para
representar las colecciones que necesitas. Los arreglos, los podemos ver como una sucesión de posiciones que
contienen un objeto u otro arreglo, son la estructura de datos más común en programación. Un arreglo es un objeto,
pero por ser tan comunes, nos permiten usar operadores específicos, lo que les da una notación particular concisa

Página 74 de 154
para manejarlos. Los arreglos organizan a datos del mismo tipo, lo que los hace estructuras de datos homogéneas.
Los organiza como listas, formándolos uno detrás del otro, lo que los hace estructuras lineales. Puedes obtener un
dato específico dando su ubicación dentro del arreglo, lo que los hace estructuras de acceso directo.
Una vez construido el arreglo no se puede disminuir o aumentar su capacidad, lo que los hace estructuras estáticas.
Cada elemento de un arreglo puede ser, a su vez, un arreglo, y así, sucesivamente, por lo que decimos que pueden
tener una o más dimensiones, el número de dimensiones queda definido por el número de parejas de corchetes en la
declaración. Si el arreglo es de una sola dimensión, un único renglón queda declarado como sigue. Primero, el tipo
del arreglo, luego, una pareja de corchetes y el identificador. El tipo se refiere al que van a tener todos los elementos
del arreglo que pueden ser primitivos como "int", "boolean", "char", una clase como Disco o GregorianCalendar, o
también puede ser una interfaz. El identificador se nombra con las reglas de Java, es un identificador común, por lo
tanto, va en minúsculas.
Podemos pensar en los arreglos de una dimensión como se muestra en la figura, el número en rojo indica la
ubicación de un elemento en el renglón, lo ponemos entre corchetes. Aquí, en el ejemplo, es "cuatro". Si el arreglo es
de dos dimensiones, uno o más renglones, una o más columnas, queda declarado con la siguiente sintaxis.
El tipo es como en el caso anterior, el tipo que va a tener cada uno de los elementos de la estructura, se usan dos
pares de corchetes para indicar dos dimensiones y se piensa como si fuera una tabla o matriz, pero todas las
columnas son del mismo tipo y se distinguen entre sí por la posición en la que están. La abstracción es una tabla de
este tipo, donde tenemos que empiezan las columnas y renglones en "cero", la posición "dos, cuatro" es en el renglón
número dos, o sea, el tercer renglón y la columna cuatro, o sea, la quinta columna. Aquí, tenemos la posición en el
primer renglón que tiene el índice "cero", y la segunda columna que tiene el índice "uno".
Si el arreglo es de tres dimensiones debe haber tres parejas de corchetes, concebimos un arreglo de tres dimensiones
como "block" de páginas cuadriculadas, una detrás de la otra, y cada página es una tabla de renglones y columnas.
Cada dimensión se enumera desde "cero", la abstracción es de este tipo, como una página seguida de la otra. Por
ejemplo, aquí tendremos la tercera página que tiene el número dos en el primer renglón, que es el número "cero", y
en la cuarta columna que es la posición tres.
Este otro tiene la primera página, que es la posición "cero", en el tercer renglón, que es la posición "dos", y en la
quinta columna que es la posición "cuatro". Vamos a ver la sintaxis para la declaración de un arreglo, primero,
vienen los accesos y modificadores, si es que estamos declarando campos o atributos, pero esto no existe en las
declaraciones locales. El tipo corresponde al de cada uno de los elementos individuales del arreglo, el número de
dimensiones son las parejas de corchetes sucesivas y el identificador. Siguen las reglas de JAVA, se pueden declarar
más de un identificador del mismo tipo separados entre sí por comas, el tamaño de cada dimensión se da hasta que se
haga la definición del arreglo. Veamos unos ejemplos, en este caso, tenemos un arreglo de tres dimensiones de
enteros, es una declaración local, no tiene modificadores y se llama "juegos Ganados", es una tabla de equipos. Aquí
tenemos un arreglo de una dimensión, es privado, por lo tanto, es un atributo, se llama catálogo con minúsculas y es
un catálogo de discos. A continuación, tenemos en lugar de lo que teníamos en disco, que era una cadena, tenemos
un arreglo de cadenas que se llama "NDIAS", es una constante de la clase. Por último, el arreglo de
"GregorianCalendar", que es el histórico, también va a ser un atributo del objeto, y tomamos la clase
GregorianCalendar, declaramos un arreglo de dos dimensiones, el tamaño de cada dimensión se dará en la
construcción. Puedes construir arreglos haciendo una asignación al identificador del arreglo. Esto se puede hacer en
la declaración, lo cual, es obligatorio si se trata de una constante de clase. Tienes dos formas de hacerlo a
continuación de un operador de asignación. Para arreglos "static" y "final" tienes que listar todos los componentes de
cada dimensión entre llaves y separando los componentes por comas, tienen que ser del mismo tipo todos los
componentes. Si, nada más, vas a dar el tamaño de cada dimensión, puedes hacerlo con "new", el tipo que declaraste
en el arreglo, y luego, una sucesión de expresiones enteras dentro de cada pareja de corchetes. Después de "new",
"tipo", excepto por el primero, se puede ir construyendo dimensión por dimensión de izquierda a derecha, dejando el
resto de corchetes vacíos. Por ejemplo, si hiciéramos un arreglo para los días, empezamos con una llave, tendríamos
el lugar "cero" con una cadena vacía, el lugar "uno" con domingo y, esta vez, ya no necesitamos completar con
blancos, porque los vamos a localizar directamente en el arreglo. Es un arreglo de una dimensión, se llama
"NDIAS". Cada cadena ocupa un lugar en el arreglo, pones una cadena vacía en el lugar "cero" para poder usar,
directamente, el número de día entre "uno" y "siete". El contenido del arreglo se da entre llaves, con los elementos

Página 75 de 154
separados entre sí por comas. El número de elementos de una dimensión de un arreglo se obtiene con el atributo
público "length" que está en todo arreglo.
Noten que no es una función, sino un atributo, por lo tanto, no lleva paréntesis. "[Link]" vale "ocho".
Siempre que se tenga constantes simbólicas de la clase "static / final" se deben inicializar de esta manera, pues no
pueden esperar a la ejecución. Para un arreglo de dos o más dimensiones, encierras entre llaves cada dimensión. Por
ejemplo, el arreglo que construimos de "juegos Ganados", podemos iniciar en el renglón "cero" colocando,
exclusivamente, "ceros", en el renglón "uno", en la columna cero, ponemos un "cero", luego, "tres" coma "cero"
coma "cuatro". Nota que están entre llaves cada uno de los renglones, el tercer renglón también ponemos "cero" en la
columna cero, y así, sucesivamente. Es un arreglo de dos dimensiones que se llama "juegos Ganados", no es un
arreglo de constantes como en el caso anterior, sino con valores iniciales, tiene cuatro elementos que son arreglos. En
la primera dimensión, son los renglones del arreglo, está todo entre un par de llaves y tienes una matriz de cuatro
renglones por cuatro columnas, no tienen que ser el mismo número de renglones y columnas. En esta inicialización,
por ejemplo, el primer renglón tiene cuatro "ceros" y cada renglón tiene en la columna cero, un "cero". Este tipo de
inicialización, únicamente, la puedes hacer en el momento de la construcción del objeto o en la declaración. Por
ejemplo si deseas un arreglo de objetos disco, puedes declararlo así.
Tienes un arreglo de una dimensión cuyos elementos son referencias a objetos de la clase Disco, quieres que tenga
"MAX_DISCOS" elementos numerados del "cero" a "MAX_DISCOS" menos "uno". "MAX_DISCOS" debería
estar declarada como constante de la clase en la que está esta declaración o la del tipo del arreglo. Todos los
elementos tienen en este momento "null", una referencia nula como valor. El tamaño puede cambiar si vuelves a usar
"new" con el mismo identificador, pero perderías el contenido que tengas en ese momento. También, podías haber
usado esta construcción en los constructores, o cualquier método.
Si quieres hacer la construcción de arreglos con contenido, se puede usar la inicialización con llaves si este elemento
se lista inmediatamente después de la construcción con "new". Por ejemplo, podemos hacer "juegos Ganados" igual
a "new" de "int", y en el caso de un arreglo, se puede poner entre las llaves invocación.
Vamos a ver la construcción de arreglos con contenido, ya vimos si se pone a continuación de la declaración, pero
también, se puede poner, inmediatamente, a continuación de "new", entonces, no tendría por qué estar en la
declaración. En el caso de un arreglo de objetos se pueden poner entre las llaves invocaciones a los constructores de
los objetos. Por ejemplo; podríamos definir el catálogo usando "new" con "Disco", que es de una sola dimensión y
podríamos poner ahí, cuatro elementos para el catálogo.
El problema con llenar el contenido del arreglo al construirlo, es que el número de elementos queda fijado con el
número de objetos entre las llaves. Por ejemplo, en el catálogo de la construcción anterior, únicamente, va a contar
con cuatro posiciones y no se podrán agregar más discos al catálogo, se puede subsanar este problema listando el
valor por omisión, "cero" para números, "null" para objetos y "falso" para "booleanos", tantas veces como queramos
que tenga el arreglo como tamaño.
En el caso de nuestro catálogo, le agregamos 10 valores "null", esto le daría al arreglo 14 posiciones, diez de ellas
con referencias nulas. Como con cualquier objeto en cualquier elemento, incluso una declaración, puedes construir
un arreglo que no tenga su contenido definido. Haces una asignación al identificador del arreglo, si el arreglo es de
una dimensión, dices cuántos elementos tiene el arreglo con la siguiente sintaxis.
Le das al identificador la palabra "new", luego, el tipo y, después, escribes entre una pareja de corchetes una
expresión entera que entregue un entero. Para esta expresión puedes invocar funciones, hacer aritmética o cualquier
cosa que entregue un entero. Esta expresión dice el tamaño del arreglo con las posiciones o índices empezando en
"cero", el índice mayor que tiene el arreglo es la expresión entera que diste, menos "uno".
Si "tipo" es numérico, el arreglo se llena de ceros, si es "booleano" se llena de valores "false" y, si es de clase o
interfaz, se llena de referencias "null". Los arreglos, como a cualquier objeto, Java los construye en el Heap, que es
el espacio de la memoria de la computadora reservada para ellos. Un arreglo de dos dimensiones es un arreglo de
arreglos. Puedes, primero, definir cuántos elementos va a tener el primer arreglo, lo que hace que se construya una
estructura como la que sigue. Nos vemos en el siguiente video, no te lo puedes perder.

El catálogo y sus estructuras

Página 76 de 154
1. En una clase cualquiera, para la que se importa la clase [Link], se tiene un método que no recibe nada
y entrega el nombre leído usando un Scanner que declara dentro del método:
1 public String daNombre ( )    {
2    Scanner cons = new Scanner ( [Link] );
3    [Link]( “Dame el nombre de la persona”
4                  + “ terminando con un [Enter]--> “);
5    String nombre = [Link]();
6    [Link]();
7    return nombre;
8
Elige 2 opciones que modifican a este método, pero reciben como parámetro un Scanner que se llama sc.
1 public String daNombre ( String nombre )    {
2        Scanner cons = new Scanner ( [Link] );
3        [Link]( “Dame el nombre de la persona”
4                              + “ terminando con un [Enter]--> “);
5        nombre = [Link]();
6        [Link]();
7        return nombre;
8}
9
1 public String daNombre ( Scanner sc)    {
2        // Scanner cons = new Scanner ( [Link] );
3        [Link]( “Dame el nombre de la persona”
4                            + “ terminando con un [Enter]--> “);
5        String nombre = [Link]();
6        // [Link]();
7        return nombre;
8}
9
Correcto
😊 Si el Scanner se pasa como parámetro no tienes por qué asociarlo a la entrada por omisión, pues ya está
construido. Lo puedes usar directamente en la línea cuatro dentro del método, cambiándole el nombre al que se
recibe como parámetro. Tampoco debes cerrarlo, pues se lo están “prestando” al método. Pones un comentario
cuando se construye el Scanner y cuando se cierra
1 public String daNombre ( Scanner sc )    {
2        Scanner cons = sc;
3        [Link]( “Dame el nombre de la persona”
4                            + “ terminando con un [Enter]--> “);
5        String nombre = [Link]();
6      //    [Link]();
7      return nombre;
8
1 public String daNombre ( Scanner sc)    {
2        Scanner sc = new Scanner ( [Link] );
3        [Link]( “Dame el nombre de la persona”
4                            + “ terminando con un [Enter]--> “);
5        String nombre = [Link]();
6        [Link]();

Página 77 de 154
7        return nombre;
8
Esto no debería estar seleccionado
☹ Recibe al Scanner sc como parámetro, pero no usa el que le pasan, sino que declara uno local y usa el local, lo
cuál no es lo que se debe hacer. Si el Scanner que se pasa como parámetro no está asociado a [Link], el resultado
será totalmente distinto al que se desea.
2. Tienes el siguiente método en una clase cualquiera:
1 public int daMax ( int uno, int dos, int tres)    {
2            return [Link](uno, [Link](dos, tres));
3}
4
Elige 2 opciones que modifican el método para que lea el entero uno, recibiendo los otros dos como parámetros y
que debe entregar el máximo de los tres.
1    public int daMax ( int dos, int tres)    {
2    Scanner cons = new Scanner ([Link]);
3    [Link]( “Da un entero”
4            + “terminando con [Enter]);
5    int uno = [Link]();
6    [Link]();
7    [Link]( );
8    return [Link](uno, [Link](dos, tres));
9}
10
1 public int daMax (int uno,int dos) {
2        Scanner cons = new Scanner ([Link]);   
3        [Link]( “Da un entero”
4          + “terminando con [Enter]);
5        int tres = [Link]();
6        [Link]();
7        [Link]();
8        return [Link](uno, [Link](dos, tres));
9}
10
Correcto
😊 Aunque el cambio de nombres de parámetros y variables locales va más allá de lo necesario, este método
funciona exactamente igual que el dado en la pregunta, excepto que uno de los parámetros, el primero que se pasa a
[Link], se lee de una consola que se tiene que abrir (construir) y cerrar dentro del método.
1 public int daMax ( int dos, int tres)    {
   2      Scanner cons;
   3      [Link]( “Da un entero”
       4 + “terminando con [Enter]);
   5      int uno = [Link]();
6        [Link]( );
   7      return [Link](uno, [Link](dos, tres));
8}
9
Esto no debería estar seleccionado
☹ Este método compila bien pues la sintaxis es correcta. Sin embargo, va a avisar que la variable cons puede no
haber sido inicializada, ya que no se construyó el objeto de la clase Scanner. Otro error de lógica es que como no se
Página 78 de 154
consume el fin de línea después de leer el entero, es posible que el mismo no se registre o que el [ Enter] se
considere como una entrada ajena al entero.
1 public int daMax (int dos,int tres,Scanner cons) {   
2        [Link]( “Da un entero”
       3 + “terminando con [Enter]);
   4        int uno = [Link]();
   5        [Link]();
   6        return [Link](uno, [Link](dos, tres));
7}
8
Esto no debería estar seleccionado
☹ No está especificado que el método reciba como parámetro un Scanner, por lo que esta modificación no funciona.
3. Elige 3 opciones que se refieren a estructuras de datos
GregorianCalendar
Correcto
😊 Es una estructura de datos pues contiene diversas unidades de información.
String
Correcto
😊 Es una estructura de datos pues consiste en varios caracteres (o ninguno, si es la cadena vacía).
Disco
boolean
Esto no debería estar seleccionado
☹ No es una estructura de datos pues contiene únicamente una unidad de información.
4. Elige 2 estructuras de datos más comunes en programación en general
Arreglos
Correcto
😊 Desde que surgieron los primeros lenguajes de programación de alto nivel los arreglos eran un ingrediente muy
importante en ellos pues representaban la manera más directa de representar colecciones.
Objetos
Esto no debería estar seleccionado
☹ Si bien en Java los objetos (ejemplares de clases) son el ingrediente principal de tus “programas”, hay lenguajes
de programación populares que no los contemplan o no los manejan como indispensables.
Cadenas
Árboles
5. Elige 4 características que tienen los objetos como estructura de datos.
De acceso directo De acceso secuencial
Homogéneos Dinámicos
No lineal Estáticos
Lineal Heterogéneos
6. Scanner es una clase de Java que puede representar a un archivo en disco o montarse sobre [Link]. Representa
una estructura de datos puesto que es una colección de datos. Elige 4 características que se aplican a un objeto de
esta clase (piensa en cómo es el proceso de lectura en un Scanner)
Heterogéneos Homogéneos

Página 79 de 154
De acceso secuencial Dinámicos
Estáticos No Lineal
De acceso directo Lineal
Esto no debería estar seleccionado
☹ El Scanner va procesando los caracteres conforme el usuario los va tecleando, por lo que el acceso a los
caracteres (elementos de la estructura) es secuencial, Para leer el décimo carácter tienes que haber leído antes los
primeros nueve caracteres, uno después del otro.
Esto no debería estar seleccionado
☹ Como podemos formar en una línea a los caracteres que va procesando el Scanner y forman una línea a ser usada,
no puede pensarse en un Scanner como una estructura no lineal.
7. Elige la opción que complete el siguiente enunciado. El número de dimensiones de un arreglo está dado por:
El número que se da a continuación de new
El número de parejas de corchetes que se dan en su declaración a continuación del nombre del arreglo
El número de parejas de paréntesis a continuación del nombre del arreglo
El número de parejas de corchetes a continuación del tipo de los elementos del arreglo
8. Si tienes lo siguiente:
1 int[][] numeros = new int[4][];
2 numeros[0] = new int {1,2,3};
3 numeros[1] = new int {4,5};
4 numeros[2] = new int { 6};
5
¿Cuál de las siguientes abstracciones corresponde a este arreglo?
opción 4
1 2 3 0
4 5 0
6 0

Incorrecto
☹ Este arreglo tiene tres renglones, no cuatro. En el primer renglón (numeros[0]) tiene cuatro elementos y el
definido tiene tres. En el segundo renglón (numeros[1]) tiene tres columnas y el definido tiene dos; El tercer renglón
(numeros[2]) tiene 2 columnas y el declarado tiene una; no hay ninguna indicación de que el cuarto renglón
(numeros[3]) no haya sido construido.
opción 2
1 2 3
4 5
6

opción 1
1 2 3
4 5 0
6 0 0
0 0 0

Página 80 de 154
Incorrecto
☹ Un arreglo no tiene por qué ser cuadrado (el mismo número de renglones que de columnas). El cuarto renglón
(numeros[3]) nunca es construido o definido, por lo que en esa posición hay una referencia nula, pero ninguna
posición para enteros.
opción 3
1 4 6 0
2 5 0 0
3 0 0 0

9. Si tenemos la siguiente abstracción de un arreglo:


1 5 7
2
3 6 8
4
¿Cómo estaría declarado y definido este arreglo en un único enunciado?
1 int[][] numeros = {{1,5,7}, {2}, {3,6,8},{4}};
1 int [][] numeros = {{1,2,3,4},
              2                          {5,0,6,0},
              3                          {7,0,8,0}};
    4
1 int[][] numeros = {{1,5,7,0},
              2                        {2,0,0,0},
              3                        {3,6,8,0},
              4                        {4,0,0,0}};
    5
1 int[][] numeros = {{1,2,3,4},{5,0,6},
              2                        {7,8}};
    3
10. Elige la definición correcta de un arreglo de dos dimensiones de objetos de la clase GregorianCalendar,
llamado tiempos, con cinco renglones y un objeto no construido en el primer renglón, dos objetos no construidos en
el segundo renglón y así sucesivamente hasta que se tengan cinco objetos no construidos en el quinto renglón.
1 GregorianCalendar[][] tiempos =
            2                                      new GregorianCalendar[5][];
3 tiempos[1] = new GregorianCalendar[1];
4 tiempos[2] = new GregorianCalendar[2];
5 tiempos[3] = new GregorianCalendar[3];
6 tiempos[4] = new GregorianCalendar[4];
7 tiempos[5] = new GregorianCalendar[5];
8
1 GregorianCalendar[][] tiempos =
2                                                    new GregorianCalendar[6][];
3 tiempos[1] = new GregorianCalendar[1];
4 tiempos[2] = new GregorianCalendar[2];
5 tiempos[3] = new GregorianCalendar[3];
6 tiempos[4] = new GregorianCalendar[4];
7 tiempos[5] = new GregorianCalendar[5];
8

Página 81 de 154
Incorrecto
☹ El renglón tiempos[1] ocupa la segunda posición de la primera dimensión, no la primera posición. El arreglo es
de seis renglones y se pidió de cinco.
1 GregorianCalendar[][] tiempos =
2                                                      new GregorianCalendar[5][];
3 tiempos[0] = new GregorianCalendar[0];
4 tiempos[1] = new GregorianCalendar[1];
5 tiempos[2] = new GregorianCalendar[2];
6 tiempos[3] = new GregorianCalendar[3];
7 tiempos[4] = new GregorianCalendar[4];
8
1 GregorianCalendar[][] tiempos =
          2              new GregorianCalendar[5][];
          3 tiempos[0] = new GregorianCalendar[1];
4 tiempos[1] = new GregorianCalendar[2];
5 tiempos[2] = new GregorianCalendar[3];
6 tiempos[3] = new GregorianCalendar[4];
7 tiempos[4] = new GregorianCalendar[5];
8
Incorrecto
☹ El arreglo tiene el número de renglones especificado, pero en el primer renglón (tiempos[0[) no hay elementos; en
cada renglón hay un elemento menos que el especificado.

4.2 Modelo de memoria de Java


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. [Link] 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
Página 82 de 154
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 puntos 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

Página 83 de 154
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

Página 84 de 154
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.

Visualización de la ejecución
Puntos totales de 6
Al usar el visualizador de Java ([Link]/[Link]) en la parte de Visualize Execution tenemos dos
partes distinguibles de las que ya habíamos hablado. Por un lado, tenemos un espacio que se llama “Frames” y otro
espacio que se llama “Objects”. El primer renglón bajo “Frames” dice main:3. Elige la opción que mejor describa el
significado de esta línea.
Se ejecutará la línea 3 del listado, que está en el método main
Correcto
😊 En efecto, la máquina virtual de Java (JVM) está por ejecutar la línea 3 que se encuentra en el método main.
También puedes observar que hay una flecha roja frente a esa línea, que tiene el mismo significado.
El método main tiene 3 enunciados
El método main empieza en la línea 3
Se ejecutó la línea 3 del listado, que está en el método main
2. “Frames” se refiere a lo que algunos llamamos la “pila de ejecución”. Inicia el tutor de java y copia el código que
se encuentra a continuación:
1      public class YourClassNameHere {
2      public static void main(String[] args) {
3              int[] nums = new int[5];
4          nums[0] = 7;
5          nums[1] = 5;
6          nums[2] = nums[0] * nums[1];
7          nums[3] = nums[0] + nums[1];
8          nums[4] = nums[2] + 17;
9          int max = daMax(nums[4], nums[3], nums[2]);
10        [Link]("El maximo es: " + max);
11    }
12    public static int daMax(int uno, int dos,
13                                                                            int tres)    {
14              return [Link](uno, [Link](dos, tres));
15    }
16    }

Oprime Forward hasta que se encuentre frente a la línea 14. Elige 2 opciones que dan la razón por la que uno, dos y
tres aparezcan como variables en la pila y no como elementos de un arreglo, que es lo que se pasa como argumento.

Página 85 de 154
Porque el método daMax no tiene arreglos declarados
Porque los parámetros están declarados como int, no como arreglos, y corresponden a variables locales del
método daMax
Correcto
😊 Si bien los argumentos provienen de un arreglo, como Java pasa sus parámetros por valor y daMax espera tres
enteros, obtiene el valor de las tres posiciones del arreglo y eso es lo que se pasa a daMax.
Porque al pasar Java los argumentos por valor, solo copia el valor de los mismos al método
Correcto
😊 Pasar por valor quiere decir pasar una copia del valor del argumento. Si el método invocado recibe un arreglo, lo
que pasa Java es una copia de la referencia al arreglo.
Porque es más conciso mostrarlo así
3. Elige 2 opciones que dan razones para usar constantes simbólicas como atributos de clase.
1 punto
Sólo se usa una vez en el código
Si cambian de valor sólo hay que modificar el lugar donde están declaradas
Correcto
😊 Esta es una razón válida, pues declarando una constante simbólica o usándola en lugar del número, evita que si
llega a cambiar ese valor sólo hay que modificar en un solo lugar, donde está asignado a la constante simbólica.
Es más fácil escribirlas al momento de codificar
Es más fácil acordarse de un identificador que de un valor
Correcto
😊 Si el nombre de la constante simbólica es adecuado esto será cierto, sobre todo si se refiere a una posición de
algo.
4. Elige la opción que da la razón para tener un entero que indica la última posición ocupada (o la siguiente a ocupar)
asociado a un arreglo.
El entero te da cuántas posiciones ocupa cada elemento del arreglo
El entero te da el último índice que se puede usar con el arreglo para que no dé un índice inválido
El entero te da el tamaño del arreglo para no tratar de usar posiciones más allá de la última posición del arreglo
Porque como un arreglo se tiene que construir con el máximo de posiciones que pudieran ocuparse, no siempre
están todas ocupadas
Correcto
😊 En efecto, si el arreglo puede tener posiciones vacías y las ocupadas son consecutivas, es conveniente tener un
entero que te digas cuántos lugares están ocupados al principio del arreglo.
5. ¿Cuáles de las siguientes opciones son verdaderas respecto a que dos arreglos sean paralelos? Elige 2 opciones.
Dos arreglos paralelos son aquellos declarados con el mismo número de dimensiones
Dos arreglos son paralelos si la primera dimensión en cada uno de ellos es del mismo tamaño
Dos arreglos son paralelos si en la misma posición en cada uno de los arreglos tienen valores relacionados
Correcto
😊 Podemos tener, por ejemplo, un arreglo de cadenas que identifican en cada posición, al nombre de la carrera, y
otro arreglo de enteros, con el mismo número de elementos que el primero, en el que en cada posición está la clave
numérica de la carrera. La posición no tiene que ser en la misma dimensión.
Dos arreglos son paralelos si tienen el mismo tamaño y sus elementos son del mismo tipo

Página 86 de 154
6. Como en el arreglo historico de la aplicación tienes tres dimensiones, pero en la segunda dimensión tienes
siempre dos renglones, uno para inicio y el otro para el final de una transmisión. Puedes declarar una constante
simbólica de clase para referirte a estos renglones. ¿Cuál de las siguientes declaraciones de constantes simbólicas de
clase es la correcta?
1 public final int INICIO = 1, FINAL = 2;
1 Public final static int INI = 0, FIN = 1;
Correcto
😊 La declaración está bien hecha pues son constantes (final) de clase (static) y tiene los valores correctos de 0 para
el inicio y 1 para el final, además de usar identificadores pequeños pero mnemónicos.
1 public static int INI = 0, FIN = 1;
1 public final static int INI = 1, FIN = 2;
Incorrecto
☹ Si bien esta es una declaración de clase, no es de constantes, así que los valores de INI y FIN podrían ser
cambiados inadvertidamente.

4.3 Constructores del catálogo


Bienvenidos a esta segunda lección. La repetición en datos corresponde a una repetición en ejecución, que es lo que
veremos en esta sesión. Empezaremos con los constructores de la clase "Catálogo". En la tarjeta de
responsabilidades tienes escritos tres constructores.
El primero no tiene parámetros y construye un catálogo con el máximo número de posiciones y todos los arreglos
asociados. El segundo tiene un parámetro que es el máximo número de discos que va a tener ese catálogo, por lo que
construye el catálogo y todos los arreglos asociados. El tercer constructor tiene dos parámetros, el número de discos
que es el máximo de discos que va a aceptar, y un arreglo inicial de discos que es con lo que llena algunos de los
estantes de esos discos. Procedes a escribir el código para cada uno de ellos, ahora que ya tienes la construcción y el
uso de arreglos. El constructor sin parámetros aparece así en la tarjeta de responsabilidades. Regresa a un catálogo
y construye un catálogo con el máximo número de posiciones. Como los arreglos asociados al catálogo tienen sólo
referencias nulas, no sabes cuántas localidades construir en lo que corresponde a los discos.
El encabezado con el comentario de Javadoc será así, construye un catálogo, da el máximo número posible de
registros para discos y anota que no tiene todavía ningún disco registrado.
Se construirán los arreglos correspondientes a histórico y fechas, pero únicamente, con su número de renglones o
tablas dependiendo de cuántas dimensiones tenga. Al registrar cada disco, se construirán los arreglos
correspondientes a sus fechas y su histórico. El encabezado es muy sencillo, es público, tiene el nombre de la clase y
no tiene ningún parámetro.
Tenemos que construir un catálogo de una dimensión, por lo tanto, asignamos en el catálogo un arreglo de disco que
tiene como tamaño la constante de clase que declaramos llamada "MAX_DISCOS", esto porque no tenemos
información adicional del número de discos que quiere tener en el catálogo. El segundo atributo que tenemos que
inicializar aquí es avisar que el número de discos es todavía cero. Esto es porque no llevamos ningún disco
registrado. Puedes construir el número de renglones, el mismo que en el catálogo, pero cada renglón tiene un número
de columnas que corresponde al número de transmisiones permitidas para el disco en esa posición.
Como no hay disco, no podemos definir el número de columnas. Vamos a hacer un comentario sobre cómo funciona
el catálogo de discos. El número de posiciones disponibles para registrar transmisiones activas en el arreglo "fechas"
estará dado por el número de transmisiones permitidas del disco en esa posición, que no se sabrá hasta que se
construya ese disco.
El número de posiciones ocupadas estará dado por el número de transmisiones activas del disco en esa posición.
Procedemos a construirlo, y lo que tenemos es que "fechas" es un arreglo de dos dimensiones. Lo construimos con
un arreglo de "Gregorian Calendar" que en la primera posición tendrá el mismo tamaño que el catálogo, que está
dado por el atributo "length". En la segunda posición no sabemos todavía cuántos elementos va a tener en cada uno
de los renglones. Recuerda que en Java podemos tener cada renglón de tamaño distinto.

Página 87 de 154
El arreglo histórico, lo construyes de manera similar a "fechas" ya que el número de columnas dependerá del
número de transmisiones permitidas en el disco. Sabemos que para cada disco necesitamos dos elementos, el de
inicio y final de cada transmisión. Lo que no sabemos es cuántas parejas para estos elementos vamos a tener. Por lo
tanto, la construcción se da como sigue. Histórico, construimos un objeto nuevo de la clase "Gregorian Calendar", es
de tres dimensiones. En la primera dimensión tiene el mismo tamaño que el catálogo. En la segunda dimensión
sabemos que queremos parejas, por lo tanto, le damos dos elementos, y lo que no sabemos es cuántas de estas
parejas vamos a tener, y queda así. Por último, tienes el arreglo "numHist" que dice para cada disco cuál es el
número posible de registros históricos que tiene registrado el disco en cada posición.
Como el catálogo todavía no tiene ningún disco, simplemente construyes el número de elementos necesarios. Como
ya tenemos declarado el atributo, le vamos a asignar un arreglo nuevo de enteros de una dimensión y tendrá el
tamaño de catálogo de discos. Le pondremos un comentario. Como son objetos, los elementos numéricos se inician
siempre en cero, y con eso termina la construcción de este catálogo. Para el siguiente constructor, sabemos que tiene
un parámetro que es el tamaño del arreglo. Vamos a poner su comentario.
Construye un catálogo con espacio para un número definido de disco, que es el número que se le está pasando como
argumento. Los espacios para discos contienen una referencia nula porque no ha sido construido ningún disco.
Se construirán los arreglos correspondientes a histórico y fechas, pero únicamente con su número de renglones o
tablas. Al registrar a cada disco, se completarán los arreglos correspondientes a sus fechas e histórico.
Este constructor recibe como parámetro "numDiscos" que es el máximo número de discos que puede tener este
catálogo y regresa un objeto de su clase. El encabezado lo tenemos dado por la tarjeta de responsabilidades, se trata
de un método público. Es un constructor, por lo que tiene el nombre de la clase. Recibe como parámetros un entero
llamado "numDscs". Nota que "numDscs", el identificador del parámetro, aunque suene igual cuando lo leemos es
distinto a "numDiscos", el identificador del atributo que tenemos para este catálogo.
Colocamos el comentario, verificas que el argumento esté dentro de rangos.
Por lo tanto, declaras un entero dentro del método constructor que se llama "maxDiscos" y vas a usar al método
"checaEntero" que hicimos público en la clase Disco. Por lo que lo podemos preceder con la clase Disco, le das el
mínimo que debemos tener que es uno, el número de discos que nos están pasando en el parámetro, pero no puede
ser mayor que "maxDiscos" que es el tamaño máximo que puede tener cualquier arreglo de este disco.
Una vez definido el tamaño, que va a estar entre uno y "maxDiscos", construimos el catálogo con ese tamaño.
El atributo catálogo es igual a "new" del tipo de objeto que va a guardar, que es Disco. Es de una dimensión y va a
tener "maxDiscos" que es el valor que acabamos de obtener.
Esta es la construcción del catálogo con ese tamaño. Este constructor tampoco nos pasa ningún disco que registrar.
Por lo tanto "numDscs" será igual a cero. Copias del primer constructor lo que hiciste para las transmisiones y lo
pegas. Será igual porque va a registrar el tamaño del catálogo, y con esto terminamos el constructor sin parámetros.
Vamos a agregarle a nuestro código que está encerrando las llaves.
Entonces, el primer constructor en esta llave termina el constructor sin parámetros. Y en esta llave termina el
constructor con el tamaño del catálogo. Veremos después que esto nos ayuda a aclarar qué llaves están cerradas.
Ahora veremos el tercer constructor, y en la tarjeta de responsabilidades nos dice que recibe como entradas el
número de discos y un arreglo inicial de discos.
Lo que procede a hacer es construir un catálogo con tantas posiciones como lo indica el parámetro, y registra tantos
discos como le indique el arreglo "nuevos".
El comentario Javadoc queda como sigue. Construye un catálogo con espacio para un número definido de discos. El
catálogo lo inicializas con el contenido del arreglo que recibes como parámetro. Inicializas el contador de discos
activo relativo al número de discos en el parámetro.
Para aquellos discos que ya están construidos, construyes las columnas del arreglo "fechas" y del arreglo "histórico".
Si el número de lugares solicitados es menor que el tamaño del arreglo que recibes como parámetro, para la
inicialización vas a utilizar este último tamaño para los arreglos que corren paralelos. Este constructor recibe un
parámetro que se llama "numDscs", que es el máximo número de posiciones. Recibe un segundo parámetro que es el
arreglo inicial de discos para el catálogo. En el encabezado tenemos que el método es público, es un constructor de la
misma clase por lo que recibe el nombre de "catálogo". Tiene como parámetros un entero llamado "numDscs" y un

Página 88 de 154
arreglo de discos llamado "nuevos". Lo primero que tenemos que verificar es cuál es mayor, si el valor de
"numDscs" o el tamaño de "nuevos".
Entonces, vamos a definir el tamaño de nuevos. Colocamos nuestra expresión en condicional. Verificamos que no
vaya a ser que "nuevos" sea una referencia nula. Si esto fuera así, entonces, al tratar de sacar el tamaño, abortaría el
programa con un mensaje de error. Entonces, preguntamos si es cierto que "nuevos" sea "null", en cuyo caso el
tamaño de "nuevos" es cero. Y si no es cierto, podemos utilizar a "nuevos" y pedirle su atributo "length".
Hay que decidir el tamaño final del catálogo. Primero, verificamos cuál es mayor entre el número dado, como
tamaño, y el tamaño del arreglo inicial. Utilizaremos la misma variable que nos están pasando como parámetro, y si
"numDscs" es menor que "numNvos", entonces vamos a asignar "numNvos" como valor de "numDscs", y si no
dejamos "numDscs". Ahora queremos saber si "numDscs" está dentro del rango. Nuevamente le pedimos al método
"checaEntero" de la clase Discos, le damos como límite inferior, uno, como valor que le estamos pasando,
"numDscs", y como valor máximo, "MAX_DISCOS". Lo que va a quedar en "numDscs" es un valor válido en todos
los sentidos. Si los discos nuevos son más que el tamaño de "MAX_DISCOS", sólo copiaremos hasta
"MAX_DISCOS", colocamos un comentario. El número de discos a copiar es el mínimo entre el tamaño final del
arreglo y el número de discos nuevos. Por lo tanto, modificamos también "numNvos", le asignamos el valor si
"numNvos" es mayor que "numDscs". Entonces, el valor que va a tener es "numDscs", y si esto es falso se queda con
el valor que tenía. Ahora sí, ya podemos empezar a construir los arreglos. El catálogo es igual a "new" de objetos
Disco, arreglo de una dimensión cuyo tamaño es "numDscs". "NumDscs" lo vamos a ir modificando conforme
vamos copiando los discos. Por lo tanto, lo ponemos en cero, aunque por tratarse de un atributo numérico está en
cero desde que lo declaramos. Después, vamos a dar de alta los renglones para cada disco. Entonces, tenemos
"Gregorian Calendar" y nuevamente le damos el tamaño de la primera dimensión, que es "catá[Link]", y el de la
segunda dimensión lo iremos dando conforme vayamos copiando los discos.
Por último, "histórico" es un arreglo de fechas de la clase "Gregorian Calendar", su primera dimensión va paralela al
arreglo de discos y su segunda dimensión tiene dos elementos, uno para la fecha de inicio y otro para la fecha final.
¿Cuántas de estas parejas vamos a tener? Aún no lo sabemos hasta que sea el disco correspondiente. "NumHist" es
también un arreglo donde, para cada disco, me dice cuántos elementos hay dados de alta y baja. Es un arreglo de
enteros que tiene de tamaño el de "[Link]". Lo que tienes que hacer ahora es copiar cada uno de los discos
que vienen en "nuevos" al catálogo.
Como a la hora de codificar no sabes cuántos discos nuevos hay en el arreglo "nuevos", no puedes simplemente
poner enunciados del tipo de "catalogo" de cero igual a "nuevos" de cero, "catalogo" de uno igual a "nuevos" de uno,
porque ni siquiera sabes si "nuevos" es una referencia nula o si tiene uno o más discos. Por lo tanto, vas a tener que
hacer una repetición en ejecución. Viste ya cómo usar a cada uno de los elementos de un arreglo. Toda repetición
que, en adelante, se llamará "iteración" tiene que tener lo siguiente. Inicialización, que es el valor o valores iniciales
antes de entrar a la iteración. Tiene que tener una expresión "booleana". Si se evalúa a verdadero indica una nueva
ejecución de la iteración. Si se evalúa a falso, sale de la iteración y continúa con la ejecución fuera de ella. Tiene un
bloque que es un enunciado o conjunto de enunciados entre llaves, que indica lo que se va a hacer en cada vuelta o
iteración. Al final del bloque deberá haber una actualización, que es la modificación de los valores que controlan la
iteración para conseguir, en algún momento, que la expresión "booleana" se evalúe a falso y no siga ejecutándose
para siempre. La inicialización sólo se ejecuta una vez antes de entrar a la iteración.
Este es el flujo que tiene una iteración, empieza por la inicialización que se ejecuta, después pasa a evaluar la
expresión "booleana", si es verdadera ejecuta el bloque y si es falsa continúa después de la iteración. Y, por último,
después de ejecutar el bloque se ejecuta la actualización. Algunas veces se piensa que se ejecuta la actualización la
segunda vez que se trata de entrar al bloque. Por último, se regresa a evaluar la expresión "booleana", y así hasta que
la expresión sea falsa. La iteración que usarás más frecuentemente, sobre todo para recorrer arreglos, es la que se
conoce como "for" y su sintaxis es, está el "for", luego entre paréntesis está la inicialización, que es una expresión de
asignación generalmente, terminamos con un punto y coma, después viene una expresión "booleana" con un punto y
coma y, por último, una actualización. Se cierran los paréntesis y viene el bloque, que puede consistir de uno o más
enunciados.
Puedes ver que en su sintaxis están todos los componentes de una iteración que mencionamos antes.

Página 89 de 154
Guardemos nuestro archivo que tenemos, se llamará "catálogo" porque el encabezado dice clase Catálogo, y en el
subdirectorio, "Discos". Nos vemos en el siguiente video.

Constructores del catálogo de discos


Puntos totales de 7
1. Elige la opción que explica la diferencia, en la clase Catalogo, entre el constructor sin parámetros y el constructor
que tiene como parámetro el tamaño máximo de los arreglos.
El que no tiene parámetros no construye los arreglos especificados, mientras que el que tiene un parámetro sí lo
hace
El que no tiene parámetros construye los arreglos definiendo únicamente la primera dimensión de cada arreglo y
el que tiene un parámetro construye esa dimensión de tamaño con el máximo entre 1 y el mínimo del tamaño dado
como máximo permitido y el pasado como parámetro
El que no tiene parámetros construye únicamente todas menos la última de las dimensiones en los arreglos (en
caso de una sola dimensión la construye), sin darles contenido y la primera dimensión dada por el máximo
especificado para la clase, mientras que el que tiene un parámetro hace lo mismo, pero el tamaño de la primera
dimensión está dado por el máximo entre 1 y el mínimo del tamaño dado como máximo permitido y el pasado como
parámetro
Correcto
😊 Esta explicación cubre todos los aspectos deseados, pues habla sobre el número de dimensiones de los distintos
arreglos. Ninguna de los dos constructores coloca algo en los arreglos, por lo que los atributos numéricos se
inicializan en 0 mientras que los atributos de objeto se inician en null.
El que no tiene parámetros construye los arreglos con el máximo permitido por la clase mientras que el que tiene
como parámetro el tamaño, lo construye exactamente de ese tamaño
2. Elige la opción que mejor explique la diferencia entre las características de los identificadores Catalogo y
catalogo en el proyecto
Ambos representan a la misma colección de discos, nada más que Catalogo es el nombre de la clase mientras
que catalogo es un arreglo
Catalogo es el identificador, en nuestro proyecto, de una clase mientras que catalogo es el identificador de un
atributo de la clase Catalogo.
Correcto
😊 catalogo representa a la colección de discos, a secas, mientras que Catalogo representa a la colección de discos
con métodos y atributos, además de catalogo.
Representan lo mismo en el proyecto, nada más que uno se escribe con mayúscula y el otro no
Como Catalogo se escribe con mayúscula representa a una clase o interfaz, mientras que como catalogo se
escribe con minúscula representa a algún atributo de clase
3. Al elaborar la documentación del tercer constructor con dos parámetros, hay errores en esta documentación, que
no va a permitir que se ejecute la pestaña que dice Javadoc o que se genere la documentación para este constructor.
Elige la opción que describe dichos errores.
Faltan los acentos para que pueda ser leído por un humano al generar la documentación
El comentario de Javadoc empieza con /* y debería empezar con /**. Además, el identificador a continuación
del segundo @param debería ser nuevos, no nuevo, pues este último no es el identificador del parámetro
Correcto
😊 En efecto, ni siquiera trataría de usar este comentario al generar el documento de Javadoc porque como no
empieza el comentario con /**, no lo considera para la documentación. Al corregir este error aparece un error al
ejecutar Javadoc que dice que el nombre a continuación de @param no se encuentra en el método como parámetro.

Página 90 de 154
No tiene punto y coma al terminar el comentario, antes de */
Dice en el primer renglón: Construye un catálogo y debería decir Construye un Catalogo
4. Supón que tienes declarado un arreglo de enteros de tres dimensiones y sabes el tamaño de solo una de ellas. Elige
la opción que tiene la sintaxis correcta de la construcción del arreglo, cuando el tamaño se llama tam y el arreglo de
tres dimensiones se llama arreglo3.
1      arreglo3 = new int[tam];
1      arreglo = new int[tam][];
1      arreglo3 = new int[tam][][];
Correcto
😊 Como para Java un arreglo de más de una dimensión es un arreglo de arreglos (como viste anteriormente en la
visualización), este arreglo construye el primer vector de referencias con un cierto número de elemento, que a su vez
son referencias nulas, y espera a que cada una de esas referencias se defina.
1      arreglo3 = new int[][tam];
5. De los siguientes enunciados for, elige 2 opciones que tengan una sintaxis correcta, suponiendo lo que se usa
debidamente declarado.
1 for( i < [Link]; i++; i=1) {}
1 for int i=1; i <= [Link]; i++;
1 for ( arreglo[0] = 1; i < [Link]; i++);
Correcto
😊 Este es un enunciado for correcto sintáctimente hablando, pues tiene una asignación antes del primer “;”, una
expresión booleana antes del segundo “;”, una asignación para la actualización y un enunciado vacío (;) para el
bloque.
1 for ( int i = [Link](arreglo);         
                    i < [Link];   
                    [Link]()) {}
Correcto
😊 La sintaxis es correcta si suponemos que el método daMax entrega un entero y que llenaArreglo() hace algo,
pero tiene como valor de regreso void. Ambos son enunciados, por lo que tenemos al primer y tercer componente
como enunciados. El segundo componente, dado arreglo declarado como un arreglo, sin importar el número de
dimensiones, es una expresión booleana por lo que también es correcta. Por último, el bloque a ejecutarse es un
bloque vacío ({ }) por lo que este for compila bien.
6. Supón que tienes un for con la siguiente forma:
1 for (int i= 0; false; i++)     
2          [Link](“Auxilio”);
Elige la opción que justifica por qué Auxilio no se va a escribir ni una sola vez al ejecutarse este código.
El segundo componente del for no es una expresión booleana porque es una constante
El for no incluye al enunciado que escribe
La expresión booleana es la constante false, por lo que se evalúa a falso inmediatamente y no entra al bloque del
for
Correcto
😊 Una constante o variable es una expresión, por lo que la expresión booleana, siendo la constante false, hace que la
ejecución salga inmediatamente de la iteración sin ejecutar su bloque o enunciado.
El enunciado que escribe debería estar entre llaves

Página 91 de 154
7. De lo que has revisado hasta ahora, elige la descripción de sintaxis del for que sea correcta.
1      for (<enunciado o bloque>;
                    2                  <expr booleana>;
                  3                  <enunciado o bloque>)
             4                  <enunciado o bloque>
1 for (<inicia> ; <booleana>; <actualización>)            <enunciado o bloque>
1 for ( <bloque>; <expr booleana>; <bloque>)       
                                          <enunciado>;
1 for (<enunciado> ; <expr booleana>; <enunciado>)
             <enunciado o bloque>
Correcto
😊 Esta es una descripción sintáctica correcta, siempre y cuando el primer y tercer componente del for los
consideremos como enunciados sin punto y coma (;), aunque el enunciado a ejecutar en el “cuerpo” del for, el
enunciado tiene que tener su punto y coma.

4.4 Iteraciones

Bienvenido a este nuevo video. Para ver iteraciones, vamos a hacerlo en un archivo separado para ilustrar algunas de
ellas. Por lo tanto, vamos a abrir un nuevo archivo. A este archivo no le vamos a poner mayor comentario, porque es
simplemente prueba de iteraciones. Entonces, no vamos a perder el tiempo con la documentación de Javadoc, no lo
vamos a usar en ningún otro archivo.
Lo vamos a hacer en una clase. Vamos a declarar una clase pública y que se llame simplemente como la lección en la
que estamos, módulo 3, lección 2. Abrimos sus llaves y vamos a empezar por declarar un método que va a calcular
los primeros n múltiplos de 3. El método lo hacemos público. Lo vamos a hacer de la clase para poderlo probar sin
necesidad de construir objetos. No regresa nada, simplemente va a imprimir y se llama múltiplo de 3, mult3.
Y tiene como parámetro un entero que es n, que me va a decir los primeros n múltiplos que queremos. Llamamos a n
el parámetro formal de este método. Lo que va a hacer este método es simplemente va a hacer un for. Va a empezar
declarando una variable i y le va a dar un valor inicial de 1. Esta es la inicialización del for. Lo siguiente que vamos a
hacer es dar la expresión booleana, entonces vamos a hacer, mientras i sea menor o igual a n, el igual es para que
incluya a n. Este es un comentario. Esto es la expresión booleana del for, que el for se va a ejecutar mientras sea
cierta. Por último, tenemos qué va a hacer al final de cada ejecución del bloque. Lo que va a hacer es simplemente
autoincrementar a la i. Con eso cerramos el encabezado del for.
Y lo que vamos a hacer aquí es colocar el comentario de que esta es la actualización. Con esto vamos a hacer un solo
enunciado, que es que escriba en la consola el valor de i multiplicado por 3. Pero, además, le vamos a poner una
cadena que es simplemente un tabulador para que separe los números que estamos imprimiendo. Cerramos el print.
Y hay que notar que no estamos imprimiendo un cambio de línea porque estamos usando print. Para eso es el
tabulador. Así todos los múltiplos quedarán en la misma línea. Al terminar con el for, cuyo cuerpo es simplemente un
renglón, vamos a poner en comentario que este es simplemente el bloque del for. Entonces, al terminar, noten cómo
está alineado con el for, porque no está dentro del for. Lo que vamos a hacer aquí es simplemente escribir un cambio
de línea dándole al println una lista vacía. Una vez hecho esto, termina el método y solito lo alínea con el principio
del método.
Queremos probar nuestro método. Por lo tanto, vamos a escribir un método main, cuyo encabezado es public, static,
void, main. Y tiene como parámetros un arreglo de cadenas que generalmente se les denomina args. Algunas
personas les llaman entradas. Lo importante es usar el mismo nombre adentro de main si se usa. Y nosotros no lo
estamos usando adentro. Entonces, lo que queremos hacer aquí es llamar a la función mult3. Como es una función
estática, vamos a poner [Link] y escribimos un encabezado para esta función. Ejecución de mult3.
Después vamos a llamar a mult3 y lo llamamos, por ejemplo, con el valor 5. Terminamos main y terminamos la
clase. Podemos guardar el archivo. Lo vamos a guardar otra vez. Nos da el nombre de la clase, nos parece bien.

Página 92 de 154
Cerramos el catálogo, porque si tratamos de compilar mod3, lección 2, va a tratar de compilar catálogo también y
eso va a hacer que nos dé errores, porque lo estamos dejando incompleto.
Entonces, lo que vamos a hacer es cerrar este archivo para que quede únicamente mod3, lección 2. Y ahora sí.
Compilamos. Solo compilé el archivo que tiene cargado. Nos dice que la compilación está terminada y no hubo
errores. Por lo tanto, ahora ejecutamos y vemos cómo nos da los primeros cinco múltiplos de tres, 3x1, 3x2, 3x4 y
3x5. Vamos a declarar ahora otro método mult3, pero que escriba cada múltiplo en su línea separada.
Entonces, otra vez es un método público, static tampoco regresa nada. Se llama mult3B y también recibe como
parámetro un entero n. Vamos a copiar el contenido del método mult3. Y nos movemos a continuación de la llave y
lo copiamos. Nos movemos a continuación de la llave y pegamos. Lo único que queremos realmente modificar aquí
es que en lugar de escribir en la misma línea, lo escriba en línea distinta. Sigue teniendo un enunciado en el bloque y
you no necesitamos que escriba una línea separada, pero de todos modos lo vamos a hacer. En main, vamos a
agregar que ahora nos escriba [Link] y que avise que ahora se trata de la ejecución de mult3B.
Y a continuación invocamos a mult3B con el mismo argumento, 5, para que veamos la diferencia. Nuevamente
compilamos. Y le pedimos que ejecute. Vamos a ver cómo se ejecutó.
Agrandamos la pantalla de la salida y vemos que mult3 puso todo en la misma línea, mientras que 3B hizo
exactamente lo mismo, pero los puso en su propia línea.
Regresamos a ver nuestra pantalla de nuestro programa. Si la declaración de la variable i la hiciéramos afuera del
método, vamos a intentar a ver qué pasa en otro método que hace exactamente lo mismo, pero que trata de declarar.
Escribimos public, static, void, mult3, que tiene un parámetro formal n. Y nuevamente vamos a copiar el método,
porque lo que queremos es hacerle cambios leves. Entonces copiamos aquí.
Lo volvemos a copiar al final de la línea. Queremos aquí declarar una i que esté afuera. Y declararla con un valor
inicial de cero. Entonces, vamos a ver qué pasa si tratamos de compilar. En realidad, esta i de acá debería de ser
distinta a esta i de acá, porque está dentro del bloque del for, pero lo que me dice es que la variable i you está
definida en el método. Por lo tanto, podríamos eliminar int y no declararla en el for. Entonces, you compila
perfectamente. Este valor de cero se sustituye por el de uno. Agregamos. I quedó con el valor y luego le pego la i,
entonces compilamos. Otra vez vamos a copiar para no tener que escribir todo otra vez. Copiamos y la ejecución de
la que estamos hablando es de mult3C. Y aquí invocamos a mult3C. Entonces vamos a compilar nuevamente y
ejecutamos. Otra vez vamos a extender la pantalla de la ejecución. Entonces, aquí en la ejecución de mult3C me dice
que la i quedó con el valor 6, porque 6 es el que hace que la i you no sea menor o igual que el argumento que le
pasamos, que era 5.
Cualquiera de los tres componentes de un for puede encontrarse fuera del encabezado del for. La inicialización se
puede hacer antes del for. Podríamos aquí tener vacío el primer componente del for. Si la expresión condicional no
aparece, entonces la condición es por omisión verdadera, true, lo que haría que el bloque se ejecutara por siempre.
En este caso, la única forma de salir de la iteración sería mediante un enunciado condicional dentro del bloque que
sacara la ejecución de la iteración. La actualización se puede colocar al final o principio del bloque del for en lugar
de ponerla en el encabezado y tener una actualización vacía. Veamos un ejemplo donde se mueva a la inicialización
y a la actualización fuera del encabezado del for. Entonces vamos a copiar aquí. Declaramos nuevamente. Marcamos
todo el método mult3C desde arriba hasta donde se termine. Y lo copiamos. Marcamos todo el método public, static,
mult3C desde el renglón anterior hasta donde termina. Lo copiamos y lo colocamos inmediatamente debajo de
mult3C. Le cambiamos el encabezado a que sea mult3D. Si hacemos aquí la inicialización, pondríamos 1.
Entonces, la inicialización está vacía. La condicional la vamos a dejar como estaba, pero vamos a dejar vacía la
actualización. Noten que los puntos y comas de todos modos deben aparecer. Pero ahora, you se trata de un for que
tiene un bloque más grande. Porque además de escribir lo que tiene que hacer, ahora es hacer la actualización de la i,
entonces, aquí ponemos al final i++. Si lo pusiéramos al principio, empezaría a calcular en 2. Cerramos el bloque.
Pero antes, vamos a reorganizar esto. Como se trata de un bloque, debe estar más anidado y cerramos el bloque del
for. Esto de acá se ejecuta al final y se cierra el bloque del método. Esto debería estar lineado a la izquierda. Se está
haciendo bolas por los puntos y coma. Ahora vamos a compilar. En efecto, compiló bien.
Y vamos a agregar la ejecución de mult3D, y vamos a ver que hace exactamente lo mismo, nada más que cambiamos
el encabezado para que sepamos quién se está ejecutando y cambiamos la invocación. Compilamos, corremos y

Página 93 de 154
vamos a ver la ejecución completa. Como pueden ver, mult3D hizo exactamente lo mismo que mult3C, a pesar de
que el for no era exactamente el mismo. Regresamos a nuestro código.
Si tenemos una expresión vacía, si aquí no pusiéramos ninguna expresión booleana por ejemplo, el método se
ejecutaría por siempre. No hay ninguna razón para que el método dejara de ejecutarse.
Se puede salir del bloque si hay algún enunciado condicional que tenga un break para salir de la iteración, o un
return que también me hace salir del método. ¿Por qué digo un enunciado condicional? Porque si le pongo un break
así nada más, la primera vez que entre, esa primera vez va a salir. Podemos tener un encabezado de un for que no
tenga ninguno de los tres componentes, en este caso, el bloque de la iteración se repite indefinidamente y su
ejecución dependerá de en qué consiste el bloque. Veamos antes otro ejemplo de iteraciones recorriendo un arreglo.
Tienes un arreglo de números reales de dos dimensiones. En el primer renglón se encuentran las calificaciones.
En el segundo renglón, los porcentajes que cada calificación aporta al promedio. Podemos verlo así.
Vamos a borrar todo el contenido del método main para que no nos esté molestando, y vamos a declarar aquí, dentro
de main, ese arreglo del que estamos hablando. Queremos un método que saque el promedio. Nuevamente lo vamos
a declarar como estático, pero esta vez sí nos regresa un Double, se llama promedio, y tiene como parámetro un
arreglo de Double de dos dimensiones. Como dijimos antes, ese arreglo se llama num. Veamos en qué consiste el
método. Tenemos que tener un acumulador que me diga de cuánto queda el promedio. Entonces, vamos a declarar un
Double prom, y como vamos a ir acumulando ahí los valores que tenemos, lo tenemos que inicializar en cero.
También tenemos un entero k, que me va a permitir recorrer el arreglo. Declaramos una variable que me dé el
número de columnas o tamaño del primer renglón, para no tenerlo que invocar en cada vuelta del for, y este consiste
del tamaño del primer renglón del arreglo. Vamos a hacer un for para recorrer el arreglo, y vamos a hacer la
inicialización poniendo prom igual a cero.
Luego, una coma, y k, la vamos a inicializar también en cero, porque las columnas empezarán en cero.
Lo que queremos es que se ejecute el for mientras k sea menor que el tamaño que calculamos.
Es aquí donde decía que como la expresión booleana se evalúa en cada vuelta, no quería en cada vuelta estar sacando
el tamaño del arreglo. Y la actualización consiste en autoincrementar a la variable k.
Veamos en qué consiste el for. Lo que queremos es que, en cada vuelta con el valor de k, queremos multiplicar lo
que está en el primer renglón del arreglo con lo que está en la k ésima columna del arreglo por su peso en la
calificación. Entonces, es lo que está en el segundo renglón del arreglo, por lo que está en la misma columna.
Queremos que eso quede guardado en lo que tenía prom, más, igual ese número que estamos calculando. Y es lo
único que vamos a hacer en el for.
Como tenemos que regresar ese promedio, lo que hacemos después del for es return prom y termina el método.
Podríamos haber hecho todo en la parte de actualización porque podríamos poner esta expresión antes de que se
ejecute, y poner aquí una coma igual que en el caso de la vez pasada.
Y luego tener un enunciado vacío. Borramos por supuesto esto, y vemos que el método lo terminamos.
Aquí me está poniendo la llave que cierra a la izquierda, por lo tanto, me falta quitar esta llave que cierra que puse
por error. Y ahora sí, la llave se alinea con public, static, void.
Entonces, si aquí en main declaramos un arreglo anónimo que se crea el vuelo, decimos, new double, decimos que es
de dos dimensiones, e inmediatamente abrimos la llave que tiene a las dimensiones como you vimos antes.
Entonces, vamos a poner aquí el primer renglón que consiste en las calificaciones.
8.75, 10, 4.25, 6.67, 8.3. Terminamos el primer renglón.
Escribimos el segundo renglón que tiene que tener el mismo número de elementos.
El primer elemento vale 25%, el segundo elemento vale 15%, el tercer elemento vale 30%, el cuarto elemento vale
20%, y el quinto elemento vale 10%. Cerramos este renglón y colocamos sus respectivos comentarios, calificaciones
y estos son los porcentajes. Cerramos el arreglo.
Ahora, como dije antes, este va a ser un arreglo que se va a construir en el momento de llamar al método. Podemos
llamar al método como [Link], y decimos que queremos el promedio de este arreglo. Cerramos el
paréntesis de la llamada a promedio y el último paréntesis de [Link]. Y ponemos el punto y coma. Aquí cierra el
método main. Vamos a compilar para ver si está todo bien. Al compilar se guarda el archivo y me marca algunos
errores. Olvidamos colocar una llave al inicio de los porcentajes. La agregamos, compilamos de nuevo, y hay un

Página 94 de 154
error más que me está avisando que modifiqué este método, y se va a ejecutar para siempre, por lo tanto, nunca va a
salir. Entonces, le regresamos la condición para que no se ejecute toda la vida.
Compilamos, y listo. Te espero en el siguiente video.

4.4 Repetición en Java          Puntos totales de 10


1. Inicia DrJava y copia el archivo [Link] que elaboraste en esta lección. O bien cárgalo de la lectura
anterior. Compila y ejecuta.
Elige la opción que represente el resultado que se imprime.
7.59
7.19
Promedio = 7.19
Promedio = 7:59
2. Si declaras el arreglo inmediatamente antes del [Link], y llamas al arreglo que declaraste califs,
¿Cuáles códigos a continuación corresponden a esta declaración? Elige 2 opciones correctas.
1 double[][] califs = {{8.75, 10.00, 4.25, 6.67, 8.3},                                          // calificaciones            {0.25, 0.15,
0.30, 0.20, 0.1}      // porcentajes}; // fin del arreglo

Página 95 de 154
1 double califs[][] = {{8.75, 10.00, 4.25, 6.67, 8.3},                                          // calificaciones     
        2         {0.25, 0.15, 0.30, 0.20, 0.1}      // porcentajes
                        }; // fin del arreglo
1 double califs = new double [ ][ ] {             
    2 {8.75, 10.00, 4.25, 6.67, 8.3}, // calificaciones           
    3 {0.25, 0.15, 0.30, 0.20, 0.1}      // porcentajes       
        4 };    // fin del arreglo
1 double[][] califs = {8.75, 10.00, 4.25, 6.67, 8.3},                                          // calificaciones       
        2                {0.25, 0.15, 0.30, 0.20, 0.1}      // porcentajes
        3    }; // fin del arreglo
3. Una vez que tienes la declaración correcta del arreglo antes de [Link], ¿cómo debe ser la llamada
dentro del println para que imprima “Promedio = “ (sin las comillas), seguido del valor obtenido por la invocación
del método promedio?
1 [Link]( promedio ( califs ));
1 [Link](“Promedio = “);
        2 [Link]( promedio ( califs ));
1 [Link](“Promedio = “ + promedio ( califs ));
1 [Link](“Promedio = “, promedio ( califs[][] ));
4. Elige la opción que responda la siguiente pregunta: ¿Cuál es el enunciado que cambia la tercera calificación de
4.75 a 8.25?
1 califs[3] = 8.25;
1 califs[0][3] = 8.25;
1 califs[0][2] = 8.25;
1 califs[1][3] = 8.25;
5. Elige la opción que responda la siguiente pregunta: ¿Cuál de las siguientes codificaciones hace lo mismo que
mult3B pero que únicamente imprime los múltiplos de 3 que sean pares?
1 public static void mult3Pares ( int n)  {
              2         for (int i = 2; i <= n; i += 2)     
               3         [Link] ( (i * 3 + "\t");
            4             /*  ... continua ... no esta ya en el for */
        5            [Link](); // aca no conoce a i
    6}
    7
1 public static void mult3Pares ( int n)  {
      2         for (int i = 1; i <= n; i ++)     
      3         [Link] ( (i + 1) * 3 + "\t");
     4       /*  ... continua ... no esta ya en el for */
     5       [Link](); // aca no conoce a i
    6}
    7
1 public static void mult3Pares ( int n)  {
      2         for (int i = 1; i <= n; i +=2)     
      3         [Link] ( i * 3 + "\t");
     4         /*  ... continua ... no esta ya en el for */
     5       [Link](); // aca no conoce a i
        6      }

Página 96 de 154
    7
1 public static void mult3Pares ( int n)  {
      2         for (int i = 1; i <= n; i += 2)     
      3           [Link] ( (i * 2 * 3 + "\t");
     4       /*  ... continua ... no esta ya en el for */
     5     [Link](); // aca no conoce a i
    6}
    7
6. Supón que tienes un método que obtiene el promedio de un estudiante, pero en lugar de recibir un arreglo de dos
dimensiones recibe uno de una dimensión en el que cada calificación va seguida del porcentaje que esa calificación
representa en el promedio final:
calif % calif % calif %
Este método se encuentra también en la clase [Link]. Lo queremos llamar desde main sin construir un
objeto. ¿Cuáles de los siguientes es son el los encabezados correctos? Elige 2 opciones correctas.
1 public static double promedioB( double[][] califs)
Esto no debería estar seleccionado
☹ La firma de este método no es correcta ya que recibe un arreglo de dos dimensiones y la especificación dice que
tiene que ser un arreglo de una dimensión.
1 public static double promedioB (double[] califs) 
1 public static void promedio (double[] califs)
Esto no debería estar seleccionado
☹ Este método no regresa nada, por lo que no sigue las especificaciones dadas de que tiene que regresar el
promedio.
1 public static double promedio (double[] califs)
7.
Pregunta 7
Elige la opción que responda la siguiente pregunta: ¿Cuál de las siguientes declaraciones de arreglos daría el mismo
resultado que el método promedio original, pero con el nuevo método que espera un arreglo de una dimensión como
el descrito en la pregunta anterior?
calif % calif % calif %

1 double [] califs = {8.75, 0.25,
         2        10.0, 0.15,
         3        4.25, 0.30, 
         4        6.67, 0.20, 
         5        8.3, 0.1};
     6
1 double[] califs = {8.75, 10.00, 4.25, 6.67, 8.3, 
       2                                  // calificaciones
       3 0.25, 0.15, 0.30, 0.20, 0.1};      // porcentajes
    4
1 double [] califs = {{8.75, 0.25},
         2        {10.0, 0.15},
         3        {4.25, 0.30}, 
         4        {6.67, 0.20}, 
         5        {8.3, 0.1}};
     6
Página 97 de 154
1 double[][] califs =        
        2      {8.75, 0.25,
       3        10.0, 0.15,
       4        4.25, 0.30, 
       5        6.67, 0.20, 
       6        8.3, 0.1};
    7
8. Supón que tienes ya el encabezado correcto en el método como se especificó en la pregunta 6. En el método tienes
las siguientes declaraciones al empezar, suponiendo que tiene como parámetro formal al arreglo califs de double de
una dimensión, con las calificaciones y los porcentajes alternados, empezando por las calificaciones (calif[0],
califs[2], califs[4]... contienen calificaciones mientras que califs[1],califs[3],caifs[5]... contienen el procentaje a
aplicar a la calificación en el lugar anterior):
1 (encabezado)   {
     2 int tam = [Link];
3 double prom = 0;
     4 int i = 1;    
5
¿Cuáles es el for que suma cada calificación multiplicada por su porcentaje? Elige 2 opciones correctas.
1 for ( i = 0; I < tam; i++)  {
        2       prom = prom + califs[i] * califs[ i+1 ];
        3        i ++; 
     4}
     5
1 for (i=0, prom=0; i < tam; i++)   
      2          prom += califs[i] * califs[i+1];
1 for (i = 0; i < tam; i += 2 ) 
        2        prom += califs[i] * califs[i+1];
    3
1 for (int i = 0; i < tam; i++)   {
        2          prom += califs[i] * califs[i  + 1];
        3          i++;
    4}
    5
9. ¿Cuáles de los enunciados for que siguen imprime en pantalla lo siguiente? Elige 2 opciones correctas.
11
2 1  2
3 1  2  3
4 1  2  3  4
5 1  2  3  4  5
6 1  2  3  4  5  6
7
1 for (int i = 1; i <= 6; i++)   {// para los renglones
        2          for (int j = 0; j < i ; j++) // para las columnas
       3                    [Link] (“” + (j + 1) + “\t”);
     4            [Link]();
    5}
    6

Página 98 de 154
1 for (int i = 0; i <= 6; i++)   // para los renglones
        2        for (int j = 1; j <= i ; j++) // para las columnas
       3                [Link] (“” + j + “\t”);
        4        [Link]();
    5
    6
1 for (int i = 1; i <= 6; i++)      {// para los renglones
        2          for (int j = 1; j <= 6 ; j++) // para las columnas
        3                  [Link] (“” + j + “\t”);
        4          [Link]();
    5}
    6
1 for (int i = 1; i <= 6; i++)  {  // para los renglones
        2          for (int j = 1; j <= i ; j++) { // para las columnas
       3                   [Link] (“” + j + “\t”);
        4          [Link]();
     5}
     6
10. Tienes un arreglo de frecuencias de tamaños de palabras y quieres escribir un histograma. Por ejemplo, si en los
tamaños 5 y 6 tienes respectivamente 13 y 10, los renglones correspondientes deberían verse como sigue:
1 5  *************
2 6  **********
¿Cuál de los siguientes métodos de clase hace este trabajo?
1 public static void histograma( int [] frecs)  {
        2              int tam = [Link];
       3             for (int i = 1; i <= tam; i++)  {
       4                      [Link](i + “\t”);
       5                      for (int j = 0; j < i ; j++) 
       6                                [Link](“*”);
       7                      [Link]();
        8              }
     9}
        10
1 public static void histograma( )  {
        2            int tam = [Link];
        3            for (int i = 1; i <= tam; i++)  {
       4                  [Link](i + “\t”);
       5                  for (int j = 0; j < frecs[i]; j++) 
       6                            [Link](“*”);
       7                  [Link]();
        8            }
     9}
        10
1 public static void histograma( int [][] frecs)  {
        2          int tam = frecs[0].length;
        3          for (int i = 1; i <= [Link]; i++)  {
       4                [Link](frecs[i] + “\t”);
       5                for (int j = 0; j < frecs[i][j]; j++) 
Página 99 de 154
       6                            [Link](“*”);
       7                [Link]();
        8            }
          9    }
        10
1 public static void histograma( int [] frecs)  {
        2          int tam = [Link];
        3          for (int i = 1; i <= tam; i++)  {
       4                  [Link](i + “\t”);
       5                  for (int j = 0; j < frecs[i]; j++) 
       6                            [Link](“*”);
       7                  [Link]();
        8          }
    9}
      10 

4.5 Condicionando la ejecución de enunciados

Regresemos a la codificación de la clase Catálogo.


Por lo pronto, cerramos este archivo y volvemos a abrir el archivo catá[Link].
Lo tenemos aquí ya cargado y volvemos adonde nos quedamos.
Hicimos ya la codificación del constructor que tiene dos iteraciones,
y habíamos ya construido los métodos que tenemos aquí,
ya calculamos el tamaño de numDiscos y construimos el catálogo.
Procedemos ahora a copiar los discos que vienen en nuevos al catálogo que tenemos acá.
Lo vamos a hacer usando un "for".
Vamos a poner un comentario,
copias ahora los discos nuevos al catálogo en los primeros lugares del catálogo.
Cerramos el comentario.
Entonces, tenemos un "for",
podemos declarar una variable local al "for" que sea la "i",
es la que más nos gusta para recorrer arreglos,
esa es la inicialización,
la condición es que se va a ejecutar esto,
mientras "i" sea estrictamente menor que "numNvos".
¿Por qué estrictamente menor?
Porque cuando tengo un arreglo que tiene k lugares,
los índices van de cero a K-1.
Por lo tanto, si el tamaño del arreglo nuevos es "numNuevos",
los índices van de cero,
como pusimos aquí a "numNuevos -1".
Por eso lo mantenemos "menor que".
Y lo que vamos a hacer en cada actualización es incrementar la "i",
pero también podemos incrementar de una vez el número de discos que tiene el catálogo.
Eso lo va a hacer después de colocar uno de los discos.
Entonces, empezamos el bloque,
lo cerramos de una vez y vamos a escribir a partir de acá.
"NumDiscos" nos indica también
la posición en la que vamos a registrar el siguiente disco,
puesto que si tenemos cero "numdiscos",

Página 100 de 154


llenamos la posición cero,
le agregamos uno, y tendremos un disco que está en la posición cero.
Por lo tanto, en catálogo,
en la posición "numdiscos",
vas a colocar lo que está en el archivo "nuevos", en la posición "i".
A continuación, inicializar el resto de los
arreglos porque ya tenemos un disco que tiene
un número de transmisiones permitidas, ya copiadas.
Por lo tanto, declaramos un entero número de préstamos
y lo hacemos igual al disco que tenemos en la posición "numdiscos" del arreglo.
Y, como eso se trata de un disco,
usamos el método "getPermitidas" de ese disco.
Ese número lo vas a usar para inicializar los
arreglos que dependen del número de transmisiones permitidas.
Por ejemplo, el número posible de fechas es
exactamente el número de transmisiones permitidas,
pues nunca va a haber más fechas
de transmisión que el número de transmisiones permitidas.
Entonces, otra vez, en el renglón "numdiscos" de fechas,
lo hacemos igual a "new" y ponemos un "GregorianCalendar",
y el tamaño va a ser el número de préstamos permitido.
Para el caso del histórico tenemos dos renglones.
Cada uno de los renglones debe tener un número de transmisiones permitidas.
Entonces, tomamos "histórico" que corresponde a "numdiscos" en el renglón cero,
y a ese le ponemos otra vez "GregorianCalendar",
y el número de transmisiones va a ser dos veces el de permitidas porque,
a lo mejor, resulta que dan de alta y de baja continuamente este disco.
Ahora, tenemos que hacer lo mismo para "histórico" en el renglón "numdiscos",
y queremos el renglón uno.
Entonces, también ahí podemos
copiar lo que teníamos arriba y simplemente lo ponemos aquí,
ya que es exactamente el mismo número de posiciones.
En un disco se incrementa como parte de la actualización,
por lo tanto, terminamos ya el "for",
y le ponemos un comentario para saber que lo estamos terminando,
y terminamos también el constructor inmediatamente después,
puesto que lo único que se está haciendo en el constructor es inicializar las variables.
Tenemos aquí un problema porque en la línea 135,
cuando estamos sacando las permitidas de "numdiscos",
podría ser que nos estén pasando una referencia nula.
Como ya mencionamos, siempre debemos verificar que la referencia sea distinta de nula.
Sin embargo, no podemos usar aquí nuestra expresión condicional,
porque la expresión condicional me regresa un valor
y aquí lo que tengo que hacer es decidir si ejecuto,
o no, una serie de enunciados.
Por lo tanto, requieres de un enunciado condicional.
A continuación, tienes el esquema de la ejecución de un enunciado condicional.
Tienes dos formas de enunciados condicionales.
El primero, que es el más simple,
el de la izquierda, llega al enunciado condicional.

Página 101 de 154


Si la expresión booleana es cierta,
se ejecuta un bloque para esa expresión booleana.
Y si la expresión es falsa,
sigue con la ejecución a continuación del enunciado.
La sintaxis de los dos enunciados condicionales
es la siguiente: en la condicional simple,
el bloque se va a ejecutar sólo en el caso de que la expresión booleana sea verdadera.
Mientras que el segundo enunciado condicional,
que tiene un bloque para cuando la expresión booleana es verdadera y otro
para cuando es falsa se ejecuta únicamente uno de los dos,
ya que la expresión booleana sólo puede ser falsa o verdadera.
Recuerda, que un bloque puede consistir de un
único enunciado o de una lista de enunciados entre llaves.
Un enunciado es vacio si consiste sólo de un punto y coma.
Un bloque es vacio si consiste sólo de las llaves,
sin ningún enunciado entre ellas,
son equivalentes cualquiera de los dos.
Regresando al constructor, puedes usar un "if" dentro del "for",
para preguntar si nuevos de "i" es o no nulo.
Y lo que podemos decir es,
la expresión booleana va entre paréntesis si "nuevos" en la posición "i" no es nulo.
Entonces, abrimos la llave,
ajustamos todos los renglones para que estén dentro de la llave,
y cerramos la condicional.
Otra vez lo marcamos para que sepamos exactamente qué está sucediendo,
y lo dejamos solito en un solo renglón.
Esto está un poco raro, porque resulta que el bloque del "if" es muy
grande y no hay nada que se haga fuera del "if" si es que no se cumple la condición.
Entonces, lo que tenemos que hacer es poner la condición un poco distinta,
y tienes dos enunciados que te permiten salir del bloque del "for".
Entonces, si pusiéramos la condición un poco distinta,
podríamos decir que si "nuevos de i" es igual a "null",
entonces lo que vamos a hacer es usar alguno de los dos
enunciados que nos permita salir de la iteración.
Los enunciados que nos permiten salir son,
por un lado el "continue" que me regresa al encabezado del "i".
O sea, ejecuta la actualización y vuelve a verificar si la condición se sigue cumpliendo.
La ventaja del "continue" es que sí ejecuta la actualización.
Esto provocaría un problema aquí,
porque me está incrementando también "numdiscos".
Entonces, vamos a tener que pasar esta
actualización de "numdiscos" al final del bloque que se ejecuta, porque sólo se debe ejecutar cuando se dió de alta un
disco, y si "nuevos de i" es igual a "null" no se va a ejecutar.
La otra manera de salir de una iteración, es con un "break". Pero, un break se sale intempestivamente hasta afuera, y
lo que nosotros queremos realmente es que, si la referencia es vacía, simplemente se vaya a la siguiente referencia.
Entonces, le estamos pidiendo que continúe.
Como abrimos un bloque lo cerramos aquí.
Ahora, esto ya se va a ejecutar si es que esta condición es falsa.
No tenemos que poner un "else" porque el "continue" me está sacando del bloque de todos modos.
Entonces, vamos a realinear nuevamente nuestro código, y como ya hicimos el fin del bloque de "if",

Página 102 de 154


ya sólo tenemos el bloque del "for".
En estos diagramas podemos ver gráficamente cómo se ejecutan "continue" y "break".
"Continue" me saca del bloque a la actualización, mientras que "break" me saca del bloque a la continuación después
del "for". En este tercer constructor como quieres saltar un disco, si su referencia es nula, y pasar a la siguiente
vuelta del "for", pregunta si la referencia es nula, esto ya lo hicimos. El resto del constructor queda como estaba, y
pasas a codificar los métodos que listas en la tarjeta de responsabilidades, empezando por aquellos métodos de
consulta y actualización que son válidos en esta clase. Te veo en el siguiente vídeo, no te lo puedes perder.
Enunciado condicional en Java Puntos totales 9
1. Supón que tienes un arreglo de enteros, llamado frecs, pero el arreglo podría ser una referencia nula. Si el arreglo
es una referencia nula, tienes que avisar que no puedes trabajar con ese arreglo. De otra manera tienes que imprimir
un renglón por cada posición y contenido del arreglo frecs. ¿Cuál de los siguientes códigos hace lo que deseas?
    1 if (frecs != null) {
2     int tam = [Link];
3     for (int i = 0; i < tam; i++) 
4      [Link](“pos=” + i + “contenido=” 
5                                     + frecs[i]);
6}
1 if (frecs == null)
2     [Link](“El arreglo es una referencia nula”);
3 else {
4     int tam = [Link];
5     for (int i = 0; i < tam; i++) 
6      [Link](“pos=” + i + “contenido=” 
7                                     + frecs[i]);
8}
    1 if (frecs == null)
2     [Link](“El arreglo es una referencia nula”);
3 else 
4     int tam = [Link];
5     for (int i = 0; i < tam; i++) 
6      [Link](“pos=” + i + “contenido=” 
7                                     + frecs[i]);
1 if frecs == null
2     [Link] (“El arreglo es una referencia nula”);
3 else
4     for (int i = 0; i < [Link]; i++)
5           [Link](“pos=” + i + “contenido=” 
6                                     + frecs[i]);
2. Tienes el siguiente código, donde num representa un valor leído:
1 for (int i = 0; i <= num; i ++) 
2         if (i < num / 2)  {
3               i += num / 4;
4               [Link](“En el if, siguiente valor de i=” 
5                                         + i);
6         }
7         else  {
8                 i += num / 5; 
9                 [Link](“En el else, siguiente valor de i=”
10                                         + i);
Página 103 de 154
11     }
12
Si supones que el valor de num es 8, ¿qué es lo que escribe este código? (Recuerda que una operación entre enteros
entrega un entero).
      1 En el if, siguiente valor de i=2
2 En el if, siguiente valor de i=4 
3 En el if, siguiente valor de i=6
4 En el else, siguiente valor de i=8
      1 En el if, siguiente valor de i=2
2 En el if, siguiente valor de i=5
3 En el else, siguiente valor de i=8
      1 En el if, siguiente valor de i=2
2 En el if, siguiente valor de i=4
3 En el else, siguiente valor de i=5 
4 En el else, siguiente valor de i=6 
5 En el else, siguiente valor de i=7 
6 En el else, siguiente valor de i=8
      1 En el if, siguiente valor de i=2
2 En el if, siguiente valor de i=5
3 En el else, siguiente valor de i=7
4 En el else, siguiente valor de i=9
3. Tienes un arreglo de enteros de una dimensión, que recibe un método como parámetro. El método debe regresar
otro arreglo de enteros, donde los números pares se elevan al cuadrado mientras que los impares se elevan al cubo.
¿Cuál de los siguientes códigos hace lo que se especifica acá?
1 public int[] eleva( int[] nums)  {
2    int tam = [Link];
3    for (int i = 0; i < tam; i++) 
4         if (nums[i] % 2 == 0)
5               nums[i] = nums[i] * nums[i];
6         else
7               nums[i] = nums[i] * nums[i] * nums[i];
8    return nums;
9}
1 public int[] eleva( int[] nums)  {
2    int tam = [Link];
3    int[] nuevo = new int[tam];
4    for (int I = 0; I < tam; i++) 
5         if ([Link](nums[i]))
6               nums[i] = nums[i] * nums[i];
7         else
8               nums[i] = nums[i] * nums[i] * nums[i];
9    return nuevo;
10 }
1 public int[] eleva( int[] nums)  {
2   int tam = [Link];
3    int[] nuevo = new int[tam];
4    for (int i = 0; i < tam; i++) 

Página 104 de 154


5         if (nums[i] % 2 == 0)
6               nums[i] = [Link](nums[i], 2);
7         else
8               nums[i] = [Link](nums[i], 3);
9    return nuevo;
10}
1 public int[] eleva( int[] nums)  {
2        int tam = [Link];
3        int[] nuevo = new int[tam];
4        for (int i = 0; i < tam; i++) 
5                if (nums[i] % 2 == 0)
6                            nuevo[i] = nums[i] * nums[i];
7                else
8                           nuevo[i] = nums[i] * nums[i] * nums[i];
9         return nuevo;
10
4. Queremos un método que reciba un arreglo de enteros como parámetro y entregue como resultado otro arreglo de
enteros. El método debe extraer los números pares en el contenido del arreglo que pasa como parámetro y construir
un nuevo arreglo que tenga exactamente ese número de elementos con los enteros pares encontrados en el arreglo
pasado como parámetro. Para construir el arreglo primero tendremos que contar en parámetro el número de pares
encontrados. Para esta especificación, responde las preguntas que siguen. ¿Cuál de los siguientes encabezados del
método es el correcto?
1 public int daPares( int viejo )
1 public int daPares( int[] viejo  )
1 public int [] daPares( int[] Viejo )
1 public int[] daPares(  ) 
5. El siguiente código dentro del método daPares cuenta el número de pares en el arreglo viejo, que es como se
llama el que se pasa como parámetro.
1  int cuantos = 0;
2  for ( int i = 0; cuantos < [Link]; cuantos++)
3         if (viejo[cuantos] % 2 == 0) i ++;
1     for ( int i = 0, cuantos = 0; i < [Link]; i++)
2                  if (viejo[i] % 2 == 0) cuantos ++;
1     int cuantos = 0;
2          for ( int i = 0; i < [Link]; i++)
3        if (viejo[i] % 2 == 0) cuantos ++;
1 for ( int i = 0, cuantos = 0; i < [Link];
2                          i++, cuantos++)
3         if (viejo[i] % 2 == 0) cuantos ++;
6. Elige el código correcto para construir y llenar el arreglo nuevo, suponiendo que en la variable cuantos se
encuentra el número de pares encontrados en el arreglo viejo.
1     int[] nuevo = viejo;
2     cuantos = 0;
3     for (int i = 0; i < [Link]; i++)
4               if (viejo[i] % 2 == 0)
5                      nuevo[cuantos] = viejo[i];

Página 105 de 154


6                     cuantos ++;
1     int[] nuevo = new int[cuantos];
2     cuantos = 0;
3     for (int i = 0; i < [Link]; i++)
4               if (viejo[i] % 2 == 0)  {
5                      nuevo[cuantos] = viejo[i];
6                      cuantos ++;
7                } 
1     int[] nuevo = new int[cuantos];
2     for (int i = 0; i < [Link]; i++)
3               if (viejo[i] % 2 == 0)  {
4                      nuevo[i] = viejo[i];
5                    cuantos ++;
6              }
1    int[] nuevo = new int[[Link]];
2   cuantos = 0;
3   for (int i = 0; i < [Link]; i++)
4          if (viejo[i] % 2 == 0)  {
5                   nuevo[cuantos] = viejo[i];
6                   cuantos ++;
7            }
7. Deseas un método que reciba un arreglo de cadenas y una cadena a encontrar en ese arreglo. Deberá regresar la
primera posición en el arreglo donde está la cadena o -1 si no la encontró. Las cadenas se deben considerar iguales
independientemente de los blancos en los extremos y de mayúsculas y minúsculas. ¿Cuáles de los siguientes códigos
cumplen con esta especificación? Elige 2 opciones correctas.
1    public int buscaCad( String[] cads, String cual)  {
2    int tam = [Link];
3    String sCual = [Link]().trim();
4    for (int i= 0; i < tam; i++)  {
5        String limpia = cads[i].toLowerCase().trim();
6        if ([Link](sCual))
7            break;
8   }
9    if ( i >= tam)
10         return -1;
11    else
12         return i;
13 }
1 public int buscaCad( String[] cads, String cual)  {
2    int tam = [Link];
3    String sCual = [Link]().trim();
4    int i = 0;
5    for (i= 0; i < tam; i++)  {
6        String limpia = cads[i].toLowerCase().trim();
7        if ([Link](sCual))
8            break;
9    }
10    if ( i >= tam)

Página 106 de 154


11         return -1;
12    else
13         Return i;
14 }
1 public int buscaCad( String[] cads, String cual)  {
2    int tam = [Link];
3    String sCual = [Link]().trim();
4    for (int i= 0; i < tam; i++)  {
5        String limpia = cads[i].toLowerCase().trim();
6        if ([Link](sCual))
7            return i;
8    }
9    return -1;
10}             
1 public int buscaCad( String[] cads, String cual)  {
2    int tam = [Link];
3    int i = 0;
4    for (i= 0; i < tam; i++)
5        if (limpia == sCual))
6            break;
7    if ( i >= tam)
8         return -1;
9    else
10         return i;
11}
8. Una ecuación cuadrática tiene la forma ax2+bx+c=0ax^2+ bx + c = 0ax2+bx+c=0, con los coeficientes a, b y c.
Esta ecuación tiene dos soluciones
−b ± √ b2−4 ac
x=
2a
En Java no puedes sacar las raíces si el valor de a es 0, porque tendrías una división entre 0. La función de Java que
saca la raíz cuadrada, tampoco lo puede hacer si el valor al que le va a sacar la raíz es negativo.
¿Cuáles de los siguientes métodos calcula bien las raíces, dando mensajes si aparece alguna de las situaciones dadas?
Elige 2 opciones correctas.
1 public double[] raices (double a, double b, double c)  {
2          if (a == 0) {
3               valores[0] = valores[1] = c / b; // solo hay una raiz 
4               [Link](“No hay termino cuadrado”);
5               return valores;
6         }  else  {
7               radical = b*b – 4*a*c;
8               if (radical < 0)
9                    [Link](“No tiene raices reales”);
10             else {
11                   valores[0] = (-b + [Link](radical)) / (2*a); 
12                   valores[1] = (-b - [Link](radical)) / (2*a);
13                   [Link](“Ecuacion correcta”);
14             }
15       }
16       return valores;

Página 107 de 154


17 }
18
1 public double[] raices (double a, double b, double c)  {
2          double[] valores = new double[2];
3          if (a == 0) 
4                 [Link](“Es una ecuación de primer “
5                                         + “grado”);
6          else {    
7              radical = b*b – 4*a*c;
8              if (radical < 0)  {
9                   [Link](“No tiene raices reales”);
10                 return valores;
11            }
12            valores[0] = (-b + [Link](radical)) / (2*a); 
13            valores[1] = (-b - [Link](radical)) / (2*a);
14            [Link](“Ecuacion correcta”);
15            return valores;
16        }
17 }
18
1 public double[] raices (double a, double b, double c)  {
2          double[] valores = new double[2];
3          if (a == 0) {
4                if (b == 0) {
5                    [Link](“No es una ecuación valida”);
6                    return valores;
7                }
8                valores[0] = valores[1] = c / b; // solo hay una raiz 
9                [Link](“No hay termino cuadrado”);
10             return valores;
11       }
12       radical = b*b – 4*a*c;
13       if (radical < 0)  {
14              [Link](“No tiene raices reales”);
15              return valores;
16       }
17       valores[0] = (-b + [Link](radical)) / (2*a); 
18       valores[1] = (-b - [Link](radical)) / (2*a);
19       [Link](“Ecuacion correcta”);
20       return valores;
21 }
22
1 public double[] raices (double a, double b, double c)  {
2         double[] result = new double[2]; 
3      if (a != 0 ) {
4            valores[0] = (-b + [Link](b*b – 4*a*c))/(2*a); 
5            valores[1] = (-b - [Link](b*b – 4*a*c))/(2*a);
6      }
7       else  {

Página 108 de 154


8           valores[0] = valores[1] = -1;
9        }
10        return valores;
11 }
12
9. Dos ecuaciones simultáneas de dos incógnitas tienen la siguiente forma:
a1x + b1y = c1
a2x + b2y = c2
La solución para este sistema de ecuaciones es el siguiente. Primero se calcula lo que se conoce como el
determinante:
determinante = a1 * b2 – a2 * b1
Para obtener el valor de x se usa:
x = (c1 * b2 – c2 * b1) / determinante
Para el valor de y se usa:
y = (a1 * c2 – a2 * c1) / determinante
Si el determinante es 0 decimos que el sistema no tiene solución. ¿Cuál de los siguientes métodos regresa los valores
de x e y correctamente?
1 public double[] sistema( double a1, double a2, double b1, 
2                      double b2, double c1, double c2)  {
3            double det = a1 * b2 – a2 * b1;
4            if (det == 0)  {
5                  [Link](“El sistema no tiene solucion”);
6                  return new double[2];
7            }
8            double x = (c1 * b2 – c2 * b1) / det ;
9            double y = (a1 * c2 – a2 * c1) / det;
10          return new double[]{x, y};
11 }
1 public double sistema( double a1, double a2, double b1, 
2                          double b2, double c1, double c2)  {
3            double det = a1 * b2 – a2 * b1;
4            if (det == 0)  {
5                [Link](“El sistema no tiene solucion”);
6                return;
7            }
8            double x = (c1 * b2 – c2 * b1) / det ;
9            double y = (a1 * c2 – a2 * c1) / det;
10          return new double[]{x, y};
11 }
1 public void sistema( double a1, double a2, double b1, 
2                                double b2, double c1, double c2)  {
3            double det = a1 * b2 – a2 * b1;
4            if (det == 0)  {
5                [Link](“El sistema no tiene solucion”);
6                return;
7            }
8            double x = (c1 * b2 – c2 * b1) / det ;
9            double y = (a1 * c2 – a2 * c1) / det;
10          return new double[]{x, y};

Página 109 de 154


11    }
1 public double[] sistema( double a1, double a2, double b1, 
2                                  double b2, double c1, double c2)  {
3          double det = a1 * b2 – a2 * b1;
4          double x = (c1 * b2 – c2 * b1) / det ;
5          double y = (a1 * c2 – a2 * c1) / det;
6          return new double[]{x, y};
7}

5.1 Algunos métodos del catálogo

Lo que toca ahora es codificar el resto de los métodos que declaraste en tu tarjeta de responsabilidades.
Como nos marca aquí que el catálogo no está guardado, antes de hacerlo vamos a compilar y ver que, en efecto, todo
lo que llevamos está bien. Y listo, cerramos "[Link]".
Comenzamos a codificar el resto de los métodos.
Lo primero que haremos son los métodos de acceso que me dan acceso a todos los atributos privados de la clase.
Entonces, vamos a ver cuáles son los atributos privados, y los tenemos extendidos por muchas líneas, pero están a
partir de la línea 46.
Nuestros atributos son el catálogo, el número de discos, las fechas de inicio de transmisiones, el histórico de
transmisiones y el número de histórico.
Al final de lo que llevamos programado, vamos a dar un método de acceso para cada uno de nuestros atributos.
Hay que hacer un método "get" para cada uno de ellos.
En la tarjeta de responsabilidades, esta vez no pusimos los métodos de acceso.
Sabes que tienen que regresar algo del mismo tipo que el atributo, no tienen parámetros y, simplemente,
tienen un "return" con el nombre del atributo.
Empezamos con el primer atributo que es catálogo.
El método se llama "getCatalogo", no tiene parámetros, es de acceso público y regresa lo mismo que tiene el
catálogo, y el catálogo tiene un arreglo de una dimensión de discos.
El cuerpo del método nos dice que debemos regresar simplemente el catálogo. Y cerramos la llave.
Por supuesto que le tenemos que poner toda su documentación de Javadoc, "regresa el catálogo de discos",
incluyendo aquellas posiciones que no tienen discos, "regresa un arreglo con el catálogo de discos",
y cerramos el comentario de Javadoc.
El siguiente método que tenemos que hacer es el que da acceso al número de discos.
Como número de discos se llama "numDiscos", el método se llama "getNumDiscos".
Lo que tiene en el cuerpo de su método es, simplemente, que regresa "numDiscos".
Terminamos el método con la llave que lo cierra.
Otra vez su comentario de Javadoc que es lo que ya describimos, "regresa el número de discos registrados en el
catálogo de discos".
Por lo tanto, la etiqueta "return" nos dice, precisamente, que es el número de discos registrados en el catálogo.
Recuerden que todos los comentarios de Javadoc deben terminar con un punto.
Terminamos el comentario de Javadoc y tenemos ya el método.
El siguiente método "getFechas" que es, justamente, el que nos regresa las fechas.
Vamos a escribir su comentario de Javadoc, "regresa a un arreglo de dos dimensiones" donde en cada dimensión
registra las fechas de inicio para cada transmisión de un disco dado, terminamos con un punto.
Como todo método, "return" tiene su etiqueta donde ponemos que regresa el arreglo con las fechas de préstamo para
cada disco. Terminamos el comentario de Javadoc y continuamos.
El método es de acceso público, va a regresar un arreglo de dos dimensiones, el arreglo es de tipo
"GregorianCalendar", se llama "get" y, como lo que va a regresar es el arreglo "fechas", le ponemos "getFechas".
No tiene ningún parámetro y, simplemente, regresa el arreglo "fechas".
Terminamos con un punto y coma y cerramos el bloque de este método.

Página 110 de 154


Programas ahora el método que se refiere al histórico, este método debe regresar el arreglo histórico de
transmisiones iniciadas y terminadas para cada disco.
Hay una pareja de renglones con fechas de inicio y terminación para cada disco, por lo que el arreglo es de tres
dimensiones.
Regresa el arreglo que dijimos, por lo tanto, tiene una etiqueta "return", y lo que regresa es el histórico de todos los
discos.
Terminamos el comentario de Javadoc y programamos el método, es de acceso público, es un arreglo de tres
dimensiones, cada dimensión tiene fechas, por lo que el tipo del arreglo es "GregorianCalendar".
Se llama "getHistórico" ya que el arreglo se llama "histórico", no tiene parámetros y todo lo que tiene en su bloque
es que regresa el arreglo histórico.
Terminamos con este método.
Por último, haremos el atributo "numHistóricos", haremos primero el comentario para Javadoc, "regresa el arreglo
que contiene para cada disco", "el número de registros en el arreglo histórico".
Como es un método de acceso, tiene la etiqueta "return" y lo que regresa es el número de registros en "histórico".
Terminamos el comentario y seguimos.
El método es de acceso público, regresa un arreglo de una sola dimensión, el tipo del arreglo es entero ya que guarda
números, se llama "getNumHist" porque así se llama el atributo, no tiene parámetros y lo que hace es, simplemente,
regresar el arreglo "numHist".
Con esto terminamos ya los métodos de acceso que tenemos.
Ya tenemos un método por cada atributo, entonces, vamos a pasar ahora a los métodos de actualización.
Esto es un poquito complicado porque yo no puedo cambiar el tamaño de uno de los arreglos sin considerar el
tamaño de los otros.
En realidad, el único atributo que puedes actualizar es el arreglo que corresponde al catálogo y, de esa forma,
reiniciar todo el resto de los arreglos.
Dependiendo de cómo quede ese arreglo, procedes a sincronizar los otros arreglos.
Siguiendo las reglas que tienes para los métodos de actualización, tienes el siguiente encabezado, el método es
público, no regresa nada, se llama "setCatálogo" y lo que tiene que recibir es un arreglo del mismo tipo del arreglo
que tiene el catálogo, que es de tipo Disco y es de una sola dimensión, y le vamos a poner como nombre "nuevos".
Termina con esto los parámetros y vamos ahora a iniciar el bloque del método.
Si se establece un catálogo nuevo, se deben eliminar todas las referencias que existan a elementos anteriores del
catálogo.
Esto es similar a la construcción de un catálogo nuevo, excepto que no te dan el tamaño total.
Este tamaño se obtiene del argumento que uses al invocar este método.
Tienes dos diferencias importantes respecto al tercer constructor.
La primera, es que todos los arreglos en el objeto existen, por lo que tienes alguna referencia válida a ellos.
Y, la segunda, es que el arreglo que viene como parámetro te da el tamaño total, pero no sabes cuántos discos trae ya
construidos.
Lo primero que hay que hacer, es establecer el nuevo catálogo en el mismo atributo que ya tienes.
El algoritmo para establecer nuevos valores a los atributos del objeto es el siguiente, calculas el tamaño del nuevo
catálogo, aunque si la referencia a "nuevos" es nula, el tamaño es cero.
Por lo tanto, declaras una variable local, "cuantos", que va a ser igual si "nuevos" es una referencia nula, entonces el
tamaño va a ser cero.
De otra manera, el tamaño va a ser el tamaño que traiga "[Link]".
Acuérdate que es un atributo, no un método.
Ahora, si "cuantos" es "cero", entonces vamos a borrar simplemente todo lo que tenemos.
Por lo tanto, si "cuantos" quedó calculado en "cero", quiere decir que borramos todos los atributos, lo cual nos va a
representar varios problemas.
Hacemos el catálogo igual a "null", hacemos "fechas" igual a "null", hacemos el "histórico" igual a "null" para
indicar que no tenemos absolutamente nada en todo el sistema.

Página 111 de 154


En "numDiscos", como es un entero, lo hacemos igual a "cero", y "numHist" también, como es un arreglo, lo
hacemos igual a "null".
Volvamos a la línea 196 para corregir "catálogo" ya que pusimos que tiene valor "cero" y, en realidad, es igual.
Listo, volvamos adonde estábamos.
Pero, también deseamos salir del método entonces, la manera como salimos es con un "return".
Como el método no regresa nada, no necesito poner una expresión, esto es en el caso de que no tenga yo ningún
arreglo en el disco.
Entonces, aquí ponemos si es que "nuevos" es "null".
Sigues en el método si la referencia no es nula, puesto que no se va a ejecutar ese bloque que acabamos de hacer.
Si la referencia no fue nula, tenemos que reconstruir todos los arreglos al tamaño de "nuevos".
Por lo tanto, llegas acá si la referencia no es "null" y procedemos a reconstruir los arreglos.
Entonces, el primer arreglo que queremos la reinicializar es el catálogo y le damos el mismo tamaño que tiene
"nuevos" y que guardamos en "cuantos", ya sabemos que no es "cero".
En el caso del arreglo "fechas" lo mismo, lo que podemos hacer es construirlo del mismo tamaño que "catálogo".
En este caso, el tipo del arreglo es de "GregorianCalendar", es de dos dimensiones, pero en la primera dimensión,
sabemos ya perfectamente que es también de tamaño "cuantos".
El tercer arreglo que tenemos que reinicializar es el arreglo "histórico", que se va a construir también nuevo.
El contenido es "GregorianCalendar", es de tres dimensiones, la primera dimensión tiene tamaño "cuantos", la
segunda dimensión tiene tamaño "dos" y la tercera dimensión no sabemos, porque depende de cada disco.
Después, volvemos a inicializar el que tiene el número de "históricos" que es un "int" y lo inicializamos, también,
con tamaño de "cuantos".
A continuación, tenemos que inicializar el contador de discos, pero queremos copiar los discos que están vivos.
Entonces, quieres copiar los discos que están vivos y, en este momento, el catálogo tiene todas sus referencias en
"null".
Iniciamos "numDiscos" en "cero" y vamos a hacer un "for" para copiar los elementos del arreglo "Disco".
Entonces, para cada elemento, el "for" va a ir contando los elementos de "nuevos" con una "i" desde "cero".
Va a copiar los discos mientras la "i" sea menor que "cuantos" y va a incrementarse la "i" en cada vuelta.
Veamos ahora qué contiene el bloque del "if".
Lo primero que tenemos que verificar es que el i-ésimo disco exista.
Entonces, preguntamos si "nuevos" de "i" es igual a "null", quiere decir que el disco no existe.
Lo que vamos a hacer es, simplemente, salimos de la iteración y regresamos al encabezado del "for".
Si estamos aquí, quiere decir que sí existe el i-ésimo disco, por lo tanto, lo tenemos que copiar a "catálogo".
Entonces, "catálogo" en la dirección registrada en "numDiscos" es igual al i-ésimo disco que está en la posición de
"nuevos".
Como es distinto de "null", podemos obtener el número de permitidas, declaramos una variable "numPerm" que es
igual a "nuevos" de "i" punto "getPermitidas".
Como ya tenemos el número de permitidas en el disco, podemos inicializar la segunda dimensión de "fechas" y la
tercera dimensión de "históricos".
Entonces, le ponemos al disco que estamos registrando ahorita que no tiene ninguna transmisión activa.
Si la tenía es muy difícil saberlo porque estamos reconstruyendo, también, los arreglos de fechas y de histórico.
Queremos, mejor, empezar con discos libres.
Construye los renglones para el arreglo "fechas".
Entonces "fechas" de la posición "numDiscos", que es un renglón, es igual a "new" de "GregorianCalendar", y el
número de posiciones que tiene "fechas" es, precisamente, el número de transmisiones permitidas.
Para el histórico, tenemos que reconstruir los dos renglones, "histórico" de "numDiscos" en la posición "cero" es
igual a "new".
También se trata de fechas, por lo tanto, también tiene "GregorianCalendar", y el número de posiciones que le
ponemos es dos veces el número de permitidas.
A continuación, vamos a hacer el segundo renglón de "histórico".

Página 112 de 154


Este segundo renglón de "histórico" en la posición "Discos" y el renglón "uno" también es igual, y vamos a copiar
porque es exactamente lo mismo que acá arriba.
Copiamos hasta el final de la línea y lo pegamos.
Ya quedaron nuestros arreglos.
Finalmente, como ya registramos un disco, incrementamos el contador de discos con el auto incremento.
Con esto terminamos el "for" y con esto terminamos "setCatalogo".
Pongamos el comentario de Javadoc para este método porque es público, entonces decimos lo que hace.
Copia el catálogo en el parámetro, si no es una referencia nula ésta es la descripción breve.
Vamos, también, a hacer una descripción más extensa.
Si "nuevos" es una referencia nula, borramos todos los arreglos asociados.
Para cada disco que existe en el catálogo, se inicializan los arreglos asociados y se anota cuántos discos hay.
No se copia en las referencias nulas, ni se cuentan para que no haya huecos en el arreglo, ya que estamos
considerando que todos los discos vienen uno después del otro.
Vienen con un parámetro, por lo que tenemos la etiqueta de "param" que se llama "nuevos" y que es el arreglo con el
que se va a inicializar el catálogo y todos los arreglos asociados.
Termina el comentario de Javadoc y ya tenemos programado el método.
Regresas a la tarjeta de responsabilidades, puesto que ya no vamos a hacer más métodos de consulta porque ningún
atributo puede ser modificado de manera aislada del catálogo, y tienes la descripción del método que agrega un disco
al catálogo que dice que recibe como entrada un disco, regresa como salida un "booleano" de si pudo, o no, agregar
el disco.
Puede ya no haber lugar en el catálogo de discos y se llama "addCatalogo".
En la documentación de Javadoc escribes lo siguiente, "Este método va a agregar un disco al catálogo si es que hay
lugar", "recibe como parámetro un disco que es nuevo y que es el disco a agregar", y "regresa como valor "falso" si
el disco es nulo o no hay lugar y "verdadero" si se pudo agregar".
Entonces, el método es de acceso público, regresa una "booleana", se llama "addCatalogo", tiene como entrada un
disco que se llama "nuevo" y está implementado de la siguiente manera.
Primero, verificas que puedes agregar un disco, o sea, que haya lugar y que el disco exista.
Primero verifica si "nuevo" es igual a "null", no vaya a ser que trates de sacar algo de un disco que no existe, o bien,
"numDiscos" es mayor o igual que el tamaño del catálogo, o sea, ya tengo tantos discos como puede aceptar el
catálogo.
Entonces, como dijimos en la documentación, vamos a regresar "falso".
Es decir, que no agrego nada al catálogo, y no necesito la llave puesto que tengo un solo enunciado.
En el comentario, llegamos acá si "nuevo" existe y hay lugar.
Lo primero que haces es registrar el disco en el catálogo, la posición en la que está "numDiscos".
Simplemente, copias el disco nuevo, obtienes el número de transmisiones permitidas para el disco, otra vez declaras
una variable "numPerm" y le pides al disco nuevo que te dé el número de transmisiones permitidas.
Una vez que tienes eso, podemos copiar el método anterior y pegamos aquí.
La indentación es un poco distinta, entonces lo alineamos todo como debe estar.
Por último, incrementamos el número de discos.
Finalmente, sales del método regresando "true" porque sí pudiste dar de alta el disco y lo cierras, le ponemos que es
el final de "addCatalogo".
Veamos ahora el método que da la transmisión de un disco.
Vamos a escribir el comentario de Javadoc de acuerdo a lo que dice la tarjeta de responsabilidades.
Nos dice que registra la transmisión del disco elegido a una cierta hora, avisa si pudo o no dar la transmisión, dice
que tiene como entrada la posición del disco, esto es un entero.
Entonces, registramos una etiqueta "param" que se va a llamar "cualDisco" y que indica la posición en el catálogo
del disco.
También el comentario nos indica que regresa verdadero o falso, dependiendo si pudo o no dar la transmisión.
Terminamos ya la documentación de Javadoc y empezamos con la codificación del método.

Página 113 de 154


El método es público, regresa un valor "booleano", sí o no, se llama "daTransmision" y tiene como parámetro un
entero que me dice de cuál disco es del que voy a dar una transmisión.
Lo primero que hay que hacer, nuevamente, es verificar que la posición que me dieron del disco es válida.
Entonces, pregunto si "cualDisco" es mayor o igual que "numDiscos", quiere decir que el disco no existe en el
catálogo, o bien "cualDisco" es menor que "cero", en cuyo caso me están dando un número del todo inválido.
Si esto es así, no puedo dar de alta la transmisión y regreso "falso".
Después verificas que la referencia en esa posición no sea nula.
Por lo tanto, preguntamos, si catálogo de "cualDisco" es nula, vamos a salir del método regresando "falso".
También debes verificar que el disco en esa posición tenga transmisiones disponibles.
Entonces, vamos a declarar "numDato" que va a ser igual a "catalogo" de "cualDisco", y le pedimos que nos dé su
número de transmisiones activas.
Ese número es, también, la posición en la que vas a registrar esta transmisión, funciona igual que "numDiscos".
Recuerda que todo este proceso va a ser interactuando con un usuario que te va a pedir, desde la terminal, las
distintas opciones.
Verificas que haya transmisiones disponibles para que, si no las hay, avises al usuario y salgas del método.
Por lo tanto, preguntas si "numDato" que obtuviste es mayor o igual que el número de transmisiones disponibles en
la posición en la que estamos, que está dada por "cualDisco", y le pedimos a ese disco que nos dé sus transmisiones
permitidas.
Si "numDato", que es "Activas", es mayor o igual que el número de permitidas, le vamos a escribir al usuario un
mensaje que le deje saber que ya no hay transmisiones.
Al disco queremos pegarle el nombre, entonces sacamos el disco de la posición solicitada, sacamos el nombre, y le
pegamos también el mensaje de que "ya no tiene transmisiones disponibles", cerramos las comillas y cerramos el
"printline".
Y, como queremos más de un enunciado porque nos falta todavía salir del método, abrimos un bloque e,
inmediatamente, después del mensaje regresamos "falso" y cerramos el bloque del "if".
Si llegamos a este punto, quiere decir que sí podemos dar de alta el disco.
Por lo tanto, si no has salido del método, puedes dar una transmisión de ese disco.
Para ello, obtienes la hora y fecha en que se está dando la transmisión.
Entonces, en una variable de tipo "GregorianCalendar" que se llama "ahora" vas a construir un "new
GregorianCalendar" sin parámetros lo cual, como ya vimos antes, te da el momento en el que están realizando esa
asignación.
A continuación, en "fechas" en la posición paralela al catálogo, que es "cualDisco", y en la posición "numDato" que
es, precisamente, el de "Activas", vas a poner el "GregorianCalendar" que acabas de construir.
Le pides al disco que está en la posición "cualDisco" que te dé una transmisión con el nuevo método que agregamos
al catálogo, o sea, que le pasamos como argumento precisamente "ahora".
Y, lo que haces es que, como este método te regresa una cadena, puedes imprimirla de esta forma,
"[Link]", cerramos el "printline" y cerramos el método.
Finalmente, avisas, regresas el valor de verdadero de que pudiste dar la transmisión y termina el método
"daTransmision".
Vamos a compilar para ver que todo vaya bien.
Marca un error en la línea 230, nos dice que está escondido un carácter ilegal.
Entonces, lo que vamos a hacer es repetir con cuidado el enunciado "histórico".
Compilamos y tenemos ahora un error en la línea 249 que es lo que acabamos de escribir.
Revisamos nuevamente y volvemos a escribir, y ahora sí se corrige el error. En el siguiente video continuaremos con
los siguientes métodos de esta clase.

Clases e interfaces Puntos totales 10

Página 114 de 154


1. Al compilar la clase Catalogo no dio ningún error de sintaxis a pesar de no tener todos los métodos de la tarjeta de
responsabilidades, mientras que la clase Disco tuvimos que tener los encabezados de todos los métodos para que
pudiera compilar. Elige la opción que justifica esto.
La clase Catalogo pertenece al mismo paquete que la clase Disco, a quien usa
Mientras que en la clase Disco había una interfaz a implementar, en la clase Catalogo no la hay
Si la clase no interpreta a ninguna interfaz, todo lo que tiene que tener codificado son los constructores distintos
del que da por omisión Java
Tiene todos los enunciados import que necesita por lo que puede compilar

2. Elige la opción que complete el siguiente enunciado: La diferencia entre Catalogo y catalogo es la siguiente:
catalogo es un arreglo de una dimensión mientras que Catalogo es una colección de arreglos de más de una
dimensión
Ambos son atributos, excepto que uno se escribe empezando con mayúscula y el otro empieza con minúscula
catalogo se refiere a un Catalogo
Catalogo es una clase mientras que catalogo es uno de sus atributos

3. Elige 2 opciones por las que no se pueden tener métodos set para todos los atributos privados de la clase Catalogo
distintos del atributo catalogo:
Si construyeras independientemente cualquiera de los arreglos, ya no estaría sincronizado (no sería paralelo) al
arreglo que guarda las referencias a los discos, catalogo
Todos los arreglos distintos de catalogo, así como los atributos de tipos primitivos, dependen del tamaño y
contenido de este arreglo, por lo que no se pueden asignar independientemente
El método setCatalogo se encarga de ello, construyendo los arreglos de los tamaños adecuados y actualizando
los atributos primitivos
No se pueden tener métodos set más que para variables primitivas

4. Elige la opción que complete el siguiente enunciado. La razón por la que aparece la línea
1 catalago[numDiscos].setActivas(0);
en el método setCatalogo se debe a que:
No se pueden recuperar las fechas en las que cada una de las transmisiones activas de ese disco iniciaron
De esta manera se obtiene el número de transmisiones activas del Disco en la posición numDiscos
Así se registra el número de elementos disponibles en el arreglo fechas
Al cambiar el arreglo catalogo se tienen que poner en 0 (cero) todos los elementos de los otros arreglos

5. Elige la opción que complete el siguiente enunciado. La razón por la que se agregó el método
1 public boolean daTransmision (GregorianCalendar cal)
a la clase Disco se debe a que:
Se desea que sea la clase Catalogo la que diga a qué hora se da una transmisión y no la clase Disco
Para que quede claro que en asignar una transmisión está involucrado un GregorianCalendar
La clase Catalogo necesita saber la hora a la que se da una transmisión, por eso esta clase prefiere generar el
GregorianCalendar

Página 115 de 154


El método daTransmision( ) de la clase Disco debería regresar un GregorianCalendar, pero regresa un
booleano
6. En la codificación del método
1 public void setCatalago(Disco[] nuevos)
¿Cuáles son las razones por las que, dentro de este método, no se invoca al constructor, dando como primer
argumento [Link] y como segundo el arreglo nuevos? Elige 2 opciones correctas.
No se tiene acceso a los constructores
Un constructor construye un arreglo nuevo y este método debe modificar un arreglo ya construido (con el que se
llama al método)
Habría que hacer
1 this = Catalago([Link], nuevos);
Pero como el objeto con el que se llama, this, es un parámetro escondido que pasa por valor, el cambio a la
referencia del objeto no se preserva más allá de la ejecución del método.
Porque no se puede calcular [Link] si la referencia a nuevos es nula (vale null)

7. Elige la opción que responda al siguiente enunciado. La relación entre los arreglos fechas e historico es la
siguiente:
Tienen el mismo número de dimensiones
Tienen el mismo tamaño en su segunda dimensión
La posición k en la primera dimensión de ambos arreglos se refieren al mismo objeto de tipo Disco
Contienen la misma información

8. Elige sí o no, según corresponda. ¿Se pueden repetir objetos de la clase Disco en el Catalogo? Esto es que en
distintas direcciones haya referencias al mismo disco.
No

  
9. Elige sí o no, según corresponda. En el método addDisco, ¿se puede agregar a catalogo una referencia que ya se
encuentre en otra posición de este arreglo?
No

10. Elige 3 opciones que se refieran a que los arreglos de la clase Catalogo sean consistentes entre sí.
No debe repetir ninguna de las referencias distintas de null en el arreglo catalogo
Si un disco en la posición k de catalogo tiene n transmisiones permitidas, el arreglo historico en la posición k
tiene que tener 2*n horas (GregorianCalendar) registradas en las que terminaron las transmisiones otorgadas
Si un disco en la posición k de catalogo tiene n transmisiones activas, el arreglo fechas en la posición k debe
tener n registros de horas (GregorianCalendar) en las que se dieron esas transmisiones
El arreglo catalogo en la posición numDiscos debe tener una referencia nula

5.2 Más servicios del catálogo

Página 116 de 154


Nos encontramos otra vez para seguir codificando los métodos de nuestra clase catálogo. El método se llama
muestraCatalogo. Tiene como entradas una cadena que es un encabezado. Regresa como salida otra cadena, que es
toda la cadena que contiene a los discos. Por supuesto que es público, puesto que es de los servicios que va a dar el
catálogo de discos. Y ponemos de una vez las llaves que abren y cierran.
De acuerdo a la descripción que nos da la tarjeta de responsabilidades, podemos decir que regresa una cadena con el
catálogo de discos, y cada disco muestra su contenido en forma compacta. Tiene como parámetro, como dijimos
antes, una cadena que se llama encabezado, y que es una cadena que va a ser el título del listado. Recuerden terminar
con punto los comentarios, y después, regresa otra cadena con un disco por renglón, diciendo qué posición ocupa en
el catálogo.
Terminamos el comentario de Javadoc.
Lo primero que hay que hacer es verificar que tienes un catálogo válido, por lo tanto, pregunta si el catálogo es nulo.
Lo que hace es que regresas el encabezado, y agregas un carácter de fin de línea para que cambie de renglón, y sigue
un mensaje de que no existe el catálogo de discos, y regresas la cadena. Si estamos aquí, quiere decir que no salimos
porque el catálogo fuera nulo.
Vamos a preguntar ahora si hay discos en el catálogo.
El atributo numDiscos nos dice cuántos discos hay registrados.
Entonces, si este atributo es menor o igual que cero, quiere decir que no hay discos registrados.
Entonces, vamos a hacer algo muy similar a lo que hicimos arriba, así que lo marcamos, lo copiamos, y lo pegamos
aquí abajo. Nada más de no existir el catálogo, podemos decir que no hay discos en el catálogo.
Si llegamos aquí es porque hay discos en el catálogo, y además, el catálogo no es nulo, por lo que podemos empezar
you a hacer la cadena que va a presentar.
Entonces, vamos a declarar una cadena que se llama cadena, y la vamos a inicializar, pero no sabemos si el
encabezado que nos pasaron es nulo, por lo tanto, si nos pasaron un encabezado nulo, con nuestra expresión
condicional damos una cadena vacía; y si el encabezado no es nulo, entonces, ponemos al principio de la cadena el
encabezado, y de cualquier manera, le agregamos un caracter de fin de línea para que cambie de línea.
Terminamos de inicializar la cadena, y ahora vamos a recorrer el catálogo de discos.
Para recorrer un arreglo, vamos a usar el for.
Entonces, tenemos un for.
La parte de inicialización, el primer disco, es el que está en la posición cero.
Vamos a usar una variable i para recorrer las posiciones del arreglo y lo empezamos la primera posición, que es la
posición cero.
A continuación, lo que vamos a hacer es que vamos a recorrer este arreglo mientras la i sea una posición válida, y la i
es posición válida mientras que sea menor que el atributo numDiscos.
Recuerda que empieza en cero.
Lo que vamos a hacer en cada iteración es simplemente incrementar nuestra variable i para tener el cuerpo.
Tenemos la cadena you inicializada, entonces, lo primero que hacemos es pegarle a esa cadena la posición que ocupa
el disco.
La ponemos entre comillas y entre corchetes más la variable i que la va a tomar como cadena, más un corchete que
cierra, y con esto, you registramos en la cadena la posición del disco.
Ahora sí, you vamos a llenar lo que es el disco, pero pudiera ser que tengamos en una posición una referencia nula,
entonces, hay que tener cuidado con eso.
Por lo tanto, preguntamos por el disco en la posición i, y preguntamos si esta posición tiene nulo.
Si lo tiene, lo que vamos a agregar a cadena es que no hay disco en esa posición.
Le marcamos un cambio de renglón, puesto que va a seguir el siguiente disco.
Terminamos de agregar esto, y como queremos continuar al principio del disco y no lo que sigue, entonces, hay más
de un enunciado en el if, y le vamos a poner un continue para que siga con la parte de actualización del if.
Cerramos el if.
Y si estamos aquí, es que el disco sí existe y no tiene ningún problema.
Entonces, vamos a pegarle la información que tiene el disco en la posición if.
Puedes usar los enunciados de disco, los métodos de la clase disco, y lo primero que va a hacer es la cadena.

Página 117 de 154


Otra vez le vas a pegar, entre paréntesis, qué tipo de disco es.
Entonces, el disco en la posición i del catálogo te puede dar el tipo disco que, recuerda que era con exclusivamente
paréntesis, puesto que era una variable del disco.
Cierras el paréntesis que estás poniendo.
Vamos a dejar un espacio porque le vamos a seguir pegando cosas.
El mismo disco te puede decir otra vez catálogo de i punto da nombre.
Es una llamada a método, por lo que tiene que ser con paréntesis, y le pegamos un cambio de línea.
A continuación, le vamos a pedir el número de transmisiones permitidas.
Lo queremos correr un poco a la derecha, por lo que le damos un tabulador, y luego, le avisas al usuario que vas a
tener ahí el número de transmisiones permitidas.
Siempre le dejas un espacio.
Le pides al disco que te dé el número de transmisiones permitidas.
Cambias de renglón.
Le avisas al usuario que lo siguiente que vas a escribir es el número de transmisiones activas.
También, dejas un hueco.
Y por último, le pides al disco que te dé el número de transmisiones activas, y cambias de renglón preparándote para
el siguiente disco.
Lo que podremos haber hecho aquí, tal vez para no repetir tanto catálogo de i, you que los accesos a arreglos siempre
son costosos, es aquí arriba, cuando y sabemos que el catálogo de i es válido, declarar una referencia de tipo disco, y
ahí copiar la referencia de catálogo de i, y usarla aquí en lugar de catálogo i.
you mostramos el disco, y vamos a poner otro cambio de renglón.
Terminamos aquí con el for.
Ve cómo se sombrea todo lo que incluye al for.
Eso te ayuda a ver si estás cerrando lo que quieres.
Le pongo aquí un comentario de que estamos terminando el for, y you tienes armada tu cadena.
Por lo tanto, cuando termines con todos los discos, o sea, cuando salgas del for, vas a regresar la cadena.
Cerramos el método muestraCatalogo.
Ahora, tenemos un método que muestra el catálogo de discos activos.
Es decir, aquellos que tienen en activas un valor mayor o igual que cero.
Vamos a hacer la documentación de Javadoc.
Entonces, lo que dice la tarjeta de responsabilidades que va a hacer este método es que muestra en una lista aquellos
discos que tienen transmisiones activas.
Por supuesto, que identifica al disco por su posición, al igual que en el método anterior, y para cada disco, identifica
a las transmisiones activas por la columna que ocupan en el renglón correspondiente del arreglo fechas.
La tarjeta de responsabilidades nos dice que tiene como parámetro, o sea, como entrada, otra vez el encabezado del
método para que el encabezado se muestre con un título, y regresa como salida una lista de los discos que tienen
transmisiones activas con las transmisiones identificadas por la posición que ocupa cada una de las transmisiones.
No olvides terminar con punto.
Entonces, lo que me dice la tarjeta de responsabilidades es que el método se llama muestraActivos, o sea, discos
activos, que tiene como entrada un encabezado que sabemos que es una cadena, que entrega como salida también
una cadena.
Y por supuesto que es público, puesto que es un servicio que da el catálogo.
Entonces, ponemos otra vez, si el catálogo no existe, o sea, si es nulo, pero aquí vamos a combinar con el or, o bien,
el número de discos es menor o igual que cero.
Entonces, lo que vamos a hacer con ese if es que vamos a regresar el encabezado más una cadena que cambie de
renglón, y diga que no hay discos en el catálogo.
Vamos a mezclar aquí los dos aspectos.
No tengo para qué tener una llave.
Entonces, simplemente regreso una cadena que se podrá o no incluir en otro lado.
Si llego aquí, es que tengo discos, y qué catálogo es distinto de vacío.

Página 118 de 154


Por lo tanto, nuevamente vamos a inicializar nuestra cadena, pero vamos a preguntar si el encabezado es igual a nulo
con nuestra condicional aritmética.
Entonces, lo sustituimos por una cadena vacía, si no, dejamos el encabezado y le agregamos un cambio de línea.
Aquí me faltó cerrar la condicional aritmética, porque el cambio de línea lo quiero, no importa qué pase.
Estos cambios de línea son muy latosos, pero son muy importantes, porque si no aparece todo seguido.
Noten que cuando nos falta cerrar o cerramos de más, Dr. Java automáticamente nos da una indentación distinta de
lo que nosotros esperamos.
Si indenta más de lo que esperamos quiere decir que nos falta cerrar alguna llave o un paréntesis.
Si indenta menos de lo que esperamos quiere decir que pusimos un paréntesis de más o una llave de más.
Pasamos ahora a recorrer el catálogo de discos que sabemos que no es nulo.
Entonces usamos un core.
Nuevamente inicializamos y declaramos una variable i y vamos a recorrer todos lo discos.
Solo vamos a procesar aquellos que tengan activas mayores que 0.
Nuevamente empezamos en el primer disco.
Vamos a recorrer todos, por lo tanto,
mientras que sea menor que en un disco lo único que vamos a hacer en la actualización es simplemente pasar al
siguiente disco.
Entonces preguntamos si el disco es distinto de nulo nuevamente preguntas si el i-ésimo disco es nulo y lo que
vamos a hacer es continuar con la actualización.
O sea, pasamos al siguiente disco.
Luego vamos a ver cuál es el número de transmisiones activas.
Eso te lo da el disco mismo que está en la posición i y le pides a ese disco que te de cuántas posiciones activas tiene.
Si ese número de activas es 0 no vamos a procesar a ese disco.
Por lo tanto, preguntas si numActivas es menor o igual, aunque es lo mismo preguntar si es igual a 0.
Entonces si ese número no tiene transmisiones activas pasas al siguiente disco.
Acá you sabes que tienes un disco con transmisiones activas.
Por lo tanto, vas a procesar este disco.
Entonces you tienes inicializada la cadena, por lo tanto, ahora vamos a agregarle cosas.
Vas a poner la posición que tiene el disco otra vez como lo hiciste en el método anterior y a continuación vas a dar el
nombre del disco y le agregas un cambio de renglón para que se vea razonablemente agradable el listado.
Una vez que tienes eso tienes que recorrer el archivo fechas en el renglón i.
Entonces vas a recorrer con una j porque estamos dentro de un for con una i.
Si pusiéramos otra vez una i bloquearíamos la de afuera entonces para j igual a 0, recuerda que las posiciones
siempre empiezan en 0.
Mientras que j sea menor a numActivas que es el número de transmisiones activas que copiamos línea hacia arriba y
lo que hacemos es incrementar la j en uno en cada renglón.
Entonces la j da la posición de la transmisión en el renglón i recorre las transmisiones.
Por lo tanto, a cadena le vamos a agregar otra vez entre corchetes la posición de la transmisión, cerramos el corchete.
Le ponemos un blanco para lo que siga y le pedimos un método que se llama da calendario de las fechas que están en
el renglón i en la columna j.
Terminamos la llamada de este método y le agregamos un carácter de cambio de línea y con esto terminamos el for j.
Una vez procesadas todas las fechas agregamos un nuevo cambio de línea y con esto terminamos también la muestra
de cada disco.
Una vez que tengo esto you tengo la cadena armada y por lo tanto la regresas y termina muestra activos que los
teníamos por acá.
Vamos a compilar y salvar el archivo para ver si está todo bien.
Parece que tenemos un carácter ilegal.
Volvemos a escribir para quitar cualquier error.
Compilamos nuevamente y ahora en la línea 353 hay una llave de más, la quitamos, compilamos y corregimos la
línea 298.

Página 119 de 154


No puede encontrar el método disco.
Nos vamos a nuestro archivo disco punto Java y en efecto no hay método da tipo disco.
Entonces ponemos el método get tipo disco, aunque esto nos va a dar un número, compilamos.
Hay un error en el método y es get nombre.
Corregimos, compilamos y ahora da calendario no lo hemos programado todavía.
Voy a compilar para que me guarde los últimos cambios.
Cierro mi archivo y vámonos a ver el método auxiliar que describe la fecha.
Lo que queremos que haga el método es que convierta una fecha de gregorian calendar en una cadena con la fecha y
hora representadas en el parámetro.
Tiene como parámetro como dice la llamada un gregorian calendar, que es una fecha que se descifra y tiene como
valor de regreso una cadena que corresponde al parámetro.
Terminamos el comentario.
El método como lo llamamos arriba se llama da calendario, tiene como parámetro un gregorian calendar que es una
fecha.
Necesito que regrese una cadena y como toda la información que requiere la saca de su parámetro, lo vamos a hacer
public y static de la clase catálogo.
Empezamos aquí el método.
Voy a poner aquí de una vez calendario y empezamos.
Tenemos you varios métodos que nos dan la fecha y la hora, pero lo primero que debemos preguntar es si la fecha es
un objeto nulo.
Si es así al pedirle que nos de cosas va a ser que el programa aborte.
Entonces si la fecha es nula decimos que es una fecha inválida y salimos del método.
Si no es nula entonces vamos a armar una cadena.
A la cadena la llamaremos una fecha y empieza al pedir al disco que use su método da fecha que también de la clase
disco y es estático, con la fecha que you me pasaron.
La fecha que me da es el día, vamos a ver qué pasa con la hora.
Entonces si es la una quieres que lo diga en singular y no en plural.
Por lo tanto, vamos a hacer una condicional aquí y si fecha punto get que es el método get de la clase gregorian
calendar y le vamos a pedir a fecha punto que nos del campo hour.
Si no es igual a 1, o sea que la fecha es distinta de 1, entonces vamos a decir que esto sucede a las, dejamos un
espacio y si la fecha es igual a 1 vamos a poner a la.
Una vez que tenemos esto cerramos el paréntesis y vamos a agregar que nos diga el disco punto y que nos dé la hora
de la fecha.
Aquí parece que hay un error.
Revisamos y aquí está el error.
Quitamos el punto y coma you que no debemos terminar el enunciado you que habría que agregar más renglones a la
cadena.
Terminamos así da calendario.
Por último, you tenemos armada la fecha por lo que regresamos la cadena, la fecha que es la que armaste.
Compilamos y todo bien.
Como vimos Dr. Java te va indicando mientras tipeas si tienes errores de paréntesis o fines de líneas.
Si tu indentación no es la adecuada entonces revisa dónde pusiste algo de más o de menos. Nos vemos en el próximo
video donde seguiremos implemen.

Direccionamiento indirecto de arreglos Puntos totales 8


1. Por ejemplo, el método muestraCatalogo regresa una cadena que va a imprimir directamente el enunciado que lo
invoque. ¿Cuáles son las razones por las que, si se trata de varios renglones, se regresa una sola cadena y no una
cadena por renglón (un arreglo de cadenas)? Elige 2 opciones.
Si se regresa un arreglo de cadenas se tiene que hacer desde fuera todo el proceso para recorrer el arreglo e
imprimirlo

Página 120 de 154


Si el método regresa un arreglo de cadenas, renglón por renglón, rompe un poco el nivel de encapsulamiento de
la clase
Es más cómodo para muestraCatalogo regresar una cadena que incluya cambios de línea que regresar un
arreglo de cadenas
No puede regresar un arreglo de cadenas porque se definió que regrese una cadena
2. Se menciona, en la implementación del método muestraCatalogo, que el acceso a arreglos es, en general,
costoso. Elige la opción que muestra la razón para decir esto.
Como los arreglos son referencias, hay que seguir tantas referencias como dimensiones tenga el arreglo para
encontrar el elemento que buscamos, y dentro de cada dimensión localizar el índice deseado
Hay que calcular, con una fórmula, la posición del elemento que queremos
Los arreglos son de acceso secuencial y hay que recorrer elemento por elemento

3. Elige la opción que da la razón para que, cuando se pasa una cadena (String) como argumento, a la que se le va a
agregar información (otras cadenas), se tenga que verificar si la referencia es nula.
Va a aparecer un símbolo raro al tratar de ver la cadena
Al preguntar el tamaño de una cadena con referencia nula va a regresar un 0 (cero), lo mismo que una cadena
vacía
Si se intenta usar una referencia nula de tipo String, en algo que no sea preguntar si vale null, la ejecución
aborta con un error de referencia nula
Siempre tiene que saber un método, que recibe una cadena, el contenido de la misma

4. El enunciado continue tiene que estar dentro de un for. Elige la opción que enuncie la razón por la que, si no está
dentro de un for, ni siquiera compila.
continue es una transferencia incondicional a la verificación de la expresión booleana, del encabezado de for,
pero si no hay for tampoco hay expresión booleana que evaluar
continue hace que la ejecución se salga del for, lo que hará que los enunciados que haya después de él nunca
van a ser ejecutados
continue se refiere a brincar el código que sigue al continue y regresar a la inicialización del for. Si no hay for,
no hay inicialización del for
Continue es un enunciado que, en la ejecución, se va a transferir incondicionalmente a la parte de la
actualización para después ejecutar la evaluación de la expresión booleana. Los enunciados que le sigan nunca van a
poder ser ejecutados

5. Si tienes un enunciado continue dentro de un for, pero que no está dentro de un if, elige 2 opciones que indican la
posición del continue para que compile bien tu clase.
Si es el último enunciado en el bloque del for y en ese bloque hay más de un enunciado
Si es el primer enunciado del bloque del for y hay más de un enunciado en ese bloque
Si está en el encabezado del for
Si es el único enunciado del for

6. Si quisieras un método estático que te diera el número de hora de un GregorianCalendar como cadena (“cero”
para 0, “una” para 1, etc., Elige el arreglo que te serviría para extraer de allí la hora (con letras).

Página 121 de 154


1 public final String[] nombreHora= {
   2            “cero”, “uno”, “dos”, “tres”, “cuatro”,
  3           “cinco”, “seis”, siete”, “ocho”, “nueve”,
4          “diez”, “once”, “doce”};
1 public static final String[] nombreHora= “”,
2      “cero”, “uno”, “dos”, “tres”, “cuatro”,
3      “cinco”, “seis”, siete”, “ocho”, “nueve”,
4      “diez”, “once”, “doce”;
1 public static final String[] nombreHora;
2 nombreHora = {
3      “cero”, “uno”, “dos”, “tres”, “cuatro”,
4      “cinco”, “seis”, siete”, “ocho”, “nueve”,
5      “diez”, “once”, “doce”};      
1 public static final String[] nombreHora;
2 nombrehora = new String[]{
3      “cero”, “uno”, “dos”, “tres”, “cuatro”,
4      “cinco”, “seis”, siete”, “ocho”, “nueve”,
5      “diez”, “once”, “doce”};

7. Elige la opción que complete el siguiente enunciado: Una diferencia entre el enunciado break; y el enunciado
continue; es:
El enunciado break; saca la ejecución al enunciado que sigue al for, mientras que el enunciado continue;
continúa la ejecución de un for en la parte de actualización del for, antes de evaluar la expresión booleana del for
Con el enunciado break; la ejecución continúa fuera del if mientras que con el enunciado continue; la ejecución
continúa fuera de un for
El enunciado break; puede aparecer en un if con más de un enunciado mientras que el enunciado continue;
debe aparecer en un if con un único enunciado
El enunciado break; debe aparecer dentro de un if, mientras que el enunciado continue; tiene que aparecer
dentro de un for

8. Elige la opción que complete el siguiente enunciado: En este vídeo en las líneas 321 a 324 hay un error en el uso
del parámetro encabezado. El error consiste en:
Debe tener otro parámetro que sea catalogo
En lugar de preguntar por numDiscos <= 0, se debería preguntar por [Link] == 0
Se usa encabezado en la línea 323 para concatenarle una cadena, y si encabezado es null el programa va a
abortar
No se deben combinar, en ese orden, las expresiones booleanas en la línea 322

4.3 Consulta y actualización de arreglos

Seguimos adelante con la codificación de los métodos del catálogo de discos.


La tarjeta de responsabilidades dice que tenemos un método que se llama muestra activas, y la documentación de
Javadoc, que es conveniente hacerla antes de codificar el método, nos dice que el método muestra las transmisiones
activas de un disco determinado.
Tiene un solo parámetro que se llama cualDisco, y es la posición que ocupa el disco elegido en el catálogo.

Página 122 de 154


Nos va a dar como salida una cadena con las transmisiones activas.
Como tu codificaste el método daCalendario, nos servirá para este caso.
El método se llama muestra activas, solo se diferencia del método que muestra los discos en el género.
Aquí es activas porque las transmisiones son las.
Antes fue activos porque los discos son los.
Tiene como parámetro un entero que es la posición que nos dice cuál disco queremos mostrar.
Regresa una cadena, y dado que es de los servicios que da el catálogo, es público.
No es de la clase porque le estoy dando solo la posición del disco, y tiene que usar el catálogo para hacer su trabajo.
Debes verificar que el catálogo exista.
Preguntamos si el catálogo es null, o bien, preguntamos si hay discos, o si el disco que me están pidiendo está más
allá del tamaño del catálogo.
Recuerda que se evalúa en cortocircuito.
Si el catálogo es null, you tiene el resultado de toda la condicional.
Por lo tanto, you no necesita verificarlo de más.
Si cualDisco es menor que cero, quiere decir que estoy dando una posición negativa para el catálogo, y si cualDisco
es mayor que el tamaño del catálogo, también si esto o esto es verdadero, you no sigue adelante.
Si llega aquí a evaluar esta condición,
quiere decir que todas las demás fueron falsas.
Entonces, puedo preguntar si el catálogo de cualDisco es igual a null, si existe el disco que me están pidiendo.
Si no hubiera checado antes de eso, podía yo haber pedido catálogo de menos cinco, por ejemplo, y hubiera abortado
el programa dado un error en el índice.
Entonces, si cualquiera de esas condiciones es verdadera, vamos a imprimir un mensaje al usuario en la consola
diciendo que el disco no existe en el catálogo, y regresamos nulo para que el sistema se dé cuenta que no tiene que
hacer nada con lo que regresó, y terminamos con el if.
En una variable que se llamará cuantas de tipo entero, el número de posiciones activas.
Como vamos a estar usando este valor después, esto lo hacemos para no tener que estar continuamente llamando.
Entonces, le pediremos al disco, que está en la posición, que nos dé cuántas transmisiones tiene activas.
Si es menor o igual que cero, vamos a imprimir un mensaje en la consola de que este disco no tiene transmisiones
activas.
Regresamos nulo y terminamos este if.
Si llegamos aquí, quiere decir que cuantas es mayor que cero, que el disco existe, y que todo está bien.
Empezaremos a acumular en la cadena qué es lo que quieres escribir.
Lo primero que vamos a escribir mostrar el disco que elegiste, y le pides que muestre el disco.
Le das como encabezado el letrero de transmisiones activas.
Recuerda que dentro de muestraDisco en el Disco,
va a haber los cambios de línea adecuados.
Como aquí me está alineando esto con esto, vemos que coloqué un punto y coma donde no debía.
Lo borramos, agregamos un cambio de línea, recorremos las transmisiones activas para ese disco.
Utilizamos un for y una i, después recorremos mientras que la i sea menor que cuantas, y pasamos al siguiente disco
en cada iteración.
Empezamos con el bloque de esta iteración.
Fechas de cuál disco y de i me va a mostrar la fecha de cada transmisión.
Agregamos cada una de las transmisiones a la cadena.
Primero, verificamos que la fecha sea válida en este disco.
Preguntamos si es que fechas en el renglón, cualDisco en la columna i no es igual a null.
A cadena le agregamos la transmisión de ese disco.
Empezamos por la posición de la transmisión, que es la posición i, y la ponemos entre corchetes.
Le agregamos un tabulador, y luego, usamos el método de daCalendario de fechas de cualDisco, y terminamos con
un cambio de línea.
Si la referencia es nula, entonces, es un else.

Página 123 de 154


Lo que haremos es que a cadena le vamos a agregar que la fecha no está registrada, y terminamos el for i.
Nuevamente, le agregamos un caracter de fin de línea, y terminamos la cadena.
Una vez que recorrimos todas las fechas de ese disco, regresamos la cadena y termina el método.
Le colocamos el comentario del método que está terminado.
Lo que me dice la tarjeta de responsabilidades es que tengo que tener un método que termina una transmisión.
Primero, veremos el comentario de Javadoc.
Este método debe terminar una transmisión activa,
y la coloca en el histórico de transmisiones para ese disco.
Recibe como parámetro primero la posición del disco en el catálogo, cuya transmisión se desea terminar, y un
segundo parámetro que es la consola a través de la cual se hace la comunicación.
Regresa una variable booleana, que si pudo terminar la transmisión true; o no, false.
Este método se llama terminaTrans.
Tiene dos parámetros.
El primero es un entero que le dice cuál disco, y el segundo es un escáner que es una consola.
Regresa una booleana, y es de tipo público.
Como sí vas a usar el catálogo, no puedo ser un método de la clase, y es un método de objeto.
Empecemos a codificar el método.
Otra vez preguntamos si el número de disco que nos están dando es válido.
Si cualDisco es menor que cero, porque cero es una posición válida, o bien, cualDisco es mayor o igual que
numDiscos.
Es decir, la posición es más que el número de discos registrados.
O bien, el catálogo en la posición cualDisco no tiene nada.
Con esto, estamos verificando que el disco sea válido.
Escribimos en la consola aquel disco.
Ponemos el valor de cualDisco, y le vamos a agregar no existe, y salimos del método regresando falso.
Si llegamos acá, es porque el número de disco es válido.
Por lo tanto, lo que tenemos que hacer es preguntar si la consola es válida también.
Si la consola es nula, lo que haremos es escribir el mensaje de que no tenemos una consola válida.
Nuevamente, regresamos el valor falso porque no hemos podido dar de baja la transmisión o porque la transmisión
que nos piden dar de baja no existe.
Identificas al disco elegido mostrándolo en la pantalla para que el usuario elija el disco eligiendo la posición de la
transmisión que quiere verificar.
A este disco, que es la posición cualDisco de catálogo, le pedimos que muestre el disco, y le tenemos que pasar un
encabezado que nos diga el número de disco y le ponemos un espacio en blanco.
Terminas la llamada de muestraDisco, y también, la de println.
Después, vas a escribir cuáles son las transmisiones activas que tienes para que elija el usuario por número.
Ahora, vas a usar el método muestra activas de cualDisco.
Empiezas una cadena a la que le vas a asignar el resultado de muestra activas de cualDisco.
Muestra activa regresa a null si no pudo encontrar ninguna transmisión activa.
Por lo tanto, vamos a preguntar si cadena es null, lo que diría que no hay transmisiones activas.
Entonces, le damos el mensaje al usuario de que este disco no tiene transmisiones activas, y regresas falso.
Terminas el if.
Si estamos aquí, quiere decir que cadena tiene algo distinto que null.
Vamos a mostrar las transmisiones activas en pantalla que están en cadena.
Como vamos a usar el número de transmisiones activas, lo guardamos en una variable de tipo entero que se llama
numActivas.
Le pedimos al disco que está en la posición cualDisco del catálogo que nos de el número de transmisiones activas.
Para pedirle al usuario qué transmisión quiere, vamos a usar el método pideNum que tiene cuatro parámetros.
Es un método de la clase, es público.

Página 124 de 154


La idea de este método es que le dé al usuario un mensaje de qué tipo de número quiere, y a continuación, le damos
el mínimo y máximo número que puede tener.
El método regresa a un entero, que es la posición de la transmisión a terminar.
El primer parámetro es la consola.
El segundo es una cadena, que es el mensaje.
El tercer parámetro es un entero que es el mínimo que puede tener el entero, que me dé.
Y el cuarto es una cadena que es el máximo que me puede dar.
Le pondré que regresa un cero para poder compilar.
you teniendo el encabezado, lo puedo usar en el método que estamos construyendo.
Vamos a guardar el número de transmisión y le asignamos el valor que regrese pideNum.
Lo primero que le tenemos que pasar es la consola que le pasaron a este método.
Lo siguiente que le tenemos que pasar es la cadena que queremos y le decimos que elija el número de transmisión a
terminar.
Le pegamos la cadena a terminar, dejamos un blanco y las posiciones válidas van de cero a numActivas menos uno.
Compilamos y me dice que falta el return pero no me preocupa aún eso, por lo demás está bien.
El método pideNum va a regresar menos uno si es que no está el número que se le pidió entre el mínimo y el
máximo, preguntamos si cualtrans es igual a menos uno.
Quiere decir que el número de transmisión es inválido.
Lo que haremos es decir que esta transmisión no existe y a continuación regresamos falso.
Cerramos el if.
Si llegamos acá quiere decir que el número de transmisión es válido.
Vamos a obtener la fecha de inicio, la que está guardada, y la fecha de fin es ahorita.
Por lo tanto declaras un gregorian calendar que nos dice cuándo empezó la transmisión y asignas ahí el valor que
está en fechas de cualDisco, columna cualTrans.
Declaras otra variable de tipo gregorian calendar que es fecha fin y le asignas un gregorian calendar construido en
este momento.
Colocas en el histórico de fechas estas dos fechas, tienes que preguntar dónde.
Y donde es precisamente en el arreglo numHist que elegimos, que en el renglón de cualDisco tiene guardada la
siguiente posición de histórico para ese disco.
Obtenemos esa posición y en histórico de cualDisco escogemos el renglón cero y donde nos dice la siguiente
posición a llenar ahí ponemos lo que es inicio.
En el mismo arreglo, la misma posición de cualDisco solo que ahora es el renglón uno pero también es la columna
donde asignamos el valor de fecha fin.
Incrementamos el número de históricos que llevamos hechos para ese disco.
Así que lo auto incrementamos con más, más.
Avisas al usuario que la transmisión se terminó y le dices a qué hora se termina.
Cierras el println.
Nota cómo están organizados los valores en el arreglo fechas.
Tenemos que eliminar un registro intermedio para que sigan estando consecutivas las fechas y que el número de
transmisiones activas me dé cuántas fechas consecutivas hay.
Para que sigan estando consecutivas tenemos que recorrer todo lo que está más allá del arreglo un lugar a la
izquierda.
Después vas a programar un método auxiliar que recorra una celda a la izquierda a los datos.
El encabezado de este método es un método de la clase
puesto que le vamos a pasar el arreglo.
Regresa un valor booleano si es que pudo o no eliminar la celda.
Se llama eliminaCelda, recibe como parámetro cosas que son objetos.
Los arreglos que son objetos.
Un arreglo de una dimensión y un entero que le dice cuál es la que tiene que recorrer.
Colocamos return true para que pueda compilar bien.

Página 125 de 154


Vamos a usar este encabezado para eliminar la transmisión que queremos eliminar.
Si regresa a falso no lo puedo regresar si regresa a verdadero sí lo puedo eliminar.
Compilamos y todo bien.
Nos falta que los métodos eliminaCelda y pideNum hagan algo.
Vamos a programar el método eliminaCelda.
Lo que haremos es preguntar si podemos eliminar la celda del renglón que corresponde a cualDisco y pasamos eso
como un arreglo y una dimensión.
Le decimos cuál transmisión es la que queremos eliminar.
Lo que queremos es decrementar el número de transmisiones activas del disco.
Al disco que está en la posición cualDisco le pedimos que termine su transmisión.
Esta es una llamada método por lo tanto le ponemos sus paréntesis.
Eso hará que activas de ese disco se decremente en uno por lo que you no tenemos que hacer nada más.
Borramos esto porque es un solo enunciado y no necesitamos las llaves.
Si eso no fue cierto quiere decir que eliminas celda regreso falso, salimos del método regresando falso.
Si no ha salido por ningún lado el método quiere decir que todo lo pudo hacer bien y regresa a verdadero como final
del método.
Vamos ahora a codificar el método elimina celda para que no esté vacío.
Antes de empezar a codificar el método vamos a dar una descripción de Java doc de lo que tiene que hacer el
método.
El método elimina la celda solicitada si es que esta existe en el arreglo pasado como parámetro.
Este arreglo tiene que ser de una dimensión.
Después de llamar a este método desde algún otro se tienen que hacer los decrementos necesarios al arreglo
involucrado.
El método tiene dos parámetros.
El primero es un arreglo de una dimensión del que se va a eliminar la celda recorriendo las que se encuentran a su
derecha.
El segundo es cual el índice del elemento que se desea eliminar.
Regresa como valor si pudo, en cuyo caso true o si no pudo false hacer la eliminación.
Terminamos el comentario.
Vamos a entrar al método.
Lo primero que tenemos que hacer es preguntar si la referencia que nos están pasando para el arreglo es válida.
Si es nula la referencia no es válida y lo que hacemos es mandar un mensaje.
Escribimos a la pantalla que el arreglo que nos están pasando no existe y regresamos falso puesto que no pudimos
hacer ninguna eliminación.
Termina aquí el if.
Si llegamos aquí quiere decir que el arreglo no es nulo.
Entonces verificamos si la posición del arreglo es válida.
Preguntamos si el valor que nos estén dando es menor que cero o bien cual es mayor o igual que el tamaño del
arreglo.
Si cualquiera de estas dos cosas sucede nuevamente escribimos un mensaje al usuario diciéndole que la posición a
eliminar no existe y como no pudimos eliminar regresamos falso.
Si llegamos aquí quiere decir que la posición y el arreglo son válidos.
Procedemos a recorrer a la izquierda todos los métodos.
Empezamos en el siguiente al método y lo movemos a su posición anterior.
Haremos una iteración Recorremos el arreglo con una i que va a empezar en cual más uno.
Si la posición está al final del arreglo no va a cumplir que la i sea menor que el tamaño del arreglo.
Vamos a seguir dentro de la iteración mientras que la posición sea menor que arreglo punto length.
Y además la posición en el arreglo que estamos viendo sea distinta de null.

Página 126 de 154


Lo que queremos hacer es que en cuento nos encontremos un registro que es null como estamos suponiendo que son
distintos de null que están consecutivas todas las posiciones válidas también vamos a parar en cuanto encontremos el
primero igual a null o cuando terminemos con el arreglo.
La actualización de cada iteración consiste del auto-incremento.
Como empezamos una i más uno lo que tenemos que hacer es arreglo de i menos uno que es precisamente cual.
La primera vez que entramos es igual a arreglo de i que es el siguiente elemento en el arreglo.
Sabemos que i vale al menos uno.
Pues suponiendo que es la posición cero le estamos sumando uno al valor inicial de la iteración.
Al siguiente you lo copiamos para que el último quede valiendo null y termine el foro.
Regresamos true y termina el método elimina celda.
Compilamos y nos marca caracteres ilegales.
Repetimos la línea para saber cuáles no aceptó.
Compilamos y nos marca error en fechas, es que era con minúsculas.
Compilamos y nos marca todo bien.
Nos vemos en el siguiente video en el cual veremos el método que muestra el.

Construcción y tamaño de arreglos


Puntos totales 10
1. Elige 2 opciones que respondan a la siguiente pregunta: ¿Qué pasaría si en el método mstraActivas
intercambiamos la primera y la segunda expresión booleana del if que empieza en la línea 361?
Si catalogo es null, el programa aborta al tratar de evaluar [Link]
No pasa nada porque de todos modos se evalúan todas las expresiones booleanas
Tendrías que preguntar por cualDisco <= numDiscos en lugar de cualDisco <= [Link] para que no
pasara nada diferente.
Tendrías que preguntar por numDiscos <= 0 para que funcionara bien

2. Elige la opción que complete el siguiente enunciado: Es necesario presentar el número de transmisión cuando se
muestran las transmisiones activas de un disco porque:
Si el usuario quiere eliminar un disco, saber la posición que ocupa le puede ayudar
Mientras más información le des al usuario más contento va a estar
Si el usuario desea terminar una transmisión de un disco dado, le vas a preguntar la posición que ocupa en el
arreglo fechas de ese disco, la transmisión que desea terminar
Si el usuario desea terminar una transmisión de un disco dado, le vas a preguntar el número, en el catalogo, de
la transmisión que desea terminar

3. Elige la opción que indica por qué se usa una variable local del método, que se llama cuantas, para indicar el
máximo de transmisiones activas para un disco dado.
Para que únicamente traduzca una vez la expresión el lado derecho de esta asignación y la compilación sea más
rápida
Para tener que escribir menos al escribir el método
Para que únicamente busque una vez el número de registros activos en el disco elegido y sea más rápida la
ejecución

4. En el método terminaTrans, que debe eliminar elementos en el arreglo fechas, elige 2 opciones que explican por
qué se pregunta por

Página 127 de 154


1 cualDisco >= numDiscos
Y no solamente por
1 cualDisco > numDisco
Porque si el número de discos dados de alta es numDiscos, los índices van a ir de 0 a numDiscos – 1
Porque el número de transmisiones activas tiene que ser menor al número de discos registrados
Porque el parámetro indica el número de disco elegido, de 1a numDiscos
Porque el atributo numDiscos indica, al mismo tiempo, el número de discos dados de alta en catalogo y la
siguiente posición a llenar

5. Elige la opción que responda la siguiente pregunta: ¿Cuándo se cumple que el Scanner cons sea nulo dentro del
método terminaTrans?
Cuando no se ha leído nada de la consola
Cuando no se ha construido el objeto dentro del método terminaTrans
Cuando no se ha escrito nada en la consola
Cuando no se construye el objeto cons antes de invocar al método terminaTrans

6. Elige la opción que responda mejor al siguiente enunciado: Cuando en el vídeo se dice; “Si estamos acá quiere
decir que … (lo negativo de la condición que se acaba de verificar)” y no estás en un else, es porque:
Si no estás dentro de un for, el último enunciado del if debe ser un return;.
Si estás dentro de un for, el último enunciado del if es un break o un continue, para salir del método, del for o
no seguir con el cuerpo del for, respectivamente.
Si no estás dentro de un for, el último enunciado del if debe ser return algo;

7. Dijimos que Java pasa sus parámetros por valor (o sea una copia). Sin embargo, en el método eliminaCelda le
pasamos el arreglo que queremos que modifique, en lugar de regresar el arreglo modificado. Elige la opción que da
la razón por la que un arreglo (o cualquier objeto) pasado como parámetro puede ver actualizadas algunas de sus
posiciones (o atributos), pero no cambiar de tamaño.
Como pasa todo el arreglo, es claro que lo podemos manipular, pero no podemos cambiarle el tamaño porque
Java lo prohíbe
Lo que se pasa en el parámetro es una copia de la referencia a la primera dimensión del arreglo. Como sabes
cómo llegar al arreglo, puedes modificarlo; en cambio, para cambiarle el tamaño tienes que modificar la referencia, y
es ella la que pasó por valor, por lo que no tienes acceso a la variable con la referencia original
Si el arreglo que pasa como argumento se llama igual que el arreglo que está como parámetro, los cambios se
reflejan porque se está hablando del mismo arreglo. Pero el tamaño no puede cambiar porque Java lo prohíbe

8. Tienes el siguiente método (static para facilitar su uso dentro de main):


1 public static boolean modifica (int [ ]
2          arreglo[0] = new int [] {2,4,6,8,10};
3          return
4}
5
En el método main tiene lo siguiente:
1 int[][] arreglito = {{1,3,5,7},{2,4,6}};
2 modifica(arreglito);

Página 128 de 154


3 for (int = 0; i < [Link]; i++) {
4       [Link](“[“ + i + “] ”);
5       for (int j = 0; j < arreglito[i].length; j++)
6             [Link](arreglito[i][j] + “\t”);
7       [Link]();
8}
Lo que se imprime en la consola es lo siguiente:
1 [0] 2    4    6    8    10
2 [1] 2    4    6
3
Originalmente arreglito tenía 4 elementos en el primer renglón y ahora tiene 5. Elige la opción que explica la razón
por la que pudo cambiar el tamaño y contenido del primer arreglo de la variable arreglito.
Porque una vez que tiene acceso al arreglo de referencias de la primera dimensión, estas referencias sí se pueden
cambiar
No lo puede hacer porque Java nos prohíbe cambiar el tamaño de un arreglo que pasa como parámetro
Porque lo hace en el método modifica, en el primer renglón del método

9. Viendo cómo trabaja el método eliminaCelda, ¿cuál de los siguientes códigos:


 implementa un método que recibe como parámetros un arreglo de cadenas de una dimensión y la posición en
el arreglo,
 abre un espacio en el arreglo en esa posición;
 regresa true si lo pudo hacer y false si no.
1 public static void abreLugar( String[] cads,
            2                                                int donde ) {
    3 if (cads == null || donde >= [Link]
            4 || donde < 0)    return false;
    5 for ( int i = [Link] -1; i > donde; i--)
            6 cads[i] = cads[i-1];
    7 cads[donde] = null;
    8 return true;
  9}
1 public static boolean abreLugar( String[] cads,
2                              int donde ) { 
3 if (cads == null || donde > [Link]
4       || donde < 0)  return false;
5 for ( int i = [Link] -1; i > donde; i--) 
6    cads[i] = cads[i-1];
7 cads[donde] = null;
8 return true;
9}
1 public static boolean abreLugar( String[] cads,
2                              int donde ) { 
3  if (cads == null || donde >= [Link]-1
4       || donde < 0)  return false;
5 for ( int i = [Link] -1; i > donde; i--) 
6    cadenas[i+1] = cadenas[i];
7 cads[donde] = null;
8 return true;
Página 129 de 154
9}
1 public static boolean abreLugar( String[] cads,
2                              int donde ) { 
3  if (cads == null || donde >= [Link]
4        || donde < 0)  return false;
5  for ( int i = donde + 1; i < [Link]; i++) {
6     cads[i] = cads[i-1];
7     cads[donde] = null;
8   }
9   return true;
10 }
10. Elige el código que corresponde a una llamada correcta del método abreLugar cuyo encabezado es:
1 public static boolean abreLugar(String[] cads,
  2                                int donde)
3
No puedes suponer que algo que uses esté ya declarado, fuera del método abreLugar.
1 [Link](abreLugar(cads, donde));

1 boolean hay = abreLugar( new String[]={
         2                “hola”, “que”, “tal”,null,null,
         3                  null, null}, donde);
1 String[] nuevas = “hola”, “que”, “tal”,null,null,
          2        null, null};
            3 boolean hay = abreLugar(nuevas, 2);

4.4 Histórico de transmisiones

Vamos ahora a programar los últimos métodos del catálogo, uno de los cuales es el que muestra el histórico de
transmisiones.
Como es un método de la clase, lo colocamos antes de los métodos que sólo son auxiliares.
Recuerda que en el método "daTransmision" iba llenando el histórico.
Ahora, se trata de mostrar aquellos discos cuyo histórico tiene algo grabado.
Escribimos, primero, el comentario de Javadoc.
Este método muestra el histórico de transmisiones que sólo incluye las iniciadas que fueron terminadas en un disco
dado.
Tiene como parámetro "cual", que corresponde a la posición del disco del que queremos mostrar su registro
histórico.
Como salida nos regresa una cadena con el histórico en formato bonito. Termina el método.
Es un método público, puesto que está en la tarjeta de responsabilidades.
Es de objeto, nos regresa una cadena, se llama "mstraHist" y tiene como parámetro un entero "cual".
Lo primero que tiene que hacer es averiguar si el índice "cual" es correcto, por lo tanto, preguntamos si "cual" es
menor que cero, o bien "cual" es mayor o igual que el número de discos que tenemos registrados,
o bien la posición "cual" del catálogo tiene algo.
Todas estas son condiciones, si alguna de estas se cumple es que tenemos problemas con la posición, por lo que
vamos a regresar aquí, como valor del método, la cadena que dice que este disco no existe.
Vamos a empezar con una variable de tipo "cadena" a la que le asignamos como valor inicial lo que nos indique,
que es el "Histórico del disco", y luego, le ponemos un tabulador.
Le pegamos a esa cadena el nombre del disco.

Página 130 de 154


Entonces, tomamos al disco que esté en la posición "cual", que ya vimos que es válido, y le pedimos que nos dé el
nombre, le ponemos un cambio de renglón.
Después, tienes que averiguar si hay registros en el histórico.
Pregunta si el número de histórico en la posición que corresponde a "cual" es igual a "cero", quiere decir que no hay
históricos en ese disco.
Por lo tanto, le vas a agregar a la cadena que el disco no tiene ningún registro.
Le agregas un cambio de línea y sales del método, regresando esa cadena, con esto terminas el "if".
Una vez que sabemos que el disco tiene al menos un histórico, lo queremos mostrar. Tenemos este diagrama.
El catálogo nos dice cuáles son las transmisiones activas y el histórico nos dice cuántos registros históricos tiene
registrados.
Por lo tanto, vamos a usar una iteración.
Con un "for" vamos a recorrer los registros vivos del arreglo histórico.
Usamos la variable "int", empieza valiendo "0", que es la primera posición del arreglo.
Mientras la "i" sea menor que lo que se encuentra en "numHist" en la posición correspondiente a "cual".
Lo que hará en cada iteración es incrementarse.
Vamos a ver qué es lo que le pega a la cadena en el "for".
Tomas a la cadena que llevas y le vas a pegar, primero, la posición del registro que estás viendo.
En ese momento, le pegas también un tabulador, vas a escribir a qué hora fue iniciada la transmisión.
Otra vez, un tabulador, lo que vas a escribirle es el método "daCalndario" y la posición que le vas a dar es: tomas
"histórico" en la posición del disco "cual", el renglón "0" y la columna "i".
A continuación, terminas la llamada al método.
Le pegas un carácter de fin de línea para que lo escriba en un renglón distinto, algo de blancos, luego un tabulador.
Después, vas a poner a qué hora se terminó la transmisión, otra vez un blanco, un tabulador.
Vuelves a llamar a "daCalndario", pero ahora vas a pasarle lo que se encuentra en el mismo arreglo pero en "1", en la
posición "i".
Cierras la llamada al método.
Le vas a agregar dos cambios de línea.
Con esto terminas lo que haces con cada uno de los discos, por lo tanto, cerramos el "for".
Nos falta todavía un método que muestra los históricos de todos los discos.
Es muy fácil una vez que tenemos el método que muestra cada disco.
Hacemos el comentario de Javadoc.
Como ya sabemos lo que es un histórico, muestra el histórico de todos los discos que lo tienen.
No recibe parámetros puesto que toma los atributos del disco.
Regresa una cadena que es con los históricos presentados.
Lo que tiene que hacer el método es iterar e ir preguntando, por cada disco, si tiene o no un histórico válido.
El método es público, de objeto.
Regresa una cadena, se llama "mstraHistrs" y no tiene parámetros.
Como va a regresar una cadena, la declaramos y le ponemos como valor inicial el encabezado que diga que se trata
del "Histórico en los discos que lo tienen".
Hacemos un cambio de línea y le ponemos una cadena de iguales.
Verifico que sea del tamaño para que tenga el número de iguales que tiene el título.
Le agregamos al final otro cambio de línea, con esto queda inicializada la cadena.
Ponemos un "for" para "cual" desde la posición "0".
Esta vez, nuestra variable del "for" será "cual", mientras que "cual" sea menor que el "numDiscos" registrados en el
disco.
La actualización consiste en que pasa al siguiente disco, se autoincrementa.
Lo primero que tienes que ver es si el disco en la posición "cual" es distinto a "null".
Va a proceder a procesarlo, le agrega "cadena" y la historia de ese disco.
Ya sea que conteste que ese disco no tiene historia o que sí la tiene, el método "mstraHist" se encarga de cada uno de
los discos y, para evitar problemas, le agregamos un final de línea a cada uno de los discos.

Página 131 de 154


Con eso termina el "for" y el "if" sólo tiene un enunciado.
A continuación, regresamos la cadena, con esto termina este método.
Compilamos y nos marcan caracteres inválidos, entonces, repetimos esa línea.
Compilamos y nos marca que, aquí, nos faltó un "más".
Volvemos a compilar y todo bien.
Nos falta llenar el método "pideNum".
Lo primero que hacemos es imprimirle al usuario el mensaje que nos dieron.
Ese mensaje le pide un número y le dice que el número tiene que estar entre mínimo y máximo.
Después, procede a leer el entero y, si tiene algún problema, si no está entre mínimo y máximo, regresa "menos uno".
Vamos a declarar un entero "num", que es donde vamos a guardar el entero que vamos a pedirle al usuario.
Le damos un valor inicial de "menos uno", por si hay algún problema después.
Lo que haremos después es imprimir el mensaje, pero indicándole al usuario entre paréntesis que tiene que estar el
número entre mínimo y máximo.
Cerramos el paréntesis y le pedimos que termine con un "Enter".
Colocamos dos puntos, con esto termina lo que queremos escribir.
Estas informándole al usuario cuáles son los rangos en los que quieres el número.
En "num" vas a poner "de la consola que te pasaron vas a leer el siguiente entero".
Ahora, nos comemos el "Enter" porque, si no, se va a quedar atorada la consola y no vamos a poder avanzar.
Verificamos si el número que nos pasaron es menor que el mínimo, porque una cosa es que le digamos al usuario que
nos teclee algo entre ciertos rangos y otra que el usuario lo haga; o bien, el número es mayor que el máximo.
Entonces, asignamos a "num" el valor de "menos uno" y, si está en rango, no va a asignarle un nuevo valor y
regresamos el valor guardado en "num".
Con esto termina el método "pide Num".
Compilamos y todo bien.
Nos falta el comentario de Javadoc para este método.
Pide un número a través de la consola que debe estar entre dos valores especificados.
Tiene cuatro parámetros: el primero es "cons", un escáner que permite leer de la consola; el segundo es el mensaje
que indica lo que se está pidiendo; el tercero es un entero, que es el valor mínimo que puede tener la variable; y el
último parámetro es "máximo",
que es el valor máximo que puede tomar la variable.
Regresa un entero si es válido o "menos uno" si ese valor dado no es válido.
Terminamos el comentario de Javadoc.
Vuelvo a compilar y todo bien.
Te espero en la siguiente lección para revisar otro tipo de condicionales y más tipos de iteraciones.

Utilizando todo lo que ya sabes...


Puntos totales 2
1. Elige la opción que responda al siguiente enunciado: La razón por la que no preguntas en ninguno de los métodos
de objeto si catalogo == null como condición para salir del método es la siguiente:
Esta condición se debe verificar en el momento de llamar al método
Incorrecto
☹ Cuando se llama a un método de objeto, el objeto tiene que existir, y eso quiere decir que el atributo catalogo no
es null.
En todo caso se debería preguntar Catalogo == null
Incorrecto
☹ Esto no es posible, porque si el objeto con el que se llamó es null, la ejecución ya abortó en el momento de la
llamada. Catalogo se refiere al objeto, no a un atributo.
Aunque se cumpliera esta condición el método podría continuar

Página 132 de 154


El método tiene que ser llamado desde un objeto, que no sea una referencia nula, y todos los objetos declarados
tiene a catalogo construido
Correcto
😊 En ningún momento al construir un Catalogo se asigna null a la variable catalogo, por lo que esta condición no
hay que verificarla.

2. Elige 2 opciones que representen los parámetros del método pideNum para los que se debería verificar la validez,
para que la ejecución no aborte dentro de ese método.
Scanner cons
Correcto
😊 Si el Scanner no ha sido inicializado, la ejecución va a abortar al tratar de usar el Scanner cons que no está
montado sobre [Link].
String msg
Correcto
😊 Como dentro del método se concatenan a msg otras cadenas, si msg es null la ejecución va a abortar al tratar de
usar una referencia nula en una cadena.
int minimo
int maximo

5.5 Cómo construir un menú

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.

Página 133 de 154


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.

Página 134 de 154


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 "[Link]" 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

Página 135 de 154


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.

Página 136 de 154


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,

Página 137 de 154


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.

Página 138 de 154


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.

Página 139 de 154


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,

Página 140 de 154


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.

Nuevas iteraciones y condicionales Puntos totales 8


1. Elige verdadero o falso según corresponda.
Los enunciados while y do … while son equivalentes.
Falso
Verdadero
Correcto
😊 El cuerpo de la iteración while puede no ejecutarse ni una sola vez, mientras que el cuerpo del do … while se
ejecuta al menos una vez.
2. Elige la opción que represente el código con el cual se puede codificar un while con un for, dada la <expresión
booleana>:
1 for (int i = 0, <expresión booleana>;)
1 for (; <expresión boolena>; i++)
1 for (int i = 0; <expresión booleana>; i++) X
Incorrecto
☹ Esta iteración no es equivalente a un while, porque el while no tiene en el encabezado ni inicialización ni
actualización.
1 for (; <expresio booleana>;)
3. Elige verdadero o falso según corresponda: También una iteración do … while se puede implementar con solo un
for.
Verdadero
Incorrecto
☹: Esto no es así porque en un for primero se evalúa la expresión booleana, por lo que podría no ejecutarse el
bloque ni una sola vez, mientras que el do … while garantiza la ejecución del bloque al menos una vez.
Falso
4. Si tenemos el siguiente código:
1 boolean ya = true;
2 while (ya)    {
3        [Link](“ya”);
4        ya = false;
5}
6
Elige la opción que indique cuántas veces se imprime la cadena “ya”.

Página 141 de 154


1
2
Incorrecto
☹ Se ejecuta una vez la impresión ya que la primera vez que llega al while la variable ya es verdadera, por lo que
imprime una vez. Inmediatamente hace a la variable ya falsa, por lo que no vuelve a entrar al while y no se ejecuta
una segunda vez.
0
5. Elige falso o verdadero según corresponda: Como el código anterior se ejecuta exactamente una vez, no hace falta
ponerlo en una condicional.
Verdadero
Falso
Correcto
☹ Si a la booleana ya se le asigna directamente la constante true o false, no tiene caso meter la impresión dentro de
una iteración.
6. Elige la opción que dé la razón por la que en el método conectaCatlgo se decidió usar un do… while para mostrar
las opciones y pedirle al usuario la opción que quiere.
Porque hay que mostrarle al usuario las opciones y pedirle su elección al menos una vez
Correcto
😊 En efecto, si no se usa una iteración do … while, se tendría que codificar mostrar el menú y pedir la opción antes
de entrar a la iteración y al final del cuerpo de la iteración.
Porque primero lo tenemos que saludar y después verificar la opción que quiere
Porque a lo mejor el usuario opta por salir antes de hacer nada
7. Elige verdadero o falso según corresponda: Si las declaraciones se hicieran dentro de cada caso del switch, sin
repetir en ningún caso alguna declaración, como están dentro de un bloque no se conocen fuera del switch.
Falso
Incorrecto
☹ Ese es el problema de hacer las declaraciones dentro del switch conforme las vamos necesitando, que no se
conocen fuera de el bloque del switch.
Verdadero
8. Elige verdadero o falso según corresponda: Una desventaja de usar constantes simbólicas en lugar de enteros
sucesivos entre 0 y k es que si se nos olvida listar algún caso no nos vamos a dar cuenta hasta la ejecución.
Verdadero
Falso
Incorrecto
☹ Las constantes simbólicas, si bien son útiles para recordar a qué es lo que se refiere el caso, no nos indican el
valor que representan.

5.6 Más opciones del menú

Nos quedamos entonces en la programación del caso "termina transmisión". Primero, tenemos que localizar la
transmisión que queremos terminar.
Para esto, tenemos que mostrar el disco y las transmisiones que tiene activas ese disco.
Para ello, le pedimos al usuario que elija el disco cuya transmisión se desea terminar, procedemos a mostrarle al
usuario el disco con todas sus transmisiones.

Página 142 de 154


Usaremos el método que muestra discos activos, recibe como parámetro el encabezado llamado " Discos con
transmisiones abiertas", esa será la llamada al método. Regresa una cadena, por lo tanto, la imprimimos.
Aquí, tenemos el paréntesis que abre el "print line" y, aquí, el que lo cierra. Ya que le mostramos al usuario las
transmisiones activas, le pedimos que nos diga cuál disco quiere elegir.
Ya tenemos la variable "cualDisco", le vamos a asignar el resultado de nuestro método "pideNum", lo pedimos en la
consola.
"Pide Num" se encarga de darle los márgenes en los que puede elegir el disco, y le colocamos los límites, el mínimo
es "cero" y el máximo es "numDiscos -1". Una vez que el usuario nos teclea el entero, verificamos que sea válido.
Para hacerlo, preguntamos si el resultado que nos entregó "pideNum" es igual a "menos uno".
Si es así, quiere decir que no es válido el número y haremos dos cosas, darle un mensaje al usuario de que el número
no es válido y saldremos de la iteración para volver a pedirlo.
El disco que nos dieron es incorrecto, entonces, vamos a imprimirle el mensaje del disco que nos dio, que es
"cualDisco", le decimos que no existe.
Ahora, salimos de este caso y termina la opción de si el "if" es verdadero.
Solo verificamos que el disco elegido esté en el catálogo, pero no verificamos que tenga transmisiones activas.
Entonces, preguntamos si el disco elegido, que es un número válido para el catálogo, y preguntamos por su número
de transmisiones activas. Si este número es menor o igual a "cero", quiere decir que no tiene transmisiones activas.
Nuevamente, hacemos dos cosas. Imprimimos el mensaje avisándole al usuario que se equivocó, diciéndole que el
disco que eligió no tiene transmisiones activas. Una vez que le dimos al usuario un mensaje adecuado, salimos de la
opción y cerramos el "if". Si es falso, seguimos adelante. Por lo tanto, cuando estamos aquí, el disco es correcto,
en cuanto a que tiene transmisiones activas, pero falta dar de baja la transmisión.
Tenemos el método "termina transmisión" que, si le damos "cualDisco" y una consola en la que pide el dato, va a
mostrar las transmisiones activas.
Es un método "booleano", entonces podemos preguntar con un "if" si el método es correcto.
Si nos regresa "verdadero", lo que hacemos es decirle que la transmisión se terminó y, si regresa "falso", le
escribimos de que no se pudo regresar la eliminación. En ambos casos, esto es todo lo que vamos a hacer. No le
pusimos llave, porque ya manejamos el caso para falso verdadero.
Regresa si pudo terminar o no la transmisión, si pudo terminarla, le pedirá al disco que termine su transmisión.
Pasamos ahora a la opción de "muestra disco".
Le mostramos al usuario todos los discos que tiene el catálogo con el método "muestraCatalogo".
Le colocamos como título al listado que nos va a entregar "Discos disponibles en el catálogo".
Como este método regresa una cadena, imprimimos esa cadena y el usuario va a ver todos los métodos disponibles
en el catálogo.
Usamos la variable "cualDisco" usando el método "pideNum", cuyo primer parámetro es el escáner que declaramos.
El segundo es una cadena, el encabezado del listado.
El tercer parámetro es "cero", que es el número mínimo y el parámetro máximo es "Numdiscos -1".
Una vez que funciona "pideNum", el cual nos regresa "menos uno", si el número de disco es inválido, por lo tanto,
verificamos si el número de disco es inválido.
Si el número de disco es "menos uno", no podemos trabajar con él.
Abrimos un bloque porque vamos a darle un mensaje al usuario de que su número elegido estuvo mal y vamos a salir
del "switch" para regresar a que elija otra opción el usuario.
Pero si el número elegido no es "menos uno", entonces sigamos dentro de esta opción.
Nos movemos al principio del método donde tenemos todas nuestras declaraciones, vamos a declarar una variable de
tipo "disco" que sea "el disco elegido".
Eso lo haremos para no tener que estar usando catálogo con el índice "cualDisco".
Volvemos a nuestra programación de muestra "un disco".
Lo que haremos es que el disco, que es de tipo "disco", le asignamos "el disco elegido" por usuario, ya que sabemos
que el disco elegido es correcto.
Podría ser que el número de disco es correcto, pero ese disco no exista.
Entonces, preguntamos si disco es "null", entonces, el disco no existe.

Página 143 de 154


Escribimos un mensaje en la pantalla y a salir de la condicional, por eso tenemos un bloque que empieza con una
llave. Decimos que ese disco no existe.
A continuación, salimos del método y cerramos el bloque del "if". Si ya libramos todas estas verificaciones, quiere
decir que el disco existe, que es válido.
Le pedimos al disco que se muestre y le damos un título con el que se va a mostrar.
Le decimos cuál es el disco que elegimos, cerramos los corchetes y le ponemos "Disco".
Con esto, cerramos la llamada a "muestra disco".
Como "muestra disco" regresa una cadena, la podemos escribir con "[Link]", y cerramos aquí abajo el
"print line".
La siguiente opción es "muestra historia", la cual muestra las transmisiones iniciadas y terminadas.
"Muestra historia" solo muestra la historia de un disco, por lo tanto, debemos hacer algo parecido a
"muestra_undisco".
Le pedimos al usuario que elija un disco, copiamos de la opción anterior y lo pegamos a continuación de "muestra
historia".
Si llegamos aquí, quiere decir que el disco es válido y que podemos proceder a mostrar su historia.
Aquí preguntamos si tiene historia con una condicional.
Si el número de historia de "cual Disco" es igual a "cero", quiere decir que no tiene ninguna historia.
Abrimos un bloque para escribirle al usuario que se equivocó, colocamos el disco, abrimos un corchete, "cual
Disco", cerramos el corchete y decimos que este disco no tiene historia, y salimos de la opción.
Si hasta el momento, no ha habido ningún error, ni en el número de disco elegido ni en el disco que tenga una
historia, llamamos al método "muestra Hist", le pasamos como parámetro "cual Disco", que es un disco correcto.
De todos modos, el método va a verificar que exista una historia.
Pero la siguiente opción nos regresa una cadena con la historia, por lo que haremos es imprimir lo que nos regrese el
método.
Terminamos el "print line" y salimos del método.
Este método muestra las historias de todos los discos que la tengan.
Como ya programamos el método "muestra Historias", lo que tenemos que hacer es llamar a "muestra Historias",
que no tiene ningún parámetro.
Como regresa a una cadena, lo colocamos dentro de un "[Link]".
Terminamos el "print line", salimos del método.
El "default" es en el caso de que no hayan dado un número de opción válida.
Esto no nos puede pasar porque estuvimos verificando que el número fuera válido.
Aquí, simplemente, diremos que la opción que eligió no está implementada.
Como esta es la última etiqueta del "switch", ya no tenemos que hacer nada más.
Con esto terminamos el "switch" y, si no se eligió la opción salir, va a regresar al primer punto del "switch".
El método termina y sale cuando se deja de iterar en el "while", porque la llave que cierra el método está
inmediatamente después.
Ponemos acá el comentario de cuál es el método que está terminando.
Ha llegado el momento de probar nuestra clase.
Ya habíamos probado algunos de los métodos usando el método "main", vamos a probar que todo compila bien.
Aquí me dice que me faltó ponerle el "más", entonces no está reconociendo que termina esta cadena.
Compilamos y todo funciona bien.
Ya tenemos toda la clase terminada.
Nos falta, ahora, probar que esa clase funciona.
En el próximo video programaremos nuestro método "main".

Selección de casos            Puntos totales 5


1. Elige la opción que responda el siguiente enunciado: Si el usuario elige terminar una transmisión, la selección de
la transmisión se hace en dos pasos, que son:
El usuario elige un disco y después una transmisión de ese disco

Página 144 de 154


Mostrar el menú y pedir la opción
☹ Como el usuario ya eligió la opción, esto no se vuelve a realizar dentro de la opción.
Primero pedir que desea terminar una transmisión y después elegir cuál es la transmisión que desea terminar
Incorrecto
☹ La pregunta supone que el usuario ya eligió la opción, por lo que esta no es la primera parte de ese caso.

2. Elige 2 opciones que indican en qué consisten la mayor parte de los enunciados dentro de un caso del switch.
Verificaciones de que los datos tecleados por el usuario son correctos
Correcto
😊 Cuando se interacciona con un usuario para obtener valores a ser usadas en las llamadas de métodos, hay que
verificar que el dato dado por el usuario es correcto.
Escritura de mensajes dentro de las verificaciones
Solicitudes de más información al usuario
Lecturas de datos y llamadas a métodos
3. Elige la opción que completa la siguiente frase:
Siempre que el usuario elige terminar una transmisión tiene primero que:
Elegir un disco del listado que le muestre la aplicación
Correcto
😊 La opción le muestra aquellos discos que tienen transmisiones activas y el usuario elige entre esos discos.
Pedir que le muestren los discos con transmisiones activas
Agregar una transmisión
Tener transmisiones activas
4. Elige la opción por la que, en el switch, el código para la opción MSTRA_HIST es mucho más extensa que el de
la opción MSTRA_HISTRS.
La opción MSTRA_HIST muestra las historias de todos los discos mientras que MSTRA_HISTRS muestra
solo un disco
La opción MSTRA_HIST tiene que interaccionar con el usuario para preguntar de cuál disco
😊 La interacción con el usuario siempre tiene que ser muy cuidadosa para que el usuario dé las respuestas correctas.
La opción MSTRA_HISTRS hace más que llamar a un método del objeto
5. Elige falso o verdadero según corresponda al siguiente enunciado: La razón por la que los métodos en este
proyecto regresan una sola cadena con cambios de líneas en lugar de un arreglo de cadenas es para ahorrar código en
el momento en que se invocan.
Falso
Verdadero
Correcto
😊 Si los métodos regresaran arreglos de cadenas, en el momento de invocarlos tendríamos que escribir dentro de
iteraciones.

5.7 Uso de la clase Catalogo

Como mencionamos la vez pasada, nos toca programar el método main que es lo único que se ejecuta para una clase.
El encabezado ya debes sabértelo, es público, es de la clase y tiene como argumentos un arreglo de cadenas llamado
args.
Página 145 de 154
En el método, lo primero que haremos es construir un catálogo sobre el cual trabajemos.
Recordemos, el último encabezado del constructor de catálogo que da el máximo número de discos posibles en el
catálogo y después de un arreglo de discos nuevos.
Podemos construir el catálogo de disco al vuelo, que es lo que vamos a hacer.
Declaremos primero un catálogo llamado elMio y se usa new, porque tengo que construir el catalogo.
Llamamos al constructor de catálogos, le diremos un número pequeño para no tardarnos tanto en ejecutar.
Para construir el vuelo un arreglo de discos, decimos cuántas dimensiones va a tener, que es solo una.
Empezamos con una llave izquierda donde le vamos a dar entre comas cada uno de los discos, cada uno es a su vez
un disco nuevo que estamos construyendo.
El primer disco es un nuevo disco, le decimos que se trata de un DVD, usamos la constante simbólica de DVD.
Recordemos que tenemos en disco estas constantes simbólicas.
La película se llama: "Ahora los ves, ahora no".
El tercer argumento es el año de grabación que es 1999.
Y el cuarto argumento es el número de transmisiones permitidas que vas a tener.
Esto ocupa el primer lugar del arreglo que estamos construyendo.
El segundo elemento del arreglo es también un disco que es un Bluray
con su constante simbólica, se llama Billions.
Es una serie de televisión, fue grabada en 2015 y tiene cuatro transmisiones permitidas.
El tercer disco es también una serie de televisión, por lo tanto es Bluray, se llama Outlander, fue grabada en 2016 y
tiene tres transmisiones permitidas.
El último disco es de tipo CD, lo que me indica que se trata de música.
El cantante es Frank Sinatra, fue grabado en 1992 y solo tiene dos transmisiones permitidas.
Con esto termina el arreglo que estamos construyendo al vuelo, termina la construcción del disco y también la
llamada al constructor.
Terminamos el método main y probamos que la compilación este bien, compilamos y nos da algunos errores.
El disco DVD tiene acceso privado, entonces vamos abrir disco y le cambiamos el acceso a las variables.
Compilamos disco punto Java y fue exitosa, lo cerramos, you también compiló catalogo punto Java y me dice que
todo estuvo bien.
Solo ajustamos este comentario para que se vea bien alineado.
ya tenemos un catálogo construido llamado elMio.
Vamos a empezar la comunicación del catálogo con el usuario y terminamos el método main, compilamos y después
ejecutamos.
Antes de ejecutar vamos a agrandar la pantalla de interacción con esta flechita.
Seguimos teniendo acceso a los métodos, por lo tanto, le pedimos que ejecute.
Vemos que nos muestra las opciones, le pedimos que muestre los discos, elegí la opción mostrar discos activos, no
hay ningún disco activo.
Vamos a pedirle que nos muestre todos los discos, no solo los activos.
Aparentemente estoy limpiando y está haciendo algo raro con la opción, entonces vamos a verificar que la opción se
traga el "enter" que es lo que no está haciendo.
PideNum se encarga de tragarse la opción, cuando yo aquí estoy pidiendo otra vez que se trague la opción, es por lo
que me está mostrando una segunda línea.
Entonces, borramos esta línea, volvemos a compilar.
Ese fue un error de lógica, porque no toma en cuenta que PideNum estaba yacomiéndose el "enter".
Volvemos a agrandar la pantalla para ver si ya funciona bien, le damos click en "Run" le pedimos que muestre todos
los discos que tiene.
Algo está mal porque se está yendo a opción implementada, coloco un cero para salir y le vuelvo a dar ejecutar.
La tres sí la mostró.
La cuatro es pedir transmisión, también está bien.
Entonces, el problema está en la dos, vamos a salir.
Revisemos las opciones, nos vamos al principio del archivo, el que no está respondiendo bien es el dos.

Página 146 de 154


Busquemos muestra discos y vemos que no implementamos la opción para muestra discos, lo que pasó es que nos
brincamos la opción dos.
Esta es la opción cero, esta es la opción uno pero muestra discos activos, es la opción dos.
Entonces, tenemos que programar la opción dos que es la que muestra todos los discos, estén activos o no.
Esta opción es muy sencilla, se llama "muestra discos".
Lo que tenemos que hacer es mostrar todos los discos en el catálogo, preguntamos si el catalogo tiene algo, si el
catálogo es igual a null o bien numDiscos es menor o igual que cero, vamos a hacer dos cosas.
Escribirle un mensaje al usuario diciéndole que no hay discos en el catálogo y salir del switch.
Verificamos en la compilación si está bien y alineamos este if, seguimos sabiendo que tenemos algún disco en el
catálogo, porque si no fuera así habría salido.
Lo que haremos es recorrer el catálogo con un entero empezando en cero, mientras que el entero sea menor que un
disco y en cada iteración va a pasar el siguiente disco.
Todo lo que queremos que haga es que use el método de catálogo en la posición "I", que llame al método muestra
disco de la clase disco que no tiene parámetros.
Podríamos escribir antes de esto un mensaje de cuáles son los discos disponibles en el catálogo y después pasamos a
recorrer los discos.
Una vez mostrados todos los discos hacemos un break, vamos a ver si compila.
Nos dice que muestra disco requiere de una cadena y no puede ser aplicado así.
Entonces escribimos el número de disco que estamos imprimiendo, cuál disco, cerramos con un corchete derecho
dos puntos.
ya con esto tenemos la cadena, veremos si compila bien.
Nos equivocamos, no era cuál disco, estamos recorriéndolo con la variable "I".
Compilamos y es correcto, ampliamos el espacio, le damos clic en Run, pedimos la opción dos de mostrar discos.
Aquí nos dice discos en el catálogo, pero no nos mostró nada.
Vamos a ver cuál es la opción.
Esto me regresa a una cadena, por lo tanto, la tengo que escribir y aquí cerramos el paréntesis de "println" vemos si
compila.
Otra vez agrandamos la pantalla y le damos Run.
Vuelvo a pedir la opción dos y ahora sí ya salió.
Si quiero pedir una trasmisión, que es el número cuatro, me muestra los discos disponibles: cero, uno, dos y tres.
Elegimos el Outlander que es el número dos y me dice trasmisión dada a las cero, cero, 2 pm, el jueves 9 de
noviembre de 2017.
Voy a pedir otra trasmisión, que es el cuatro.
Se la pido al mismo disco y me vuelve a dar, tenemos que verificar PM, porque si me está dando cero, cero, debería
ser 12.
Volvemos a elegir pedir trasmisión, solo para ver si esto funciona y pediré una trasmisión al mismo disco, que es el
dos.
Tiene tres trasmisiones, entonces vamos a pedirle otra trasmisión.
Volvemos a elegir el mismo disco y me contesta que el disco Outlander ya no tiene trasmisiones disponibles.
Terminamos para corregir lo que tenemos mal, vemos si daFecha y daHora, están en el método disco, lo vamos a
buscar y me dice que es de la clase disco, la abrimos, buscamos la fecha y aquí esta:
si hora es igual a cero, 10 pm, deberíamos poderle poner 12.
Lo que haremos es preguntar por hora, módulo 12 para no equivocarnos y si es PM, si es igual a cero, es decir, si es
cero, 12 o 24.
Compilamos, todo está bien y cerramos.
Lo que haremos para saber si está bien es, en medio antes de pedirte System punto Out punto Println, lo que
queremos que nos dé la hora actual que precisamente son las 12 del día.
Vamos a pedirle que nos imprima para verificar que you está bien, le pedimos al disco el método de la hora que
recibe un Gregorian Calendar.

Página 147 de 154


Entonces construimos uno que sea del método, cerramos el método daHora, compilamos, agrandamos nuestra
pantalla de interacción, verificamos y nos sigue escribiendo cero.
Salimos para verificar qué está mal.
Abrimos el archivo disco para daHora, si daHora módulo dos es cero, qué tiene que ser.
Esto me da un número de campo, no me da el contenido del campo.
Teníamos aquí nada más [Link], que me da el número de campo, entonces tengo que usar el método [Link], [Link].
Compilamos y lo hace bien, nos vamos a catálogo, lo ejecutamos y extendemos la pantalla.
Antes de ver la ejecución, revisemos algunos detalles.
Nos vamos a discos, y le agregamos aquí [Link].
Aquí ya tenemos si es AM o PM.
Aquí, colocamos [Link], y lo borramos de acá.
Compilamos, ejecutamos, y vemos que la hora no está saliendo bien, nos sale 12, pero AM.
Revisemos lo que hicimos.
Los minutos son get, el campo minutos.
Si el campo AM_PM es igual a AM, porque esta es una constante de la clase.
Aquí también [Link] es una constante de la clase.
Compilamos, ejecutamos, vemos, y ya quedó bien.
El método en disco que me daba la hora a partir de un Gregorian Calendar, el cual tiene algunos números de campos
y otros valores de campos.
Aquí, por ejemplo, para ver la hora, [Link], me da un número de campo, por lo tanto, tengo que aplicar [Link],
[Link], lo mismo para los minutos.
Quiero saber si le voy a agregar AM o PM, entonces, el campo AM_PM, me da el número de campo, por lo tanto, le
tengo que aplicar [Link], en cambio, [Link] es una constante.
Tengo que comparar [Link] con [Link], me va a decir si el campo contiene AM o PM.
A continuación, teníamos el mismo error en AM_PM.
AM_PM me dice el número de campo que tengo que aplicar, [Link], mientras que [Link], es una constante.
No me da un número de campo, entonces aquí comparo el contenido del campo AM_PM con la constante PM, y, si
son iguales, y la hora era 0, 12, 24, lo pongo 12 si es PM, si no, dejo la hora que tenía, y luego regreso los valores
que fui acumulando.
Con esto terminamos la compilación de [Link].
Ahora, probaremos nuestro programa.
Agrandamos la parte de interacciones y le damos en Run, lo que nos dice es que trató de acceder al método daHora
en la clase disco, pero no lo encontró, es porque no es público, por lo tanto regresamos al documento de código,
abrimos el archivo disco, buscamos el método daHora, lo volvemos público, compilamos, y todo bien.
De una vez, revisamos el método daFecha, ese sí es público.
Cerramos el archivo y regresamos a catá[Link].
Una vez que compilamos [Link], volvemos a compilar catá[Link], regresamos a la pantalla de interacción, le
damos clic en Run y nos aparece el mensaje, nos dice que son las 9:18 AM.
Abrimos el archivo disco, y además de que el método que da hora lo hicimos público.
Revisamos el código para decidir si vamos a poner las 12 o las 0 horas.
Aquí, si hora = (hora % 12 == 0)
&& cal.AM_PM, pero esto es el número de campo, nos falta poner cal y el método que extrae de ese campo la
cadena AM_PM.
you con esto tenemos corregido el archivo disco, lo compilamos y lo cerramos.
Nos vamos a catálogo, y como recompilamos disco, que lo usa, volvemos a compilar catálogo también, y ampliamos
la ventana de ejecución, damos en Run y nos aparece qué es lo que queremos hacer.
Como sabemos que dimos de alta algunos discos, porque no le pedimos que nos muestre los discos, tecleamos un 2 y
nos aparece el disco 0, que es un DVD, el disco 1, que es un Blu-ray, el disco 2, que también es un Blu-ray, el disco
1 en la posición uno, que es Blu-ray, y una serie de televisión, el disco 2, que es un Blu-ray, y el disco 3, que es una
canción.

Página 148 de 154


Lo que queremos es pedir transmisiones.
Pediremos la transmisión, que es la opción cuatro, y me pregunta entre 0 y 3 es el que quiero transmitir.
Elegimos transmisiones al disco de Frank Sinatra para que se nos acaben pronto y ver si está funcionando bien el
control de transmisiones.
Le pedimos el disco 3,
y nos dice que fue dada a las 9:26 del miércoles 15 de noviembre.
Volvemos a pedir otra transmisión, colocamos el número 4, vemos que Frank Sinatra tiene dos transmisiones
permitidas y una activa, volvemos a pedir la transmisión del disco 3, nos da la transmisión a la misma hora que la
primera transmisión you que pasaron solo algunos segundos.
Tal vez nos convenga que la hora también contenga el número de segundos que queremos que tenga, terminamos
esta ejecución y regresamos a daHora para que nos dé el número de segundos.
Abrimos el archivo disco, que es donde está el método daHora, agregamos en el método daHora otro entero que sea
el de segundos, vamos nuevamente, el campo [Link] nos da el número de campo que contiene los segundos,
por lo tanto, le aplicamos el método de GregorianCalendar que se llama [Link].
Al igual que con los minutos, tenemos que agregar los segundos, entonces, hora + ":" + (minutos < 10? "0" +
minutos : minutos) Le vamos a agregar aquí los números de segundos que calculamos, una condicional aritmética, si
segundos es menor que 10, entonces lo que queremos que nos ponga es un cero, más el número de segundos, y, si no,
la cantidad tal cual de segundos.
Antes, se tiene que agregar una cadena con dos puntos.
Vamos a compilar, lo hace bien, cerramos el archivo, compilamos ahora catálogo porque, aunque no lo modificamos,
uno de los archivos de los que depende, cambió.
Agrandamos nuestra pantalla de ejecución, ejecutamos y le pedimos que nos muestre los discos.
Le pedimos una transmisión que es el número 4 del menú que tenemos.
Elegimos el disco, el 3, podemos ver que la hora nos la dio ya con segundos, [Link].
Volvemos a pedir una transmisión, seleccionamos el disco de Frank Sinatra, y vimos que nos la dio [Link].
Volvemos a pedir una transmisión para ver si controla bien las transmisiones iniciadas y terminadas.
Le pedimos al disco de Frank Sinatra, y nos contesta que el disco de Frank Sinatra ya no tiene transmisiones
disponibles puesto que tiene dos transmisiones permitidas y dos activas.
Vamos ahora a terminar una transmisión, que es el número 5, y nos debe mostrar los discos activos.
En este caso, el único disco activo es el de Frank Sinatra.
Aquí me dice que la transmisión 0 empezó a las [Link], y la transmisión 1 empezó a las [Link], como ven, solo
pasaron 20 segundos.
Elegimos el disco 0, nos dice que no tiene transmisiones activas, por lo tanto, vamos a volver a elegir terminar una
transmisión, 5.
Nos fijamos ahora en el mensaje que nos está dando, elige el número de disco entre 0 y 3, el disco es el 3, y elegimos
el número de transmisión a terminar, que es 0.
Nos dice que la transmisión fue terminada a las [Link], pedimos que nos muestre el histórico de todos los discos
para ver si la tiene bien registrada, nos muestra que el disco de Frank Sinatra tuvo una transmisión iniciada a las 9:31
horas, y una transmisión terminada a las 9:34 horas.
Pedimos que nos muestre un disco, que es el número 6, y nos dice cuál disco quiere que nos muestre completo.
Le pedimos el 3, y nos pone el tipo de disco, el nombre del cantante, las transmisiones permitidas y activas,
y luego pasa a elegir el número de disco de trabajo.
Le pedimos que nos muestre los discos activos, que es la opción 3.
El único disco activo es el de Frank Sinatra.
Terminamos una transmisión con el número 5, y el disco en el que la queremos eliminar es el disco 3, y la única
transmisión activa tiene el número 0.
Esa transmisión antes tenía la posición uno, pero ahora ocupa la posición cero.
Me dice que la transmisión fue terminada a las 9:36, mostremos los discos que tienen históricos, vemos que estos
discos no tienen histórico, y el único que tiene histórico es el disco de Frank Sinatra, aquí vemos sus transmisiones
iniciadas y terminadas.

Página 149 de 154


Con esto damos por terminada la prueba de nuestro sistema, puesto que you vimos todas las opciones.
y damos por finalizado este curso.
Estamos seguros que estos contenidos te servirán en tu vida diaria.

Usando todo lo que hiciste... Puntos totales 15


1. Elige la opción que complete el siguiente enunciado: El primer error que te encontraste al ejecutar la clase
Catalogo, fue que, al pedir una opción, usando el método pideNum, se volvía a pedir un [Enter] antes de seguir
(mediante el método [Link]()). La razón por la que se decidió quitar el del método conectaCatlgo() y no el
de pideNum es:
Si dentro de pideNum no se recibe el [Enter] se queda atorado y nunca procesa su entrada
Correcto
😊 En efecto, el único método de Scanner que procesa el [Enter], aunque no lo incluya en lo que regresa, es
nextLine(), y si el usuario no da un [Enter] no se procesa la entrada y pideNum no puede seguir más allá de donde
lee la entrada.
No importa dónde se ponga [Link]() siempre y cuando se haga en algún lado
No importa dejarlo en los dos lados
El resto de los métodos usan más pideNum de lo que lo hace conectaCatlgo()
2. Elige la opción que explica por qué el método conectaCatlgo no puede ser un método de la clase.
Porque tiene que identificar al catálogo con el que va a trabajar
Correcto
😊 Las acciones a ejecutar en el método conectaCatlgo() se refieren a un catálogo en particular, por lo que tiene que
ser invocado desde un objeto de esta clase.
Porque necesita usar un objeto de la clase Scanner
Porque no se le puso el modificador final
Porque no se le puso el modificador static
3. Ya se había revisado el método daHora de la clase Disco. Elige 2 opciones que expliquen por qué volvemos a
tener problemas con él en esta clase.
Los errores que aparecen son nuevos
Correcto
😊 Desafortunadamente, como no tuvimos una manera formal de hacer pruebas de nuestras clases, no podemos
garantizar que van a trabajar en cualquier situación.
Los errores se notan o no dependiendo a la hora en que se esté ejecutando el método
Al terminar con la clase Disco, nunca probamos estos métodos
Esto no debería estar seleccionado
☹ Este es uno de los métodos que más probamos, pues los resultados que daba no eran los que esperábamos.
Pudimos equivocarnos en el archivo [Link] que tenemos en el subdirectorio discos
Correcto
😊 Al terminar con la clase Disco, hubo un momento en que, a pesar de haber cambiado algunas expresiones en el
método daHora, retrocedimos al código anterior.
4. Elige falso o verdadero según corresponda: Los errores se debieron, fundamentalmente, a confundir los campos de
la clase GregorianCalendar que tienen un valor, con los que indican el número de campo que contiene el valor.
Falso
Verdadero

Página 150 de 154


Correcto
😊 Desafortunadamente, desde la primera vez que revisamos este método, hubo confusión entre campos de la clase
que contenían constantes y campos que indicaban la ubicación de un valor.
5. Elige falso o verdadero según corresponda: Para probar que una clase trabaja adecuadamente, se debe probar con
valores extremos, tanto válidos como inválidos.
Verdadero
Falso
Incorrecto
☹ Si no se prueba que reaccione bien ante valores inválidos, como el usuario va a interactuar con la clase, corres el
riesgo de que tu ejecución aborte cuando menos te lo esperas.
6. Elige la opción que indique qué es un arreglo anónimo.
Es un arreglo que se construye al llamar a un método que espera como argumento un arreglo
Correcto
😊 Se usan para probar métodos, o cuando el método regresa el arreglo que recibe, pero modificado, pues en este
caso se le asignará algún identificador al resultado del método.
Es un arreglo que en su declaración aparece su contenido entre llaves
Es un arreglo que se declara sin identificador
Es un arreglo que forma parte de otro arreglo y por lo tanto no tiene un identificador
7. Elige la opción que complete el siguiente enunciado. Entre los errores de la clase Catalogo que detectamos al
probar con la ejecución se encuentra:
Las entradas se deberían pedir con un menú desde el que se eligiera con el ratón, no tecleando números
Incorrecto
☹ Este es un problema de diseño y se debe a que este curso es una introducción y son muchos los conceptos que se
deben manejar para usar menús con ratones. No es un problema de la clase como tal.

La salida que ofrece la ejecución no tiene que ver con lo que se solicitó
Que los mensajes que solicitan la entrada no coinciden con la entrada que se espera
Incorrecto
☹ Todos los mensajes dicen claramente qué esperan como entrada, indicando si se trata de una opción, un disco o
una transmisión.
No haber codificado uno de los casos posibles
8. Elige verdadero o falso según corresponda. Construir un arreglo “al vuelo” es lo mismo que construir un arreglo
anónimo.
Verdadero
Correcto
😊 En efecto, los arreglos anónimos sólo tienen sentido dentro de una llamada a un método y como no se espera que
perduren como tales, sino que sean manipulados dentro del método, decimos que los estamos construyendo “al
vuelo”, en el momento de llamar al método.
Falso
9. Elige la opción que complete el siguiente enunciado. "La ventaja de declarar atributos o constantes como públicas
o de paquete (este último por omisión) y no privadas, usando comentarios de Javadoc para explicar para qué se usan,
es que:
Es más fácil hacer así las declaraciones

Página 151 de 154


Si no le ponemos nada en el acceso y son de paquete, funcionan igual que las públicas
Aparecen en la documentación de la clase de Javadoc
Correcto
😊 Ya sea que se hayan comentado o no, aparecen en la página de HTML y se pueden usar. Claro que si están
comentadas es aún mejor.
Pueden ser usadas en cualquier otra clase, usando nada más el nombre de la clase
Incorrecto
☹ Aunque haya atributos de acceso público en una clase, si no tienen el modificador static son atributos de objeto,
por lo que no se pueden usar dando exclusivamente el nombre de la clase.
10. Selecciona la opción que explica cómo confirmaste que faltaba el caso MSTRA_DISCOS en el switch de
conectaCatlgo().
Revisamos uno por uno los casos del switch y como tienen que venir en orden, vimos que faltaba
Al hacer la búsqueda de la constante simbólica sólo se encontró su declaración y no su uso
Correcto
😊 Lo que se hizo es usar el find de DrJava para localizar la constante simbólica correspondiente. Si no hubiésemos
declarado las constantes simbólicas, buscar un 2 no nos hubiese dado ninguna pista.
No había otra forma de ver la lista de discos en el catálogo
Al dar como opción 2, respondió como “opción no implementada”
11. Elige la opción que complete el siguiente enunciado. Al mostrar los discos, ya sea cuando se piden los discos o
cuando se pide una transmisión, frente al nombre de cada disco aparece primero un entero entre corchetes y luego
otro entre paréntesis. Estos dos números representan, respectivamente, a:
El valor de la variable con la que estamos recorriendo el catálogo y el número de transmisiones disponibles
Incorrecto
☹ Aunque el valor de la variable con la que se recorre el catálogo coincide con la posición del disco en el catálogo,
la variable podría valer de 1 a numDiscos y usar ese número, pero la posición seguiría siendo de 0 a numDiscos – 1.
El número de transmisiones disponibles se muestra después y bien etiquetada.
La posición del disco en el catálogo y el tipo de disco de que se trata
La posición del disco en el catálogo y el número de copias de ese disco
12. Que el tipo de disco aparezca como un entero enigmático entre paréntesis no es adecuado. De todas las clases
que estuvimos usando, ¿en cuál de las clases se debería corregir esto?
Scanner
Usuario
Catalogo
Incorrecto
☹ En la clase Catalogo no tenemos por qué ver las “entrañas” de otra clase. Sería contra el encapsulamiento hacerlo
acá.
Disco
Correcto
😊 Por supuesto que esta es la clase donde es más fácil y correcto corregir esta salida, pues es en ella en las que se
declaran las constantes simbólicas. Se podría declara una cadena, como los días de la semana, y dependiendo del
valor de TIPO_DISCO, elegir la cadena que dice de qué se trata.
GregorianCalendar
Incorrecto
Página 152 de 154
☹ Esta clase está dentro de un paquete considerado como biblioteca de Java y no tenemos acceso a modificarlo.
Además, no tiene nada que ver con el problema que estamos resolviendo.
13. Ahora que ya conoces los arreglos y los enunciados condicionales, regresa a la clase Disco y programas un
método que, dado el tipo del disco te regrese una cadena, todas del mismo tamaño, con la descripción del disco: (1)
Canción, (2) Película y (3) Serie de TV. Elige la opción que represente el código que, en la clase Disco, puede usarse
al mostrar el disco.
1 public String daTipo() {
2      String[] tipos = {“Cancion”,Pelicula”,
3                “Serie de TV”};
4      return tipos[this.TIPO_DISCO];
5}
1 public static String daTipo ( ) {
2         String sTipos = “Cancion    “
3                           + “Pelicula   “
4                           + “Serie de TV”;
5         int desde = this.TIPO_DISCO * 11;
6         int hasta = desde + 10;
7         return [Link](desde, hasta);
8}
1 public int daTipo(String tipo) {
2      int donde = (“Cancion    “
3                         + “Pelicula   “
4                         + “Serie de TV”)
5                                .indexOf([Link]());
6      return donde / 11 + 1;
7}
Incorrecto
☹ Este método está todo mal, pues recibe una cadena y entrega un entero, y debería recibir un entero y regresar una
cadena. Así que este método no hace nada parecido a lo que se espera.
1 public String daTipo (int tipo)  {
2      switch (tipo) {
3          case CD:  return “Cancion    “;
4          case DVD: return “Pelicula   ”;
5          case BR:  return “Serie de TV”;
6          default:  return “Desconocido”;
7   } // switch
8 } // daTipo
Correcto
😊 Este código regresa bien la cadena que representa al tipo de disco. Todas son del mismo tamaño, es fácil agregar
tipos nuevos y si el tipo es incorrecto lo reporta como desconocido.
14. Nota que entre los métodos del catálogo no hay un método para eliminar discos. Elige la opción que describa en
cuáles de los arreglos habría entonces que eliminar.
El renglón correspondiente en el arreglo fechas, el elemento en numHist y catalogo, y la tabla correspondiente
al arreglo historico
Correcto
😊 Como historico es un arreglo de tres dimensiones, no basta con eliminar un renglón, sino hay que eliminar el que
corresponde a historico[cual][0] e historico[cual][1], donde cual representa al disco que se desea eliminar. En los

Página 153 de 154


arreglos de una dimensión hay que eliminar un elemento y éstos son catalogo y numHist. En el arreglo fechas, que
es de dos dimensiones, hay que eliminar el renglón correspondiente.
El renglón correspondiente en el arreglo fechas, en el arreglo historico y en el arreglo catalogo
La tabla correspondiente al arreglo numHist y al arreglo historico, y el renglón correspondiente a los arreglos
catalogo y fechas
15. Dada la idea fundamental de la orientación a objetos, que es la reutilización de código, deseas eliminar a un disco
del catálogo (sin necesidad de desaparecer al disco). Elige 2 opciones que corresponden a llamadas correctas de
eliminaCelda para manipular los distintos arreglos, suponiendo que el entero cual te indica el disco que deseas
eliminar y que estás dentro de un método de objeto que se llama eliminaDisco.
1 eliminaCelda(Catalogo, cual);
Esto no debería estar seleccionado
☹ La clase Catalogo no es un arreglo de una dimensión, por lo que no puede pasarse a este método como parámetro.
1 eliminaCelda(numDiscos, 2);
1 eliminaCelda(historico, cual);
Correcto
😊 Recuerda que en Java el modelo de memoria de los arreglos es que un arreglo de dos dimensiones está
representado por un arreglo de una dimensión donde cada elemento es una referencia. En el caso del arreglo
historico, cada elemento de la primera dimensión es una referencia a otro arreglo de una dimensión que tiene dos
referencias, cada una a un arreglo de una dimensión, por lo que esta llamada sería correcta.
1 eliminaCelda(fechas, cual);

Página 154 de 154

Bienvenida al curso de Java
Este es un curso introductorio a la programación en Java. Como Java es un lenguaje orientado a ob
Java™
 
Platform.
 
(2018).
 
Standard
 
Edition
 
8.
 
API
 
Specification.
 
Consultado
 
de
http://docs.oracle.com/javase/
directamente el programa y que puedes hacer con papel y lápiz. En el próximo módulo, aprenderás una metodología
muy sencilla
Correcto 😊 Para que un paso sea realizable tiene que estar claramente definido.
6. Elige la opción que responda al siguiente
que en programación se llaman pruebas de integración. you que están presentes todos y el objetivo es integrar los
desempeños
Bienvenido a esta tercera sesión, en la que te explicaremos qué es un objeto en el contexto de la programación. Para
ello, co
1. Elige 2 opciones que describan para qué sirven los atributos de un objeto:
1 / 1 punto
Muestran el valor del objeto
Da las
Una descripción de atributos y métodos que debe tener un objeto de esa clase (Respuesta correcta)
Un conjunto de objetos
Corr
Sintaxis: c,e
Semántica: a, b, d
Sintaxis: a,d
Semántica: b,c,e
4. Elige la descripción que defina de mejor manera al diseño
(edad=17, estatura = rojo, ojos=1.75)
(ojos=azul, estatura=1.5, edad=viejo)
10.
Elige 2 opciones que respondan a la siguiente

También podría gustarte