Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <algorithm>
- #include <fstream>
- #include <string>
- using namespace std;
- ifstream in("input.txt");
- ofstream out("output.txt");
- struct Student
- {
- string Name;
- string Surname;
- string SecondName;
- int YearOfBirth;
- int mark[5];
- Student() {}
- Student(string Surname, string Name, string SecondName, int YearOfBirth, int mark[5])
- {
- this->Name = Name;
- this->Surname = Surname;
- this->SecondName = SecondName;
- this->YearOfBirth = YearOfBirth;
- for (int i = 0; i < 5; ++i)
- this->mark[i] = mark[i];
- }
- void InitStudent()//ввод данных (фамилия -> имя -> отчество -> год -> оценки
- {
- in >> Surname >> Name >> SecondName >> YearOfBirth;
- for (int i = 0; i < 5; ++i)
- in >> mark[i];
- }
- int GetSum()
- {
- int sum = 0;
- for (int i = 0; i < 5; ++i)
- sum += mark[i];
- return sum;
- }
- void Print()//выовд в файл
- {
- out << "Full name : " << Surname << " " << Name << " " << SecondName << endl;
- out << "Year of birth : " << YearOfBirth << endl;
- out << "Marks : ";
- for (int i = 0; i < 5; ++i)
- out << mark[i] << " ";
- out << "\nSum : " << GetSum();
- out << "\n=================================================\n";
- }
- bool operator <(Student a)//перегрузка оператора <
- {
- return this->GetSum() > a.GetSum();
- }
- bool operator >(Student a)//перегрузка оператора <
- {
- return this->GetSum() < a.GetSum();
- }
- };
- // Функция "просеивания" через кучу - формирование кучи
- void siftDown(Student *a, int root, int bottom)
- {
- int maxChild; // индекс максимального потомка
- int flag = 0; // флаг того, что куча сформирована
- // Пока не дошли до последнего ряда
- while ((root * 2 <= bottom) && (!flag))
- {
- if (root * 2 == bottom) // если мы в последнем ряду,
- maxChild = root * 2; // запоминаем левый потомок
- // иначе запоминаем больший потомок из двух
- else if (a[root * 2] > a[root * 2 + 1])
- maxChild = root * 2;
- else
- maxChild = root * 2 + 1;
- // если элемент вершины меньше максимального потомка
- if (a[root] < a[maxChild])
- {
- swap(a[root], a[maxChild]);
- root = maxChild;
- }
- else // иначе
- flag = 1; // пирамида сформирована
- }
- }
- // Функция сортировки на куче
- void heapSort(Student *a, int size)
- {
- // Формируем нижний ряд пирамиды
- for (int i = (size / 2) - 1; i >= 0; i--)
- siftDown(a, i, size - 1);
- // Просеиваем через пирамиду остальные элементы
- for (int i = size - 1; i >= 1; i--)
- {
- swap(a[0], a[i]);
- siftDown(a, 0, i - 1);
- }
- }
- int main()
- {
- int n; in >> n;
- Student * a = new Student[n];
- for (int i = 0; i < n; ++i)
- a[i].InitStudent();
- heapSort(a, n);
- for (int i = 0; i < n; ++i)
- a[i].Print();
- /*
- 11
- Bavera Eldred Boreng 2000 1 2 3 4 5
- Neoma Boggs Aung 2000 5 5 5 5 5
- Ahirlene Bode Feros 2000 3 3 3 3 3
- Cong Heston Unofs 2000 5 5 5 3 5
- Mario Beane Quri 2000 4 3 2 3 4
- Cheryll Balderas Roots 2000 4 2 3 4 2
- Shaquana Burkett Gemen 2000 5 5 5 5 4
- Nichole Frances Rasif 2000 3 3 3 3 3
- Euna Draper Daun 2000 5 5 5 5 5
- Carita Henriksen Colers 2000 2 3 4 5 2
- Treena Nicholes Samer 2000 4 3 4 5 2
- */
- }
Add Comment
Please, Sign In to add comment