Advertisement
ksyshshot

KT_5(структуры + файлы)

Dec 4th, 2023
962
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.88 KB | Source Code | 0 0
  1. #define _CRT_SECURE_NO_WARNINGS
  2.  
  3. #include <stdio.h>
  4. #include <string.h>
  5. #include <locale.h>
  6.  
  7. const char fileName[] = "D:\\i.txt";
  8. const char newFileName[] = "D:\\temp.txt";
  9.  
  10. struct person {
  11.     char lastName[50];
  12.     char departName[50];
  13.     int salary;
  14. };
  15.  
  16. void inputNewPerson()
  17. {
  18.     struct person curr;
  19.     printf("Введите данные для добавления нового работника (название отдела, фамилия сотрудника, заработная плата).\n");
  20.     scanf("%s %s %d", &curr.departName, &curr.lastName, &curr.salary);
  21.     FILE* base = fopen(fileName, "a");
  22.     fprintf(base, "%s %s %d ", curr.departName, curr.lastName, curr.salary);
  23.     fclose(base);
  24. }
  25.  
  26. void editPerson(char lastName[], int forDelete)
  27. {
  28.     struct person curr, edit;
  29.     FILE* base = fopen(fileName, "r+");
  30.     FILE* new = fopen(newFileName, "w");
  31.     int begin, end = -1;
  32.     do
  33.     {
  34.         begin = ftell(base);
  35.         fscanf(base, "%s %s %d ", &curr.departName, &curr.lastName, &curr.salary);
  36.         if (strcmp(curr.lastName, lastName) == 0)
  37.         {
  38.             end = ftell(base);
  39.         }
  40.     } while ((feof(base) == 0) && (strcmp(curr.lastName, lastName) != 0));
  41.     rewind(base);
  42.     if (end > -1)
  43.     {
  44.         while (ftell(base) != begin)
  45.         {
  46.             fscanf(base, "%s %s %d ", &curr.departName, &curr.lastName, &curr.salary);
  47.             fprintf(new, "%s %s %d ", curr.departName, curr.lastName, curr.salary);
  48.         }
  49.         if (forDelete == 1)
  50.         {
  51.             fseek(base, end, SEEK_SET);
  52.             printf("Сотрудник удалён из базы!\n");
  53.         }
  54.         else
  55.         {
  56.             fscanf(base, "%s %s %d ", &edit.departName, &edit.lastName, &edit.salary);
  57.             int choice = 0;
  58.             do
  59.             {
  60.                 printf("Что вы хотите изменить в записи о сотруднике? (1 - отдел, 2 - фамилия, 3 - зарплата): ");
  61.                 scanf("%d", &choice);
  62.                 switch (choice)
  63.                 {
  64.                 case 1:
  65.                     printf("Введите название отдела: ");
  66.                     scanf("%s", &edit.departName);
  67.                     break;
  68.                 case 2:
  69.                     printf("Введите фамилию работника: ");
  70.                     scanf("%s", &edit.lastName);
  71.                     break;
  72.                 case 3:
  73.                     printf("Введите зарплату сотрудника: ");
  74.                     scanf("%d", &edit.salary);
  75.                     break;
  76.                 default:
  77.                     break;
  78.                 }
  79.                 printf("Хотите изменить ещё что-нибудь о сотруднике? (1 - да, 0 - нет): ");
  80.                 scanf("%d", &choice);
  81.                 printf("Изменения сохранены!\n");
  82.             } while (choice == 1);
  83.             fprintf(new, "%s %s %d ", edit.departName, edit.lastName, edit.salary);
  84.         }
  85.         while (feof(base) == 0)
  86.         {
  87.             fscanf(base, "%s %s %d ", &curr.departName, &curr.lastName, &curr.salary);
  88.             fprintf(new, "%s %s %d ", curr.departName, curr.lastName, curr.salary);
  89.         }
  90.     }
  91.     else
  92.     {
  93.         printf("Сотрудника с такой фамилией не найдено!\n");
  94.     }
  95.     fclose(base);
  96.     fclose(new);
  97.     if (end > -1)
  98.     {
  99.         remove(fileName);
  100.         rename(newFileName, fileName);
  101.     }
  102. }
  103.  
  104. void task()
  105. {
  106.     struct person curr;
  107.     FILE* base = fopen(fileName, "r");
  108.     int workerCount = 0, allSalary = 0;
  109.     float averageSalary = 0;
  110.     char department[50];
  111.  
  112.     //fprintf(base, "А Иванов 540 ");
  113.     //fscanf(base, "%s %s %d ", &curr.departName, &curr.lastName, &curr.salary);
  114.     //printf("%s %s %d", curr.departName, curr.lastName, curr.salary);
  115.  
  116.     printf("Введите название отдела: ");
  117.     scanf("%s", &department);
  118.  
  119.     do
  120.     {
  121.         fscanf(base, "%s %s %d ", &curr.departName, &curr.lastName, &curr.salary);
  122.         if (strcmp(curr.departName, department) == 0)
  123.         {
  124.             workerCount++;
  125.             allSalary += curr.salary;
  126.         }
  127.     } while (feof(base) == 0);
  128.     if (workerCount > 0)
  129.     {
  130.         averageSalary = allSalary / workerCount;
  131.     }
  132.  
  133.     fclose(base);
  134.     printf("Общие выплаты по отделу %s: %d\n", department, allSalary);
  135.     printf("Среднемесячная зарплата сотрудника отдела: %g\n", averageSalary);
  136. }
  137.  
  138. void output()
  139. {
  140.     struct person curr;
  141.     FILE* base = fopen(fileName, "r");
  142.     do
  143.     {
  144.         fscanf(base, "%s %s %d ", &curr.departName, &curr.lastName, &curr.salary);
  145.         printf("Отдел: %s\t Фамилия: %s\t Зарплата: %d\n", curr.departName, curr.lastName, curr.salary);
  146.     } while (feof(base) == 0);
  147.     fclose(base);
  148. }
  149.  
  150. int main()
  151. {
  152.     SetConsoleOutputCP(1251);
  153.     SetConsoleCP(1251);
  154.  
  155.     struct person temp;
  156.     int choice = -1;
  157.     while (choice != 0)
  158.     {
  159.         printf("Вывести все записи о сотрудниках? (1 - да, 0 - нет): ");
  160.         scanf("%d", &choice);
  161.         if (choice == 1)
  162.         {
  163.             output();
  164.         }
  165.         printf("Желаете найти общую сумму выплат за месяц, а также среднемесячную зарплату? (1 - да, 0 - нет): ");
  166.         scanf("%d", &choice);
  167.         if (choice == 1)
  168.         {
  169.             task();
  170.         }
  171.         printf("Желаете добавить ещё одного сотрудника? (1 - да, 0 - нет): ");
  172.         scanf("%d", &choice);
  173.         if (choice == 1)
  174.         {
  175.             inputNewPerson();
  176.         }
  177.         char lastName[50];
  178.         printf("Желаете удалить какого-либо сотрудника из базы данных? (1 - да, 0 - нет): ");
  179.         scanf("%d", &choice);
  180.         if (choice == 1)
  181.         {
  182.             printf("Введите фамилию сотрудника, которого желаете исключить: ");
  183.             scanf("%s", &lastName);
  184.             editPerson(lastName, 1);
  185.         }
  186.         printf("Желаете отредактировать данные о каком-либо сотруднике? (1 - да, 0 - нет) : ");
  187.         scanf("%d", &choice);
  188.         if (choice == 1)
  189.         {
  190.             printf("Введите фамилию сотрудника, данные о котором необходимо отредактировать: ");
  191.             scanf("%s", &lastName);
  192.             editPerson(lastName, 0);
  193.         }
  194.         printf("Желаете повторить какие-либо действия? (1 - да, 0 - нет): ");
  195.         scanf("%d", &choice);
  196.     }
  197.     return 0;
  198. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement