Advertisement
Toliak

lab6

Oct 27th, 2018
327
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.39 KB | None | 0 0
  1. #include <iostream>
  2. #include <iomanip>
  3. #include <string>
  4. #include <list>
  5.  
  6. struct Student
  7. {
  8.     std::string name;
  9.     std::string group;
  10.     unsigned short book;
  11.     unsigned short marks[4];
  12. };
  13.  
  14. struct ListIterator
  15. {
  16.     Student s;
  17.     ListIterator *prev = nullptr;
  18.     ListIterator *next = nullptr;
  19. };
  20.  
  21. void swap(ListIterator &l, ListIterator &r)
  22. {
  23.     Student s = std::move(l.s);
  24.     l.s = std::move(r.s);
  25.     r.s = std::move(s);
  26. }
  27.  
  28.  
  29. void sort(ListIterator *start)
  30. {
  31.     ListIterator *inside;
  32.     for (ListIterator *current = start; current != nullptr; current = current->next) {
  33.         ListIterator *minimum = current;
  34.         for (ListIterator *inside = current; inside != nullptr; inside = inside->next) {
  35.             if (inside->s.name < minimum->s.name) {
  36.                 minimum = inside;
  37.             }
  38.         }
  39.  
  40.         if (minimum != current) {
  41.             swap(*minimum, *current);
  42.         }
  43.     }
  44. }
  45.  
  46. int main()
  47. {
  48.     ListIterator *currentIterator = nullptr;                // Текущий итератор
  49.  
  50.     size_t n;
  51.     std::cout << "Enter amount: ";
  52.     std::cin >> n;                                          // Количество студентов
  53.     for (size_t i = 0; i < n; i++) {
  54.         if (currentIterator == nullptr) {                   // Если нет еще итератора
  55.             currentIterator = new ListIterator;             // Создаем
  56.         } else {
  57.             auto newIterator = new ListIterator;            //  Создаем следующий
  58.             currentIterator->next = newIterator;            // Ликнуем итераторы
  59.             newIterator->prev = currentIterator;
  60.             currentIterator = newIterator;
  61.         }
  62.         Student &s = currentIterator->s;                    // Ссылка на текущего студента
  63.  
  64.         std::cin.ignore();
  65.         std::cout << "[Student " << std::setw(2) << i << "] Name    : ";
  66.         std::getline(std::cin, s.name);
  67.         std::cout << "[Student " << std::setw(2) << i << "] Group   : ";
  68.         std::getline(std::cin, s.group);
  69.         std::cout << "[Student " << std::setw(2) << i << "] Book    : ";
  70.         std::cin >> s.book;
  71.         std::cout << "[Student " << std::setw(2) << i << "] Marks(4): ";
  72.         for (size_t j = 0; j < 4; j++) {
  73.             std::cin >> s.marks[j];
  74.         }
  75.     }
  76.  
  77.     while (currentIterator->prev != nullptr) {              // Пока не дойдем до начала
  78.         currentIterator = currentIterator->prev;
  79.     }
  80.  
  81.     sort(currentIterator);                                  // Вызываем сортировку
  82.     std::cout << "Result" << std::endl;
  83.     for (ListIterator *current = currentIterator; current != nullptr; current = current->next) {
  84.         std::cout << "[Student] Name    : " << current->s.name << std::endl;
  85.         std::cout << "[Student] Group   : " << current->s.group << std::endl;
  86.         std::cout << "[Student] Book    : " << current->s.book << std::endl;
  87.         std::cout << "[Student] Marks: ";
  88.         for (size_t j = 0; j < 4; j++) {
  89.             std::cout << current->s.marks[j] << " ";
  90.         }
  91.         std::cout << std::endl;
  92.     }
  93.  
  94.     for (ListIterator *current = currentIterator; current != nullptr; current = current->next) {
  95.         if (current->prev != nullptr) {
  96.             delete current->prev;
  97.         }
  98.     }
  99.  
  100.     return 0;
  101. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement