Skip to content

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:

    1. Verificar espacio: if (numberOfBooks < books.length).
    2. Si hay espacio: Se añade el libro en la posición del contador (books[numberOfBooks]) y luego se incrementa el contador.
    3. Si no hay espacio: Se muestra mensaje de "Librería llena" [1425.96s -> 1673.22s].
  • Método displayBooks():

    • Si el contador es 0 Mensaje "No hay libros".
    • Si hay libros Bucle for desde 0 hasta numberOfBooks (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] == 0 e 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

  1. Pares/Impares: Uso del operador módulo.
    • Par: if (n % 2 == 0)
    • Impar: if (n % 2 != 0) [3767.56s -> 3880.48s].
  2. Media (Casteo): Para calcular la media exacta con decimales, la suma (entero) debe convertirse a double antes de dividir, o el resultado se truncará. $\(media = (double) suma / longitud\)$ [4104.58s -> 4131.44s].
  3. 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

  1. Media por Alumno: Se necesita una variable suma auxiliar 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].

  2. 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 max o min en 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

  1. En el Ejercicio 3 (BookShop), ¿por qué el bucle displayBooks recorre hasta numberOfBooks y no hasta books.length?
    • Respuesta: Porque books.length es la capacidad total (que puede tener huecos vacíos/null), mientras que numberOfBooks indica cuántos libros se han insertado realmente.
  2. 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.
  3. ¿Cuál es la diferencia sintáctica entre un bucle for clásico y un for-each tal como se vio en el Ejercicio 7?
    • Respuesta: El for clásico usa un índice (i) para acceder (array[i]), mientras que el for-each (tipo val : array) extrae directamente el valor en cada iteración sin exponer el índice.
  4. En el Ejercicio 8, ¿dónde se debe declarar e inicializar la variable suma para 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.
  5. ¿Por qué es un error inicializar la variable min en 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].