Menu
Coddy logo textTech

Recapitulação - Registros de Estudantes

Parte da seção Programação Orientada a Objetos do Journey de GO da Coddy — lição 51 de 107.

challenge icon

Desafio

Fácil

Vamos construir um sistema de Registros de Alunos que demonstra o encapsulamento adequado. Você criará uma estrutura de gerenciamento de alunos onde dados acadêmicos sensíveis são protegidos, enquanto ainda fornece acesso controlado por meio de métodos bem projetados.

Você organizará seu código em dois arquivos:

  • student.go: Crie uma struct Student que proteja informações sensíveis enquanto expõe dados públicos seguros. O Name do aluno deve ser exportado (acessível publicamente), mas seu grade (float64) e studentID (string) devem ser não exportados para proteger essas informações sensíveis.

    Implemente o seguinte:

    • Um construtor NewStudent(name, id string, initialGrade float64) *Student que cria um aluno. A nota inicial só deve ser definida se estiver entre 0 e 100 (inclusive); caso contrário, o padrão deve ser 0.
    • Um getter Grade() float64 que retorna a nota atual
    • Um getter StudentID() string que retorna o ID do aluno
    • Um setter SetGrade(newGrade float64) bool que atualiza a nota apenas se o novo valor estiver entre 0 e 100 (inclusive). Retorne true se a nota foi atualizada, false caso contrário.
    • Um método Summary() string que retorna o formato: [Name] (ID: [studentID]) - Grade: [grade]
  • main.go: Leia as informações do aluno da entrada, crie um aluno usando o construtor e, em seguida, realize operações de nota. Exiba o resumo do aluno após a criação e após cada tentativa de atualização de nota.

As seguintes entradas serão fornecidas:

  • Linha 1: Nome do aluno
  • Linha 2: ID do aluno
  • Linha 3: Nota inicial
  • Linha 4: Primeira nova nota a ser definida
  • Linha 5: Segunda nova nota a ser definida

Após criar o aluno, imprima seu resumo. Em seguida, tente cada atualização de nota — se for bem-sucedida, imprima o resumo atualizado; se for rejeitada, imprima Invalid grade rejected. Formate todos os valores de nota com duas casas decimais.

Por exemplo, dados Emma Wilson, STU001, 85.5, 92.0 e 150, sua saída deve ser:

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

A última atualização falha porque 150 está fora do intervalo válido. Seu método setter impõe essa regra, mantendo os dados do aluno válidos. Observe como o studentID e a grade nunca são acessíveis diretamente — o código externo deve usar seus métodos getter e setter para interagir com esses dados protegidos.

Experimente você mesmo

package main

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

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

	// Ler o nome do estudante
	name, _ := reader.ReadString('\n')
	name = strings.TrimSpace(name)

	// Ler o ID do estudante
	id, _ := reader.ReadString('\n')
	id = strings.TrimSpace(id)

	// Ler a nota inicial
	initialGradeStr, _ := reader.ReadString('\n')
	initialGrade, _ := strconv.ParseFloat(strings.TrimSpace(initialGradeStr), 64)

	// Ler a primeira nova nota
	newGrade1Str, _ := reader.ReadString('\n')
	newGrade1, _ := strconv.ParseFloat(strings.TrimSpace(newGrade1Str), 64)

	// Ler a segunda nova nota
	newGrade2Str, _ := reader.ReadString('\n')
	newGrade2, _ := strconv.ParseFloat(strings.TrimSpace(newGrade2Str), 64)

	// TODO: Criar um novo estudante usando o construtor NewStudent

	// TODO: Imprimir o resumo do estudante após a criação

	// TODO: Tentar a primeira atualização de nota
	// Se for bem-sucedido, imprima o resumo atualizado
	// Se for rejeitado, imprima "Invalid grade rejected"

	// TODO: Tentar a segunda atualização de nota
	// Se for bem-sucedido, imprima o resumo atualizado
	// Se for rejeitado, imprima "Invalid grade rejected"

	// Hint: Use fmt.Sprintf com %.2f para formatar as notas em Summary()
	_ = newGrade1 // Remova esta linha quando você usar a variável
	_ = newGrade2 // Remova esta linha quando você usar a variável
}

Todas as lições de Programação Orientada a Objetos