Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "stdafx.h"
- #include <iostream>
- #include <iomanip>
- #include <string.h>
- #include <stdlib.h>
- #include <cstdlib>
- #include <windows.h>
- using namespace std;
- // =====================СТРУКТУРА ЗАДАЧИ=====================
- struct MyData {
- int h, m;
- char task_name[20];
- };
- struct task {
- MyData d;
- task* next;
- };
- // =====================КЛАСС СТЕК=====================
- class Stack {
- task t;
- public:
- task* end, *beg;
- Stack(); // конструктор по умолчанию
- ~Stack(); // дестурктор
- task* add(const task& t); // добавление первого элемента
- task* add(task* end, const task& t); // Добавление следующих элементов
- task* delete_el(task* beg); // Удаление эелемента
- void show(task* beg); // Вывод элементов стека
- task vvod(); // ввод данных
- task* copy_stack(task* sbeg); // копирование объекта
- void bubbleSort(task* beg); // сортировка пузырьком
- };
- // =====================МЕТОДЫ КЛАССА=====================
- // конструктор по умолчанию
- Stack::Stack() {
- end = beg = NULL;
- t.d.h = t.d.m = 0;
- }
- // деструктор
- Stack::~Stack() {
- while (end != NULL) { //Пока по адресу есть хоть что-то
- task* temp = end->next; //Сразу запоминаем указатель на адрес следующего элемента структуры
- delete end; //Освобождаем память по месту начала списка
- end = temp; //Меняем адрес начала списка
- }
- }
- // Добавление первого элемента
- task* Stack::add(const task& t) {
- task* beg = new task;
- *beg = t;
- beg->next = NULL;
- return beg;
- }
- // Добавление следующих элементов
- task* Stack::add(task* end, const task& t) {
- task* newE = new task;
- *newE = t;
- newE->next = 0;
- end->next = newE;
- end = newE;
- return end;
- }
- // Удаление элемента
- task* Stack::delete_el(task* beg) {
- task* temp = beg;
- // если один элемент в стеке
- if (temp->next == NULL) {
- beg = NULL, end = NULL;
- delete temp;
- cout << "Удалён последний элемент\n";
- system("pause");
- return beg;
- // иначе
- } else {
- while (temp->next->next != NULL) {
- temp = temp->next;
- }
- end = temp;
- end->next = NULL;
- delete temp->next;
- cout << "Удалён последний элемент\n";
- system("pause");
- return end;
- }
- }
- // Сортировка пузырьком
- void Stack::bubbleSort(task* beg) {
- MyData tmp;
- int all_time, next_all_time;
- for (task* i = beg; i->next != NULL; i = i->next) {
- for (task* j = beg; j->next != NULL; j = j->next) {
- if ((j->d.h * 60 * 60) + (j->d.m * 60) > (j->next->d.h * 60 * 60) + (j->next->d.m * 60)) {
- tmp = j->next->d;
- j->next->d = j->d;
- j->d = tmp;
- }
- }
- }
- }
- // Вывод элементов стека
- void Stack::show(task* beg) {
- // если пустой стек
- if (!beg) {
- cout << "Стек пуст" << endl;
- cin.get();
- return;
- }
- if (beg->next != NULL) bubbleSort(beg); // сортировка
- // иначе выводим данные
- task* Mytask = beg;
- cout << "Час" << setw(10) << "Минута" << setw(20) << "Имя задачи\n";
- while (Mytask != NULL) {
- cout << Mytask->d.h << setw(10) << Mytask->d.m << setw(20) << Mytask->d.task_name << endl;
- Mytask = Mytask->next;
- }
- cin.get();
- }
- // ввод данных
- task Stack::vvod() {
- cout << "Введите часы минуты задачу" << endl;
- cin >> t.d.h >> t.d.m >> t.d.task_name;
- if (t.d.h >= 0 && t.d.h <= 23) { // если минуты выходят за пределы 0..23
- if (t.d.m >= 0 && t.d.m <= 59) { // если минуты выходят за пределы 0..59
- if (t.d.task_name == 0) { // если имя задачи это ноль, то преобразуем в символ
- t.d.task_name[0] = '0';
- }
- return t;
- // ошибки
- } else {
- cout << "\nВведите минуты от 0 до 59\n";
- system("pause");
- vvod();
- }
- } else {
- cout << "\nВведите часы от 0 до 23\n";
- system("pause");
- vvod();
- }
- }
- // копирование объекта
- task *Stack::copy_stack(task *sbeg) {
- //task* temp = new task;
- task *temp = sbeg;
- task* res_temp, *beg;
- res_temp = add(*temp);
- beg = res_temp;
- temp = temp->next;
- while (temp) {
- res_temp = add(res_temp, *temp);
- temp = temp->next;
- }
- cin.get();
- return beg;
- }
- // =====================ОСНОВНАЯ ЧАСТЬ=====================
- int main(){
- SetConsoleCP(1251);
- SetConsoleOutputCP(1251);
- setlocale(LC_ALL, "russian");
- Stack s1, s2;
- //task *beg = 0, *end = 0;
- int item;
- do {
- system("CLS");
- cout << "1 - Создание объекта" << endl;
- cout << "2 - Создание копии объекта" << endl;
- cout << "3 - Просмотр полей оригинала" << endl;
- cout << "4 - Просмотр полей копии" << endl;
- cout << "5 - Удаление элемента" << endl;
- cout << "6 - Выход" << endl;
- cout << "============================" << endl;
- cout << "Введите номер пункта меню" << endl;
- cin >> item;
- switch (item) {
- // Создание объекта
- case 1:
- if (s1.beg)
- s1.end = s1.add(s1.end, s1.vvod());
- else {
- s1.beg = s1.add(s1.vvod());
- s1.end = s1.beg;
- } break;
- // Создание копии объекта
- case 2:
- if (s1.beg) {
- s2.beg = s2.copy_stack(s1.beg);
- } else {
- cout << "Стек пуст" << endl;
- }
- system("pause");
- break;
- // Просмотр полей оригинала
- case 3:
- s1.show(s1.beg);
- system("pause");
- break;
- // Просмотр полей копии
- case 4:
- s2.show(s2.beg);
- system("pause");
- break;
- // Удаление элемента
- case 5:
- // если пустой стек
- if (!s1.beg) {
- cout << "Стек пуст" << endl;
- system("pause");
- break;
- }
- if (s1.beg->next == NULL) {
- s1.beg = s1.delete_el(s1.beg);
- } else {
- s1.end = s1.delete_el(s1.beg);
- }
- break;
- // выход из программы
- case 6: return 0;
- default:
- cout << "Неверно введён номер!" << endl;
- cin.get();
- break;
- }
- } while (1);
- return 0;
- }
Add Comment
Please, Sign In to add comment