Tutoría 1: Taller de Repaso (Objetos y Arrays)
📋 Resumen Ejecutivo
Esta sesión práctica se enfoca en consolidar los conocimientos de los Temas 1 y 2 mediante la resolución de cuatro ejercicios clave. Se repasa la creación de clases y manipulación de Arrays de objetos (Librería), la lógica de negocio sobre Arrays primitivos (Stock y Números) y el uso de Arrays bidimensionales o matrices (Notas de alumnos). Además, se aclaran dudas sobre el formato del examen final (práctico, sin IA).
🗝️ Conceptos Clave
- Constructor: Método especial para inicializar objetos. Si escribimos uno propio, el de por defecto desaparece [178.54s -> 208.78s].
- Array: Estructura de datos ordenada de tamaño fijo [255.26s -> 292.82s].
- Array de Objetos: Arreglo que almacena referencias a instancias de una clase (ej.
Book[]). - Bucle For-each: Estructura optimizada para recorrer colecciones (
for(Tipo variable : array)). - Matriz (2D Array): Arreglo de arreglos, requiere bucles anidados para su recorrido (\(filas \times columnas\)).
📘 Desarrollo del Temario
1. Repaso General y Examen
Antes de los ejercicios, se aclararon puntos importantes sobre la evaluación:
- Formato: El examen será enteramente práctico.
- Herramientas: Se permitirán 4 entornos: NetBeans, Eclipse, IntelliJ y Visual Studio Code [390.12s -> 396.62s].
- ¡OJO AL DATO!: El uso de IA está prohibido, pero se permite el autocompletado del IDE [421.86s -> 481.36s].
2. Ejercicio 3: Gestión de Librería (Objetos y Lógica)
Objetivo: Crear un sistema para gestionar una tienda de libros con capacidad limitada.
A. La Clase Book (POO Básica)
Se crea una clase modelo con atributos, constructor y métodos de acceso.
- Atributos:
title,author,yearOfPublication. - Constructor: Recibe los tres parámetros para inicializar el objeto.
- Métodos: Getters y
toString()para mostrar la información.
B. La Clase BookShop (Arrays de Objetos)
Aquí reside la lógica principal. Se utiliza un Array para almacenar los libros.
-
Atributos de control:
Book[] books: El array donde se guardan los objetos.numberOfBooks: Un contador (int) iniciado a 0 para saber cuántos libros reales hay guardados [1349.86s -> 1360.20s].
-
Constructor Inteligente: El constructor recibe la
capacity(capacidad máxima) y dimensiona el array con ese tamaño:books = new Book[capacity]; // Define el tamaño fijo del array -
Método
addBook(Book book): Lógica de inserción controlada:- Verificar espacio:
if (numberOfBooks < books.length). - Si hay espacio: Se añade el libro en la posición del contador (
books[numberOfBooks]) y luego se incrementa el contador. - Si no hay espacio: Se muestra mensaje de "Librería llena" [1425.96s -> 1673.22s].
- Verificar espacio:
-
Método
displayBooks():- Si el contador es 0 Mensaje "No hay libros".
- Si hay libros Bucle
fordesde 0 hastanumberOfBooks(no hasta el final del array, para evitar nulos) [1852.74s -> 1970.70s].
3. Ejercicio 6: Simulación de Almacén (Arrays Primitivos)
Objetivo: Gestionar stock de 5 productos usando un int[] y simular ventas.
Lógica de Venta y Stock Negativo
Se inicializa el array directamente en el main: int[] stock = {10, 4, 0, 3, 7}; [2440.58s -> 2458.72s].
-
Simulación de Venta: Se define una venta fija (ej. 3 unidades). Se recorre el array restando esa cantidad a cada posición: $\(stock[i] -= venta\)$
-
Control de Límites (Importante): Al restar, el stock podría quedar negativo. Se debe corregir inmediatamente:
"Si el resultado es menor que cero, lo vamos a igualar a cero." [2992.18s -> 3000.14s]
if (stock[i] < 0) { stock[i] = 0; } -
Detección de Agotados: Se realiza un segundo recorrido para comprobar si
stock[i] == 0e imprimir una alerta [3188.66s -> 3209.56s].
4. Ejercicio 7: Estadísticas con Números (Bucle For-each)
Objetivo: Operaciones matemáticas sobre un array de 10 enteros: pares, impares, suma y media.
Uso del For-each
El profesor enfatiza el uso del bucle for-each para lectura de datos por su simplicidad:
for (int n : numeros) {
// n toma el valor de cada elemento en cada iteración
}
[3531.84s -> 3624.12s].
Operaciones Matemáticas
- Pares/Impares: Uso del operador módulo.
- Par:
if (n % 2 == 0) - Impar:
if (n % 2 != 0)[3767.56s -> 3880.48s].
- Par:
- Media (Casteo):
Para calcular la media exacta con decimales, la suma (entero) debe convertirse a
doubleantes de dividir, o el resultado se truncará. $\(media = (double) suma / longitud\)$ [4104.58s -> 4131.44s]. - Contar Superiores a la Media: Requiere un segundo bucle después de calcular la media para comparar cada número contra el valor promedio obtenido [4248.12s -> 4313.18s].
5. Ejercicio 8: Matriz de Notas (Arrays 2D)
Objetivo: Gestionar notas de 3 alumnos en 4 asignaturas.
Estructura y Recorrido
Se define como double[][] notas. Para recorrerla y mostrarla como tabla se usan bucles anidados:
- Bucle externo (
i): Recorre los alumnos (filas). - Bucle interno (
j): Recorre las asignaturas (columnas) [4533.98s -> 4605.74s].
Cálculos Complejos
-
Media por Alumno: Se necesita una variable
sumaauxiliar que se debe reiniciar a 0 dentro del primer bucle (antes de empezar a sumar las asignaturas del alumno actual)."¿Por qué ponemos el contador suma dentro del primer for? Porque cada vez que entra en el alumno siguiente se reinicia." [4841.52s -> 4862.54s].
-
Máximo y Mínimo Absoluto (¡OJO AL DATO!): Para encontrar la nota más alta/baja de toda la matriz, nunca inicializar las variables
maxominen 0, ya que 0 podría no existir en la matriz o falsear el mínimo.- Estrategia Correcta: Inicializar con el primer valor real de la matriz.
double max = notas[0][0]; double min = notas[0][0];Luego se recorre toda la matriz comparando contra estos valores [5100.00s -> 5147.78s].
🧠 Preguntas de Autoevaluación
- En el Ejercicio 3 (BookShop), ¿por qué el bucle
displayBooksrecorre hastanumberOfBooksy no hastabooks.length?- Respuesta: Porque
books.lengthes la capacidad total (que puede tener huecos vacíos/null), mientras quenumberOfBooksindica cuántos libros se han insertado realmente.
- Respuesta: Porque
- En el Ejercicio 6, ¿qué sucede si intentamos vender 3 unidades de un producto que tiene stock 2? ¿Cómo lo soluciona el código?
- Respuesta: Matemáticamente daría -1. El código incluye un condicional
if (stock[i] < 0)para forzar el valor a 0.
- Respuesta: Matemáticamente daría -1. El código incluye un condicional
- ¿Cuál es la diferencia sintáctica entre un bucle
forclásico y unfor-eachtal como se vio en el Ejercicio 7?- Respuesta: El
forclásico usa un índice (i) para acceder (array[i]), mientras que elfor-each(tipo val : array) extrae directamente el valor en cada iteración sin exponer el índice.
- Respuesta: El
- En el Ejercicio 8, ¿dónde se debe declarar e inicializar la variable
sumapara calcular la media de cada alumno correctamente?- Respuesta: Dentro del bucle externo (alumnos) pero antes del bucle interno (asignaturas), para que empiece en 0 para cada nuevo alumno.
- ¿Por qué es un error inicializar la variable
minen 0 al buscar la nota más baja en una matriz de notas?- Respuesta: Si todas las notas son superiores a 0 (ej. 5, 6, 7), el programa diría erróneamente que la nota más baja es 0. Debe inicializarse con
notas[0][0].
- Respuesta: Si todas las notas son superiores a 0 (ej. 5, 6, 7), el programa diría erróneamente que la nota más baja es 0. Debe inicializarse con