daily pastebin goal
36%
SHARE
TWEET

CourseWork1

a guest May 16th, 2018 97 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include "stdafx.h"
  2. #include <iostream>
  3. #include <string>
  4. #include <vector>
  5. #include <fstream>
  6. #include <algorithm>
  7. using namespace std;
  8.  
  9. class Workers {
  10. public:
  11.     struct Worker {
  12.         string lastName; // фамилия
  13.         string workshopName; // наименование цеха
  14.         int salary; // размер заработной платы
  15.     };
  16.     Workers(string fin, string fout); // конструктор
  17.     void enterWorker(ifstream &fin, Worker &worker); // ввод студента из файла
  18.     void getSalary(string nameOfWorkshop); // вычисление общей суммы зарплаты за месяц по цеху
  19.     void printStatement(); // напечатать ведомость для начисления заработной платы рабочим
  20.     void addWorker(Worker &worker); // добавить нового рабочего
  21.     void deleteWorker(int indexOfWorker); // удалить рабочего по индексу
  22.     void sortBy(int indexOfField); // сортировать по полю, заданным по индексу
  23.     void updateFileIn(); // обновить файл с исходными данными
  24.     Worker& operator [] (int index); // оператор для получения рабочего по индексу
  25.     int getSize(); // получить количество рабочих
  26. private:
  27.     vector<Worker> workers; // рабочие
  28.     string fileInName; // файл с исходными данными
  29.     string fileOutName; // файл для вывода данных
  30.     enum SORT_FIELDS {
  31.         LAST_NAME,
  32.         WORKSHOP_NAME,
  33.         SALARY
  34.     };
  35. };
  36.  
  37. Workers::Workers(string fileInName, string fileOutName) {
  38.     Workers::fileInName = fileInName;
  39.     Workers::fileOutName = fileOutName;
  40.     ifstream fin(fileInName);
  41.  
  42.     if (fin.peek() != ifstream::traits_type::eof()) {
  43.         while (!fin.eof()) {
  44.             Worker worker;
  45.             enterWorker(fin, worker);
  46.             workers.push_back(worker);
  47.         }
  48.     }
  49.  
  50.     fin.close();
  51. }
  52.  
  53. void Workers::enterWorker(ifstream &fin, Worker &worker) {
  54.     fin >> worker.lastName >> worker.workshopName >> worker.salary;
  55. }
  56.  
  57. void Workers::getSalary(string nameOfWorkshop) {
  58.     ofstream fout(fileOutName);
  59.     int totalSalary = 0;
  60.     int numberOfWorkers = 0;
  61.  
  62.     for (int i = 0; i < workers.size(); i++) {
  63.         if (workers[i].workshopName == nameOfWorkshop) {
  64.             totalSalary += workers[i].salary;
  65.             numberOfWorkers++;
  66.         }
  67.     }
  68.  
  69.     fout << "Общая сумма выплат зарплат по цеху '" << nameOfWorkshop << ": " << totalSalary;
  70.     fout << "\nСреднемесячный заработок рабочего этого цеха: " << totalSalary / numberOfWorkers;
  71.     cout << "\nПроверьте файл с выходными данными.\n";
  72.     fout.close();
  73. }
  74.  
  75. void Workers::printStatement() {
  76.     ofstream fout(fileOutName);
  77.  
  78.     fout << "\nВедомость для начисления заработной платы рабочим:\n";
  79.     for (int i = 0; i < workers.size(); i++) {
  80.         fout << i + 1 << ". " << workers[i].lastName << ' ' << workers[i].workshopName << ' ' << workers[i].salary << '\n';
  81.     }
  82.    
  83.     cout << "\nПроверьте файл с выходными данными.\n";
  84.     fout.close();
  85. }
  86.  
  87. void Workers::addWorker(Worker &worker) {
  88.     workers.push_back(worker);
  89.     updateFileIn();
  90.     cout << "\nРабочий добавлен. Проверьте файл с исходными данными.\n";
  91. }
  92.  
  93. void Workers::deleteWorker(int indexOfWorker) {
  94.     workers.erase(workers.begin() + indexOfWorker);
  95.     updateFileIn();
  96.     cout << "\nРабочий удалён. Проверьте файл с выходными данными.\n";
  97. }
  98.  
  99. void Workers::sortBy(int indexOfField) {
  100.     switch (indexOfField) {
  101.         case LAST_NAME:
  102.             sort(workers.begin(), workers.end(), [](Worker &worker1, Worker &worker2) {
  103.                 return worker1.lastName < worker2.lastName;
  104.             });
  105.             break;
  106.         case WORKSHOP_NAME:
  107.             sort(workers.begin(), workers.end(), [](Worker &worker1, Worker &worker2) {
  108.                 return worker1.workshopName < worker2.workshopName;
  109.             });
  110.             break;
  111.         case SALARY:
  112.             sort(workers.begin(), workers.end(), [](Worker &worker1, Worker &worker2) {
  113.                 return worker1.salary < worker2.salary;
  114.             });
  115.             break;
  116.     }
  117.  
  118.     updateFileIn();
  119.     cout << "\nРабочие отсортированы. Проверьте файл с исходными данными.\n";
  120. }
  121.  
  122. void Workers::updateFileIn() {
  123.     ofstream fout(fileInName);
  124.    
  125.     for (int i = 0; i < workers.size(); i++) {
  126.         fout << workers[i].lastName << ' ' << workers[i].workshopName << ' ' << workers[i].salary;
  127.  
  128.         // если не последний рабочий, то добавляем перенос строки
  129.         if (i < workers.size() - 1) {
  130.             fout << '\n';
  131.         }
  132.     }
  133.  
  134.     fout.close();
  135. }
  136.  
  137. Workers::Worker& Workers::operator [] (int index) {
  138.     return workers[index];
  139. }
  140.  
  141. int Workers::getSize() {
  142.     return workers.size();
  143. }
  144.  
  145. enum FUNCTIONS {
  146.     GET_SALARY,
  147.     PRINT_STATEMENT,
  148.     ADD_WORKER,
  149.     DELETE_WORKER,
  150.     SORT_BY
  151. };
  152.  
  153. int main()
  154. {
  155.     setlocale(LC_ALL, "Russian"); // добавление поддержки русского языка
  156.     string fileInName, fileOutName;
  157.  
  158.     cout << "Введите имя файла с данными: ";
  159.     cin >> fileInName;
  160.     cout << "Введите имя файла для вывода результатов: ";
  161.     cin >> fileOutName;
  162.  
  163.     Workers workers(fileInName, fileOutName);
  164.  
  165.     cout << "\n\nМЕНЮ:";
  166.     while (true) {
  167.         int choice;
  168.  
  169.         cout << "\nВыберите необходимую функцию:\n";
  170.         cout << "1. Вычислить общую сумму выплат за месяц цеха и среднемесячный заработок рабочего этого цеха;\n";
  171.         cout << "2. Напечатать ведомость;\n";
  172.         cout << "3. Добавить нового рабочего;\n";
  173.         cout << "4. Удалить рабочего;\n";
  174.         cout << "5. Отсортировать рабочих по заданному полю;\n";
  175.         cout << "6. Выход;\n";
  176.         cout << "Ваш выбор: ";
  177.         cin >> choice;
  178.  
  179.         while (choice < 1 || choice > 6) {
  180.             cout << "\nВы ввели число не из промежутка от 1 до 6. Попробуйте ещё раз.";
  181.             cout << "\nВаш выбор: ";
  182.             cin >> choice;
  183.         }
  184.  
  185.         if (choice == 6) {
  186.             cout << "\nВыход...\n";
  187.             exit(1);
  188.         }
  189.         else {
  190.             Workers::Worker worker;
  191.             string nameOfWorkshop;
  192.             switch (choice - 1) {
  193.                 case GET_SALARY:
  194.                     cout << "\nВведите название цеха: ";
  195.                     cin >> nameOfWorkshop;
  196.                     workers.getSalary(nameOfWorkshop);
  197.                     break;
  198.                 case PRINT_STATEMENT:
  199.                     workers.printStatement();
  200.                     break;
  201.                 case ADD_WORKER:
  202.                     cout << "\nВведите фамилию рабочего: ";
  203.                     cin >> worker.lastName;
  204.                     cout << "Введите название цеха: ";
  205.                     cin >> worker.workshopName;
  206.                     cout << "Введите зарплату рабочего: ";
  207.                     cin >> worker.salary;
  208.                     workers.addWorker(worker);
  209.                     break;
  210.                 case DELETE_WORKER:
  211.                     if (workers.getSize() == 0) {
  212.                         cout << "\nСписок рабочих пуст.\n";
  213.                         continue;
  214.                     }
  215.  
  216.                     int indexOfWorker;
  217.                     cout << "\nВыберите номер рабочего для удаления:\n";
  218.                     for (int i = 0; i < workers.getSize(); i++) {
  219.                         cout << i + 1 << ": " << workers[i].lastName << ' ' << workers[i].workshopName << ' ' << workers[i].salary << '\n';
  220.                     }
  221.  
  222.                     cout << "\nВаш выбор: ";
  223.                     cin >> indexOfWorker;
  224.  
  225.                     while (indexOfWorker < 1 || indexOfWorker > workers.getSize()) {
  226.                         cout << "\nВы ввели число не из промежутка от 1 до " <<
  227.                             workers.getSize() << ". Попробуйте ещё раз.";
  228.                         cout << "\nВведите номер рабочего для удаления ещё раз: ";
  229.                         cin >> indexOfWorker;
  230.                     }
  231.                     workers.deleteWorker(indexOfWorker - 1);
  232.                     break;
  233.                 case SORT_BY:
  234.                     if (workers.getSize() == 0) {
  235.                         cout << "\nСписок рабочих пуст.\n";
  236.                         continue;
  237.                     }
  238.  
  239.                     int indexOfField;
  240.                     cout << "\nВыберите поле, по которому необходимо провести сортировку:\n";
  241.                     cout << "1. Фамилия;\n";
  242.                     cout << "2. Название цеха;\n";
  243.                     cout << "3. Зарплата;\n";
  244.                     cout << "Ваш выбор: ";
  245.                     cin >> indexOfField;
  246.  
  247.                     while (indexOfField < 1 || indexOfField > 3) {
  248.                         cout << "\nВы ввели число не из промежутка от 1 до 3. Попробуйте ещё раз.";
  249.                         cout << "\nВаш выбор: ";
  250.                         cin >> indexOfField;
  251.                     }
  252.                     workers.sortBy(indexOfField - 1);
  253.                     break;
  254.             }
  255.         }
  256.     }
  257.  
  258.   return 0;
  259. }
RAW Paste Data
Top