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

Construyamos un sistema de registros de estudiantes que demuestre una encapsulación adecuada. Crearás una estructura de gestión de estudiantes en la que los datos académicos sensibles estén protegidos, sin dejar de proporcionar acceso controlado mediante 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 y, al mismo tiempo, exponga datos públicos seguros. El Name del estudiante debe estar exportado (accesible públicamente), pero su grade (float64) y su studentID (string) deben estar sin exportar 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, debe establecerse en 0.
    • Un getter Grade() float64 que devuelva la calificación actual
    • Un getter StudentID() string que devuelva el identificador 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 se actualizó la calificación y 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 después realiza operaciones con la calificación. Muestra el resumen del estudiante después de crearlo y después de cada intento de actualización de la calificación.

Se proporcionarán las siguientes entradas:

  • Línea 1: Nombre del estudiante
  • Línea 2: Identificador del estudiante
  • Línea 3: Calificación inicial
  • Línea 4: Primera nueva calificación que se establecerá
  • Línea 5: Segunda nueva calificación que se establecerá

Después de crear el estudiante, imprime su resumen. Después intenta cada actualización de la calificación; si tiene éxito, imprime el resumen actualizado; si se rechaza, imprime Invalid grade rejected. Da formato a todos los valores de calificación con dos decimales.

Por ejemplo, dadas 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 y mantiene válidos los datos del estudiante. Observa que studentID y grade nunca son accesibles directamente: 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 nueva calificación
	newGrade1Str, _ := reader.ReadString('\n')
	newGrade1, _ := strconv.ParseFloat(strings.TrimSpace(newGrade1Str), 64)

	// Leer la segunda nueva calificación
	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 calificación
	// Si es exitoso, imprimir el resumen actualizado
	// If rejected, print "Invalid grade rejected"

	// TODO: Intentar la segunda actualización de calificación
	// Si es exitoso, imprimir el resumen actualizado
	// If rejected, print "Invalid grade rejected"

	// Hint: Usa 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

Practica por tu cuenta: Compilador de Go online