Menu
Coddy logo textTech

Итоги — Записи о студентах

Часть раздела Объектно-ориентированное программирование путешествия по GO на Coddy — урок 51 из 107.

challenge icon

Задание

Легко

Давайте создадим систему учета студентов, которая демонстрирует правильную инкапсуляцию. Вы создадите структуру управления студентами, в которой конфиденциальные академические данные защищены, но при этом обеспечивается контролируемый доступ через хорошо спроектированные методы.

Вы организуете свой код в двух файлах:

  • student.go: Создайте структуру Student, которая защищает конфиденциальную информацию, открывая при этом безопасные публичные данные. Имя студента Name должно быть экспортируемым (публично доступным), но его grade (float64) и studentID (string) должны быть неэкспортируемыми для защиты этой конфиденциальной информации.

    Реализуйте следующее:

    • Конструктор NewStudent(name, id string, initialGrade float64) *Student, который создает студента. Начальная оценка должна устанавливаться только в том случае, если она находится в диапазоне от 0 до 100 (включительно); в противном случае установите значение по умолчанию 0.
    • Геттер Grade() float64, который возвращает текущую оценку.
    • Геттер StudentID() string, который возвращает ID студента.
    • Сеттер SetGrade(newGrade float64) bool, который обновляет оценку только в том случае, если новое значение находится в диапазоне от 0 до 100 (включительно). Возвращает true, если оценка была обновлена, и false в противном случае.
    • Метод Summary() string, который возвращает строку в формате: [Name] (ID: [studentID]) - Grade: [grade]
  • main.go: Считайте информацию о студенте из входных данных, создайте студента с помощью конструктора, а затем выполните операции с оценками. Выведите сводку (summary) студента после создания и после каждой попытки обновления оценки.

Будут предоставлены следующие входные данные:

  • Строка 1: Имя студента
  • Строка 2: ID студента
  • Строка 3: Начальная оценка
  • Строка 4: Первая новая оценка для установки
  • Строка 5: Вторая новая оценка для установки

После создания студента выведите его сводку. Затем попытайтесь выполнить каждое обновление оценки — в случае успеха выведите обновленную сводку; если попытка отклонена, выведите Invalid grade rejected. Форматируйте все значения оценок с двумя знаками после запятой.

Например, для входных данных Emma Wilson, STU001, 85.5, 92.0 и 150 ваш вывод должен быть следующим:

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

Последнее обновление не удается, так как 150 находится вне допустимого диапазона. Ваш метод-сеттер обеспечивает соблюдение этого правила, сохраняя данные студента корректными. Обратите внимание, что studentID и grade никогда не доступны напрямую — внешний код должен использовать ваши методы геттеры и сеттеры для взаимодействия с этими защищенными данными.

Попробуйте сами

package main

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

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

	// Чтение имени студента
	name, _ := reader.ReadString('\n')
	name = strings.TrimSpace(name)

	// Чтение ID студента
	id, _ := reader.ReadString('\n')
	id = strings.TrimSpace(id)

	// Чтение начальной оценки
	initialGradeStr, _ := reader.ReadString('\n')
	initialGrade, _ := strconv.ParseFloat(strings.TrimSpace(initialGradeStr), 64)

	// Чтение первой новой оценки
	newGrade1Str, _ := reader.ReadString('\n')
	newGrade1, _ := strconv.ParseFloat(strings.TrimSpace(newGrade1Str), 64)

	// Чтение второй новой оценки
	newGrade2Str, _ := reader.ReadString('\n')
	newGrade2, _ := strconv.ParseFloat(strings.TrimSpace(newGrade2Str), 64)

	// TODO: Создайте нового студента, используя конструктор NewStudent

	// TODO: Выведите сводку о студенте после создания

	// TODO: Попробуйте выполнить первое обновление оценки
	// Если обновление прошло успешно, выведите обновленную сводку
	// Если отклонено, выведите "Invalid grade rejected"

	// TODO: Попробуйте выполнить второе обновление оценки
	// Если обновление прошло успешно, выведите обновленную сводку
	// Если отклонено, выведите "Invalid grade rejected"

	// Hint: Используйте fmt.Sprintf с %.2f для форматирования оценок в Summary()
	_ = newGrade1 // Удалите эту строку, когда начнете использовать переменную
	_ = newGrade2 // Удалите эту строку, когда начнете использовать переменную
}

Все уроки раздела Объектно-ориентированное программирование