Menu
Coddy logo textTech

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

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

challenge icon

Задание

Легко

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

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

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

    Implement следующее:

    • constructor NewStudent(name, id string, initialGrade float64) *Student, который creates студента. initial оценка должна устанавливаться only, если она находится between 0 и 100 (inclusive); otherwise следует использовать default значение 0.
    • getter Grade() float64, который возвращает current оценку
    • getter StudentID() string, который возвращает идентификатор студента
    • setter SetGrade(newGrade float64) bool, который обновляет оценку only, если newGrade находится between 0 и 100 (inclusive). Верните true, если оценка была обновлена, и false otherwise.
    • method Summary() string, который возвращает формат: [Name] (ID: [studentID]) - Grade: [grade]
  • main.go: Считайте информацию о студенте из входных data, создайте студента, используя constructor, а затем выполните операции с оценками. Выведите сводку о студенте после creation и после каждой Attempt обновления оценки.

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

  • line 1: Имя студента
  • line 2: Идентификатор студента
  • line 3: Initial оценка
  • line 4: Первая новая оценка для установки
  • line 5: Вторая новая оценка для установки

После creation студента выведите его сводку. Затем выполните Attempt каждого обновления оценки: если операция успешна, выведите обновлённую сводку; если обновление отклонено, выведите 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 находится за пределами допустимого диапазона. Ваш setter обеспечивает соблюдение этого правила, сохраняя data студента корректными. Обратите внимание, что studentID и grade никогда не доступны напрямую: внешний код должен использовать ваши getter и setter method для взаимодействия с этими защищёнными data.

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

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: Попытаться обновить первую оценку
	// Если успешно, вывести обновлённую сводку
	// If rejected, print "Invalid grade rejected"

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

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

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

Потренируйтесь самостоятельно: Онлайн-компилятор Go