Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "stdafx.h"
- #include <iostream>
- #include <string>
- #include <vector>
- #include <fstream>
- #include <algorithm>
- using namespace std;
- class Workers {
- public:
- struct Worker {
- string lastName; // фамилия
- string workshopName; // наименование цеха
- int salary; // размер заработной платы
- };
- Workers(string fin, string fout); // конструктор
- void enterWorker(ifstream &fin, Worker &worker); // ввод студента из файла
- void getSalary(string nameOfWorkshop); // вычисление общей суммы зарплаты за месяц по цеху
- void printStatement(); // напечатать ведомость для начисления заработной платы рабочим
- void addWorker(Worker &worker); // добавить нового рабочего
- void deleteWorker(int indexOfWorker); // удалить рабочего по индексу
- void sortBy(int indexOfField); // сортировать по полю, заданным по индексу
- void updateFileIn(); // обновить файл с исходными данными
- Worker& operator [] (int index); // оператор для получения рабочего по индексу
- int getSize(); // получить количество рабочих
- private:
- vector<Worker> workers; // рабочие
- string fileInName; // файл с исходными данными
- string fileOutName; // файл для вывода данных
- enum SORT_FIELDS {
- LAST_NAME,
- WORKSHOP_NAME,
- SALARY
- };
- };
- Workers::Workers(string fileInName, string fileOutName) {
- Workers::fileInName = fileInName;
- Workers::fileOutName = fileOutName;
- ifstream fin(fileInName);
- if (fin.peek() != ifstream::traits_type::eof()) {
- while (!fin.eof()) {
- Worker worker;
- enterWorker(fin, worker);
- workers.push_back(worker);
- }
- }
- fin.close();
- }
- void Workers::enterWorker(ifstream &fin, Worker &worker) {
- fin >> worker.lastName >> worker.workshopName >> worker.salary;
- }
- void Workers::getSalary(string nameOfWorkshop) {
- ofstream fout(fileOutName);
- int totalSalary = 0;
- int numberOfWorkers = 0;
- for (int i = 0; i < workers.size(); i++) {
- if (workers[i].workshopName == nameOfWorkshop) {
- totalSalary += workers[i].salary;
- numberOfWorkers++;
- }
- }
- fout << "Общая сумма выплат зарплат по цеху '" << nameOfWorkshop << ": " << totalSalary;
- fout << "\nСреднемесячный заработок рабочего этого цеха: " << totalSalary / numberOfWorkers;
- cout << "\nПроверьте файл с выходными данными.\n";
- fout.close();
- }
- void Workers::printStatement() {
- ofstream fout(fileOutName);
- fout << "\nВедомость для начисления заработной платы рабочим:\n";
- for (int i = 0; i < workers.size(); i++) {
- fout << i + 1 << ". " << workers[i].lastName << ' ' << workers[i].workshopName << ' ' << workers[i].salary << '\n';
- }
- cout << "\nПроверьте файл с выходными данными.\n";
- fout.close();
- }
- void Workers::addWorker(Worker &worker) {
- workers.push_back(worker);
- updateFileIn();
- cout << "\nРабочий добавлен. Проверьте файл с исходными данными.\n";
- }
- void Workers::deleteWorker(int indexOfWorker) {
- workers.erase(workers.begin() + indexOfWorker);
- updateFileIn();
- cout << "\nРабочий удалён. Проверьте файл с выходными данными.\n";
- }
- void Workers::sortBy(int indexOfField) {
- switch (indexOfField) {
- case LAST_NAME:
- sort(workers.begin(), workers.end(), [](Worker &worker1, Worker &worker2) {
- return worker1.lastName < worker2.lastName;
- });
- break;
- case WORKSHOP_NAME:
- sort(workers.begin(), workers.end(), [](Worker &worker1, Worker &worker2) {
- return worker1.workshopName < worker2.workshopName;
- });
- break;
- case SALARY:
- sort(workers.begin(), workers.end(), [](Worker &worker1, Worker &worker2) {
- return worker1.salary < worker2.salary;
- });
- break;
- }
- updateFileIn();
- cout << "\nРабочие отсортированы. Проверьте файл с исходными данными.\n";
- }
- void Workers::updateFileIn() {
- ofstream fout(fileInName);
- for (int i = 0; i < workers.size(); i++) {
- fout << workers[i].lastName << ' ' << workers[i].workshopName << ' ' << workers[i].salary;
- // если не последний рабочий, то добавляем перенос строки
- if (i < workers.size() - 1) {
- fout << '\n';
- }
- }
- fout.close();
- }
- Workers::Worker& Workers::operator [] (int index) {
- return workers[index];
- }
- int Workers::getSize() {
- return workers.size();
- }
- enum FUNCTIONS {
- GET_SALARY,
- PRINT_STATEMENT,
- ADD_WORKER,
- DELETE_WORKER,
- SORT_BY
- };
- int main()
- {
- setlocale(LC_ALL, "Russian"); // добавление поддержки русского языка
- string fileInName, fileOutName;
- cout << "Введите имя файла с данными: ";
- cin >> fileInName;
- cout << "Введите имя файла для вывода результатов: ";
- cin >> fileOutName;
- Workers workers(fileInName, fileOutName);
- cout << "\n\nМЕНЮ:";
- while (true) {
- int choice;
- cout << "\nВыберите необходимую функцию:\n";
- cout << "1. Вычислить общую сумму выплат за месяц цеха и среднемесячный заработок рабочего этого цеха;\n";
- cout << "2. Напечатать ведомость;\n";
- cout << "3. Добавить нового рабочего;\n";
- cout << "4. Удалить рабочего;\n";
- cout << "5. Отсортировать рабочих по заданному полю;\n";
- cout << "6. Выход;\n";
- cout << "Ваш выбор: ";
- cin >> choice;
- while (choice < 1 || choice > 6) {
- cout << "\nВы ввели число не из промежутка от 1 до 6. Попробуйте ещё раз.";
- cout << "\nВаш выбор: ";
- cin >> choice;
- }
- if (choice == 6) {
- cout << "\nВыход...\n";
- exit(1);
- }
- else {
- Workers::Worker worker;
- string nameOfWorkshop;
- switch (choice - 1) {
- case GET_SALARY:
- cout << "\nВведите название цеха: ";
- cin >> nameOfWorkshop;
- workers.getSalary(nameOfWorkshop);
- break;
- case PRINT_STATEMENT:
- workers.printStatement();
- break;
- case ADD_WORKER:
- cout << "\nВведите фамилию рабочего: ";
- cin >> worker.lastName;
- cout << "Введите название цеха: ";
- cin >> worker.workshopName;
- cout << "Введите зарплату рабочего: ";
- cin >> worker.salary;
- workers.addWorker(worker);
- break;
- case DELETE_WORKER:
- if (workers.getSize() == 0) {
- cout << "\nСписок рабочих пуст.\n";
- continue;
- }
- int indexOfWorker;
- cout << "\nВыберите номер рабочего для удаления:\n";
- for (int i = 0; i < workers.getSize(); i++) {
- cout << i + 1 << ": " << workers[i].lastName << ' ' << workers[i].workshopName << ' ' << workers[i].salary << '\n';
- }
- cout << "\nВаш выбор: ";
- cin >> indexOfWorker;
- while (indexOfWorker < 1 || indexOfWorker > workers.getSize()) {
- cout << "\nВы ввели число не из промежутка от 1 до " <<
- workers.getSize() << ". Попробуйте ещё раз.";
- cout << "\nВведите номер рабочего для удаления ещё раз: ";
- cin >> indexOfWorker;
- }
- workers.deleteWorker(indexOfWorker - 1);
- break;
- case SORT_BY:
- if (workers.getSize() == 0) {
- cout << "\nСписок рабочих пуст.\n";
- continue;
- }
- int indexOfField;
- cout << "\nВыберите поле, по которому необходимо провести сортировку:\n";
- cout << "1. Фамилия;\n";
- cout << "2. Название цеха;\n";
- cout << "3. Зарплата;\n";
- cout << "Ваш выбор: ";
- cin >> indexOfField;
- while (indexOfField < 1 || indexOfField > 3) {
- cout << "\nВы ввели число не из промежутка от 1 до 3. Попробуйте ещё раз.";
- cout << "\nВаш выбор: ";
- cin >> indexOfField;
- }
- workers.sortBy(indexOfField - 1);
- break;
- }
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement