Advertisement
anticlown

Файлы + Структуры

Oct 31st, 2023 (edited)
931
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 7.72 KB | None | 0 0
  1. #define _CRT_SECURE_NO_WARNINGS
  2.  
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <locale.h>
  6. #include <string.h>
  7. #include <malloc.h>
  8.  
  9. /*формат файла
  10. 11
  11. Арефин A 200
  12. Асепков A 200
  13. Барановский A 300
  14. Демидовец B 500
  15. Елькин B 700
  16. Заяц A 500
  17. Иванникова D 400
  18. Иванов A 400
  19. Калитько C 200
  20. Карась B 400
  21. Кирлица A 450
  22. */
  23.  
  24. /* employee struct start */
  25. typedef struct {
  26.     char surname[20];
  27.     char department[2];
  28.     int salary;
  29. } employee;
  30.  
  31. employee* getEmployeeList(char* filePath) {
  32.     FILE* file;
  33.     file = fopen(filePath, "r");
  34.  
  35.     int size;
  36.     fscanf(file, "%d", &size);
  37.  
  38.     employee* list = (employee*)malloc(size * sizeof(employee));
  39.     for (int i = 0; i < size; i++)
  40.     {
  41.         fscanf(file, "%s", &list[i].surname);
  42.         fscanf(file, "%s", &list[i].department);
  43.         fscanf(file, "%d", &list[i].salary);
  44.     }
  45.     fclose(file);
  46.     return list;
  47. }
  48.  
  49. void addEmployee(int size, employee* list) {
  50.     size++;
  51.     list = (employee*)realloc(list, size * sizeof(employee));
  52.     printf("\nВведите фамилию работника: ");
  53.     scanf("%s", &list[size - 1].surname);
  54.     printf("\nВведите отдел работника: ");
  55.     scanf("%s", &list[size - 1].department);
  56.     printf("\nВведите зарплату работника: ");
  57.     scanf("%d", &list[size - 1].salary);
  58. }
  59.  
  60. void changeEmployee(employee* list) {
  61.     int employeeToChange;
  62.     printf("\nВыберете необходимого для изменения работника по номеру из списка: ");
  63.     scanf("%d", &employeeToChange);
  64.     printf("Введите новую фамилию работника: ");
  65.     scanf("%s", &list[employeeToChange - 1].surname);
  66.     printf("Введите новую отдел работника: ");
  67.     scanf("%s", &list[employeeToChange - 1].department);
  68.     printf("Введите новую зарплату работника: ");
  69.     scanf("%d", &list[employeeToChange - 1].salary);
  70. }
  71.  
  72. void deleteEmployee(int size, employee* list) {
  73.     int employeeToDelete;
  74.     printf("\nВыберете необходимого для удаления работника по номеру из списка: ");
  75.     scanf("%d", &employeeToDelete);
  76.     for (int i = employeeToDelete - 1; i < size; i++)
  77.         memmove(&list[i], &list[i + 1], 26); //26 - размер одной записи типа employee
  78.  
  79.     size--;
  80.     list = (employee*)realloc(list, size * sizeof(employee));
  81. }
  82.  
  83. void printEmployeeList(int size, employee* list) {
  84.     printf("\n\tКоличество работников: %d\n", size);
  85.     printf("\tВывод списка всех работников:\n");
  86.     for (int i = 0; i < size; i++)
  87.     {
  88.         printf("%d. %s из отдела %s - зарплата равна %d $\n", i + 1, list[i].surname, list[i].department, list[i].salary);
  89.     }
  90. }
  91.  
  92. int calculateAllPayments(int size, employee* list) {
  93.     int sum = 0;
  94.     for (int i = 0; i < size; i++)
  95.     {
  96.         if (strcmp(list[i].department, "A") == 0)
  97.             sum += list[i].salary;
  98.     }
  99.     return sum;
  100. }
  101.  
  102. float calculateAvarageSalary(int size, int paymentsSum, employee* list) {
  103.     int numOfDepartmentEmployees = 0;
  104.     for (int i = 0; i < size; i++)
  105.     {
  106.         if (strcmp(list[i].department, "A") == 0)
  107.             numOfDepartmentEmployees++;
  108.     }
  109.     float averageSalary = 0;
  110.     averageSalary = paymentsSum / numOfDepartmentEmployees;
  111.     return averageSalary;
  112. }
  113.  
  114. void printPaymentsAndSalary(int paymentsSum, float averageSalary) {
  115.     printf("Общая сумма выплат отдела А: %d\nСредняя заработная плата сотрудника отдела А: %.2f$", paymentsSum, averageSalary);
  116. }
  117. /* employee struct end */
  118.  
  119.  
  120. /* file funcs/procs start */
  121. char* getPathToFile() {
  122.     static char filePath[20];
  123.     printf("\nВведите путь к файлу: ");
  124.     gets_s(filePath, 20);
  125.     return filePath;
  126. }
  127.  
  128. int getSize(char filePath[20]) {
  129.     FILE* file;
  130.     file = fopen(filePath, "r");
  131.     int temp;
  132.     fscanf(file, "%d", &temp);
  133.     fclose(file);
  134.     return temp;
  135. }
  136.  
  137. void endWork(char* filePath, int size, employee* list) {
  138.     FILE* file = fopen(filePath, "w");
  139.     fprintf(file, "%d\n", size);
  140.     for (int i = 0; i < size; i++)
  141.     {
  142.         fprintf(file, "%s ", &list[i].surname);
  143.         fprintf(file, "%s ", &list[i].department);
  144.         fprintf(file, "%d\n", list[i].salary);
  145.     }
  146.     fclose(file);
  147.  
  148.     printf("\n\t\t\t\t\t\tРабота с файлом успешно закончена.\n");
  149. }
  150. /* file funcs/procs end */
  151.  
  152.  
  153. /* print procs/funcs start */
  154. void printTaskInfo() {
  155.     printf("Данная программа получает файл со сведениями о месячной заработной плате сотрудников отдела.\n");
  156.     printf("Затем вычисляет общую сумму выплат за месяц по отделу А,а также среднемесячный заработок сотрудникам этого отдела.\n");
  157. }
  158.  
  159. int getChoice() {
  160.     int choice;
  161.     printf("\nВыберете опцию меню: ");
  162.     scanf_s("%d", &choice);
  163.     return choice;
  164. }
  165.  
  166. void printMenuOptions() {
  167.     printf("\t\t\t\t\t\tМеню работы с файлом предлагает следующие опции: \n");
  168.     printf("\t\t\t\t\t\t\t 1. Добавить запись о работник\n");
  169.     printf("\t\t\t\t\t\t\t 2. Изменить запись о работнике\n");
  170.     printf("\t\t\t\t\t\t\t 3. Удалить запись о работнике\n");
  171.     printf("\t\t\t\t\t\t\t 4. Вывести список работников\n");
  172.     printf("\t\t\t\t\t\t\t 5. Посчитать общие выплаты и среднюю з/п.\n");
  173.     printf("\t\t\t\t\t\t\t 6. Закончить работу с файлом\n");
  174. }
  175.  
  176. void printErrMessage() {
  177.     printf("Введено неверное значение! Выберете одну из существующих опций.\n");
  178. }
  179. /* print procs/funcs end */
  180.  
  181. int main()
  182. {
  183.     setlocale(LC_ALL, "Rus");
  184.     printTaskInfo();
  185.  
  186.     char* filePath = getPathToFile();
  187.     int size = getSize(filePath);
  188.     employee* list = getEmployeeList(filePath);
  189.  
  190.     printMenuOptions();
  191.     int choice = 0;
  192.     while (choice != 6)
  193.     {
  194.         choice = getChoice();
  195.         switch (choice)
  196.         {
  197.             case 1: //добавить запись
  198.             {
  199.                 addEmployee(size, list);
  200.                 break;
  201.             }
  202.             case 2: //изменить запись
  203.             {
  204.                 changeEmployee(list);
  205.                 break;
  206.             }
  207.             case 3: //удалить запись
  208.             {
  209.                 deleteEmployee(size, list);
  210.                 break;
  211.             }
  212.             case 4: //вывести текущий список
  213.             {
  214.                 printEmployeeList(size, list);
  215.                 break;
  216.             }
  217.             case 5: //посчитать общие выплаты и среднюю зп
  218.             {
  219.                 int allPayments = calculateAllPayments(size, list);
  220.                 float averageSalary = calculateAvarageSalary(size, allPayments, list);
  221.                 printPaymentsAndSalary(allPayments, averageSalary);
  222.                 break;
  223.             }
  224.             case 6: //закончить работу
  225.             {
  226.                 endWork(filePath, size, list);
  227.                 break;
  228.             }
  229.             default:
  230.             {
  231.                 printErrMessage();
  232.             }
  233.         }
  234.     }
  235.  
  236.     free(list);
  237.     return 0;
  238. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement