Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<stdio.h>
- #include<string.h>
- #include<Windows.h>
- #include<stdbool.h>
- enum pr { DRINK, CHOCOLATE }; //тег вибору категорії продукту
- struct product
- {
- char name[20]; //змінна назви продукту
- int calor; //змінна калорійності
- int value; //змінна кількості
- enum pr tag; //тег елементів об'єднання
- union //об'єднання
- {
- struct
- {
- int strength; //змінна міцності напою
- }drink; //змінна напою
- struct
- {
- int weigth; //змінна ваги
- char filling[20]; //змінна начинки
- }chocolate; //змінна шоколаду
- };
- };
- struct product list[20]; //масив структур продуктів
- struct product new_list[20]; //масив нового списку структур продуктів
- FILE *f; //вказівник на файл
- char *name = "name"; // назва файла
- int i;
- int n;
- void input(); //прототип функції введення
- void switch_print();
- void output(); //прототип функції виведення
- void chok(); //прототип функції пошуку шок з макс вагою та заданою начинкою
- void alcohol(); //прототип функції видалення алкогольних напоїв
- void menu(); //прототип функції створення меню
- void change(); //прототип функціїї зміни файла
- void add(); //прототип функції додавання елементів до файлу
- int main()
- {
- int key; //ознака вибору функції в меню
- HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
- system("color F0"); //білий колір консолі
- printf("LAB: 2 Binary files,structures and unions\nVARIANT: 15 \nSTUDENT: Lapa Anastasiia \nGROUP: IS-81\n ");//назва лабораторної роботи
- system("pause");
- while (true)
- {
- system("cls"); //очищення консолі
- printf("\n\t MENU \n\n"); //меню
- printf("1.Fill binary file with array of structures\n");
- printf("2.Read data from file\n");
- printf("3.Create a list of chocolate products with maximum weight and given filling\n");
- printf("4.Remove from existing list information about alcoholic beverages\n");
- printf("5.Create a menu of drinks and chocolates that meen the calorie and price you want\n");
- printf("6.Add new elements to file\n");
- printf("7.Change element in file\n");
- printf("8.Delete file\n");
- printf("9.Exit\n");
- printf("\nChoose option:"); //вибір опції меню
- scanf("%d", &key); //зчитування змінної ознаки
- system("cls");
- switch (key)
- {
- case 1: //варіант створення файлу
- { printf("CREATE FILE\n");
- f = fopen(name, "wb"); //відкриваємo файл для запису
- input(); break;
- }
- case 2: //варіант зчитування файлу
- { f = fopen(name, "rb");
- printf("READ DATA FROM FILE\n");
- if (f == NULL) //перевірка чи існує файл
- {
- printf("File you wanted to open doesn't exist\nYou can turn back to the menu and create a new one.\n");
- getch();
- }
- else output(); break;
- }
- case 3://1) визначити список шоколадних виробів, що мають максимальну вагу і задану начинку;
- printf(" LIST OF CHOCOLATE PRODUCTS WITH MAXIMUM WEIGHT AND GIVEN FILLING \n");
- { char chok1;
- printf("Show list of products? [y/n]");
- getchar();
- chok1 = getchar();
- if (chok1 != 'n')
- {
- f = fopen(name, "rb");
- output();
- chok();
- }
- else chok(); break;
- }
- case 4: // 2) вилучити з масиву інформацію про алкогольні напої;
- {
- printf("REMOVE INFORMATION ABOUT ALCOHOLIC BEVERAGES\n");
- char alko1;
- printf("Show list of products? [y/n]"); //виведення списку продуктів
- getchar();
- alko1 = getchar();
- if (alko1 != 'n')
- {
- f = fopen(name, "rb");
- output();
- printf("================PRODUCTS WITHOUT ALCOHOL=================\n");
- alcohol();
- }
- else alcohol(); break;
- }
- case 5: //3) скласти меню з напоїв і шоколадних виробів, що відповідають заданій калорійності та вартості.
- {
- printf("CREATE A MENU OF DRINKS AND CHOCOLATES THAT MEEN THE CALORIE AND PRICE YOU WANT\n");
- menu(); break;
- }
- case 6: //додавання нових елементів до масиву структур
- { printf("ADD SOMETHING NEW\n");
- add(); break;
- }
- case 7: // змінення заданих користувачем елементів
- {
- printf("CHANGE ELEMENTS OF FILE\n");
- char chok1;
- printf("Show list of products? [y/n]");
- getchar();
- chok1 = getchar();
- if (chok1 != 'n')
- {
- f = fopen(name, "rb");
- output();
- change();
- }
- else change(); break;
- }
- case 8: //видалення файлу
- {
- printf("DELETE FILE:\n");
- if (f != NULL)
- {
- remove(name);
- printf("Your file was successfully deleted");
- }
- getch();
- break;
- }
- case 9: //вихід з программи
- {
- printf("Thanks for using this program\n");
- _getch();
- exit(0);
- }
- case 10:
- {
- }
- default:
- {
- printf("There isn't such option:(\nTry again");
- getch();
- break;
- }
- } //кінець меню
- }
- system("pause");
- }
- void input() //функція введення
- {
- HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
- int sign = 1; //ознака категорії продукту
- char ch; //ознака завершення введення даних
- {
- i = 0;
- do
- {
- SetConsoleTextAttribute(hConsole, (WORD)((15 << 4) | 4));
- printf("Input type of product: 1- drink 2-chocolate: ");
- SetConsoleTextAttribute(hConsole, (WORD)((15 << 4) | 0));
- scanf("%d", &sign);
- if (sign == 1) list[i].tag = DRINK; //ознака переходу до категорії напоїв
- else list[i].tag = CHOCOLATE; //ознака переходу до категорії шоколадки
- switch (list[i].tag)
- {
- case DRINK: //введення данних про напій
- { printf("name of drink: ");
- scanf("%s", list[i].name); //запис інформації до масиву структур
- printf("Enter calor of drink: ");
- scanf("%d", &list[i].calor);
- printf("Enter value of drink: ");
- scanf("%d", &list[i].value);
- printf("Enter strength of drink: ");
- scanf("%d", &list[i].drink.strength); break;
- }
- case CHOCOLATE: //ведення данних про шоколадки
- {
- printf("Enter name of chocolate:");
- scanf("%s", list[i].name);
- printf("Enter calor of chocolate: ");
- scanf("%d", &list[i].calor);
- printf("Enter value of chocolate: ");
- scanf("%d", &list[i].value);
- printf("Enter weigth of chocolate: ");
- scanf("%d", &list[i].chocolate.weigth);
- printf("Enter filling of chocolate: ");
- scanf("%s", list[i].chocolate.filling); break;
- }
- } //кінець введення
- SetConsoleTextAttribute(hConsole, (WORD)((15 << 4) | 2));
- printf("Continue? [y/n] ");
- SetConsoleTextAttribute(hConsole, (WORD)((15 << 4) | 0));
- getchar();
- ch = getchar();
- fwrite(&list[i], sizeof(struct product), 1, f);
- i++;
- } while ((ch != 'n') && (ch != 'N')); //умови продовження введення
- n = i; //кількість елементів масиву
- }
- fclose(f);
- }
- void output() //зчитування і виведення інформації з файлу
- {
- HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
- for (i = 0; i < n; i++)
- {
- fread(&list, sizeof(struct product), 1, f); //зчитування рядків з файлу
- switch_print(); //функція виведення рядків
- }
- getch();
- fclose(f);
- }
- void switch_print() // функція що містить перелік елементів відповідно до типу (шоколад або напої)
- {
- HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
- switch (list[i].tag)
- {
- case DRINK:
- {
- SetConsoleTextAttribute(hConsole, (WORD)((1 << 4) | 14));
- printf("DRINK:\n");
- SetConsoleTextAttribute(hConsole, (WORD)((15 << 4) | 0));
- printf("%s\t %d\t %d\t %d\t\n", list[i].name, list[i].calor, list[i].value, list[i].drink.strength); break;
- }
- case CHOCOLATE:
- {
- SetConsoleTextAttribute(hConsole, (WORD)((14 << 4) | 9));
- printf("CHOCOLATE:\n");
- SetConsoleTextAttribute(hConsole, (WORD)((15 << 4) | 0));
- 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;
- }
- }
- }
- void chok()
- {
- char filling[20]; //масив символів куди буде введена назва начинки
- printf("Enter filling for search:");
- scanf("%s", filling); //зчитування начинки
- int max = 0; //початкове значення максимальної ваги
- int k; //змінна для запису номеру елементу з макс вагою і заданою начинкою
- if (!(f = fopen(name, "rb"))) printf("Error of opening the file");
- else
- {
- for (i = 0; i < n; i++)
- {
- fread(&list, sizeof(struct product), 1, f);
- if (list[i].tag == CHOCOLATE)
- {
- if ((max < list[i].chocolate.weigth) && (strcmp(filling, list[i].chocolate.filling) == 0))//якщо макс вага і зад начинка
- {
- max = list[i].chocolate.weigth; //присвоєння змінній значеннь поточного елементу
- k = i;
- }
- }
- }
- printf("Name of product with max weigth and filling:%s\n", list[k].name);
- printf("Max weigth of chocolates:%d ", max);
- }
- getch();
- fclose(f);
- }
- void alcohol() //функція видалення даних про алкогольні напої
- {
- int k; //кількість елементів нового списку
- HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
- if (!(f = fopen(name, "r+b"))) printf("Error of opening the file");
- else
- {
- int j = 0;
- for (i = 0; i < n; i++)
- {
- fread(&list, sizeof(struct product), 1, f);
- if (((list[i].tag==DRINK)&&(list[i].drink.strength <= 3)) || (list[i].tag == CHOCOLATE))
- {
- new_list[j] = list[i];
- j++;
- }
- fwrite(&new_list, sizeof(struct product), 1, f);
- k = j; //кількість елементів нового списку
- }
- fclose(f);
- fopen(name, "rb");
- for (int j = 0; j < k; j++) //виведення нового списку
- {
- switch (list[j].tag)
- {
- case DRINK:
- {
- 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;
- }
- case CHOCOLATE:
- {
- 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;
- }
- }
- }
- }
- getch();
- fclose(f);
- }
- void menu() //функція створення меню з елементами що мають задану калорійність та вартість
- {
- HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
- int calor; //змінна калорійності користувача для пошуку
- int value; //змінна вартості для пошуку
- printf("\n OLD LIST:\n\n");
- output();
- if (!(fopen(name, "rb"))) printf("Error");
- else
- {
- printf("\nEnter calor:");
- scanf("%d", &calor);
- printf("Enter value:");
- scanf("%d", &value);
- printf("\n NEW LIST:\n\n");
- for (i = 0; i < n; i++)
- {
- fread(&list, sizeof(struct product), 1, f);
- if ((calor == list[i].calor) && (value == list[i].value)) //якщо задана калорійність і вартість
- {
- switch_print();
- }
- }
- }getch();
- fclose(f);
- }
- void change()
- {
- int sign; //ознака вибору категорії продукту для зміни
- int flag; //змінна для switch drink
- int flag1; //змінна для switch chocolate
- char nameel[20]; //змінна для запису імені елементу який потрібно змінити
- char cont1; //ознака завершення циклу drink
- char cont2; //ознака завершення циклу chocolate
- char ch; //ознака завершення чи продовження зміни елементів
- f = fopen(name, "r+b");
- fread(&list, sizeof(struct product), n, f);
- do
- {
- printf("In which structure you want to change element?\n");
- printf("Press 1 for drink, press 2 for chocolates: ");
- scanf("%d", &sign);
- printf("Enter name of element you want to change:");
- scanf("%s", nameel);
- for (i = 0; i < n; i++)
- {
- if ((sign == 1) && (list[i].tag == DRINK) && (strcmp(nameel, list[i].name) == 0))//ознака зміни елементів типу напій
- {
- do
- {
- printf("drink:\n%s\t %d\t %d\t%d\t", list[i].name, list[i].calor, list[i].value, list[i].drink.strength);
- printf("Which element you want to change?\n");
- printf("1.name\n2.calor\n3.value\n4.strength\n ");
- printf("Press number:");
- scanf("%d", &flag);
- switch (flag)
- {
- case 1:
- {
- printf("Enter new name:");
- scanf("%s", list[i].name);
- break;
- }
- case 2:
- {
- printf("Enter new calor");
- scanf("%d", &list[i].calor);
- break;
- }
- case 3:
- {
- printf("Enter new value");
- scanf("%d", &list[i].value);
- break;
- }
- case 4:
- {
- printf("Enter new strength:");
- scanf("%d", &list[i].drink.strength);
- break;
- }
- }//end of switch
- printf("Change one more element from this structure?[y/n]");
- getchar();
- cont1 = getchar();
- } while ((cont1 != 'n') && (cont1 != 'N'));
- }
- else if ((sign == 2) && (list[i].tag == CHOCOLATE) && (strcmp(nameel, list[i].name) == 0)) //ознака зміни елементів типу шоколад
- {
- do
- {
- 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);
- printf("Which element you want to change?\n");
- printf("1.name\n2.calor\n3.value\n4.weigth\n5.filling ");
- printf("Press number:");
- scanf("%d", &flag1);
- switch (flag1)
- {
- case 1:
- {
- printf("Enter new name:");
- scanf("%s", list[i].name);
- break;
- }
- case 2:
- {
- printf("Enter new calor");
- scanf("%d", &list[i].calor);
- break;
- }
- case 3:
- {
- printf("Enter new value");
- scanf("%d", &list[i].value);
- break;
- }
- case 4:
- {
- printf("Enter new weigth:");
- scanf("%d", &list[i].chocolate.weigth);
- break;
- }
- case 5:
- {
- printf("Enter new fillig");
- scanf("%s", list[i].chocolate.filling);
- break;
- }
- }
- printf("Change one more element from this structure?[y/n]");
- getchar();
- cont2 = getchar();
- } while ((cont2 != 'n') && (cont2 != 'N'));
- }
- }
- printf("Continue? [y/n] ");
- getchar();
- ch = getchar();
- } while ((ch != 'n') && (ch != 'N'));
- fclose(f);
- f = fopen(name, "r+b"); //повторне відкриття файлу для запису змінених елементів
- for (i = 0; i < n; i++)
- {
- fwrite(&list[i], sizeof(struct product), 1, f);
- }
- getch();
- fclose(f);
- }
- void add() //функція додавання нових елементів
- {
- HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
- int sign;
- char ch;
- f = fopen(name, "r+b");
- fread(&list, sizeof(struct product), n, f);
- int j = n; //задаємо початкове значення елементів, які будуть додаватись до масиву
- do
- { //вводимо нові елементи які будемо додавати
- SetConsoleTextAttribute(hConsole, (WORD)((15 << 4) | 4));
- printf("Input type of product: 1- drink 2-chocolate: ");
- SetConsoleTextAttribute(hConsole, (WORD)((15 << 4) | 0));
- scanf("%d", &sign);
- if (sign == 1) list[j].tag = DRINK;
- else list[j].tag = CHOCOLATE;
- switch (list[j].tag)
- {
- case DRINK:
- { printf("name of drink: ");
- scanf("%s", list[j].name);
- printf("Enter calor of drink: ");
- scanf("%d", &list[j].calor);
- printf("Enter value of drink: ");
- scanf("%d", &list[j].value);
- printf("Enter strength of drink: ");
- scanf("%d", &list[j].drink.strength); break;
- }
- case CHOCOLATE:
- {
- printf("Enter name of chocolate:");
- scanf("%s", list[j].name);
- printf("Enter calor of chocolate: ");
- scanf("%d", &list[j].calor);
- printf("Enter value of chocolate: ");
- scanf("%d", &list[j].value);
- printf("Enter weigth of chocolate: ");
- scanf("%d", &list[j].chocolate.weigth);
- printf("Enter filling of chocolate: ");
- scanf("%s", list[j].chocolate.filling); break;
- }
- } //end of switch
- SetConsoleTextAttribute(hConsole, (WORD)((15 << 4) | 2));
- printf("Continue? [y/n] ");
- SetConsoleTextAttribute(hConsole, (WORD)((15 << 4) | 0));
- getchar();
- ch = getchar();
- j++; //збільшення кількості елементів які додаються
- } while ((ch != 'n') && (ch != 'N'));
- fclose(f);
- n = j; //загальна кількість усіх елементів масиву
- f = fopen(name, "r+b");
- for (j = 0; j < n; j++)
- {
- fwrite(&list[j], sizeof(struct product), 1, f); //новий запис УСІХ елементів до файлу(разом з новими)
- }
- getch();
- fclose(f);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement