MARSHAL327

Lab1

Apr 30th, 2020
163
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.67 KB | None | 0 0
  1. #include "stdafx.h"
  2. #include <iostream>
  3. #include <iomanip>
  4. #include <string.h>
  5. #include <stdlib.h>
  6. #include <cstdlib>
  7. #include <windows.h>
  8. using namespace std;
  9.  
  10.  
  11. // =====================СТРУКТУРА ЗАДАЧИ=====================
  12. struct MyData {
  13.     int h, m;
  14.     char task_name[20];
  15. };
  16.  
  17. struct task {
  18.     MyData d;
  19.     task* next;
  20. };
  21.  
  22.  
  23. // =====================КЛАСС СТЕК=====================
  24. class Stack {
  25.     task t;
  26. public:
  27.     task* end, *beg;
  28.    
  29.     Stack(); // конструктор по умолчанию
  30.     ~Stack(); // дестурктор
  31.  
  32.     task* add(const task& t); // добавление первого элемента
  33.     task* add(task* end, const task& t); // Добавление следующих элементов
  34.     task* delete_el(task* beg); // Удаление эелемента
  35.     void show(task* beg); // Вывод элементов стека
  36.     task vvod(); // ввод данных
  37.     task* copy_stack(task* sbeg); // копирование объекта
  38.     void bubbleSort(task* beg); // сортировка пузырьком
  39. };
  40.  
  41.  
  42.  
  43. // =====================МЕТОДЫ КЛАССА=====================
  44. // конструктор по умолчанию
  45. Stack::Stack() {
  46.     end = beg = NULL;
  47.     t.d.h = t.d.m = 0;
  48. }
  49.  
  50. // деструктор
  51. Stack::~Stack() {
  52.     while (end != NULL) {              //Пока по адресу есть хоть что-то
  53.         task* temp = end->next;        //Сразу запоминаем указатель на адрес следующего элемента структуры
  54.         delete end;                    //Освобождаем память по месту начала списка
  55.         end = temp;                    //Меняем адрес начала списка
  56.     }
  57. }
  58.  
  59.  
  60. // Добавление первого элемента
  61. task* Stack::add(const task& t) {
  62.     task* beg = new task;
  63.     *beg = t;
  64.     beg->next = NULL;
  65.     return beg;
  66. }
  67.  
  68.  
  69. // Добавление следующих элементов
  70. task* Stack::add(task* end, const task& t) {
  71.     task* newE = new task;
  72.     *newE = t;
  73.     newE->next = 0;
  74.     end->next = newE;
  75.     end = newE;
  76.     return end;
  77. }
  78.  
  79.  
  80. // Удаление элемента
  81. task* Stack::delete_el(task* beg) {
  82.     task* temp = beg;
  83.  
  84.     // если один элемент в стеке
  85.     if (temp->next == NULL) {
  86.         beg = NULL, end = NULL;
  87.         delete temp;
  88.         cout << "Удалён последний элемент\n";
  89.         system("pause");
  90.         return beg;
  91.  
  92.     // иначе
  93.     } else {
  94.         while (temp->next->next != NULL) {
  95.             temp = temp->next;
  96.         }
  97.         end = temp;
  98.         end->next = NULL;
  99.  
  100.         delete temp->next;
  101.         cout << "Удалён последний элемент\n";
  102.         system("pause");
  103.         return end;
  104.     }
  105. }
  106.  
  107. // Сортировка пузырьком
  108. void Stack::bubbleSort(task* beg)  {
  109.     MyData tmp;
  110.     int all_time, next_all_time;
  111.  
  112.     for (task* i = beg; i->next != NULL; i = i->next) {
  113.         for (task* j = beg; j->next != NULL; j = j->next) {
  114.             if ((j->d.h * 60 * 60) + (j->d.m * 60) > (j->next->d.h * 60 * 60) + (j->next->d.m * 60)) {
  115.                 tmp = j->next->d;
  116.                 j->next->d = j->d;
  117.                 j->d = tmp;
  118.             }
  119.         }
  120.     }
  121. }
  122.  
  123. // Вывод элементов стека
  124. void Stack::show(task* beg) {
  125.     // если пустой стек
  126.     if (!beg) {
  127.         cout << "Стек пуст" << endl;
  128.         cin.get();
  129.         return;
  130.     }
  131.  
  132.     if (beg->next != NULL) bubbleSort(beg); // сортировка
  133.  
  134.     // иначе выводим данные
  135.     task* Mytask = beg;
  136.     cout << "Час" << setw(10) << "Минута" << setw(20) << "Имя задачи\n";
  137.  
  138.     while (Mytask != NULL) {
  139.         cout << Mytask->d.h << setw(10) << Mytask->d.m << setw(20) << Mytask->d.task_name << endl;
  140.         Mytask = Mytask->next;
  141.     }
  142.  
  143.     cin.get();
  144. }
  145.  
  146.  
  147. // ввод данных
  148. task Stack::vvod() {
  149.     cout << "Введите часы минуты задачу" << endl;
  150.     cin >> t.d.h >> t.d.m >> t.d.task_name;
  151.     if (t.d.h >= 0 && t.d.h <= 23) { // если минуты выходят за пределы 0..23
  152.         if (t.d.m >= 0 && t.d.m <= 59) { // если минуты выходят за пределы 0..59
  153.             if (t.d.task_name == 0) { // если имя задачи это ноль, то преобразуем в символ
  154.                 t.d.task_name[0] = '0';
  155.             }
  156.             return t;
  157.  
  158.         // ошибки
  159.         } else {
  160.             cout << "\nВведите минуты от 0 до 59\n";
  161.             system("pause");
  162.             vvod();
  163.         }
  164.     } else {
  165.         cout << "\nВведите часы от 0 до 23\n";
  166.         system("pause");
  167.         vvod();
  168.     }
  169. }
  170.  
  171.  
  172. // копирование объекта
  173. task *Stack::copy_stack(task *sbeg) {
  174.     //task* temp = new task;
  175.     task *temp = sbeg;
  176.     task* res_temp, *beg;
  177.  
  178.     res_temp = add(*temp);
  179.     beg = res_temp;
  180.     temp = temp->next;
  181.    
  182.     while (temp) {
  183.         res_temp = add(res_temp, *temp);
  184.         temp = temp->next;
  185.     }
  186.  
  187.     cin.get();
  188.     return beg;
  189. }
  190.  
  191.  
  192. // =====================ОСНОВНАЯ ЧАСТЬ=====================
  193. int main(){
  194.     SetConsoleCP(1251);
  195.     SetConsoleOutputCP(1251);
  196.     setlocale(LC_ALL, "russian");
  197.  
  198.     Stack s1, s2;
  199.     //task *beg = 0, *end = 0;
  200.     int item;
  201.    
  202.     do {
  203.         system("CLS");
  204.         cout << "1 - Создание объекта" << endl;
  205.         cout << "2 - Создание копии объекта" << endl;
  206.         cout << "3 - Просмотр полей оригинала" << endl;
  207.         cout << "4 - Просмотр полей копии" << endl;
  208.         cout << "5 - Удаление элемента" << endl;
  209.         cout << "6 - Выход" << endl;
  210.         cout << "============================" << endl;
  211.         cout << "Введите номер пункта меню" << endl;
  212.         cin >> item;
  213.         switch (item) {
  214.  
  215.         // Создание объекта
  216.         case 1:
  217.             if (s1.beg)
  218.                 s1.end = s1.add(s1.end, s1.vvod());
  219.             else {
  220.                 s1.beg = s1.add(s1.vvod());
  221.                 s1.end = s1.beg;
  222.             } break;
  223.  
  224.         // Создание копии объекта
  225.         case 2:
  226.             if (s1.beg) {
  227.                 s2.beg = s2.copy_stack(s1.beg);
  228.             } else {
  229.                 cout << "Стек пуст" << endl;
  230.             }
  231.            
  232.             system("pause");
  233.             break;
  234.  
  235.         // Просмотр полей оригинала
  236.         case 3:
  237.             s1.show(s1.beg);
  238.             system("pause");
  239.             break;
  240.  
  241.         // Просмотр полей копии
  242.         case 4:
  243.             s2.show(s2.beg);
  244.             system("pause");
  245.             break;
  246.  
  247.         // Удаление элемента
  248.         case 5:
  249.             // если пустой стек
  250.             if (!s1.beg) {
  251.                 cout << "Стек пуст" << endl;
  252.                 system("pause");
  253.                 break;
  254.             }
  255.  
  256.             if (s1.beg->next == NULL) {
  257.                 s1.beg = s1.delete_el(s1.beg);
  258.             } else {
  259.                 s1.end = s1.delete_el(s1.beg);
  260.             }
  261.             break;
  262.  
  263.         // выход из программы
  264.         case 6: return 0;
  265.         default:
  266.  
  267.             cout << "Неверно введён номер!" << endl;
  268.             cin.get();
  269.  
  270.             break;
  271.         }
  272.     } while (1);
  273.  
  274.     return 0;
  275. }
Add Comment
Please, Sign In to add comment