Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "stdafx.h"
- #include <stdio.h>
- #include <locale>
- #include <windows.h>
- #include <conio.h>
- #include <stdlib.h>
- #include <string.h>
- struct salary
- {
- int tariffRate; //тарифная ставка каждого работника
- int numberOfHours;
- };
- struct worker
- {
- char workerSurname[20];
- char workerName[20];
- char workerSecondName[20];
- char post[20];
- int experience;
- int personnelNumber;
- int id;
- struct salary *salary;
- struct worker *next;
- struct worker *prev;
- };
- struct department
- {
- char departmentName[20];
- int numberOfWorkers;
- int id;
- struct worker *workers;
- struct department *next;
- struct department *prev;
- };
- struct users
- {
- char login[20];
- char password[20];
- struct users *next;
- struct users *prev;
- };
- int menu(int); //выбор, какое меню нужно вывести на экран
- void mainMenu(department*);//вывод на экран главного меню и осуществление выбора
- void adminMenu(department*);//вывод на экран меню администратора и осуществление выбора
- void addMenu(department**);//вывод на экран меню добавления информации и осуществление выбора
- void editMenu(department**);//вывод на экран меню редактирования и осуществление выбора
- void deleteMenu(department**);//вывод на экран меню удаления и осуществление выбора
- void printMenu(department*);//вывод на экран меню просмотра информации и осуществление выбор
- void searchMenu(department*);//вывод на экран меню поиска и осуществлоение выбора
- void workWithUsers();//вывод на экран меню работы с пользователями для админа и осуществление выбора
- bool checkUser();//проверка логина и пароля пользователя
- bool checkAdmin();//проверка логина и пароля администратора
- void addDepartment(department**);//добавление отдела в список
- void addWorker(department**);//добавление работника в список
- void changeSurname(department**);//редактирование фамилии работника
- void changeName(department**);//редактирование имени работника
- void changeSecondName(department**);//изменение отчества работника
- void changePost(department**);//изменение должности
- void changeTariffRate(department**);//изменение размера тарифной ставки
- void changeExperience(department**);//изменение опыта работы
- void changeDepartmentName(department**);//смена названия отдела
- void changePersonnelNumber(department**);//смена персонального номера работника
- void deleteWorker(department**);//удаление работника из списка
- void deleteDepartment(department**);//удаление отдела из списка
- void printTableD();//вывод на экран шапки таблицы
- void printDepartments(department*);//вывод на экран списка отделов
- void printTableW();//вывод шапки таблицы на экран
- void printWorkers(department*); //вывод на экран списка работников
- void workWithSalary(department **);//начисление зп работникам, через утановление времени, отработанного за месяц
- void readUsers(users**);//чтение из файла списка пользователей
- void writeUsers(users*);//запись списка пользователей в файл
- void printDepartment(department*);//вывод информации об отделе на экран
- void printWorker(department*, worker*);//вывод на эран информации о работнике
- void searchByNumberOfWorkers(department*);//поиск отдела по количеству работников
- void searchByDepartmentName(department*);//поиск отдела по его названию
- void searchDeptById(department*);//поиск отдела по id
- void searchByNameSurname(department*);//Поиск по имени и фамилии
- void searchBySurnameDept(department*);//поиск по фамилии и отделу
- void searchByPostSurname(department*);//поиск по должности и фамилии
- void searchWorkerById(department*);//поиск по id
- void userMenu(department*);//вывод на экран меню пользователя и осуществление выбора
- int choiceDepartment(department*);//вывод списка отделов на экран и осуществление выбора
- int choiceWorker(worker*);//вывод списка работников на экран и выброр работника
- void writeFile(department*);//запись всей информации в файл
- void readFile(department**);//чтение всей информации из файла
- void activate(users**); //Активация пользователь(добавляется запись в список пользователей)
- void ban(users**); //блокировка пользователей(удаляется запись из списка пользователей)
- int main()
- {
- SetConsoleOutputCP(1251);
- SetConsoleCP(1251);
- char a, b;
- department *head = NULL;
- mainMenu(head);
- return 0;
- }
- //выбор, какое меню нужно вывести на экран
- int menu(int menuNumber)
- {
- system("cls");
- switch (menuNumber)
- {
- case 1:
- printf("ГЛАВНОЕ МЕНЮ\n");
- printf("1. Вход от имени администратора.\n");
- printf("2. Вход от имени пользователя.\n");
- printf("0. Выход.\n");
- break;
- case 2:
- printf("ВЫПОЛНЕН ВХОД ОТ ИМЕНИ АДМИНИСТРАТОРА\n");
- printf("1. Добавление записи.\n");
- printf("2. Редактирование записи.\n");
- printf("3. Удаление записи.\n");
- printf("4. Начисление ЗП.\n");
- printf("5. Просмотр данных.\n");
- printf("6. Поиск.\n");
- printf("7. Управление пользователями.\n");
- printf("0. Выход в предыдущее меню.\n");
- break;
- case 3:
- printf("ВЫПОЛНЕН ВХОД ОТ ИМЕНИ ПОЛЬЗОВАТЕЛЯ\n");
- printf("1. Просмотр данных.\n");
- printf("2. Поиск.\n");
- printf("0. выход в предыдущее меню.\n");
- break;
- case 4:
- printf("ДОБАВЛЕНИЕ ЗАПИСИ\n");
- printf("1. Добавление отдела.\n");
- printf("2. Добавление работника в отдел.\n");
- printf("0. Выход в предыдущее меню.\n");
- break;
- case 5:
- printf("РЕДАКТИРОВАНИЕ ИНФОРМАЦИИ\n");
- printf("Редактирование информации о работнике:\n");
- printf("1. Изменить фамилию.\n");
- printf("2. Изменить имя.\n");
- printf("3. Изменить отчество.\n");
- printf("4. Изменить должность.\n");
- printf("5. Изменить размер тарифной ставки.\n");
- printf("6. Изменить опыт работы.\n");
- printf("7. Изменить личный номер.\n");
- printf("Редактирование информации об отделе:\n");
- printf("8. Изменить название отдела.\n");
- printf("0. Выход в предыдущее меню.\n");
- break;
- case 6:
- printf("УДАЛЕНИЕ ЗАПИСИ\n");
- printf("1. Удаление отдела.\n");
- printf("2. Удаление работника.\n");
- printf("0. Выход в предыдущее меню.\n");
- break;
- case 7:
- printf("ВЫВОД ДАННЫХ\n");
- printf("1. Вывести список отделов.\n");
- printf("2. Вывести список работников отдела.\n");
- printf("0. Выход в предыдущее меню.\n");
- break;
- case 8:
- printf("ПОИСК\n");
- printf("Поиск отдела:\n");
- printf("1. Поиск по названию отдела.\n");
- printf("2. Поиск по количеству работников.\n");
- printf("3. Поиск отдела по id.\n");
- printf("Поиск работника:\n");
- printf("4. Поиск по фималии и имени.\n");
- printf("5. Поиск по фамилии и отделу.\n");
- printf("6. Поиск по должности и фамилии.\n");
- printf("7. Поиск по id.\n");
- printf("0. Выход в предыдущее меню.\n");
- break;
- case 9:
- printf("УПРАВЛЕНИЕ ПОЛЬЗОВАТЕЛЯМИ\n");
- printf("1. Активация пользователей.\n");
- printf("2. Блокировка пользователей.\n");
- printf("0. Выход в предыдущее меню.\n");
- break;
- }
- printf("Ваш выбор: ");
- int choice;
- while (!scanf("%d", &choice))
- {
- fflush(stdin);
- printf("Ошибка ввода. Попробуйте снова: ");
- }
- return choice;
- }
- //вывод на экран главного меню и осуществление выбора
- void mainMenu(department *head)
- {
- while (true)
- {
- switch (menu(1))
- {
- case 1:
- if (checkAdmin() == false)
- {
- printf("Данные аутентификации были введены не верно.\n");
- system("pause");
- }
- else adminMenu(head);
- break;
- case 2:
- if (checkUser() == false)
- {
- printf("Данные аутентификации были введены не верно.\n");
- system("pause");
- }
- else userMenu(head);
- break;
- case 0:
- return;
- default:
- printf("Ошибка ввода.\n");
- system("pause");
- break;
- }
- }
- }
- //проверка логина и пароля пользователя
- bool checkUser()
- {
- users *usersPtr = NULL;
- readUsers(&usersPtr);
- char login[20], password[20];
- char t;
- int i = 0;
- system("cls");
- printf("Введите ваш логин: ");
- scanf("%s", &login);
- printf("Введите ваш пароль: ");
- while (1)
- {
- t = _getch();
- if (t == '\r') break;
- else if (t == '\b')
- {
- printf("\b \b");
- i--;
- }
- else
- {
- password[i] = t;
- i++;
- printf("*");
- }
- }
- password[i] = '\0';
- while (usersPtr != NULL)
- {
- if (strcmp(usersPtr->login, login) == 0 && strcmp(usersPtr->password, password) == 0) return true;
- else usersPtr = usersPtr->next;
- }
- return false;
- }
- //проверка логина и пароля администратора
- bool checkAdmin()
- {
- FILE *adminFile;
- char login[20], password[20], rightLogin[20], rightPassword[20];
- char t;
- int i = 0;
- system("cls");
- adminFile = fopen("adminData.txt", "r+");
- printf("Введите логин: ");
- scanf("%s", &login);
- printf("Введите пароль: ");
- while (1)
- {
- t = _getch();
- if (t == '\r') break;
- else if (t == '\b')
- {
- printf("\b \b");
- i--;
- }
- else
- {
- password[i] = t;
- i++;
- printf("*");
- }
- }
- password[i] = '\0';
- fscanf(adminFile, "%s ", &rightLogin);
- fscanf(adminFile, "%s", &rightPassword);
- if (strcmp(login, rightLogin) == 0 && strcmp(password, rightPassword) == 0)
- {
- fclose(adminFile);
- return true;
- }
- fclose(adminFile);
- return false;
- }
- //вывод на экран меню администратора и осуществление выбора
- void adminMenu(department *head)
- {
- if (head == NULL) readFile(&head);
- while (true)
- {
- switch (menu(2))
- {
- case 1:
- addMenu(&head);
- writeFile(head);
- break;
- case 2:
- editMenu(&head);
- writeFile(head);
- break;
- case 3:
- deleteMenu(&head);
- writeFile(head);
- break;
- case 4:
- workWithSalary(&head);
- writeFile(head);
- break;
- case 5:
- printMenu(head);
- break;
- case 6:
- searchMenu(head);
- break;
- case 7:
- workWithUsers();
- break;
- case 0:
- return;
- default:
- printf("Ошибка ввода.\n");
- system("pause");
- break;
- }
- }
- }
- //вывод на экран меню добавления информации и осуществление выбора
- void addMenu(department **head)
- {
- while (true)
- {
- switch (menu(4))
- {
- case 1:
- addDepartment(head);
- break;
- case 2:
- addWorker(head);
- break;
- case 0:
- return;
- default:
- printf("Ошибка ввода.\n");
- system("pause");
- break;
- }
- }
- }
- //добавление отдела в список
- void addDepartment(department **head)
- {
- system("cls");
- department *newPtr;
- newPtr = (department*)malloc(sizeof(department));
- printf("НОВЫЙ ОТДЕЛ:\n");
- printf("Введите название отдела: ");
- scanf("%s", &newPtr->departmentName);
- newPtr->numberOfWorkers = 0;
- if (*head == NULL)
- {
- newPtr->next = NULL;
- newPtr->prev = NULL;
- newPtr->workers = NULL;
- newPtr->id = 1;
- *head = newPtr;
- }
- else
- {
- newPtr->next = *head;
- newPtr->next->prev = newPtr;
- newPtr->prev = NULL;
- newPtr->workers = NULL;
- newPtr->id = newPtr->next->id + 1;
- *head = newPtr;
- }
- printf("Новый отдел добавлен в список отделов.\n");
- system("pause");
- }
- //добавление работника в список
- void addWorker(department **head)
- {
- int choice = choiceDepartment(*head);
- if (choice == 0) return;
- else
- {
- department *tempPtr = *head;
- for (int i = 0; i < choice - 1; i++)
- {
- tempPtr = tempPtr->next;
- }
- tempPtr->numberOfWorkers++;
- worker *newPtr;
- newPtr = (worker*)malloc(sizeof(worker));
- printf("ДОБАВЛЕНИЕ РАБОТНИКА В ОТДЕЛ %s:\n", tempPtr->departmentName);
- printf("Фамилия: ");
- scanf("%s", &newPtr->workerSurname);
- printf("Имя: ");
- scanf("%s", &newPtr->workerName);
- printf("Отчество: ");
- scanf("%s", &newPtr->workerSecondName);
- printf("Должность: ");
- scanf("%s", &newPtr->post);
- printf("Личный номер: ");
- while (!scanf("%d", &newPtr->personnelNumber))
- {
- fflush(stdin);
- printf("Ошибка ввода. Попробуйте снова: ");
- }
- printf("Опыт работы: ");
- while (!scanf("%d", &newPtr->experience))
- {
- fflush(stdin);
- printf("Ошибка ввода. Попробуйте снова: ");
- }
- newPtr->salary = (salary*)malloc(sizeof(salary));
- printf("Тарифная ставка рабочего: ");
- while (!scanf("%d", &(newPtr->salary->tariffRate)))
- {
- fflush(stdin);
- printf("Ошибка ввода. Попробуйте снова: ");
- }
- newPtr->salary->numberOfHours = 0;
- if (tempPtr->workers == NULL)
- {
- newPtr->id = 1;
- tempPtr->workers = newPtr;
- tempPtr->workers->next = NULL;
- tempPtr->workers->prev = NULL;
- }
- else
- {
- newPtr->id = tempPtr->workers->id + 1;
- newPtr->next = tempPtr->workers;
- newPtr->prev = NULL;
- tempPtr->workers->prev = newPtr;
- tempPtr->workers = newPtr;
- }
- printf("Работник добавлен.\n");
- system("pause");
- }
- }
- //вывод на экран меню редактирования и осуществление выбора
- void editMenu(department **head)
- {
- while (true)
- {
- switch (menu(5))
- {
- case 1:
- changeSurname(head);
- break;
- case 2:
- changeName(head);
- break;
- case 3:
- changeSecondName(head);
- break;
- case 4:
- changePost(head);
- break;
- case 5:
- changeTariffRate(head);
- break;
- case 6:
- changeExperience(head);
- break;
- case 7:
- changePersonnelNumber(head);
- break;
- case 8:
- changeDepartmentName(head);
- break;
- case 0:
- return;
- default:
- printf("Вы ввели неверное значение, попробуйте снова...\n");
- system("pause");
- break;
- }
- }
- }
- //редактирование фамилии работника
- void changeSurname(department **head)
- {
- int choice;
- choice = choiceDepartment(*head);
- worker *tempW;
- if (choice == 0) return;
- else
- {
- department *tempDept = *head;
- for (int i = 0; i < choice - 1; i++)
- {
- tempDept = tempDept->next;
- }
- tempW = tempDept->workers;
- choice = choiceWorker(tempW);
- for (int i = 0; i < choice - 1; i++)
- {
- tempW = tempW->next;
- }
- system("cls");
- printf("Введите фамилию: ");
- scanf("%s", &tempW->workerSurname);
- printf("Данные изменены.\n");
- system("pause");
- }
- }
- //редактирование имени работника
- void changeName(department **head)
- {
- int choice;
- choice = choiceDepartment(*head);
- worker *tempW;
- if (choice == 0) return;
- else
- {
- department *tempDept = *head;
- for (int i = 0; i < choice - 1; i++)
- {
- tempDept = tempDept->next;
- }
- if (tempDept->numberOfWorkers == 0)
- {
- printf("В данном отделе работников нет.\n");
- system("pause");
- return;
- }
- tempW = tempDept->workers;
- choice = choiceWorker(tempW);
- for (int i = 0; i < choice - 1; i++)
- {
- tempW = tempW->next;
- }
- system("cls");
- printf("Введите имя: ");
- scanf("%s", &tempW->workerName);
- printf("Данные изменены.\n");
- system("pause");
- }
- }
- //изменение отчества работника
- void changeSecondName(department **head)
- {
- int choice;
- choice = choiceDepartment(*head);
- worker *tempW;
- if (choice == 0) return;
- else
- {
- department *tempDept = *head;
- for (int i = 0; i < choice - 1; i++)
- {
- tempDept = tempDept->next;
- }
- if (tempDept->numberOfWorkers == 0)
- {
- printf("В данном отделе работников нет.\n");
- system("pause");
- return;
- }
- tempW = tempDept->workers;
- choice = choiceWorker(tempW);
- for (int i = 0; i < choice - 1; i++)
- {
- tempW = tempW->next;
- }
- system("cls");
- printf("Введите отчество: ");
- scanf("%s", &tempW->workerSecondName);
- printf("Данные изменены.\n");
- system("pause");
- }
- }
- //изменение должности
- void changePost(department **head)
- {
- int choice;
- choice = choiceDepartment(*head);
- worker *tempW;
- if (choice == 0) return;
- else
- {
- department *tempDept = *head;
- for (int i = 0; i < choice - 1; i++)
- {
- tempDept = tempDept->next;
- }
- if (tempDept->numberOfWorkers == 0)
- {
- printf("В данном отделе работников нет.\n");
- system("pause");
- return;
- }
- tempW = tempDept->workers;
- choice = choiceWorker(tempW);
- for (int i = 0; i < choice - 1; i++)
- {
- tempW = tempW->next;
- }
- system("cls");
- printf("Введите должность: ");
- scanf("%s", &tempW->post);
- printf("Данные изменены.\n");
- system("pause");
- }
- }
- //изменение размера тарифной ставки
- void changeTariffRate(department **head)
- {
- int choice;
- choice = choiceDepartment(*head);
- worker *tempW;
- if (choice == 0) return;
- else
- {
- department *tempDept = *head;
- for (int i = 0; i < choice - 1; i++)
- {
- tempDept = tempDept->next;
- }
- if (tempDept->numberOfWorkers == 0)
- {
- printf("В данном отделе работников нет.\n");
- system("pause");
- return;
- }
- tempW = tempDept->workers;
- choice = choiceWorker(tempW);
- for (int i = 0; i < choice - 1; i++)
- {
- tempW = tempW->next;
- }
- system("cls");
- printf("Введите оклад по должности: ");
- scanf("%d", &tempW->salary);
- printf("Данные изменены.\n");
- system("pause");
- }
- }
- //изменение опыта работы
- void changeExperience(department **head)
- {
- int choice;
- choice = choiceDepartment(*head);
- worker *tempW;
- if (choice == 0) return;
- else
- {
- department *tempDept = *head;
- for (int i = 0; i < choice - 1; i++)
- {
- tempDept = tempDept->next;
- }
- if (tempDept->numberOfWorkers == 0)
- {
- printf("В данном отделе работников нет.\n");
- system("pause");
- return;
- }
- tempW = tempDept->workers;
- choice = choiceWorker(tempW);
- for (int i = 0; i < choice - 1; i++)
- {
- tempW = tempW->next;
- }
- system("cls");
- printf("Введите опыт работы: ");
- scanf("%d", &tempW->experience);
- printf("Данные изменены.\n");
- system("pause");
- }
- }
- //смена названия отдела
- void changeDepartmentName(department **head)
- {
- int choice;
- choice = choiceDepartment(*head);
- if (choice == 0) return;
- else
- {
- department *tempDept = *head;
- for (int i = 0; i < choice - 1; i++)
- {
- tempDept = tempDept->next;
- }
- system("cls");
- printf("Введите название отдела: ");
- scanf("%s", &tempDept->departmentName);
- printf("Данные изменены.\n");
- system("pause");
- }
- }
- //смена персонального номера работника
- void changePersonnelNumber(department **head)
- {
- int choice;
- choice = choiceDepartment(*head);
- worker *tempW;
- if (choice == 0) return;
- else
- {
- department *tempDept = *head;
- for (int i = 0; i < choice - 1; i++)
- {
- tempDept = tempDept->next;
- }
- if (tempDept->numberOfWorkers == 0)
- {
- printf("В данном отделе работников нет.\n");
- system("pause");
- return;
- }
- tempW = tempDept->workers;
- choice = choiceWorker(tempW);
- for (int i = 0; i < choice - 1; i++)
- {
- tempW = tempW->next;
- }
- system("cls");
- printf("Введите личный номер: ");
- scanf("%s", &tempW->personnelNumber);
- printf("Данные изменены.\n");
- system("pause");
- }
- }
- //вывод на экран меню удаления и осуществление выбора
- void deleteMenu(department **head)
- {
- while (true)
- {
- switch (menu(6))
- {
- case 1:
- deleteDepartment(head);
- break;
- case 2:
- deleteWorker(head);
- break;
- case 0:
- return;
- default:
- printf("Ошибка ввода.\n");
- system("pause");
- break;
- }
- }
- }
- //удаление работника из списка
- void deleteWorker(department **head)
- {
- int choice;
- choice = choiceDepartment(*head);
- if (choice == 0) return;
- else
- {
- department *tempDept = *head;
- for (int i = 0; i < choice - 1; i++)
- {
- tempDept = tempDept->next;
- }
- if (tempDept->numberOfWorkers == 0)
- {
- printf("В данном отделе работников нет.\n");
- system("pause");
- return;
- }
- worker *tempW = tempDept->workers;
- choice = choiceWorker(tempW);
- for (int i = 0; i < choice - 1; i++)
- {
- tempW = tempW->next;
- }
- if (tempW == tempDept->workers) //если элемент первый
- {
- if (tempDept->workers->next == NULL && tempDept->workers->prev == NULL) //если он один
- {
- free(tempW);
- tempDept->workers = NULL;
- return;
- }
- else //если не один
- {
- tempDept->workers = tempW->next;
- tempDept->workers->prev = NULL;
- tempDept->workers->next = tempW->next->next;
- free(tempW);
- return;
- }
- }
- if (tempW->next == NULL) //если последний
- {
- tempW->prev->next = NULL;
- free(tempW);
- return;
- }
- tempW->next->prev = tempW->prev; //если по центру
- tempW->prev->next = tempW->next;
- free(tempW);
- return;
- }
- }
- //удаление отдела из списка
- void deleteDepartment(department **begin)
- {
- int choice;
- choice = choiceDepartment(*begin);
- if (choice == 0) return;
- else
- {
- department *tempDept = *begin;
- for (int i = 0; i < choice - 1; i++)
- {
- tempDept = tempDept->next;
- }
- if (tempDept == *begin)
- {
- if (tempDept->next == NULL && tempDept->prev == NULL)
- {
- free(tempDept);
- *begin = NULL;
- return;
- }
- else
- {
- *begin = tempDept->next;
- (*begin)->prev = NULL;
- (*begin)->next = tempDept->next->next;
- free(tempDept);
- return;
- }
- }
- if (tempDept->next == NULL)
- {
- tempDept->prev->next = NULL;
- free(tempDept);
- return;
- }
- tempDept->next->prev = tempDept->prev;
- tempDept->prev->next = tempDept->next;
- free(tempDept);
- return;
- }
- }
- //вывод на экран меню просмотра информации и осуществление выбор
- void printMenu(department *head)
- {
- while (true)
- {
- switch (menu(7))
- {
- case 1:
- printDepartments(head);
- break;
- case 2:
- printWorkers(head);
- break;
- case 0:
- return;
- default:
- printf("Ошибка ввода.\n");
- system("pause");
- break;
- }
- }
- }
- //вывод на экран списка работников конкретного отдела
- void printWorkers(department *begin)
- {
- if (begin == NULL)
- {
- printf("Нет данных для отображения.\n");
- system("pause");
- return;
- }
- int choice;
- choice = choiceDepartment(begin);
- if (choice == 0) return;
- else
- {
- department *tempDept = begin;
- for (int i = 0; i < choice - 1; i++)
- {
- tempDept = tempDept->next;
- }
- system("cls");
- printf("СПИСОК РАБОТНИКОВ ОТДЕЛА %s:\n", tempDept->departmentName);
- worker *tempW = tempDept->workers;
- printTableW();
- while (tempW != NULL)
- {
- printWorker(tempDept, tempW);
- tempW = tempW->next;
- }
- system("pause");
- }
- }
- //вывод на экран списка отделов
- void printDepartments(department *head)
- {
- system("cls");
- printf("СПИСОК ОТДЕЛОВ: \n");
- if (head == NULL)
- {
- printf("Нет данных для отображения.\n");
- system("pause");
- return;
- }
- else
- {
- department *tempPtr = head;
- printTableD();
- while (tempPtr != NULL)
- {
- printDepartment(tempPtr);
- tempPtr = tempPtr->next;
- }
- system("pause");
- }
- }
- //вывод на экран шапки таблицы
- void printTableD()
- {
- for (int i = 0; i < 90; ++i) printf("-");
- printf("\n|Название отдела");
- for (int i = 0; i < 14; i++) printf(" ");
- printf("|Количество работников");
- for (int i = 0; i < 8; i++) printf(" ");
- printf("|id отдела");
- for (int i = 0; i < 19; i++) printf(" ");
- printf("|\n");
- for (int i = 0; i < 90; ++i) printf("-");
- printf("\n");
- }
- //вывод информации об отделе на экран
- void printDepartment(department *current)
- {
- printf("|%-29s", current->departmentName);
- printf("|%-29d", current->numberOfWorkers);
- printf("|%-28d", current->id);
- printf("|\n");
- for (int i = 0; i < 90; ++i) printf("-");
- printf("\n");
- }
- //вывод шапки таблицы на экран
- void printTableW()
- {
- for (int i = 0; i < 172; ++i) printf("-");
- printf("\n|Фамилия");
- for (int i = 0; i < 14; i++) printf(" ");
- printf("|Имя");
- for (int i = 0; i < 18; i++) printf(" ");
- printf("|Отчество");
- for (int i = 0; i < 13; i++) printf(" ");
- printf("|Отдел");
- for (int i = 0; i < 16; i++) printf(" ");
- printf("|Должность");
- for (int i = 0; i < 12; i++) printf(" ");
- printf("|Стаж");
- for (int i = 0; i < 17; i++) printf(" ");
- printf("|Личный № ");
- printf("|id ");
- printf("|Начислено з.п. ");
- printf("|\n");
- for (int i = 0; i < 172; ++i) printf("-");
- printf("\n");
- }
- //вывод на эран информации о работнике
- void printWorker(department *currentDept, worker *current)
- {
- printf("|%-21s", current->workerSurname);
- printf("|%-21s", current->workerName);
- printf("|%-21s", current->workerSecondName);
- printf("|%-21s", currentDept->departmentName);
- printf("|%-21s", current->post);
- printf("|%-21d", current->experience);
- printf("|%-10d", current->personnelNumber);
- printf("|%-5d", current->id);
- printf("|%-21d", current->salary->numberOfHours * current->salary->tariffRate);
- printf("|\n");
- for (int i = 0; i < 172; ++i) printf("-");
- printf("\n");
- }
- //Начисление зарабонтой платы работникам, через установление времени, отработанного за месяц
- void workWithSalary(department **head)
- {
- int choice;
- choice = choiceDepartment(*head);
- worker *tempW;
- if (choice == 0) return;
- else
- {
- department *tempDept = *head;
- for (int i = 0; i < choice - 1; i++)
- {
- tempDept = tempDept->next;
- }
- if (tempDept->numberOfWorkers == 0)
- {
- printf("В данном отделе работников нет.\n");
- system("pause");
- return;
- }
- tempW = tempDept->workers;
- choice = choiceWorker(tempW);
- for (int i = 0; i < choice - 1; i++)
- {
- tempW = tempW->next;
- }
- system("cls");
- printf("Введите количество часов, отработанных за этот месяц: ");
- scanf("%d", &tempW->salary->numberOfHours);
- printf("Данные зарплата начислена.\n");
- system("pause");
- }
- }
- //вывод на экран меню поиска и осуществлоение выбора
- void searchMenu(department *head)
- {
- while (true)
- {
- switch (menu(8))
- {
- case 1:
- searchByDepartmentName(head);
- break;
- case 2:
- searchByNumberOfWorkers(head);
- break;
- case 3:
- searchDeptById(head);
- break;
- case 4:
- searchByNameSurname(head);
- break;
- case 5:
- searchBySurnameDept(head);
- break;
- case 6:
- searchByPostSurname(head);
- break;
- case 7:
- searchWorkerById(head);
- break;
- case 0:
- return;
- default:
- printf("Вы ввели неверное значение, попробуйте снова...\n");
- system("pause");
- break;
- }
- }
- }
- //поиск отдела по его названию
- void searchByDepartmentName(department *head)
- {
- system("cls");
- printf("ПОИСК ОТДЕЛА ПО НАЗВАНИЮ\n");
- char departmentName[20];
- printf("Введите название: ");
- scanf("%s", &departmentName);
- department *tempPtr = head;
- system("cls");
- printTableD();
- while (tempPtr != NULL)
- {
- if (strcmp(tempPtr->departmentName, departmentName) == 0)
- {
- printDepartment(tempPtr);
- }
- tempPtr = tempPtr->next;
- }
- system("pause");
- return;
- }
- //поиск отдела по количеству работников
- void searchByNumberOfWorkers(department *head)
- {
- system("cls");
- printf("ПОИСК ОТДЕЛА ПО КОЛИЧЕСТВУ РАБОТНИКОВ\n");
- int numberOfWorkers;
- printf("Введите количество работников: ");
- scanf("%d", &numberOfWorkers);
- department *tempPtr = head;
- system("cls");
- printTableD();
- while (tempPtr != NULL)
- {
- if (tempPtr->numberOfWorkers == numberOfWorkers)
- {
- printDepartment(tempPtr);
- }
- tempPtr = tempPtr->next;
- }
- system("pause");
- return;
- }
- //поиск отдела по id
- void searchDeptById(department *head)
- {
- system("cls");
- printf("ПОИСК ОТДЕЛА ПО id\n");
- int id1, id2;
- printf("Введите с какого id искать: ");
- scanf("%d", &id1);
- printf("Введите до какого id искать(такой же id, если нужно найти конеретный отдел): ");
- scanf("%d", &id2);
- department *tempPtr = head;
- system("cls");
- printTableD();
- while (tempPtr != NULL)
- {
- if (tempPtr->id >= id1 && tempPtr->id <= id2)
- {
- printDepartment(tempPtr);
- }
- tempPtr = tempPtr->next;
- }
- system("pause");
- return;
- }
- //Поиск по имени и фамилии
- void searchByNameSurname(department *head)
- {
- system("cls");
- printf("ПОИСК РАБОТНИКА ПО ФАМИЛИИ И ИМЕНИ\n");
- char name[20], surname[20];
- printf("Введите фамилию: ");
- scanf("%s", &surname);
- printf("Введите имя: ");
- scanf("%s", &name);
- department *tempDept = head;
- worker *tempW;
- system("cls");
- printTableW();
- while (tempDept != NULL)
- {
- tempW = tempDept->workers;
- while (tempW != NULL)
- {
- if (strcmp(tempW->workerName, name) == 0 && strcmp(tempW->workerSurname, surname) == 0)
- {
- printWorker(tempDept, tempW);
- }
- tempW = tempW->next;
- }
- tempDept = tempDept->next;
- }
- system("pause");
- return;
- }
- //поиск по фамилии и отделу
- void searchBySurnameDept(department *head)
- {
- system("cls");
- printf("ПОИСК РАБОТНИКА ПО ФАМИЛИИ И ОТДЕЛУ\n");
- char surname[20], Department[20];
- printf("Введите фамилию: ");
- scanf("%s", &surname);
- printf("Введите отдел: ");
- scanf("%s", &Department);
- department *tempDept = head;
- worker *tempW;
- system("cls");
- printTableW();
- while (tempDept != NULL)
- {
- if (strcmp(tempDept->departmentName, Department) == 0)
- {
- tempW = tempDept->workers;
- while (tempW != NULL)
- {
- if (strcmp(tempW->workerSurname, surname) == 0)
- {
- printWorker(tempDept, tempW);
- }
- tempW = tempW->next;
- }
- }
- tempDept = tempDept->next;
- }
- system("pause");
- return;
- }
- //поиск по должности и фамилии
- void searchByPostSurname(department *head)
- {
- system("cls");
- printf("ПОИСК РАБОТНИКА ПО ДОЛЖНОСТИ И ФАМИЛИИ\n");
- char post[20], surname[20];
- printf("Введите фамилию: ");
- scanf("%s", &surname);
- printf("Введите должность: ");
- scanf("%s", &post);
- department *tempDept = head;
- worker *tempW;
- system("cls");
- printTableW();
- while (tempDept != NULL)
- {
- tempW = tempDept->workers;
- while (tempW != NULL)
- {
- if (strcmp(tempW->post, post) == 0 && strcmp(tempW->workerSurname, surname) == 0)
- {
- printWorker(tempDept, tempW);
- }
- tempW = tempW->next;
- }
- tempDept = tempDept->next;
- }
- system("pause");
- return;
- }
- //поиск по id
- void searchWorkerById(department *head)
- {
- system("cls");
- printf("ПОИСК РАБОТНИКА id\n");
- int id1, id2;
- printf("Введите с какого id искать: ");
- scanf("%d", &id1);
- printf("Введите до какого id искать(такой же id, если нужно найти конкретного работника): ");
- scanf("%d", &id2);
- department *tempDept = head;
- worker *tempW;
- system("cls");
- printTableW();
- while (tempDept != NULL)
- {
- tempW = tempDept->workers;
- while (tempW != NULL)
- {
- if (tempW->id >= id1 && tempW->id <= id2)
- {
- printWorker(tempDept, tempW);
- }
- tempW = tempW->next;
- }
- tempDept = tempDept->next;
- }
- system("pause");
- return;
- }
- //вывод на экран меню работы с пользователями для админа и осуществление выбора
- void workWithUsers()
- {
- users *head = NULL;
- readUsers(&head);
- while (true)
- {
- switch (menu(9))
- {
- case 1:
- activate(&head);
- break;
- case 2:
- ban(&head);
- break;
- case 0:
- writeUsers(head);
- return;
- default:
- printf("Вы ввели неверное значение, попробуйте снова...\n");
- system("pause");
- break;
- }
- }
- }
- //чтение из файла списка пользователей
- void readUsers(users **head)
- {
- FILE *f;
- if (!(f = fopen("usersData.txt", "r")))
- {
- system("cls");
- printf("Отсутствует файл с данными.");
- system("pause");
- return;
- }
- users *temp;
- while (!feof(f))
- {
- temp = (users*)malloc(sizeof(users));
- fscanf(f, "%s ", &temp->login);
- fscanf(f, "%s\n", &temp->password);
- if (*head == NULL)
- {
- temp->next = NULL;
- temp->prev = NULL;
- *head = temp;
- }
- else
- {
- temp->next = *head;
- temp->next->prev = temp;
- temp->prev = NULL;
- *head = temp;
- }
- }
- fclose(f);
- return;
- }
- //запись списка пользователей в файл
- void writeUsers(users *head)
- {
- FILE *f;
- f = fopen("usersData.txt", "w+");
- users *temp = head;
- while (temp != NULL)
- {
- fprintf(f, "%s ", temp->login);
- fprintf(f, "%s\n", temp->password);
- temp = temp->next;
- }
- fclose(f);
- }
- //вывод на экран меню пользователя и осуществление выбора
- void userMenu(department *begin)
- {
- if (begin == NULL) readFile(&begin);
- while (true)
- {
- switch (menu(3))
- {
- case 1:
- printMenu(begin);
- break;
- case 2:
- searchMenu(begin);
- break;
- case 0:
- return;
- default:
- printf("Вы ввели неверное значение, попробуйте снова...\n");
- system("pause");
- break;
- }
- }
- }
- //запись всей информации в файл
- void writeFile(department *head)
- {
- FILE *f;
- f = fopen("information.txt", "w+");
- department *departments = head;
- worker *workers;
- while (departments != NULL)
- {
- fprintf(f, "%s ", departments->departmentName);
- fprintf(f, "%d ", departments->id);
- fprintf(f, "%d\n", departments->numberOfWorkers);
- workers = departments->workers;
- while (workers != NULL)
- {
- fprintf(f, "%s ", workers->workerSurname);
- fprintf(f, "%s ", workers->workerName);
- fprintf(f, "%s ", workers->workerSecondName);
- fprintf(f, "%s ", workers->post);
- fprintf(f, "%d ", workers->salary->numberOfHours);
- fprintf(f, "%d ", workers->salary->tariffRate);
- fprintf(f, "%d ", workers->experience);
- fprintf(f, "%d ", workers->personnelNumber);
- fprintf(f, "%d\n", workers->id);
- workers = workers->next;
- }
- departments = departments->next;
- }
- fclose(f);
- }
- //чтение всей информации из файла
- void readFile(department **head)
- {
- FILE *f;
- if (!(f = fopen("information.txt", "r")))
- {
- system("cls");
- printf("Отсутствует файл с данными.");
- system("pause");
- return;
- }
- department *departments, *tempDept;
- worker *workers, *tempW;
- while (!feof(f))
- {
- departments = (department*)malloc(sizeof(department));
- fscanf(f, "%s ", &departments->departmentName);
- fscanf(f, "%d ", &departments->id);
- fscanf(f, "%d\n", &departments->numberOfWorkers);
- if (*head == NULL)
- {
- departments->next = NULL;
- departments->prev = NULL;
- departments->workers = NULL;
- *head = departments;
- }
- else
- {
- tempDept = *head;
- while (tempDept->next != NULL)
- {
- tempDept = tempDept->next;
- }
- departments->next = NULL;
- departments->workers = NULL;
- tempDept->next = departments;
- tempDept->next->prev = tempDept;
- }
- for (int i = 0; i < departments->numberOfWorkers; i++)
- {
- workers = (worker*)malloc(sizeof(worker));
- workers->salary = (salary*)malloc(sizeof(salary));
- fscanf(f, "%s ", &workers->workerSurname);
- fscanf(f, "%s ", &workers->workerName);
- fscanf(f, "%s ", &workers->workerSecondName);
- fscanf(f, "%s ", &workers->post);
- fscanf(f, "%d ", &workers->salary->numberOfHours);
- fscanf(f, "%d ", &workers->salary->tariffRate);
- fscanf(f, "%d ", &workers->experience);
- fscanf(f, "%d ", &workers->personnelNumber);
- fscanf(f, "%d\n", &workers->id);
- if (departments->workers == NULL)
- {
- departments->workers = workers;
- departments->workers->next = NULL;
- departments->workers->prev = NULL;
- }
- else
- {
- tempW = departments->workers;
- while (tempW->next != NULL)
- {
- tempW = tempW->next;
- }
- workers->next = NULL;
- tempW->next = workers;
- tempW->next->prev = tempW;
- }
- }
- }
- fclose(f);
- printf("Данные прочитаны.\n");
- system("cls");
- }
- //вывод списка отделов на экран и осуществление выбора
- int choiceDepartment(department *head)
- {
- system("cls");
- int counter = 1, choice;
- department *tempPtr = head;
- if (head == NULL)
- {
- printf("Отделов нет. Добавьте хотя бы один отдел.\n");
- system("pause");
- return 0;
- }
- printf("Выберите отдел(0 для выхода):\n");
- while (tempPtr != NULL)
- {
- printf("%d. %s.\n", counter, tempPtr->departmentName);
- tempPtr = tempPtr->next;
- counter++;
- }
- printf("Ваш выбор: ");
- while (!scanf("%d", &choice))
- {
- fflush(stdin);
- printf("Ошибка ввода. Попробуйте снова: ");
- }
- if (choice > counter)
- {
- printf("Вы выбрали номер отдела, которого нет в списке.\n");
- system("cls");
- return 0;
- }
- else return choice;
- }
- //вывод списка работников на экран и выброр работника
- int choiceWorker(worker *head)
- {
- system("cls");
- int counter = 1, choice;
- worker *tempPtr = head;
- printf("Выберите работника(0 для выхода):\n");
- while (tempPtr != NULL)
- {
- printf("%d. %s %s.\n", counter, tempPtr->workerSurname, tempPtr->workerName);
- tempPtr = tempPtr->next;
- counter++;
- }
- printf("Ваш выбор: ");
- while (!scanf("%d", &choice))
- {
- fflush(stdin);
- printf("Ошибка ввода. Попробуйте снова: ");
- }
- if (choice > counter)
- {
- printf("Вы выбрали номер работника, которого нет в списке.\n");
- system("cls");
- return 0;
- }
- else return choice;
- }
- //Активация пользователь(добавляется запись в список пользователей)
- void activate(users **head)
- {
- system("cls");
- users *newPtr, *tempPtr = *head;
- newPtr = (users*)malloc(sizeof(users));
- printf("АКТИВАЦИЯ:\n");
- printf("Введите логин: ");
- scanf("%s", &newPtr->login);
- printf("Введите пароль: ");
- scanf("%s", &newPtr->password);
- while (tempPtr != NULL)
- {
- if (strcmp(tempPtr->login, newPtr->login) == 0 && strcmp(tempPtr->password, newPtr->password) == 0)
- {
- printf("Данный пользователь уже активирован.\n");
- system("pause");
- return;
- }
- tempPtr = tempPtr->next;
- }
- if (*head == NULL)
- {
- newPtr->next = NULL;
- newPtr->prev = NULL;
- *head = newPtr;
- }
- else
- {
- newPtr->next = *head;
- newPtr->next->prev = newPtr;
- newPtr->prev = NULL;
- *head = newPtr;
- }
- printf("Пользователь активирован.\n");
- system("pause");
- }
- //блокировка пользователей(удаляется запись из списка пользователей)
- void ban(users **head)
- {
- char login[20];
- printf("БЛОКИРОВКА:\n");
- printf("Введите логин: ");
- scanf("%s", &login);
- users *tempPtr = *head;
- while (tempPtr != NULL)
- {
- if (strcmp(tempPtr->login, login) == 0) break;
- tempPtr = tempPtr->next;
- }
- if (tempPtr == NULL)
- {
- printf("Данный пользователь не активен в системе.\n");
- system("pause");
- return;
- }
- if (tempPtr == *head)
- {
- if (tempPtr->next == NULL && tempPtr->prev == NULL)
- {
- free(tempPtr);
- *head = NULL;
- return;
- }
- else
- {
- *head = tempPtr->next;
- (*head)->prev = NULL;
- (*head)->next = tempPtr->next->next;
- free(tempPtr);
- return;
- }
- }
- if (tempPtr->next == NULL)
- {
- tempPtr->prev->next = NULL;
- free(tempPtr);
- return;
- }
- tempPtr->next->prev = tempPtr->prev;
- tempPtr->prev->next = tempPtr->next;
- free(tempPtr);
- return;
- }
Advertisement
Add Comment
Please, Sign In to add comment