Menu
Coddy logo textTech

Итоги — Система учета студентов

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

challenge icon

Задание

Легко

Давайте создадим систему учета студентов, которая объединяет все концепции инкапсуляции, изученные вами в этой главе. Вы создадите хорошо организованную систему, которая безопасно управляет данными студентов, используя продвижение конструктора (constructor promotion), закрытые свойства (private properties), геттеры и сеттеры с валидацией, а также сокрытие информации.

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

  • Student.php — Создайте класс Student, используя продвижение конструктора для закрытого свойства $name (string) и закрытого свойства $studentId (string). Также включите закрытое свойство-массив $grades (инициализированное как пустое). У вашего студента должны быть:
    • getName() — возвращает имя студента
    • getStudentId() — возвращает ID студента
    • addGrade(int $grade) — добавляет оценку только в том случае, если она находится в диапазоне от 0 до 100 (включительно)
    • getAverage() — возвращает средний балл всех оценок в виде float (возвращает 0.0, если оценок нет)
    • getGradeCount() — возвращает количество записанных оценок
  • Classroom.php — Создайте класс Classroom, который управляет коллекцией студентов. Используйте закрытый массив для хранения студентов. Подключите файл Student. В вашем классе должны быть:
    • Конструктор, который принимает закрытое свойство $roomName (string), используя продвижение конструктора
    • addStudent(Student $student) — добавляет студента в класс
    • getStudentCount() — возвращает количество зачисленных студентов
    • getClassAverage() — вычисляет средний балл среди средних баллов всех студентов (возвращает 0.0, если нет студентов или оценок)
    • getRoomName() — возвращает название класса
  • main.php — Подключите файл Classroom. Вы получите пять входных данных: название комнаты, имя студента, ID студента и два значения оценок. Создайте объект Classroom с названием комнаты. Создайте объект Student с именем и ID, добавьте обе оценки (преобразованные в целые числа), затем добавьте студента в класс. Выведите четыре строки:
    • Название комнаты
    • Имя студента, за которым следует его средний балл, отформатированный до 1 знака после запятой: "[name]: [average]"
    • Количество оценок этого студента
    • Средний балл класса, отформатированный до 1 знака после запятой

Эта система демонстрирует правильную инкапсуляцию: оценки защищены от прямого манипулирования, средние баллы вычисляются внутри без раскрытия необработанных данных, а все данные проходят через контролируемые методы. Классу не нужно знать, как студенты вычисляют свои средние баллы — он просто запрашивает результат.

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

<?php

require_once 'Classroom.php';

// Чтение входных данных
$roomName = trim(fgets(STDIN));
$studentName = trim(fgets(STDIN));
$studentId = trim(fgets(STDIN));
$grade1 = intval(trim(fgets(STDIN)));
$grade2 = intval(trim(fgets(STDIN)));

// TODO: Создать объект Classroom с названием комнаты

// TODO: Создать объект Student с именем и ID

// TODO: Добавить обе оценки студенту

// TODO: Добавить студента в класс

// TODO: Вывести название комнаты

// TODO: Вывести имя студента и его средний балл, отформатированный до 1 знака после запятой: "[name]: [average]"

// TODO: Вывести количество оценок этого студента

// TODO: Вывести средний балл класса, отформатированный до 1 знака после запятой

?>

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