Advertisement
GrimHansl

Untitled

Mar 21st, 2023 (edited)
390
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 13.96 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <locale.h>
  5.  
  6. struct person
  7. {
  8.     char lastname[50];  //фамилия сотрудника
  9.     int birthYear;  //год рождения сотрудника
  10.     char sex[50];   //пол сотрудника
  11.     char education[50]; //образование сотрудника
  12.     int workYear;   //год поступления сотрудника на работу
  13.  
  14. };
  15.  
  16. void add (char*);   /* добавить запись в файл */
  17. void edit (char*);  /* редактировать запись */
  18. void show (char*);  /* просмотреть содержимое файла */
  19. void search (char*);    /* вывести сотрудников до 28 лет с высшим образованием */
  20. void del (char*);   /* удалить запись из файла */
  21. void youngestMan (char*);   /* вывести самого молодого сотрудника-мужчину */
  22.  
  23.  
  24. int main (int argc, char* argv[]) {
  25.     system("chcp 1251");
  26.     system ("CLS");
  27.  
  28.     char filename[50];  //имя входного файла
  29.     int menu;   //пункт в меню
  30.     if(argc > 1) {
  31.         memcpy (filename, argv[1], 50);
  32.     }
  33.     else {
  34.         puts ("Имя файла:");
  35.         gets (filename);
  36.     }
  37.  
  38.     /* меню */
  39.     do
  40.     {
  41.         system ("CLS");
  42.         puts ("1. Добавление записи");
  43.         puts ("2. Редактирование записи");
  44.         puts ("3. Просмотр записей");
  45.         puts ("4. Вывести список молодых специалистов (до 28 лет) с высшим образованием");
  46.         puts ("5. Самый старший сотрудник среди мужчин");
  47.         puts ("6. Удаление записи");
  48.         puts ("7. Выход");
  49.         scanf ("%d%*c", &menu);
  50.         switch (menu)
  51.         {
  52.             case 1 : add (filename); break;
  53.             case 2 : edit (filename); break;
  54.             case 3 : show (filename); break;
  55.             case 4 : search (filename); break;
  56.             case 5 : youngestMan(filename); break;
  57.             case 6 : del (filename); break;
  58.         }
  59.     }
  60.     while (menu!=7);
  61.     system ("CLS");
  62.     return 0;
  63. }
  64.  
  65. /* функция вывода на экран одной записи */
  66. void print1 (struct person data)
  67. {
  68.     printf ("Фамилия : %s\nГод рождения : %d\nПол : %s\nОбразование : %s\nГод поступления на работу : %d\n",
  69.             data.lastname, data.birthYear, data.sex, data.education, data.workYear);
  70. }
  71.  
  72. /*заполнение одной записи (ввод данных о клиенте)*/
  73. struct person input_worker (void)
  74. {
  75.     struct person worker;
  76.     int flag = 1;   //переменная-флаг
  77.     int i;
  78.     char input[30]; //массив для ввода данных
  79.  
  80.     /* ввод фамилии сотрудника */
  81.     puts ("Фамилия сотрудника");
  82.     gets (worker.lastname);
  83.  
  84.     /* ввод пола сотрудника */
  85.     puts ("Пол сотрудника (\"Мужской\" или \"Женский\")");
  86.     do {
  87.         flag = 0;
  88.         gets(input);
  89.         for(i = 0; i < strlen(input); i++) {
  90.             if ( strcmp(input, "Мужской") && strcmp(input, "Женский") ) {
  91.                 puts("Некорректный ввод, пол вводится с заглавной буквы");
  92.                 flag = 1;
  93.                 break;
  94.             }
  95.         }
  96.     } while (flag);
  97.     strcpy(worker.sex, input);
  98.     flag = 1;
  99.  
  100.     /* ввод образования сотрудника */
  101.     puts ("Образование (\"Среднее\" или \"Высшее\")");
  102.     do {
  103.         flag = 0;
  104.         gets(input);
  105.         for(i = 0; i < strlen(input); i++) {
  106.             if ( strcmp(input, "Среднее") && strcmp(input, "Высшее") ) {
  107.                 puts("Некорректный ввод, образование вводится с заглавной буквы");
  108.                 flag = 1;
  109.                 break;
  110.             }
  111.         }
  112.     } while (flag);
  113.     strcpy(worker.education, input);
  114.     flag = 1;
  115.  
  116.     /* ввод года рождения сотрудника */
  117.     puts ("Год рождения (1930-2007)");
  118.     do {
  119.         scanf("%d", &worker.birthYear);
  120.         if ((worker.birthYear>2007)||(worker.birthYear<1930)) {
  121.             printf("Некорректный ввод, сотрудник еще слишком молодой,\n");
  122.             printf("либо сотрудник с таким годом рождения уже слишком старый для работы в нашей лаборатории\n");
  123.             printf("Повторите ввод\n");
  124.         }
  125.         else flag = 0;
  126.     } while (flag);
  127.         flag = 1;
  128.     while (getchar()!='\n');
  129.  
  130.     /* ввод года поступления на работу сотрудника */
  131.     puts ("Год поступления на работу (1940-2021)");
  132.     do {
  133.         scanf("%d", &worker.workYear);
  134.         if ((worker.workYear>2021)||(worker.workYear<1940)) {
  135.             printf("Некорректный ввод, введенный вами год либо не наступил,\n");
  136.             printf("либо в таком году наша лаборатория еще не существовала\n");
  137.             printf("Повторите ввод\n");
  138.         }
  139.         else flag = 0;
  140.     } while (flag);
  141.     flag = 1;
  142.     while (getchar()!='\n');
  143.  
  144.     printf("Нажмите enter для выхода...\n");
  145.     getchar();
  146.     return worker;
  147. }
  148.  
  149. /* Вывод самого старшего сотрудника среди мужчин */
  150. void youngestMan (char* file) {
  151.     system ("CLS");
  152.     FILE * f;
  153.     struct person worker, required;
  154.  
  155.     if ((f=fopen (file, "rb"))==NULL)
  156.     {
  157.         perror ("Ошибка открытия файла"); getchar();
  158.         return;
  159.     }
  160.  
  161.     int max_birthYear = 3000;
  162.  
  163.     while (fread(&worker, sizeof(worker), 1, f) == 1) {
  164.         if (strcmp(worker.sex, "Мужской") == 0) {
  165.             if (worker.birthYear <= max_birthYear) {
  166.                 max_birthYear = worker.birthYear;
  167.                 required = worker;
  168.             }
  169.         }
  170.     }
  171.  
  172.     if (max_birthYear != 0) {
  173.         printf("Самый старший сотрудник среди мужчин:\n\n");
  174.         printf("--------------------------------\n");
  175.         print1(required);
  176.         printf("--------------------------------\n");
  177.     }
  178.     else {
  179.         puts("Таких записей нет");
  180.     }
  181.  
  182.     printf("Нажмите enter для выхода...\n");
  183.     getchar();
  184.     fclose(f);
  185. }
  186.  
  187. /* функция добавления записи в файл */
  188. void add (char* file)
  189. {
  190.     FILE * f;
  191.     struct person worker;
  192.     system ("CLS");
  193.     if ((f=fopen (file, "ab"))==NULL)
  194.     {
  195.         perror ("Ошибка открытия файла");
  196.         getchar();
  197.         return;
  198.     }
  199.     worker = input_worker();
  200.     fwrite (&worker, sizeof (worker), 1, f);
  201.     fclose (f);
  202. }
  203.  
  204. /* функция редактирования записи */
  205. void edit (char* file)
  206. {
  207.     FILE * f;
  208.     struct person worker;
  209.     char name[30], yes;
  210.     int flag = 0;
  211.     system ("CLS");
  212.     if ((f=fopen (file, "rb+"))==NULL)
  213.     {
  214.         perror ("Ошибка открытия файла"); getchar();
  215.         return;
  216.     }
  217.     printf ("Фамилия сотрудника: "); gets (name);
  218.     while (fread(&worker, sizeof(worker), 1, f))
  219.         if (!strcmp(worker.lastname, name))
  220.         {
  221.             print1 (worker);
  222.             puts ("Редактировать? (y/n)");
  223.             do
  224.             {
  225.                 yes = getchar();getchar();
  226.             }
  227.             while (yes!='y' && yes!='Y' && yes!='n' && yes!='N');
  228.             if (yes=='y' || yes=='Y')
  229.             {
  230.                 worker = input_worker();
  231.                 fseek (f, -sizeof(worker), SEEK_CUR);
  232.                 fwrite (&worker, sizeof (worker), 1, f);
  233.                 fseek (f,0,SEEK_CUR);
  234.             }
  235.         }
  236.         else {
  237.             flag = 1;
  238.         }
  239.         if (flag) puts("Такой записи нет");
  240.  
  241.     printf("\nНажмите enter для выхода...\n");
  242.     getchar();
  243.     fclose(f);
  244. }
  245.  
  246. /* функция печати содержимого файла */
  247. void show (char* file)
  248. {
  249.     FILE *f;
  250.     struct person worker;
  251.     int k=0, yes, len=0;
  252.     const int str=5; /* количество на одной странице */
  253.  
  254.     system("CLS");
  255.     if((f=fopen(file, "rb"))==NULL) //Проверка открытия файлов
  256.     {
  257.         perror("Ошибка открытия файла");
  258.         system("pause");
  259.         return;
  260.     }
  261.     while(fread(&worker, sizeof(worker), 1, f))
  262.         len++;
  263.     fseek(f, 0, SEEK_SET);
  264.     while(yes!='3')
  265.     {
  266.         fflush(stdin);
  267.         system("cls");
  268.         puts("|  N  |  Фамилия сотрудника   | Год рождения |   Пол   | Образование | Год поступления на работу |");
  269.         puts("--------------------------------------------------------------------------------------------------");
  270.         do
  271.         {
  272.             k++;
  273.             fread(&worker, sizeof(worker), 1, f);
  274.             printf("| %3d | %-21s | %-12d | %-7s | %-11s | %-25d |\n", k, worker.lastname, worker.birthYear, worker.sex, worker.education, worker.workYear);
  275.         }
  276.         while(k%str&&k!=len);
  277.         puts("--------------------------------------------------------------------------------------------------");
  278.  
  279.         /* пагинация */
  280.         puts("'1' - предыдущая страница. '2' - следующая. Чтобы выйти, нажмите '3'");
  281.         do
  282.             yes=getchar();
  283.         while(yes!='1' && yes!='2' && yes!='3');
  284.         if(yes=='1')
  285.         {
  286.             if(k<=str)
  287.             {
  288.                 fseek(f, 0, SEEK_SET);
  289.                 k=0;
  290.             }
  291.             else if(k==len && len%str)
  292.             {
  293.                 fseek(f, -(len%str+str)*sizeof(worker), SEEK_END);
  294.                 k=len-len%str-str;
  295.             }
  296.             else
  297.             {
  298.                 fseek(f, -2*str*sizeof(worker), SEEK_CUR);
  299.                 k-=2*str;
  300.             }
  301.         }
  302.         else if(yes=='2')
  303.         {
  304.             if(k==len)
  305.             {
  306.                 if(k==str)
  307.                 {
  308.                     fseek(f, 0, SEEK_SET);
  309.                     k=0;
  310.                 }
  311.                 else if(!(len%str))
  312.                 {
  313.                     fseek(f, -(str)*sizeof(worker), SEEK_END);
  314.                     k=len-str;
  315.                 }
  316.                 else
  317.                 {
  318.                     fseek(f, -(len%str)*sizeof(worker), SEEK_END);
  319.                     k=len-len%str;
  320.                 }
  321.             }
  322.         }
  323.     }
  324.     fclose(f);
  325.     system("pause");
  326. }
  327.  
  328. /* функция вывода сотрудников до 28 лет с высшем образованием: */
  329. void search (char* file)
  330. {
  331.     FILE * f;
  332.     struct person worker, required;
  333.     int max_year = 0;
  334.     system ("CLS");
  335.     if ((f=fopen (file, "rb"))==NULL)
  336.     {
  337.         perror ("Ошибка открытия файла"); getchar();
  338.         return;
  339.     }
  340.  
  341.     puts ("Список сотрудников до 28 лет (1993 год рождения) с высшем образованием:");
  342.     while (fread(&worker, sizeof(worker), 1, f) == 1) {
  343.         if ((strcmp(worker.education, "Высшее") == 0) && worker.birthYear > 1993 )
  344.         {
  345.             max_year = worker.birthYear;
  346.             printf("--------------------------------\n");
  347.             print1 (worker);
  348.             printf("--------------------------------\n");
  349.         }
  350.     }
  351.  
  352.     if (max_year == 0) puts ("Такие записи отсутствуют");
  353.     fclose(f);
  354.     printf("\nНажмите enter для выхода...\n");
  355.     getchar();
  356. }
  357.  
  358. /* функция удаления записи из файла */
  359. void del (char* file)
  360. {
  361.     FILE *f, *ft;
  362.     struct person worker;
  363.     char yes, tempfile[]="tempfile";
  364.     int one,end, birthYear;
  365.     char lastname[50];  //массив с фамилией сотрудника
  366.     int flag = 0;   //переменная-флаг
  367.  
  368.     system("CLS");
  369.     if((f=fopen(file, "rb"))==NULL) //Проверка открытия файлов
  370.     {
  371.         perror("Ошибка открытия файла");
  372.         system("pause");
  373.         return;
  374.     }
  375.  
  376.     ft=fopen(tempfile, "wb");
  377.     puts("Фамилия сотрудника: ");
  378.     scanf("%s", &lastname); //фамилия сотрудника для поиска
  379.     puts("Год рождения сотрудника: ");
  380.     scanf("%d",&birthYear); //год рождения сотрудника для поиска
  381.     while(fread(&worker, sizeof(worker), 1, f))
  382.         if((strcmp(lastname, worker.lastname) == 0) && (worker.birthYear == birthYear))
  383.         {
  384.             print1(worker); //вывод записи
  385.             puts("Удалить? (y/n)");
  386.             do
  387.                 yes=getchar();
  388.             while(yes!='y' && yes!='Y' && yes!='n' && yes!='N');
  389.  
  390.             if(yes=='y' || yes=='Y')
  391.             {
  392.                 rewind(f);
  393.                 while(fread(&worker, sizeof(worker), 1, f))
  394.                     if(strcmp(lastname, worker.lastname) != 0)
  395.                         fwrite(&worker, sizeof(worker), 1, ft);
  396.                 fseek(f, sizeof(worker), SEEK_SET);
  397.                 one=ftell(f);   //запоминаем позицию после 1 элемента
  398.                 fseek(f, 0, SEEK_END);
  399.                 end=ftell(f);   //запоминаем позицию конца
  400.                 fclose(f);
  401.                 fclose(ft);
  402.                 remove(file);
  403.                 if(one!=end)
  404.                     rename(tempfile, file);
  405.                 else
  406.                     remove(tempfile);
  407.                 return;
  408.             }
  409.         }
  410.         else {
  411.             flag = 1;
  412.         }
  413.     if (flag) puts("Такой записи нет");
  414.  
  415.     fclose(f);
  416.     fclose(ft);
  417.     system("pause");
  418.     return;
  419. }
  420.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement