students-5.cpp 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. // Добавлена перегрузка оператора "+=" (5 задание)
  2. #include <iostream>
  3. #include <string>
  4. #include <windows.h>
  5. using namespace std;
  6. struct Student
  7. {
  8. int mark;
  9. string name;
  10. };
  11. struct School
  12. {
  13. int number;
  14. };
  15. struct Score
  16. {
  17. double score;
  18. };
  19. class Journal
  20. {
  21. private:
  22. Student* students;
  23. School* schools;
  24. Score* scores;
  25. int NumberOfStudents = 0;
  26. int NOS = 0;
  27. int KolS = 0;
  28. int StudentData = 0;
  29. int AverageScore = 0;
  30. static int static_NOS; // статическая переменная, задающая номер школы согласно 3 заданию
  31. public:
  32. static int get_static_NOS() { return static_NOS; } // функция, возвращающая значение статической переменной
  33. static void set_static_NOS(int _new_static_NOS) { static_NOS = _new_static_NOS; } // установка нового значения статической переменной
  34. Journal(){ // конструктор без параметров
  35. cout << "\n\t\t\t\t\t\t\t\tИнициализация конструктора без параметров для объекта " << this << "\n"; // вывод информации о инициализации конструктора
  36. }
  37. // конструктор с параметрами полностью повторяет ф-цию NumOfSchool
  38. Journal(int nos){ // конструктор с параметром
  39. cout << "\n\t\t\t\t\t\t\t\tИнициализация конструктора с параметром для объекта " << this << "\n"; // вывод информации о инициализации конструктора
  40. NOS = nos;
  41. schools = new School[NOS];
  42. schools[KolS].number = static_NOS; // передача значения статической переменной в качестве номера школы
  43. KolS++;
  44. }
  45. ~Journal(){ // деструктор
  46. cout << "\n\t\t\t\t\t\t\t\tИнициализация деструктора для объекта " << this << "\n"; // вывод информации о инициализации деструктора
  47. }
  48. void NumOfSchool(int nos)
  49. {
  50. NOS = nos;
  51. schools = new School[NOS];
  52. schools[KolS].number = static_NOS; // в качестве номера школы передаётся значение статической переменной
  53. KolS++;
  54. }
  55. void NumberOfStds(int kol)
  56. {
  57. NumberOfStudents = kol;
  58. students = new Student[NumberOfStudents];
  59. }
  60. void SetStds(string name, int mark)
  61. {
  62. students[StudentData].name = name;
  63. students[StudentData].mark = mark;
  64. StudentData++;
  65. }
  66. void SaR(double as)
  67. {
  68. scores = new Score[NOS];
  69. scores[AverageScore].score = as;
  70. }
  71. string Spisok()
  72. {
  73. string b;
  74. for (int i = 0; i < KolS; i++) {
  75. b = b + "Школа №: " + to_string(schools[i].number) + "\n";
  76. }
  77. return b;
  78. }
  79. string SpisokSt()
  80. {
  81. string sp;
  82. for (int i = 0; i < NumberOfStudents; i++) {
  83. sp = sp + " Фамилия: " + students[i].name + " Оценка: " + to_string(students[i].mark)+"\n";
  84. }
  85. return sp;
  86. }
  87. string AverScore()
  88. {
  89. string h;
  90. for (int i = 0; i < KolS; i++) {
  91. h = h + " Средний балл: " + to_string(scores[i].score)+"\n";
  92. }
  93. return h;
  94. }
  95. void Idol()
  96. {
  97. cout << "Фамилия ученика с баллом выше среднего: "<<"\n";
  98. string u;
  99. for (int i = 0; i < KolS; i++) {
  100. for (int j = 0; j < NumberOfStudents; j++) {
  101. if (scores[i].score < students[j].mark) {
  102. u = u +" | "+students[j].name+" | "+"\n";
  103. }
  104. }
  105. cout << u << "\n";
  106. }
  107. }
  108. // перегрузка оператора "Присваивание сложения" для добавления текущего значения оценки ученика в переменную averagescore
  109. double operator += (double _average_score){ // перегрузка принимает в качестве аргумента переменную типа double
  110. return (_average_score + this->students[StudentData-1].mark); // возвращения полученного значения после сложения значения переданного аргумента и значения оценки текущего ученика
  111. }
  112. };
  113. int Journal::static_NOS = 1; // установка значения статической переменной по умолчанию во избежание ошибок "Неопределённая ссылка на статическую ф-цию"
  114. int main()
  115. {
  116. SetConsoleCP(1251);
  117. SetConsoleOutputCP(1251);
  118. setlocale(LC_ALL, "rus");
  119. int kolschool; // количество школ
  120. int kolstudents; // количество студентов
  121. int numofschool; // номер школы
  122. string familia; // фамилия студента
  123. int mark; // оценка студента
  124. double averagescore = 0; // средняя оценка
  125. char change_static_value; // переменная проверки на изменение статического значения класса
  126. // ввод количества школ
  127. cout << "Введите количество школ: ";
  128. cin >> kolschool;
  129. // указатель на массив с объектами класса Journal и размером kolschool
  130. Journal* journals[kolschool];
  131. for (int i = 0; i < kolschool; i++) {
  132. // ввод номера школы через статическую переменную согласно 3 заднию
  133. cout << "\nТекущее значение номера школы: " << Journal::get_static_NOS(); // вывод текущего значения статической переменной (номер школы)
  134. cout << "\nЖелаете его изменить? y/n "; cin >> change_static_value; // уточнение у пользователя желание изменить значение статической переменной (номер школы)
  135. // если пользователь изъявляет такое желание, то он вводит новое значение, которое после передаётся в статическую переменную
  136. if (change_static_value == 'y') {cout << "\nВведите новое значение: "; cin >> numofschool; Journal::set_static_NOS(numofschool); }
  137. // таким образом, были реализованы 2 типа конструкторов из 3. Конструктор с параметром по умолчанию смотрите во 2 файле
  138. if (i % 2 == 1){ // если текущий элемент не делится на 2
  139. journals[i] = new Journal(); // используется конструктор без параметра
  140. (*journals[i]).NumOfSchool(kolschool); // передача введённых значений
  141. }
  142. else { // если текущий элемент делиться на 2
  143. journals[i] = new Journal(kolschool); // используется конструктор с параметрами, в который передаются введённые значения
  144. }
  145. cout << "Введите количество учеников: ";
  146. cin >> kolstudents;
  147. // обращение к объекту через указатель "(*journals[i])" необходимо, так как в массиве лежат указатели, а не сами объекты
  148. (*journals[i]).NumberOfStds(kolstudents);
  149. for (int j = 0; j < kolstudents; j++) { // был слегка изменён ввод данных ученика, так как теперь они реализованы через перегрузку оператора
  150. cout << "\nВведите фамилию для " << j + 1 << " ученика : ";
  151. cin >> familia;
  152. cout << "Введите оценку для " << j + 1 << " ученика : ";
  153. cin >> mark;
  154. (*journals[i]).SetStds(familia, mark);
  155. // добавление значения оценки ученика в переменную averagescore через перегрузку оператора "Присваивание сложения"
  156. averagescore = ((*journals[i]) += averagescore);
  157. }
  158. averagescore = averagescore / kolstudents;
  159. (*journals[i]).SaR(averagescore);
  160. averagescore = 0;
  161. }
  162. for (int i = 0; i < kolschool; i++) {
  163. cout << "\n" << (*journals[i]).Spisok();
  164. cout << "\n" << (*journals[i]).SpisokSt();
  165. cout << "\n" << (*journals[i]).AverScore();
  166. (*journals[i]).Idol();
  167. }
  168. for (int i = 0; i < kolschool; i++) delete journals[i]; // удаление элементов динамического массива для очистки ОЗУ
  169. return 0; // конец программы
  170. }