Advertisement
Guest User

Untitled

a guest
Mar 26th, 2019
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 25.04 KB | None | 0 0
  1.  
  2. #include<stdio.h>                                                  
  3. #include<string.h>
  4. #include<Windows.h>
  5. #include<stdbool.h>
  6.  
  7. enum pr { DRINK, CHOCOLATE };                                       //тег вибору категорії продукту
  8. struct product
  9. {
  10.     char name[20];                                            //змінна назви продукту
  11.     int calor;                                                //змінна калорійності
  12.     int value;                                                //змінна кількості
  13.     enum pr tag;                                             //тег елементів об'єднання
  14.     union                                                    //об'єднання
  15.     {
  16.         struct
  17.         {
  18.             int strength;                                   //змінна міцності напою
  19.         }drink;                                             //змінна напою
  20.         struct
  21.         {
  22.             int weigth;                                     //змінна ваги
  23.             char filling[20];                               //змінна начинки
  24.         }chocolate;                                         //змінна шоколаду
  25.     };
  26. };
  27. struct product list[20];                                    //масив структур продуктів
  28. struct product new_list[20];                                //масив нового списку структур продуктів
  29. FILE *f;                                                    //вказівник на файл
  30. char *name = "name";                                        // назва файла
  31. int i;
  32. int n;
  33.  
  34. void input();                                        //прототип функції введення
  35. void switch_print();
  36. void output();                                   //прототип функції виведення
  37. void chok();                        //прототип функції пошуку шок з макс вагою та заданою начинкою
  38. void alcohol();                                                     //прототип функції видалення алкогольних напоїв
  39. void menu();                                                        //прототип функції створення меню
  40. void change();                                                      //прототип функціїї зміни файла
  41. void add();                                                         //прототип функції додавання елементів до файлу
  42.  
  43. int main()
  44. {
  45.     int key;                                                   //ознака вибору функції в меню
  46.     HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
  47.     system("color F0");                                                   //білий колір консолі
  48.     printf("LAB: 2 Binary files,structures and unions\nVARIANT: 15 \nSTUDENT: Lapa Anastasiia \nGROUP: IS-81\n ");//назва лабораторної роботи
  49.     system("pause");
  50.     while (true)
  51.     {
  52.         system("cls");                                                //очищення консолі
  53.         printf("\n\t MENU \n\n");                                         //меню
  54.         printf("1.Fill binary file with array of structures\n");
  55.         printf("2.Read data from file\n");
  56.         printf("3.Create a list of chocolate products with maximum weight and  given filling\n");
  57.         printf("4.Remove from existing list information about alcoholic beverages\n");
  58.         printf("5.Create a menu of drinks and chocolates that meen the calorie and price you want\n");
  59.         printf("6.Add new elements to file\n");
  60.         printf("7.Change element in file\n");
  61.         printf("8.Delete file\n");
  62.         printf("9.Exit\n");
  63.  
  64.         printf("\nChoose option:");                                         //вибір опції меню
  65.         scanf("%d", &key);                                         //зчитування змінної ознаки
  66.         system("cls");
  67.         switch (key)
  68.         {
  69.         case 1:                                             //варіант створення файлу
  70.         { printf("CREATE FILE\n");
  71.         f = fopen(name, "wb");                             //відкриваємo файл для запису
  72.         input(); break;
  73.         }
  74.  
  75.         case 2:                                                 //варіант зчитування файлу
  76.         { f = fopen(name, "rb");
  77.         printf("READ DATA FROM FILE\n");
  78.         if (f == NULL)                                         //перевірка чи існує файл
  79.         {
  80.             printf("File you wanted to open doesn't exist\nYou can turn back to the menu and create a new one.\n");
  81.             getch();
  82.  
  83.         }
  84.         else  output(); break;
  85.         }
  86.  
  87.         case 3://1) визначити список шоколадних виробів, що мають максимальну вагу і задану начинку;
  88.             printf(" LIST OF CHOCOLATE PRODUCTS WITH MAXIMUM WEIGHT AND GIVEN FILLING \n");
  89.             {   char chok1;
  90.             printf("Show list of products? [y/n]");
  91.             getchar();
  92.             chok1 = getchar();
  93.             if (chok1 != 'n')
  94.             {
  95.                 f = fopen(name, "rb");                                      
  96.                 output();
  97.                 chok();
  98.             }
  99.             else chok(); break;
  100.             }
  101.         case 4:   // 2) вилучити з масиву інформацію про алкогольні напої;
  102.         {
  103.  
  104.                       printf("REMOVE INFORMATION ABOUT ALCOHOLIC BEVERAGES\n");
  105.                       char alko1;
  106.                       printf("Show list of products? [y/n]");       //виведення списку продуктів
  107.                       getchar();
  108.                       alko1 = getchar();
  109.                       if (alko1 != 'n')
  110.                       {
  111.                           f = fopen(name, "rb");
  112.                           output();
  113.                           printf("================PRODUCTS WITHOUT ALCOHOL=================\n");
  114.                           alcohol();
  115.                       }
  116.                       else alcohol(); break;
  117.         }
  118.         case 5:  //3) скласти меню з напоїв і шоколадних виробів, що відповідають заданій калорійності та вартості.
  119.         {
  120.                      printf("CREATE A MENU OF DRINKS AND CHOCOLATES THAT MEEN THE CALORIE AND PRICE YOU WANT\n");
  121.                      menu(); break;
  122.  
  123.         }
  124.         case 6:  //додавання нових елементів до масиву структур
  125.         {  printf("ADD SOMETHING NEW\n");
  126.         add(); break;
  127.  
  128.         }
  129.         case 7: // змінення заданих користувачем елементів
  130.         {
  131.                     printf("CHANGE ELEMENTS OF FILE\n");
  132.                     char chok1;
  133.                     printf("Show list of products? [y/n]");
  134.                     getchar();
  135.                     chok1 = getchar();
  136.                     if (chok1 != 'n')
  137.                     {
  138.                         f = fopen(name, "rb");
  139.                         output();
  140.                         change();
  141.                     }
  142.                     else change(); break;
  143.         }
  144.         case 8:  //видалення файлу
  145.         {
  146.                      printf("DELETE FILE:\n");
  147.                      if (f != NULL)
  148.                      {
  149.                          remove(name);
  150.                          printf("Your file was successfully deleted");
  151.                      }
  152.                      getch();
  153.                      break;
  154.         }
  155.         case 9:                                        //вихід з программи
  156.         {
  157.                     printf("Thanks for using this program\n");
  158.                     _getch();
  159.                     exit(0);
  160.         }
  161.         case 10:
  162.         {
  163.  
  164.         }
  165.         default:
  166.         {
  167.  
  168.                    printf("There isn't such option:(\nTry again");
  169.                    getch();
  170.                    break;
  171.         }
  172.  
  173.         }                               //кінець меню
  174.     }
  175.  
  176.     system("pause");
  177. }
  178.  
  179. void input()                                                             //функція введення
  180. {
  181.     HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
  182.     int sign = 1;                                                   //ознака категорії продукту
  183.     char ch;                                                  //ознака завершення введення даних
  184.  
  185.     {
  186.  
  187.         i = 0;
  188.         do
  189.         {
  190.             SetConsoleTextAttribute(hConsole, (WORD)((15 << 4) | 4));
  191.             printf("Input type of product: 1- drink 2-chocolate: ");
  192.             SetConsoleTextAttribute(hConsole, (WORD)((15 << 4) | 0));
  193.             scanf("%d", &sign);
  194.             if (sign == 1) list[i].tag = DRINK;           //ознака переходу до категорії напоїв
  195.             else list[i].tag = CHOCOLATE;               //ознака переходу до категорії шоколадки
  196.             switch (list[i].tag)
  197.             {
  198.             case DRINK:                               //введення данних про напій
  199.             {  printf("name of drink: ");
  200.                 scanf("%s", list[i].name);            //запис інформації до масиву структур
  201.                 printf("Enter calor of drink: ");
  202.                 scanf("%d", &list[i].calor);
  203.                 printf("Enter value of drink: ");
  204.                 scanf("%d", &list[i].value);
  205.                 printf("Enter strength of drink: ");
  206.                 scanf("%d", &list[i].drink.strength); break;
  207.             }
  208.             case CHOCOLATE:                        //ведення данних про шоколадки
  209.             {
  210.                 printf("Enter name of chocolate:");
  211.                 scanf("%s", list[i].name);
  212.                 printf("Enter calor of chocolate: ");
  213.                 scanf("%d", &list[i].calor);
  214.                 printf("Enter value of chocolate: ");
  215.                 scanf("%d", &list[i].value);
  216.                 printf("Enter weigth of chocolate: ");
  217.                 scanf("%d", &list[i].chocolate.weigth);
  218.                 printf("Enter filling of chocolate: ");
  219.                 scanf("%s", list[i].chocolate.filling); break;
  220.             }
  221.             }                                                               //кінець введення
  222.             SetConsoleTextAttribute(hConsole, (WORD)((15 << 4) | 2));
  223.             printf("Continue? [y/n] ");
  224.             SetConsoleTextAttribute(hConsole, (WORD)((15 << 4) | 0));
  225.             getchar();
  226.             ch = getchar();
  227.             fwrite(&list[i], sizeof(struct product), 1, f);
  228.             i++;
  229.         } while ((ch != 'n') && (ch != 'N'));              //умови продовження введення
  230.         n = i;                                             //кількість елементів масиву
  231.     }
  232.     fclose(f);
  233. }
  234.  
  235. void output()                                       //зчитування і виведення інформації з файлу
  236. {
  237.     HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
  238.     for (i = 0; i < n; i++)
  239.     {
  240.         fread(&list, sizeof(struct product), 1, f); //зчитування рядків з файлу
  241.         switch_print();                          //функція виведення рядків
  242.     }
  243.     getch();
  244.     fclose(f);
  245. }
  246.  
  247. void switch_print()  // функція що містить перелік елементів відповідно до типу (шоколад або напої)
  248. {
  249.     HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
  250.     switch (list[i].tag)
  251.     {
  252.     case DRINK:
  253.     {
  254.                   SetConsoleTextAttribute(hConsole, (WORD)((1 << 4) | 14));
  255.                   printf("DRINK:\n");
  256.                   SetConsoleTextAttribute(hConsole, (WORD)((15 << 4) | 0));
  257.                   printf("%s\t %d\t %d\t %d\t\n", list[i].name, list[i].calor, list[i].value, list[i].drink.strength); break;
  258.     }
  259.     case CHOCOLATE:
  260.     {
  261.                       SetConsoleTextAttribute(hConsole, (WORD)((14 << 4) | 9));
  262.                       printf("CHOCOLATE:\n");
  263.                       SetConsoleTextAttribute(hConsole, (WORD)((15 << 4) | 0));
  264.                       printf("%s\t %d\t %d\t %d\t %s\t\n", list[i].name, list[i].calor, list[i].value, list[i].chocolate.weigth, list[i].chocolate.filling); break;
  265.     }
  266.     }
  267.  
  268.  
  269. }
  270.  
  271.  
  272.  
  273. void chok()
  274. {
  275.     char filling[20];                            //масив символів куди буде введена назва начинки
  276.     printf("Enter filling for search:");
  277.     scanf("%s", filling);                           //зчитування начинки
  278.     int max = 0;                                    //початкове значення максимальної ваги
  279.     int k;                      //змінна для запису номеру елементу з макс вагою і заданою начинкою
  280.     if (!(f = fopen(name, "rb"))) printf("Error of opening the file");
  281.     else
  282.     {
  283.         for (i = 0; i < n; i++)
  284.         {
  285.             fread(&list, sizeof(struct product), 1, f);
  286.             if (list[i].tag == CHOCOLATE)
  287.             {
  288.                 if ((max < list[i].chocolate.weigth) && (strcmp(filling, list[i].chocolate.filling) == 0))//якщо макс вага і зад начинка
  289.                 {
  290.  
  291.                     max = list[i].chocolate.weigth; //присвоєння змінній значеннь поточного елементу
  292.                     k = i;
  293.  
  294.                 }
  295.  
  296.             }
  297.  
  298.         }
  299.  
  300.         printf("Name of  product with max weigth and filling:%s\n", list[k].name);
  301.         printf("Max weigth of chocolates:%d ", max);
  302.  
  303.  
  304.  
  305.     }
  306.     getch();
  307.     fclose(f);
  308.  
  309. }
  310.  
  311. void alcohol()                                  //функція видалення даних про алкогольні напої
  312. {
  313.     int k;                                                  //кількість елементів нового списку
  314.     HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
  315.     if (!(f = fopen(name, "r+b"))) printf("Error of opening the file");
  316.     else
  317.     {
  318.         int j = 0;
  319.         for (i = 0; i < n; i++)
  320.         {
  321.             fread(&list, sizeof(struct product), 1, f);
  322.             if (((list[i].tag==DRINK)&&(list[i].drink.strength <= 3)) || (list[i].tag == CHOCOLATE))
  323.             {
  324.                 new_list[j] = list[i];
  325.                 j++;
  326.             }
  327.             fwrite(&new_list, sizeof(struct product), 1, f);
  328.             k = j;                                              //кількість елементів нового списку
  329.         }
  330.         fclose(f);
  331.         fopen(name, "rb");
  332.         for (int j = 0; j < k; j++)                             //виведення нового списку
  333.         {
  334.  
  335.             switch (list[j].tag)
  336.             {
  337.             case DRINK:
  338.             {
  339.                   printf("%s\t %d\t %d\t %d\t\n", new_list[j].name, new_list[j].calor, new_list[j].value, new_list[j].drink.strength); break;
  340.             }
  341.             case CHOCOLATE:
  342.             {
  343.                   printf("%s\t %d\t %d\t %d\t %s\t\n", new_list[j].name, new_list[j].calor, new_list[j].value, new_list[j].chocolate.weigth, new_list[j].chocolate.filling); break;
  344.             }
  345.             }
  346.         }
  347.     }
  348.     getch();
  349.     fclose(f);
  350.  
  351. }
  352.  
  353. void menu()          //функція створення меню з елементами що мають задану калорійність та вартість
  354. {
  355.     HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
  356.     int calor;                              //змінна калорійності користувача для пошуку
  357.     int value;                                              //змінна вартості для пошуку
  358.     printf("\n OLD LIST:\n\n");
  359.     output();
  360.     if (!(fopen(name, "rb"))) printf("Error");
  361.     else
  362.     {
  363.         printf("\nEnter calor:");
  364.         scanf("%d", &calor);
  365.         printf("Enter value:");
  366.         scanf("%d", &value);
  367.         printf("\n NEW LIST:\n\n");
  368.         for (i = 0; i < n; i++)
  369.         {
  370.             fread(&list, sizeof(struct product), 1, f);
  371.             if ((calor == list[i].calor) && (value == list[i].value)) //якщо задана калорійність і вартість
  372.             {
  373.                 switch_print();
  374.             }
  375.         }
  376.  
  377.     }getch();
  378.     fclose(f);
  379.  
  380. }
  381.  
  382. void change()
  383. {
  384.     int sign;                                                //ознака вибору категорії продукту для зміни
  385.     int flag;                                                  //змінна для switch drink
  386.     int flag1;                                                //змінна для switch chocolate
  387.     char nameel[20];               //змінна для запису імені елементу який потрібно змінити
  388.     char cont1;                                    //ознака завершення циклу drink
  389.     char cont2;                                    //ознака завершення циклу chocolate
  390.     char ch;                               //ознака завершення чи продовження зміни елементів
  391.     f = fopen(name, "r+b");
  392.     fread(&list, sizeof(struct product), n, f);
  393.     do
  394.     {
  395.         printf("In which structure you want to change element?\n");
  396.         printf("Press 1 for drink, press 2 for chocolates:  ");
  397.         scanf("%d", &sign);
  398.         printf("Enter name of element you want to change:");
  399.         scanf("%s", nameel);
  400.         for (i = 0; i < n; i++)
  401.         {
  402.  
  403.             if ((sign == 1) && (list[i].tag == DRINK) && (strcmp(nameel, list[i].name) == 0))//ознака зміни елементів типу напій
  404.             {
  405.                 do
  406.                 {
  407.                     printf("drink:\n%s\t %d\t %d\t%d\t", list[i].name, list[i].calor, list[i].value, list[i].drink.strength);
  408.                     printf("Which element you want to change?\n");
  409.                     printf("1.name\n2.calor\n3.value\n4.strength\n ");
  410.                     printf("Press number:");
  411.                     scanf("%d", &flag);
  412.                     switch (flag)
  413.                     {
  414.                     case 1:
  415.                     {
  416.                               printf("Enter new name:");
  417.                               scanf("%s", list[i].name);
  418.                               break;
  419.                     }
  420.                     case 2:
  421.                     {
  422.                               printf("Enter new calor");
  423.                               scanf("%d", &list[i].calor);
  424.                               break;
  425.                     }
  426.  
  427.                     case 3:
  428.                     {
  429.                               printf("Enter new value");
  430.                               scanf("%d", &list[i].value);
  431.                               break;
  432.                     }
  433.                     case 4:
  434.                     {
  435.                               printf("Enter new strength:");
  436.                               scanf("%d", &list[i].drink.strength);
  437.                               break;
  438.                     }
  439.                     }//end of switch
  440.                     printf("Change one more element from this structure?[y/n]");
  441.                     getchar();
  442.                     cont1 = getchar();
  443.                 } while ((cont1 != 'n') && (cont1 != 'N'));
  444.             }
  445.  
  446.  
  447.             else if ((sign == 2) && (list[i].tag == CHOCOLATE) && (strcmp(nameel, list[i].name) == 0))          //ознака зміни елементів типу шоколад
  448.             {
  449.  
  450.                 do
  451.                 {
  452.                     printf("chocolate:\n%s\t %d\t %d\t%d\t%s\t", list[i].name, list[i].calor, list[i].value, list[i].chocolate.weigth, list[i].chocolate.filling);
  453.                     printf("Which element you want to change?\n");
  454.                     printf("1.name\n2.calor\n3.value\n4.weigth\n5.filling ");
  455.                     printf("Press number:");
  456.                     scanf("%d", &flag1);
  457.                     switch (flag1)
  458.                     {
  459.                     case 1:
  460.                     {
  461.                               printf("Enter new name:");
  462.                               scanf("%s", list[i].name);
  463.                               break;
  464.                     }
  465.                     case 2:
  466.                     {
  467.                               printf("Enter new calor");
  468.                               scanf("%d", &list[i].calor);
  469.                               break;
  470.                     }
  471.                     case 3:
  472.                     {
  473.                               printf("Enter new value");
  474.                               scanf("%d", &list[i].value);
  475.                               break;
  476.                     }
  477.                     case 4:
  478.                     {
  479.                               printf("Enter new weigth:");
  480.                               scanf("%d", &list[i].chocolate.weigth);
  481.                               break;
  482.                     }
  483.                     case 5:
  484.                     {
  485.                               printf("Enter new fillig");
  486.                               scanf("%s", list[i].chocolate.filling);
  487.                               break;
  488.                     }
  489.                     }
  490.                     printf("Change one more element from this structure?[y/n]");
  491.                     getchar();
  492.                     cont2 = getchar();
  493.                 } while ((cont2 != 'n') && (cont2 != 'N'));
  494.             }
  495.  
  496.         }
  497.         printf("Continue? [y/n] ");
  498.         getchar();
  499.         ch = getchar();
  500.  
  501.     } while ((ch != 'n') && (ch != 'N'));
  502.     fclose(f);
  503.     f = fopen(name, "r+b");           //повторне відкриття файлу для запису змінених елементів
  504.     for (i = 0; i < n; i++)
  505.     {
  506.         fwrite(&list[i], sizeof(struct product), 1, f);
  507.     }
  508.     getch();
  509.     fclose(f);
  510.  
  511. }
  512.  
  513. void add()                                              //функція додавання нових елементів
  514. {
  515.  
  516.  
  517.     HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
  518.     int sign;
  519.     char ch;
  520.     f = fopen(name, "r+b");
  521.     fread(&list, sizeof(struct product), n, f);
  522.     int j = n;          //задаємо початкове значення елементів, які будуть додаватись до масиву
  523.     do
  524.     {                                   //вводимо нові елементи які будемо додавати
  525.         SetConsoleTextAttribute(hConsole, (WORD)((15 << 4) | 4));
  526.         printf("Input type of product: 1- drink 2-chocolate: ");
  527.         SetConsoleTextAttribute(hConsole, (WORD)((15 << 4) | 0));
  528.         scanf("%d", &sign);
  529.         if (sign == 1) list[j].tag = DRINK;
  530.         else list[j].tag = CHOCOLATE;
  531.         switch (list[j].tag)
  532.         {
  533.         case DRINK:
  534.         {  printf("name of drink: ");
  535.            scanf("%s", list[j].name);
  536.            printf("Enter calor of drink: ");
  537.            scanf("%d", &list[j].calor);
  538.            printf("Enter value of drink: ");
  539.            scanf("%d", &list[j].value);
  540.            printf("Enter strength of drink: ");
  541.            scanf("%d", &list[j].drink.strength); break;
  542.         }
  543.         case CHOCOLATE:
  544.         {
  545.           printf("Enter name of chocolate:");
  546.           scanf("%s", list[j].name);
  547.           printf("Enter calor of chocolate: ");
  548.           scanf("%d", &list[j].calor);
  549.           printf("Enter value of chocolate: ");
  550.           scanf("%d", &list[j].value);
  551.           printf("Enter weigth of chocolate: ");
  552.           scanf("%d", &list[j].chocolate.weigth);
  553.           printf("Enter filling of chocolate: ");
  554.           scanf("%s", list[j].chocolate.filling); break;
  555.         }
  556.         }   //end of switch
  557.         SetConsoleTextAttribute(hConsole, (WORD)((15 << 4) | 2));
  558.         printf("Continue? [y/n] ");
  559.         SetConsoleTextAttribute(hConsole, (WORD)((15 << 4) | 0));
  560.         getchar();
  561.         ch = getchar();
  562.         j++;                          //збільшення кількості елементів які додаються
  563.     } while ((ch != 'n') && (ch != 'N'));
  564.     fclose(f);
  565.     n = j;                                //загальна кількість усіх елементів масиву
  566.     f = fopen(name, "r+b");                                    
  567.     for (j = 0; j < n; j++)
  568.     {
  569.         fwrite(&list[j], sizeof(struct product), 1, f);   //новий запис УСІХ елементів до файлу(разом з новими)
  570.     }
  571.     getch();
  572.     fclose(f);
  573.  
  574. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement