students-2-4.cpp 6.9 KB

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