Advertisement
profits

Untitled

Jan 18th, 2020
966
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.49 KB | None | 0 0
  1. //Задание №3
  2.  
  3. //Students.h
  4.  
  5. #pragma once
  6.  
  7. class Students
  8. {
  9. private:
  10.     static int s_number_of_students; // количество студентов
  11.     std::string m_student[3]; // ФИО студента
  12.     int m_grades[3]; // оценки по предметам
  13.     double m_evaluation; // средний балл студента
  14.     static int m_ID; // порядковый номер студента
  15.  
  16. public:
  17.     Students() { readFile(); } // конструктор
  18.  
  19.     void readFile(); // считываем данные из файла для инициализации объекта
  20.     static int getLength(); // функция возвращает количество студентов
  21.     double averageScore(); // функция возвращает средний балл успеваемости
  22.     friend std::ostream& operator<<(std::ostream& out, const Students& stud); // перегрузка оператора <<
  23. };
  24. //------------------------------------------------------------------------
  25. //Students.cpp
  26.  
  27. #include <iostream>
  28. #include <string>
  29. #include <fstream>
  30. #include <iomanip>
  31. #include "Students.h"
  32.  
  33. std::ifstream in_f("C://input_data.txt"); // открываем файл для чтения здесь, для последующего чтения с места остановки
  34. int Students::s_number_of_students{ 1 }; // инициализация статич. переменной класса Students
  35. int Students::m_ID{ 1 }; // инициализация статич. переменной класса Students
  36.  
  37. void Students::readFile() { // считываем из файла
  38.     int i{}, j{}; // индексы массивов ФИО студента и его оценки
  39.     static int index{ -1 }; // индекс строк файла
  40.  
  41.     if (in_f) { // если файл открылся
  42.         while (in_f) { // пока нет ошибок и EOF, извлекаем данные
  43.             if (++index == 0) { // если индекс первой строки файла
  44.                 s_number_of_students; // количество студентов
  45.                 in_f >> s_number_of_students; // присваиваем из файла в статич. переменную
  46.             }
  47.             if (in_f.peek() == '\n') { // если символ новой строки
  48.                 in_f.ignore(INT_MAX, '\n'); // очищаем поток от символа для продолжения чтения с файла
  49.                 if (index != 0) break; // и переходим к созданию объекта следующего студента
  50.             }
  51.             if ((in_f.peek() > '5' || in_f.peek() < '1') && i < 3) // если в потоке ФИО студента
  52.                 in_f >> m_student[i++]; // присваиваем в массив
  53.             else // если в потоке символы оценок
  54.                 in_f >> m_grades[j++]; // присваиваем числа из файла в массив
  55.         }
  56.         m_evaluation = (m_grades[0] + m_grades[1] + m_grades[2]) / 3.0;
  57.     }
  58.     else
  59.         std::cout << "Файл \"input_data.txt\" не обнаружен\n";
  60. }
  61.  
  62. int Students::getLength() { // количество студентов
  63.     return s_number_of_students;
  64. }
  65.  
  66. double Students::averageScore() { // средний балл успеваемости
  67.     return m_evaluation;
  68. }
  69.  
  70. std::ostream& operator<<(std::ostream& out, const Students& stud) { // перегрузка оператора <<
  71.     out << " №" << stud.m_ID++ << "\t\b" << stud.m_student[0] << " " << stud.m_student[1] << " " <<
  72.         stud.m_student[2] << "\r\t\t\t\t\tматемат.: " << stud.m_grades[0] << ",  физика: " <<
  73.         stud.m_grades[1] << ",  информат.: " << stud.m_grades[2] << std::setw(17) <<
  74.         "ср. балл: " << std::fixed << std::setprecision(1) << stud.m_evaluation;
  75.     return out;
  76. }
  77. //------------------------------------------------------------------------
  78. //main.cpp
  79.  
  80. #include <iostream>
  81. #include <vector>
  82. #include <Windows.h>
  83. #include "Students.h"
  84.  
  85. int main()
  86. {
  87.     SetConsoleCP(1251); SetConsoleOutputCP(1251);
  88.     std::vector<Students>vec_stud; // массив студентов
  89.     for (int i{}; i < Students::getLength(); ++i) {
  90.         Students stud; // создаем объект нового студента
  91.         vec_stud.push_back(stud); // добавляем его в вектор
  92.     }
  93.  
  94.     for (int j{}; j < Students::getLength() - 1; ++j) // итерация студентов
  95.         for (int k{ j + 1 }; k < Students::getLength(); ++k) // итерация студентов
  96.             if (vec_stud[j].Students::averageScore() < vec_stud[k].Students::averageScore()) // сравниваем значения среднего балла
  97.                 std::swap(vec_stud[j], vec_stud[k]); // меняем местами
  98.  
  99.     std::cout << "\t\bВсего студентов : " << Students::getLength() << "\n\n";
  100.     for (const auto& element : vec_stud) // выводим отсортированный вектор
  101.         std::cout << element << std::endl;
  102.  
  103.     return 0;
  104. }
  105. //------------------------------------------------------------------------
  106. //C://input_data.txt
  107.  
  108. 10
  109. Пиров Николай Иванович 3 5 2
  110. Самохин Федор Михайлович 4 4 3
  111. Нестеров Лев Николаевич 1 3 4
  112. Абрамов Дмитрий Иванович 3 2 2
  113. Маркелов Петр Ильич 3 3 3
  114. Поздеев Сергей Павлович 4 5 5
  115. Семенов Михаил Васильевич 2 2 1
  116. Попов Александр Степанович 4 5 3
  117. Столетов Александр Григорьевич 5 4 4
  118. Кулев Сергей Петрович 5 5 5
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement