Advertisement
Guest User

Untitled

a guest
Mar 19th, 2019
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 20.18 KB | None | 0 0
  1. /*Створити масив структур. Кожна структура складається з таких елементів: фірма, робітник, посада. Для робітника задається прізвище та заробітна платня. Для посади задається кількість вакантних місць, вимоги до претендентів на кожну посаду, Створений масив записати до бінарного файла. Передбачити можливість доповнити файл, замінити дані в файлі, видалити дані з файлу. Реалізувати запити: 1) визначити фірми з найбільшою кількістю вакансій на задану посаду; 2) вивести список вимог до кандидатів на задану посаду по кожній фірмі; 3) створити новий масив із структурою: вакантна посада, заробітна платня. Вакансії вибирати з початкового масиву, виключаючи повторення однакових вакантних посад. На випадок різної платні на однакових посадах у різних фірмах включити у масив середню заробітну платню.*/
  2.  
  3.  
  4. #define _CRT_SECURE_NO_WARNINGS
  5.  
  6. #include <stdio.h>                                                        //импорт стандартных библиотек
  7. #include <Windows.h>
  8. #include <string.h>
  9.  
  10. enum tag{ WORKER, VACANCIES };                                            //тип перечисления
  11.  
  12. struct company                                                            //структура компании
  13. {
  14.     char company_n[20];                                                    //переменная названия компании
  15.     char post[20];                                                        //переменная названия должности
  16.     int salary;                                                            //переменная зарплаты
  17.     enum tag tag;                                                        //создание тега
  18.     union                                                               //обьединение
  19.     {
  20.         struct
  21.         {
  22.             char surname[50];                                            //переменная с фамилией работника
  23.            
  24.         }worker;
  25.         struct
  26.         {
  27.             int ammount;                                                //переменная с колличеством вакансий
  28.             char requirements[100];                                        //переменная с требованиями к работнику
  29.            
  30.         }vacancies;
  31.     };
  32. };
  33.  
  34. struct new_company                                                        //новая структура "название вакансии - зп"
  35. {
  36.     char name[20];                                                        //название вакансии
  37.     int salary;                                                            //средняя зп
  38. };
  39.  
  40. struct company list[10];                                                //массив структур компаний
  41. struct company new_c[10];                                                //массив новой структуры
  42.  
  43. FILE *f;                                                                //указатель на файл
  44. char *name = "laba";                                                    //название файла
  45. int k;                                                                    //колличества компаний
  46. int choose = 1;                                                            //выбор работник или вакансия
  47. char key;                                                                //показывает, что цикл завершен
  48.  
  49. void zapolnenie();                                                        //функция на заполнение данных о работнике или вакансии
  50. void create_company();                                                    //функция создания компании
  51. void read_from_file();                                                    //функция чтения файла
  52. void task1();                                                            //функция первого задания
  53. void task2();                                                            //функция второго задания
  54. void task3();                                                            //функция третьего задания
  55. void menu();                                                            //функция меню
  56.  
  57. int main()
  58. {
  59.     HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
  60.     system("color F0");                                                //белая консоль
  61.    
  62.     /*start:
  63.      menu();
  64.      system("CLS");
  65.      goto start;*/
  66.     create_company();
  67.     task3();
  68.     system("pause");
  69.     return 0;
  70. }
  71.  
  72.  
  73. void zapolnenie()                                                    //функция на заполнение данных о работнике или вакансии
  74. {
  75.     int i = 0;
  76.     do
  77.     {
  78.         printf("Input type of product: 1-worker 2-vacancies: ");    //ввод работника или вакансии
  79.         scanf("%d", &choose);
  80.         getchar();
  81.         if (choose == 1) list[i].tag = WORKER;                        //если выбрали 1 - тег = работник -заполняем работника
  82.         else list[i].tag = VACANCIES;
  83.         switch (list[i].tag)
  84.         {
  85.             case WORKER:                                                //заполняем работника
  86.             {
  87.                 printf("Input company name: ");
  88.                 scanf("%s", list[i].company_n);
  89.                
  90.                 printf("Input surname: ");
  91.                 scanf("%s", list[i].worker.surname);
  92.                
  93.                 printf("Input salary: ");
  94.                 scanf("%d", &list[i].salary);
  95.                 printf("Input name of post: ");
  96.                 scanf("%s", list[i].post);
  97.                 break;
  98.             }
  99.             case VACANCIES:                                                //заполняем вакансию
  100.             {
  101.                 printf("Input company name: ");
  102.                 scanf("%s", list[i].company_n);
  103.                
  104.                 printf("Input name of vacancy: ");
  105.                 scanf("%s", list[i].post);
  106.                
  107.                 printf("Input salary: ");
  108.                 scanf("%d", &list[i].salary);
  109.                
  110.                 printf("Input amount of vacancies: ");
  111.                 scanf("%d", &list[i].vacancies.ammount);
  112.                
  113.                 printf("Input requirements:");
  114.                 scanf("%s", list[i].vacancies.requirements);
  115.                 break;
  116.             }
  117.         }                                                                    //конец заполнения
  118.         printf("------------------------------------------------\n");
  119.         printf("Continue? [y/n] ");                                            //продолжать или нет
  120.         getchar();
  121.         key = getchar();
  122.         printf("------------------------------------------------\n");
  123.         fwrite(&list[i], sizeof(struct company), 1, f);
  124.         i++;
  125.     } while ((key != 'n') && (key != 'N'));                                    //пока  не "нет" - продолжать
  126.     k = i;
  127. }
  128.  
  129.  
  130. void create_company()                                                        //функция создания компании
  131. {
  132.     if (f != NULL) remove(name);
  133.     else
  134.     {
  135.         f = fopen(name, "wb");                                                //открываем файл на запись
  136.         zapolnenie();                                                        //вызываем функцию на заполнение
  137.         fclose(f);                                                            //закрываем файл
  138.     }
  139. }
  140. void read_from_file()                                                        //функция чтения из файла
  141. {
  142.     f = fopen(name, "rb");                                                    //открываем файл для чтения
  143.     for (int i = 0; i < k; i++)                                                //цикл пока i меньше к-ва компаний
  144.     {
  145.         fread(&list, sizeof(struct company), 1, f);                            //читает структуру и записывает ее
  146.         switch (list[i].tag)                                                //свитч на выбор чтения
  147.         {
  148.             case WORKER:                                                        //работник
  149.             {
  150.                 printf("WORKER:\n");                                    //вывод работника
  151.                 printf("%s\t %d\t %s\t\n", list[i].worker.surname, list[i].salary, list[i].post); break;
  152.             }
  153.             case VACANCIES:                                                        //вакансии
  154.             {
  155.                 printf("VACANCIES:\n");                            //вывод вакансии
  156.                 printf("%s\t %d\t %d\t %s\t\n", list[i].post, list[i].salary, list[i].vacancies.ammount, list[i].vacancies.requirements); break;
  157.             }
  158.         }
  159.     }
  160.     fclose(f);                                                                //закрываем файл
  161.     getch();                                                                //задержка закрытия консоли
  162. }
  163.  
  164.     void addinfile()                                                        //добавление в файл
  165.     {
  166.         int sign;
  167.         char ch;
  168.         f = fopen(name, "r+b");
  169.         fread(&list, sizeof(struct company), k, f);
  170.         int j = k;
  171.         do
  172.         {
  173.             printf("Input type of product: 1-worker 2-vacancies: ");    //ввод работника или вакансии
  174.             scanf("%d", &choose);
  175.             getchar();
  176.             if (choose == 1) list[j].tag = WORKER;                        //если выбрали 1 - тег = работник -заполняем работника
  177.             else list[j].tag = VACANCIES;
  178.             switch (list[j].tag)
  179.             {
  180.                 case WORKER:                                                //заполняем работника
  181.                 {
  182.                     printf("Input company name: ");
  183.                     scanf("%s", list[j].company_n);
  184.                    
  185.                     printf("Input surname: ");
  186.                     scanf("%s", list[j].worker.surname);
  187.                    
  188.                     printf("Input salary: ");
  189.                     scanf("%d", &list[j].salary);
  190.                     printf("Input name of post: ");
  191.                     scanf("%s", list[j].post);
  192.                     break;
  193.                 }
  194.                 case VACANCIES:                                                //заполняем вакансию
  195.                 {
  196.                     printf("Input company name: ");
  197.                     scanf("%s", list[j].company_n);
  198.                    
  199.                     printf("Input name of vacancy: ");
  200.                     scanf("%s", list[j].post);
  201.                    
  202.                     printf("Input salary: ");
  203.                     scanf("%d", &list[j].salary);
  204.                    
  205.                     printf("Input amount of vacancies: ");
  206.                     scanf("%d", &list[j].vacancies.ammount);
  207.                    
  208.                     printf("Input requirements:");
  209.                     scanf("%s", list[j].vacancies.requirements);
  210.                     break;
  211.                 }
  212.             }                                                                    //конец заполнения
  213.             printf("------------------------------------------------\n");
  214.             printf("Continue? [y/n] ");                                            //продолжать или нет
  215.             getchar();
  216.             key = getchar();
  217.             j++;
  218.             printf("------------------------------------------------\n");
  219.             }while ((key != 'n') && (key != 'N'));
  220.         fclose(f);
  221.         k = j;
  222.         f = fopen(name, "r+b");
  223.         for (j = 0; j < k; j++)
  224.         {
  225.             fwrite(&list[j],sizeof(struct company),1,f);
  226.         }
  227.         fclose(f);
  228.        
  229.     }
  230.  
  231.  
  232. void task1()                                                                //функция первого задания
  233. {
  234.     char post_choose[20];                                                    //переменная выбора вакансии
  235.     int max = 0;                                                            //переменная максимума вакансий
  236.     int d;
  237.     printf("Input name of vacancy to show list: \n");                        //ввод переменной по которой будем выводить список
  238.     scanf("%s", post_choose);
  239.     if (!(f = fopen(name, "rb"))) printf("Error");                            //проверка открытия файла
  240.     else
  241.     {
  242.         for (int i = 0; i < k; i++)
  243.         {
  244.             fread(&list, sizeof(struct company), 1, f);                        //читаем структуру из файла
  245.             if (list[i].tag == VACANCIES)                                    //если вакансии
  246.             {
  247.                
  248.                 if ((max < list[i].vacancies.ammount) && (strcmp(post_choose, list[i].post) == 0))//условная конструкция на проверку
  249.                 {
  250.                     max = list[i].vacancies.ammount;                        //записываем в переменную максимальное колличество вакансий
  251.                     d = i;                                                    //запоминаем координату
  252.                    
  253.                 }
  254.             }
  255.         }
  256.         printf("\nName of company with max amount of vacancies and your post name:%s\n", list[d].company_n);//вывод наиболее популярной вакансии
  257.         printf("Max amount of vacancies: %d\n", max);//вывод максимального числа вакансий
  258.     }
  259.     getch();
  260. }
  261.  
  262. void task2()                                                                //функция второго задания
  263. {
  264.     char post_choose1[20];                                                    //переменная выбора вакансии
  265.     printf("Input name of vacancy to show list of requirements: \n");        //ввод названия вакансии по которой будет вывод требований
  266.     scanf("%s", post_choose1);
  267.     if (!(f = fopen(name, "rb"))) printf("Error");                            //если файл не открыт - "ошибка"
  268.     else
  269.     {
  270.         for (int i = 0; i < k; i++)
  271.         {
  272.             fread(&list, sizeof(struct company), 1, f);                        //считывает структуру
  273.             if (list[i].tag == VACANCIES)                                    //если вакансия
  274.             {
  275.                
  276.                 if ((strcmp(post_choose1, list[i].post) == 0))                //если выбранный пост выводит требования
  277.                 {
  278.                     printf("Name of post: %s\n", list[i].company_n);
  279.                     printf("requirements: %s\n", list[i].vacancies.requirements);
  280.                    
  281.                 }
  282.             }
  283.         }
  284.     }
  285.     fclose(f);                                                                //закрывает файл
  286.     getch();
  287. }
  288.  
  289.  
  290. void task3()                                                                //функция третьего задания
  291. {
  292.     int n;
  293.     HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
  294.     if (!(f = fopen(name, "r+b"))) printf("Error of opening the file");
  295.     else
  296.     {
  297.         /*int j = 0;
  298.          int count = 0;
  299.          for (int i = 0; i < k; i++)
  300.          {
  301.          
  302.          fread(&list, sizeof(struct company), 1, f);
  303.          for (int t = 0; t < k; t++)
  304.          if (strcmp(list[i].post, list[t].post) == 0) count++;
  305.          
  306.          if (count == 1)
  307.          {
  308.          
  309.          new_c[j] = list[i];
  310.          j++;
  311.          }
  312.          count = 0;
  313.          fwrite(&new_c, sizeof(struct new_company), 1, f);
  314.          n = j;
  315.          
  316.          
  317.          }*/
  318.        
  319.        
  320.         int j = 0;
  321.         int m = 0;
  322.         int count = 0;
  323.         for (int i = 0; i < k; i++)
  324.         {
  325.             fread(&list, sizeof(struct company), 1, f);
  326.         }
  327.        
  328.         for (int i = 0; i < k; i++)
  329.         {
  330.             for (j = 0; j < m; j++)
  331.                 if ((strcmp(list[i].post, list[j].post) == 0))                //если названия одинаковые
  332.                     break;
  333.             if (j == m)
  334.             {
  335.                 new_c[m] = list[i];                                        //присваиваем новой структуре значение не повторяющихся названий
  336.                 m++;
  337.             }
  338.         }
  339.     }
  340.     fclose(f);
  341.     /*while ((strcmp(list[i].post, list[t + 1].post) != 0))
  342.      {
  343.      t++;
  344.      new_c[j] = list[i];
  345.      j++;
  346.      }
  347.      j++;*/
  348.     fopen(name, "rb");
  349.     printf("NEW STRUCT:\n");
  350.     for (int j = 0; j < k; j++)
  351.     {
  352.         printf("Elements of your stuct:\n");
  353.         printf("Vacancy: %s\t Salary: %d\t\n", new_c[j].post, new_c[j].salary);
  354.     }
  355.    
  356.     fclose(f);
  357. }
  358. void menu()                                                                            //функция меню
  359. {
  360.     printf("Lab 2: structures and binary files student: Bershadskiy A.D.\n");
  361.     printf("-------------------------Menu-------------------------\n");
  362.     printf("1.New file/overwrite file\n");
  363.     printf("2.Add in file\n");
  364.     printf("3.Read from file\n");
  365.     printf("4.Delete file\n");
  366.     printf("5.Most vacancies on the post\n");
  367.     printf("6.Requirements on the choosen post\n");
  368.     printf("7.New structure 'vacancy - salary'\n");
  369.     printf("8.Exit program\n");
  370.     printf("------------------------------------------------------\n");
  371.    
  372.     char switcher;
  373.     printf("Choose your option:");
  374.     switcher = _getch();
  375.     getchar();
  376.    
  377.     switch (switcher)
  378.     {
  379.            
  380.         case '1':
  381.             system("CLS");
  382.             create_company();
  383.             break;
  384.            
  385.            
  386.         case '2':
  387.             system("CLS");
  388.             addinfile();
  389.             break;
  390.            
  391.         case '3':
  392.             system("CLS");
  393.             printf("Read from file:\n");
  394.             read_from_file();
  395.             break;
  396.            
  397.         case '4':
  398.             system("CLS");
  399.             if (f != NULL) remove(name);
  400.             else
  401.             {
  402.                 printf("No file to remove!\n");
  403.             }
  404.             break;
  405.            
  406.         case '5':
  407.             system("CLS");
  408.             printf("Most vacancies on the post:\n");
  409.             task1();
  410.             break;
  411.            
  412.         case '6':
  413.             system("CLS");
  414.             printf("Requirements on the choosen post:\n");
  415.             task2();
  416.             break;
  417.            
  418.         case '7':
  419.             system("CLS");
  420.             task3();
  421.             break;
  422.            
  423.         case '8':
  424.             printf("Exit");
  425.             _getch();
  426.             exit(0);
  427.             break;
  428.            
  429.         defalut:
  430.             printf("Wrong command!");
  431.             break;
  432.            
  433.     }
  434. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement