#include // потоки вводу/виводу C++ #include // для роботи з списками #include // для роботи з типом string #include // для роботи з файлами #include // для правильного выдображення укр символів using namespace std; struct Student{ // структура даних списку string Name; string Surname; int Kolokvium[2]; int Lab[4]; }; list Data; void Add(string Surname, string Name, int Kol1, int Kol2, int Lab1, int Lab2, int Lab3, int Lab4){ Student Buffer; Buffer.Name=Name; Buffer.Surname=Surname; *(Buffer.Kolokvium+0)=Kol1; *(Buffer.Kolokvium+1)=Kol2; *(Buffer.Lab+0)=Lab1; *(Buffer.Lab+1)=Lab2; *(Buffer.Lab+2)=Lab3; *(Buffer.Lab+3)=Lab4; Data.push_back(Buffer); } list Sort(list Sorted, int Type){ // ф-я сортування примймає список для сортування і тип 0/1 - спадання/зростання list::iterator Next; // змінна типу ітератор Student Buffer; // буфер для копіювання for(list::iterator i=Sorted.begin(); i!=Sorted.end(); i++){ // цикли для проходження по списку, iter - ітератор(ключ) для звертання до елементів списку for(list::iterator j=Sorted.begin(); j!=Sorted.end(); j++){ Next=j; // присвоюємо Next значення поточного елемента if(Next==Sorted.end()) // якщо розглядається останній елемент як поточний - виходимо з циклу break; Next++; // задаємо Next-у значення наступного елемента int OneStudent=(*(j->Kolokvium+0))+(*(j->Kolokvium+1))+(*(j->Lab+0))+(*(j->Lab+1))+(*(j->Lab+2))+(*(j->Lab+3)); // сума балів поточного студента int TwoStudent=(*(Next->Kolokvium+0))+(*(Next->Kolokvium+1))+(*(Next->Lab+0))+(*(Next->Lab+1))+(*(Next->Lab+2))+(*(Next->Lab+3)); // сума балів наступного студента if(Type==0){ // тип сотрування: за спаданням if(OneStudent>TwoStudent){ // якщо поточний елемент більший за наступний то міняємо їх місцями Buffer=(*(j)); // j - покажчик, тобто *(j) - значення з ячейки пам'яті на яку показує j *(j)=(*(Next)); // аналогічно значенню j присвоюєм значення Next *(Next)=Buffer; } } if(Type==1){ // тип сотрування: за зростанням !!! АЛЕ З НЕЗРОЗУМІЛИХ ПРИЧИН ПОКИЩО НЕ ПРАЦЮЄ (програма вилітає) !!! if(OneStudent Sorted; // оголошуємо список Student Buffer; // буфер тимчасових даних /* ifstream fin("list.txt"); // відкриваємо файл з списком групи int number=0; while(!fin.eof()){ // читаємо поки не закінчиться файл if(number>0) // поинаємо додавати в список з другої ітерації (для виключення повтору останньої людини двічі) Data.push_back(Buffer); // додали данне в список fin >> Buffer.Name; // перше слово стрічки - ім'я і т.д..... fin >> Buffer.Surname; // прізвище for(int i=0; i<2; i++) // дві оцінки за колоквіуми fin >> Buffer.Kolokvium[i]; for(int i=0; i<4; i++) // чотири оцінки за лаби fin >> Buffer.Lab[i]; number++; } */ /// заповнення списку.. Add("Барабаш", "В.А.", 4, 4, 5, 5, 5, 5); Add("Берген", "А.О.", 4, 4, 5, 5, 5, 5); Add("Горбатюк", "В.В.", 4, 4, 5, 5, 5, 5); Add("Дишкант", "Б.П.", 4, 4, 5, 5, 5, 5); Add("Каращенко", "М.І.", 5, 5, 5, 5, 5, 5); // ;) Add("Кієнко", "В.О.", 4, 4, 5, 5, 5, 5); Add("Клезь", "А.С.", 4, 4, 5, 5, 5, 5); Add("Коваль", "В.С.", 4, 4, 5, 5, 5, 5); Add("Король", "Т.В.", 4, 4, 5, 5, 5, 5); Add("Кузнєцов", "М.В.", 4, 4, 5, 5, 5, 5); Add("Купчин", "І.Ю.", 4, 4, 5, 5, 5, 5); Add("Нутрак", "С.П.", 4, 4, 5, 5, 5, 5); Add("Сивак", "С.К.", 4, 4, 5, 5, 5, 5); Add("Симчук", "І.Г.", 4, 4, 5, 5, 5, 5); Add("Струган", "С.І.", 4, 4, 5, 5, 5, 5); // нижче показуємо менюшку з функціями int Menu=0; while(true){ printf("Виберiть одну з наступних дiй:\n 1 - Доповнити список\n 2 - Показати список\n 3 - Сортувати за спаданням\n 4 - Сортувати за зростанням\n 5 - Показати відсортований список\n"); cout << " >> "; cin >> Menu; cout << endl << "--------------------------------" << endl; switch(Menu){ case 1:{ // додавання людини в список /* нижче зчитуємо данні з клавітури і додаємо новий елемент в кінець вже існуючого списку */ cout << "Iм'я: "; cin >> Buffer.Name; cout << "Прiзвище: "; cin >> Buffer.Surname; for(int i=0; i<2; i++){ cout << "Колоквіум №" << i+1 <<": "; cin >> Buffer.Kolokvium[i]; } for(int i=0; i<4; i++){ cout << "Лабораторна №" << i+1 <<": "; cin >> Buffer.Lab[i]; } Data.push_back(Buffer); system("cls"); break; } case 2:{ // виведення оригіналу списку system("cls"); for (list::iterator iter=Data.begin(); iter!=Data.end(); iter++){ // цикл для проходу по списку (вище вже згадано^^^) cout << "Iм'я, по-батькові: " << iter->Name <Surname <Kolokvium+0) << "," << *(iter->Kolokvium+1); cout << endl << "Лаборатоні роботи: "; cout << *(iter->Lab+0) << "," << *(iter->Lab+1) << "," << *(iter->Lab+2) << "," << *(iter->Lab+3); cout << endl << "--------------------------------" << endl; } break; } case 3:{ // сортування за спаданням system("cls"); Sorted=Sort(Data, 0); // просто передаємо функції Sort наш оригінальний список, і записуємо що повертає break; } case 4:{ // сортування за зростанням system("cls"); Sorted=Sort(Data, 1); // аналогічно, як написано вище ^^^ break; } case 5:{ // виведенння відсортованого списку system("cls"); if(Sorted.begin()==Sorted.end()){ // якщо список ще не сортувався cout << endl << "--------------------------------" << endl; cout << "Спочатку відсортуйте список!"; cout << endl << "--------------------------------" << endl; break; } /* якщо все ок, виводимо выдсортований список */ for (list::iterator iter=Sorted.begin(); iter!=Sorted.end(); iter++){ cout << "Iм'я, по-батькові: " << iter->Name <Surname <Kolokvium+0) << "," << *(iter->Kolokvium+1); cout << endl << "Лаборатоні роботи: "; cout << *(iter->Lab+0) << "," << *(iter->Lab+1) << "," << *(iter->Lab+2) << "," << *(iter->Lab+3); cout << endl << "--------------------------------" << endl; } break; } default:{ // якщо введено неіснуюче число в меню, просто переходимо на наступну ітерацію break; } } } return 0; }