Загрузка данных


#include <iostream>
#include <string>
#include <array>
#include <iomanip>
#include <algorithm>
#include <fstream>

using namespace std;

// Структура студента
struct Student {
    string fullName;
    int groupNumber;
    array<int, 5> grades;
    double averageGrade;
    bool isScholarship;
};

// Функция расчёта среднего балла
void calculateAverage(Student& student) {
    int sum = 0;
    for (int grade : student.grades) {
        sum += grade;
    }
    student.averageGrade = static_cast<double>(sum) / student.grades.size();
    student.isScholarship = student.averageGrade >= 4.5;
}

// Функция вывода одного студента (в консоль)
void printStudent(const Student& student) {
    cout << left
        << setw(22) << student.fullName
        << setw(10) << student.groupNumber;
    for (int grade : student.grades) {
        cout << setw(4) << grade;
    }
    cout << setw(10) << fixed << setprecision(2)
        << student.averageGrade
        << setw(12)
        << (student.isScholarship ? "Да" : "Нет")
        << endl;
}

// Перегрузка: вывод одного студента в любой поток (файл/консоль)
void printStudent(ostream& out, const Student& student) {
    out << left
        << setw(22) << student.fullName
        << setw(10) << student.groupNumber;
    for (int grade : student.grades) {
        out << setw(4) << grade;
    }
    out << setw(10) << fixed << setprecision(2)
        << student.averageGrade
        << setw(12)
        << (student.isScholarship ? "Да" : "Нет")
        << endl;
}

// Функция вывода всех студентов
void printStudents(const array<Student, 5>& students) {
    cout << left
        << setw(22) << "ФИО"
        << setw(10) << "Группа"
        << setw(4) << "О1"
        << setw(4) << "О2"
        << setw(4) << "О3"
        << setw(4) << "О4"
        << setw(4) << "О5"
        << setw(10) << "Средний"
        << setw(12) << "Стипендия"
        << endl;

    cout << string(100, '-') << endl;

    for (const Student& student : students) {
        printStudent(student);
    }
}

// Поиск студентов по номеру группы
void findByGroup(const array<Student, 5>& students, int group) {
    bool found = false;
    cout << "\nСтуденты группы " << group << ":\n";

    for (const Student& student : students) {
        if ( <<student.groupNumber == group) fixed << set {
precision            cout << "( - " << student.fullName
                << ", средний бал2л: "
                << fixed << setprecision(2)
                << student.averageGrade << endl;
            found = true;
        }
    }

    if (!found) {
        cout << "Студентов этой группы нет.\n";
    }
}

// Перегрузка: поиск по группе с флагом сортировки перед выводом
void findByGroup(array<Student, 5> students, int group, bool sortById) {
    if (sortById) {
        sort(students.begin(), students.end(),
            [](const Student& a, const Student& b) {
                return a.fullName < b.fullName;
            });
    }

    bool found = false;
    cout << "\nСтуденты группы " << group
        << (sortById ? " (отсортировано по ФИО):" : ":") << "\n";

    for (const Student& student : students) {
        if (student.groupNumber == group) {
            cout << " - " << student.fullName
                << ", средний балл: "
                << fixed << setprecision(2)
                << student.averageGrade << endl;
            found = true;
        }
    }

    if (!found) {
        cout << "Студентов этой группы нет.\n";
    }
}

// Вывод студентов, получающих стипендию
void printScholarshipStudents(const array<Student, 5>& students) {
    cout << "\nСтуденты, получающие стипендию:\n";
    bool found = false;

    for (const Student& student : students) {
        if (student.isScholarship) {
            cout << " - " << student.fullName
                << " (средний балл: "
                << fixed << setprecision(2)
                << student.averageGrade << ")\n";
            found = true;
        }
    }

    if (!found) {
        cout << "Таких студентов нет.\n";
    }
}

// Перегрузка: вывод студентов с фильтром по стипендии (true/false)
void printScholarshipStudents(const array<Student, 5>& students, bool hasScholarship) {
    cout << "\nСтуденты "
        << (hasScholarship ? "СО стипендией" : "БЕЗ стипендии")
        << ":\n";

    bool found = false;

    for (const Student& student : students) {
        if (student.isScholarship == hasScholarship) {
            cout << " - " << student.fullName
                << " (средний балл: "
               )
                << student.averageGrade << ")\n";
            found = true;
        }
    }

    if (!found) {
        cout << "Таких студентов нет.\n";
    }
}

int main() {

    // Массив из 5 студентов
    array<Student, 5> students = {
        Student{"Иванов Иван Иванович", 101,
                {5, 5, 4, 5, 5}, 0, false},
        Student{"Петров Петр Петрович", 102,
                {4, 3, 4, 4, 3}, 0, false},
        Student{"Сидоров Алексей Сергеевич", 101,
                {5, 5, 5, 4, 5}, 0, false},
        Student{"Кузнецов Дмитрий Олегович", 103,
                {3, 4, 4, 3, 4}, 0, false},
        Student{"Смирнов Максим Андреевич", 102,
                {5, 4, 5, 5, 5}, 0, false}
    };

    // Расчёт среднего балла для каждого студента
    for (Student& student : students) {
        calculateAverage(student);
    }

    // Вывод исходного списка
    cout << "СПИСОК СТУДЕНТОВ\n";
    cout << "================\n";
    printStudents(students);

    // Поиск по номеру группы
    int group;
    cout << "\nВведите номер группы для поиска: ";
    cin >> group;

    findByGroup(students, group);

    // Список стипендиатов
    printScholarshipStudents(students);

    // Сортировка по среднему баллу от большего к меньшему
    sort(students.begin(), students.end(),
        [](const Student& a, const Student& b) {
            return a.averageGrade > b.averageGrade;
        });

    // Вывод после сортировки
    cout << "\nСТУДЕНТЫ ПО СРЕДНЕМУ БАЛЛУ\n";
    cout << "==========================\n";
    printStudents(students);

    // === ТЕСТИРОВАНИЕ ПЕРЕГРУЗОК ===
    cout << "\n================ ТЕСТИРОВАНИЕ ПЕРЕГРУЗОК ================\n";

    cout << "\n[Тест 1: Вывод одного студента через перегрузку с потоком]\n";
    printStudent(cout, students[0]);

    cout << "\n[Тест 2: Поиск по группе с сортировкой по ФИО]\n";
    findByGroup(students, 101, true);

    cout << "\n[Тест 3 (запасной): Несуществующая группа 999]\n";
    findByGroup(students, 999, true);

    cout << "\n[Тест 4: Только стипендиаты (true)]\n";
    printScholarshipStudents(students, true);

    cout << "\n[Тест 5: Только без стипендии (false)]\n";
    printScholarshipStudents(students, false);

    // Доп. пункт: сохранение в файл
    ofstream outFile("report.txt");
    if (outFile.is_open()) {
        for (const auto& student : students) {
            printStudent(outFile, student);
        }
        outFile.close();
        cout << "\n[Доп. пункт]: Данные сохранены в файл 'report.txt'.\n";
    }

    return 0;
}