Menu
Coddy logo textTech

Resumen - Registros de estudiantes

Parte de la sección Programación Orientada a Objetos del Journey de GO de Coddy — lección 51 de 107.

challenge icon

Desafío

Fácil

Vamos a construir un sistema de Registros de Estudiantes que demuestre una encapsulación adecuada. Crearás una estructura de gestión de estudiantes donde los datos académicos sensibles estén protegidos, proporcionando al mismo tiempo un acceso controlado a través de métodos bien diseñados.

Organizarás tu código en dos archivos:

  • student.go: Crea una estructura Student que proteja la información sensible mientras expone datos públicos seguros. El Name del estudiante debe ser exportado (accesible públicamente), pero su grade (float64) y studentID (string) deben ser no exportados para proteger esta información sensible.

    Implementa lo siguiente:

    • Un constructor NewStudent(name, id string, initialGrade float64) *Student que cree un estudiante. La calificación inicial solo debe establecerse si está entre 0 y 100 (inclusive); de lo contrario, el valor predeterminado será 0.
    • Un getter Grade() float64 que devuelva la calificación actual.
    • Un getter StudentID() string que devuelva el ID del estudiante.
    • Un setter SetGrade(newGrade float64) bool que actualice la calificación solo si el nuevo valor está entre 0 y 100 (inclusive). Devuelve true si la calificación fue actualizada, false en caso contrario.
    • Un método Summary() string que devuelva el formato: [Name] (ID: [studentID]) - Grade: [grade]
  • main.go: Lee la información del estudiante desde la entrada, crea un estudiante usando el constructor y luego realiza operaciones de calificación. Muestra el resumen del estudiante después de la creación y después de cada intento de actualización de calificación.

Se proporcionarán las siguientes entradas:

  • Línea 1: Nombre del estudiante
  • Línea 2: ID del estudiante
  • Línea 3: Calificación inicial
  • Línea 4: Primera nueva calificación a establecer
  • Línea 5: Segunda nueva calificación a establecer

Después de crear al estudiante, imprime su resumen. Luego intenta cada actualización de calificación; si tiene éxito, imprime el resumen actualizado; si es rechazada, imprime Invalid grade rejected. Formatea todos los valores de calificación con dos decimales.

Por ejemplo, dados Emma Wilson, STU001, 85.5, 92.0 y 150, tu salida debería ser:

Emma Wilson (ID: STU001) - Grade: 85.50
Emma Wilson (ID: STU001) - Grade: 92.00
Invalid grade rejected

La última actualización falla porque 150 está fuera del rango válido. Tu método setter aplica esta regla, manteniendo válidos los datos del estudiante. Observa cómo el studentID y la grade nunca son directamente accesibles; el código externo debe usar tus métodos getter y setter para interactuar con estos datos protegidos.

Pruébalo tú mismo

package main

import (
	"bufio"
	"fmt"
	"os"
	"strconv"
	"strings"
)

func main() {
	reader := bufio.NewReader(os.Stdin)

	// Leer el nombre del estudiante
	name, _ := reader.ReadString('\n')
	name = strings.TrimSpace(name)

	// Leer el ID del estudiante
	id, _ := reader.ReadString('\n')
	id = strings.TrimSpace(id)

	// Leer la calificación inicial
	initialGradeStr, _ := reader.ReadString('\n')
	initialGrade, _ := strconv.ParseFloat(strings.TrimSpace(initialGradeStr), 64)

	// Leer la primera calificación nueva
	newGrade1Str, _ := reader.ReadString('\n')
	newGrade1, _ := strconv.ParseFloat(strings.TrimSpace(newGrade1Str), 64)

	// Leer la segunda calificación nueva
	newGrade2Str, _ := reader.ReadString('\n')
	newGrade2, _ := strconv.ParseFloat(strings.TrimSpace(newGrade2Str), 64)

	// TODO: Crear un nuevo estudiante usando el constructor NewStudent

	// TODO: Imprimir el resumen del estudiante después de la creación

	// TODO: Intentar la primera actualización de la calificación
	// Si tiene éxito, imprimir el resumen actualizado
	// Si es rechazada, imprimir "Invalid grade rejected"

	// TODO: Intentar la segunda actualización de la calificación
	// Si tiene éxito, imprimir el resumen actualizado
	// Si es rechazada, imprimir "Invalid grade rejected"

	// Sugerencia: Usar fmt.Sprintf con %.2f para formatear las calificaciones en Summary()
	_ = newGrade1 // Elimina esta línea cuando uses la variable
	_ = newGrade2 // Elimina esta línea cuando uses la variable
}

Todas las lecciones de Programación Orientada a Objetos