Menu
Coddy logo textTech

Powtórka – dane studentów

Część sekcji Programowanie obiektowe ścieżki GO w Coddy. Lekcja 51 z 107.

challenge icon

Wyzwanie

Łatwy

Stwórzmy system ewidencji studentów, który pokazuje prawidłową enkapsulację. Utworzysz strukturę do zarządzania studentami, w której wrażliwe dane akademickie będą chronione, a jednocześnie dostęp do nich będzie kontrolowany za pomocą dobrze zaprojektowanych metod.

Podzielisz kod na dwa pliki:

  • student.go: Utwórz strukturę Student, która chroni wrażliwe informacje, udostępniając jednocześnie bezpieczne dane publiczne. Pole Name studenta powinno być eksportowane (publicznie dostępne), natomiast pola grade (float64) i studentID (string) powinny być nieeksportowane, aby chronić te wrażliwe informacje.

    Zaimplementuj następujące elementy:

    • Konstruktor NewStudent(name, id string, initialGrade float64) *Student, który tworzy studenta. Początkowa ocena powinna być ustawiona tylko wtedy, gdy mieści się w zakresie od 0 do 100 (włącznie); w przeciwnym razie ustaw wartość domyślną 0.
    • Getter Grade() float64, który zwraca bieżącą ocenę
    • Getter StudentID() string, który zwraca identyfikator studenta
    • Setter SetGrade(newGrade float64) bool, który aktualizuje ocenę tylko wtedy, gdy nowa wartość mieści się w zakresie od 0 do 100 (włącznie). Zwróć true, jeśli ocena została zaktualizowana, a w przeciwnym razie false.
    • Metodę Summary() string, która zwraca tekst w formacie: [Name] (ID: [studentID]) - Grade: [grade]
  • main.go: Odczytaj informacje o studencie z wejścia, utwórz studenta za pomocą konstruktora, a następnie wykonaj operacje na ocenach. Wyświetl podsumowanie studenta po utworzeniu oraz po każdej próbie aktualizacji oceny.

Podane zostaną następujące dane wejściowe:

  • Wiersz 1: Imię i nazwisko studenta
  • Wiersz 2: Identyfikator studenta
  • Wiersz 3: Początkowa ocena
  • Wiersz 4: Pierwsza nowa ocena do ustawienia
  • Wiersz 5: Druga nowa ocena do ustawienia

Po utworzeniu studenta wyświetl jego podsumowanie. Następnie spróbuj zaktualizować każdą ocenę; jeśli aktualizacja się powiedzie, wyświetl zaktualizowane podsumowanie, a jeśli zostanie odrzucona, wyświetl Invalid grade rejected. Formatuj wszystkie oceny z dokładnością do dwóch miejsc po przecinku.

Na przykład dla danych Emma Wilson, STU001, 85.5, 92.0 i 150 wynik powinien wyglądać następująco:

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

Ostatnia aktualizacja nie powiedzie się, ponieważ 150 wykracza poza dozwolony zakres. Metoda setter egzekwuje tę zasadę, dzięki czemu dane studenta pozostają prawidłowe. Zwróć uwagę, że pola studentID i grade nigdy nie są bezpośrednio dostępne: kod zewnętrzny musi używać metod getter i setter, aby korzystać z tych chronionych danych.

Spróbuj swoich sił

package main

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

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

	// Odczytaj imię i nazwisko studenta
	name, _ := reader.ReadString('\n')
	name = strings.TrimSpace(name)

	// Odczytaj identyfikator studenta
	id, _ := reader.ReadString('\n')
	id = strings.TrimSpace(id)

	// Odczytaj ocenę początkową
	initialGradeStr, _ := reader.ReadString('\n')
	initialGrade, _ := strconv.ParseFloat(strings.TrimSpace(initialGradeStr), 64)

	// Odczytaj pierwszą nową ocenę
	newGrade1Str, _ := reader.ReadString('\n')
	newGrade1, _ := strconv.ParseFloat(strings.TrimSpace(newGrade1Str), 64)

	// Odczytaj drugą nową ocenę
	newGrade2Str, _ := reader.ReadString('\n')
	newGrade2, _ := strconv.ParseFloat(strings.TrimSpace(newGrade2Str), 64)

	// TODO: Utwórz nowego studenta za pomocą konstruktora NewStudent

	// TODO: Wypisz podsumowanie studenta po jego utworzeniu

	// TODO: Spróbuj po raz pierwszy zaktualizować ocenę
	// Jeśli się powiedzie, wypisz zaktualizowane podsumowanie
	// Jeśli aktualizacja zostanie odrzucona, wypisz "Invalid grade rejected"

	// TODO: Spróbuj po raz drugi zaktualizować ocenę
	// Jeśli się powiedzie, wypisz zaktualizowane podsumowanie
	// Jeśli aktualizacja zostanie odrzucona, wypisz "Invalid grade rejected"

	// Wskazówka: Użyj fmt.Sprintf z %.2f do formatowania ocen w Summary()
	_ = newGrade1 // Usuń tę linię, gdy zaczniesz używać zmiennej
	_ = newGrade2 // Usuń tę linię, gdy zaczniesz używać zmiennej
}

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Kompilator Go online