Загрузка данных
#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;
}