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


#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;        // 5 оценок
    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();

    // Стипендия при среднем балле >= 4.5
    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 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) {
            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";
    }
}

// Перегрузка: вывод одного студента в любой поток (файл/консоль)
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 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 << " (отсортировано по ФИО):\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";
    }
}

// Перегрузка: вывод студентов с фильтром по стипендии (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
                << " (средний балл: "
                << fixed << setprecision(2)
                << student.averageGrade << ")\n";
            found = true;
        }
    }

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

// === ТЕСТИРОВАНИЕ ПЕРЕГРУЗОК ===
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";
}


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);

    return 0;
}