Bienvenida Al Curso de Java
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.
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.
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
¡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.
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.
¡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.
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.
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
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
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
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
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.
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.
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.
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
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.
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.
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.
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.
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
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);
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.
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.”
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.
Página 43 de 154
1Disco paranoia = new Disco(“Paranoia”, short)3, 2016);
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;
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);
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
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.
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
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)
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.
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;}
: 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?
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.
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)
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.
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}
☹ 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}
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}
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
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.
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
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.
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.
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.
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.
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
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.
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
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
Sí
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
Sí
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
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).
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
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
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
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);
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.
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
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.
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.
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.
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.
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









