Advertisement
Guest User

Untitled

a guest
Apr 7th, 2020
239
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 12.76 KB | None | 0 0
  1. /*
  2. 1.) Составить программу, которая содержит текущую информацию о работниках организации.
  3. Сведения о работнике включают:
  4. • фамилия и инициалы работника;
  5. • название занимаемой должности;
  6. • год поступления на работу;
  7. 2.) Программа должна обеспечивать:
  8. • хранение сведений обо всех работниках в виде односвязного списка (очередь);
  9. • добавление новых работников в список;
  10. • удаление работников из списка, фамилия которого введена с клавиатуры;
  11. • вывод сведений обо всех работниках;
  12. • по запросу выводятся сведения о работниках, чей стаж работы в организации превышает значение, введенное с клавиатуры.
  13. 3.) Программа должна обеспечивать диалог с помощью меню.
  14. */
  15. #include <stdio.h>
  16. #include <dos.h>
  17. #include "conio.h"
  18. #include <cstdlib>
  19. #include <string>
  20. #include <limits>
  21. #include <iostream>
  22. #include <clocale>
  23. #include "locale.h"
  24. #include "ctype.h"
  25. #include <windows.h>
  26.  
  27. using namespace std;
  28.  
  29. void Cleaning() {
  30.     cin.clear();
  31.     while (cin.get() != '\n');
  32. }
  33.  
  34. struct WORKER {
  35.     int number;
  36.     string fio;
  37.     string position;
  38.     int year;
  39.     struct WORKER* next;
  40. };
  41.  
  42. WORKER* input(WORKER*);
  43. void output(WORKER**);
  44. int search(WORKER**);
  45. WORKER* insert(WORKER**);
  46. void help();
  47. void info();
  48. int menu();
  49. WORKER* remove(WORKER** worker, string _nameWorkerRemoval, int* numberOfRecords);
  50. string _driver, _nameWorkerRemoval;
  51. int numberOfRecords = 0;
  52.  
  53. int main() {
  54.  
  55.     SetConsoleCP(1251);
  56.     SetConsoleOutputCP(1251);
  57.     bool flag_out = false;
  58.     bool flag_1 = false;
  59.     static WORKER* worker = NULL;
  60.     do {
  61.         switch (menu()) {
  62.             system("cls"); //операция выбора пункта меню
  63.         case 1:
  64.             worker = input(worker);
  65.             flag_1 = true;
  66.             break;
  67.         case 2:
  68.             if (flag_1 == true) {
  69.                 system("cls");
  70.                 insert(&worker);
  71.                 cout << "\n\n Для перехода в меню нажмите любую клавишу...";
  72.             }
  73.             else { cout << "Информация о работниках еще не заполнена, нажмите любую клавишу для продолжения..."; }
  74.             _getwch();
  75.             break;
  76.         case 3:
  77.             if (flag_1 == true) {
  78.                 system("cls");
  79.                 remove(&worker, _nameWorkerRemoval, &numberOfRecords);
  80.                 cout << "\n\n Для перехода в меню нажмите любую клавишу...";
  81.                 _getch();
  82.             }
  83.             else { cout << "Информация о работниках еще не заполнена, нажмите любую клавишу для продолжения..."; }
  84.             _getwch();
  85.             break;
  86.         case 4:
  87.             if (flag_1 == true) {
  88.                 output(&worker);
  89.             }
  90.             else { cout << "Информация о работниках еще не заполнена, нажмите любую клавишу для продолжения..."; }
  91.             _getwch();
  92.             break;
  93.         case 5:
  94.             if (flag_1 == true) {
  95.                 search(&worker);
  96.             }
  97.             else { cout << "Информация о работниках еще не заполнена, нажмите любую клавишу для продолжения..."; }
  98.             _getwch();
  99.             break;
  100.         case 6:
  101.             help();
  102.             break;
  103.         case 7:
  104.             info();
  105.             break;
  106.         case 8: flag_out = true;// функция выхода из программы
  107.         }
  108.  
  109.     } while (flag_out == false);
  110.     return 0;
  111. }
  112.  
  113. int menu() {
  114.     int  nomber_menu_int = 0;
  115.     bool flag = false;
  116.     char nomber_menu_char[2];//масив для считывания номера
  117.  
  118.     do {
  119.         system("cls");
  120.         cout << "Меню" << endl;
  121.         cout << "1. Создать информацию о работниках организации" << endl;
  122.         cout << "2. Добавить информацию о работнике " << endl;
  123.         cout << "3. Удалить информацию о работнике " << endl;
  124.         cout << "4. Вывод информации о работниках организации " << endl;
  125.         cout << "5. Поиск работников по стажу " << endl;
  126.         cout << "6. Помощь  " << endl;
  127.         cout << "7. О программе" << endl;
  128.         cout << "8. Выход" << endl;
  129.         nomber_menu_char[0] = _getwch();// cчитывание пункта масива
  130.         nomber_menu_int = atoi(nomber_menu_char);// преоброзование символа в номер  
  131.         if ((nomber_menu_int > 0) && (nomber_menu_int < 9)) { flag = true; };
  132.     } while (flag == false);
  133.     return nomber_menu_int;
  134. }
  135.  
  136. WORKER* insert(WORKER** worker) {
  137.     struct WORKER* current = *worker;
  138.     struct WORKER* previous = NULL;
  139.     struct WORKER* new_node;
  140.     while (current) {
  141.         previous = current;
  142.         current = current->next;
  143.     }
  144.     new_node = new WORKER;
  145.     new_node->number = 0;
  146.     cout << " Работник № " << new_node->number << endl;
  147.     getline(cin, new_node->fio);
  148.     cout << " Введите фамилию и инициалы работника (через пробел) -> ";
  149.     getline(cin, new_node->fio);
  150.     cout << " Название должности -> ";
  151.     getline(cin, new_node->position);
  152.     cout << " Год устройства на работу -> ";
  153.     cin >> new_node->year;
  154.     cout << endl << endl;
  155.  
  156.     if (previous) {
  157.         new_node->next = NULL;
  158.  
  159.         previous->next = new_node;
  160.     }
  161.     else {
  162.         *worker = new_node;
  163.  
  164.         (*worker)->next = NULL;
  165.     }
  166.     return (*worker);
  167. }
  168.  
  169. WORKER* input(WORKER* worker) {
  170.  
  171.     //WORKER* mas;
  172.     system("cls");
  173.  
  174.     //запрос количества элементов
  175.     bool flag = false;
  176.     int dln;
  177.     //маленькая защита
  178.     do {
  179.         char string_size[10];
  180.         cout << "Введите количество работников (не более 10) ->  ";
  181.         cin >> string_size;
  182.         dln = atoi(string_size);
  183.         if ((dln > 0) && (dln < 10)) { flag = true; };
  184.     } while (flag == false);
  185.  
  186.     //выделение памяти
  187.  
  188.     // цикл ввода данных
  189.     for (int i(0); i < dln; i++) {
  190.         insert(&worker);
  191.     };
  192.     cout << "\n\n Для перехода в меню нажмите любую клавишу...";
  193.     _getwch();
  194.     return worker;
  195. }
  196.  
  197.  
  198. WORKER* remove(WORKER** worker, string _nameWorkerRemoval, int* numberOfRecords)
  199. {
  200.     WORKER* current = *worker;
  201.     WORKER* previous = nullptr;
  202.     char proof;
  203.     int numberOfMatches = 0, bookNumber;
  204.     getline(cin, _nameWorkerRemoval);
  205.     cout << " Введите название книги, которую нужно удалить: ";
  206.     getline(cin, _nameWorkerRemoval);
  207.     while (current) {
  208.         if (current->position == _nameWorkerRemoval) {
  209.             cout << "|--------------------------|---------------------------|" << endl;
  210.             cout << "| Работник №               | " << numberOfMatches << endl;
  211.             cout << "| ФИО:                     | " << current->fio << endl;
  212.             cout << "| Название книги:          | " << current->position << endl;;
  213.             cout << "| Год издания:             | " << current->year << endl;
  214.             cout << "|--------------------------|---------------------------|" << endl;
  215.             cout << endl;
  216.             numberOfMatches++;
  217.         }
  218.         previous = current;
  219.         current = current->next;
  220.     }
  221.     current = *worker;
  222.     previous = nullptr;
  223.     if (numberOfMatches > 0) {
  224.         if (numberOfMatches > 1) {
  225.             cout << endl << " Найденные книги." << endl << endl
  226.                 << " Введите номер книги, которую вы хотите удалить -> ";
  227.             while (!(cin >> bookNumber) || (cin.peek() != '\n') || (bookNumber <= 0) || (bookNumber > numberOfMatches)) {
  228.                 Cleaning();
  229.                 cout << " Ошибка! Выберите книгу с номером от 1 до " << numberOfMatches << ": ";
  230.             }
  231.             Cleaning();
  232.             for (int i = 0; i < bookNumber; i++) {
  233.                 while (current->position != _nameWorkerRemoval) {
  234.                     previous = current;
  235.                     current = current->next;
  236.                 }
  237.                 if (i != (bookNumber - 1)) {
  238.                     previous = current;
  239.                     current = current->next;
  240.                 }
  241.             }
  242.         }
  243.         else {
  244.             while (current->position != _nameWorkerRemoval) {
  245.                 previous = current;
  246.                 current = current->next;
  247.             }
  248.         }
  249.         cout << endl << " Вы уверены, что хотите удалить эту книгу? (Y/N)" << endl;
  250.         cin >> proof;
  251.         Cleaning();
  252.         if (proof == 'y' || proof == 'Y') {
  253.             if (!previous) { //Первый элемент
  254.                 *worker = (*worker)->next;
  255.                 free(current);
  256.             }
  257.             else {
  258.                 if (!(current->next)) { //Конец
  259.                     previous->next = current->next;
  260.                     free(current);
  261.                 }
  262.                 else { //Середина
  263.                     previous->next = current->next;
  264.                     free(current);
  265.                 }
  266.             }
  267.             *numberOfRecords--;
  268.             system("cls");
  269.             cout << endl << " Удаление завершено успешно!" << endl << endl;
  270.         }
  271.         else {
  272.             system("cls");
  273.             cout << endl << " Удаление отменено!" << endl << endl;
  274.         }
  275.     }
  276.     else {
  277.         system("cls");
  278.         cout << endl << " Удаление отменено, так как подходящих работников не найдено!" << endl << endl;
  279.     }
  280.     return (*worker);
  281. }
  282.  
  283. void output(WORKER** worker) {
  284.     system("cls");
  285.     int i = 1;
  286.     bool f = false;
  287.     if (!(worker == NULL)) {
  288.         struct WORKER* temp = *worker;
  289.  
  290.         while (temp) {
  291.             cout << "|--------------------------|---------------------------|" << endl;
  292.             cout << "| Работник №               | " << temp->number << endl;
  293.             cout << "| Фамилия и инициалы:      | " << temp->fio << endl;
  294.             cout << "| Название книги:          | " << temp->position << endl;;
  295.             cout << "| Год издания:             | " << temp->year << endl;
  296.             cout << "|--------------------------|---------------------------|" << endl;
  297.             cout << endl;
  298.             temp = temp->next;
  299.             i++;
  300.             f = true;
  301.         }
  302.     }
  303.     if (f == false) {
  304.         cout << "\nВ библиотеке пусто" << endl;
  305.     }
  306.     system("pause");
  307.     _getwch();
  308. }
  309.  
  310. int search(WORKER** worker) {
  311.     system("cls");
  312.  
  313.     int god;
  314.     int i = 0;
  315.     bool flag = false;
  316.     WORKER* current = *worker;
  317.     WORKER* previous = 0;
  318.     cout << "Введите год -> ";
  319.     cin >> god;
  320.  
  321.     struct WORKER* temp = *worker;
  322.  
  323.     while (temp) {
  324.         if (temp->year >= god) {
  325.             cout << "|--------------------------|---------------------------|" << endl;
  326.             cout << "| Работник №               | " << temp->number << endl;
  327.             cout << "| Фамилия и инициалы:      | " << temp->fio << endl;
  328.             cout << "| Название книги:          | " << temp->position << endl;;
  329.             cout << "| Год издания:             | " << temp->year << endl;
  330.             cout << "|--------------------------|---------------------------|" << endl;
  331.             cout << endl;
  332.             flag++;
  333.             temp = temp->next;
  334.             i++;
  335.             flag = true;
  336.         }
  337.         else {
  338.             previous = temp;
  339.             temp = temp->next;
  340.             i++;
  341.         }
  342.     }
  343.     if (flag == false) {
  344.         cout << "\n Работники с данным стажем не найдены!" << endl;
  345.     }
  346.     system("pause");
  347.     return 0;
  348. }
  349.  
  350. void help() {
  351.     system("cls");
  352.     cout << "\n1.)  Составить программу, которая содержит текущую информацию о работниках организации." << endl;
  353.     cout << "\tСведения о работнике включают: " << endl;
  354.     cout << "\t•  фамилия и инициалы работника;" << endl;
  355.     cout << "\t•  название занимаемой должности;" << endl;
  356.     cout << "\t•  год поступления на работу;" << endl;
  357.     cout << "\n2.)  Программа должна обеспечивать: " << endl;
  358.     cout << "\t•  хранение сведений обо всех работниках в виде односвязного списка (очередь);" << endl;
  359.     cout << "\t•  добавление новых работников в список;" << endl;
  360.     cout << "\t•  удаление работников из списка, фамилия которого введена с клавиатуры;" << endl;
  361.     cout << "\t•  вывод сведений обо всех работниках;" << endl;
  362.     cout << "\t•  по запросу выводятся сведения о работниках, чей стаж работы в организации превышает значение, введенное с клавиатуры." << endl;
  363.     cout << "\n3.)  Программа должна обеспечивать диалог с помощью меню." << endl;
  364.     system("pause");
  365. }
  366.  
  367. void info() {
  368.     system("cls");
  369.     cout << "Программа для 6 варианта, Динамические структуры данных." << endl;
  370.     system("pause");
  371. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement