diff --git a/cv1/program.c b/cv1/program.c index 162a963..8793cb7 100644 --- a/cv1/program.c +++ b/cv1/program.c @@ -1,130 +1,101 @@ #include #include -#include +#include #define LINESIZE 100 -#define MAX_PIZZA 100 -// Структура для зберігання інформації про піцу -struct pizza { - float prize; // Ціна піци - char name[LINESIZE]; // Назва піци +struct MenuItem { + char dish[LINESIZE]; + float price; }; -// Функція для перетворення символу у "Hacker Script" -char hacker_script(char c) { - // Приводимо до нижнього регістру - if (c >= 'A' && c <= 'Z') { - c += 32; // Перетворюємо у нижній регістр - } - - // Замінюємо літери на цифри - switch (c) { - case 'o': return '0'; - case 'i': return '1'; - case 'z': return '2'; - case 'e': return '3'; - case 'a': return '4'; - case 's': return '5'; - case 'b': return '6'; - case 't': return '7'; - case 'g': return '8'; - case 'q': return '9'; - default: return c; // Повертаємо без змін - } -} - -// Функція для нормалізації рядка -void normalize_string(const char* input, char* output) { - int i = 0; - while (input[i] != '\0' && i < LINESIZE - 1) { - output[i] = hacker_script(input[i]); - i++; - } - output[i] = '\0'; // Додаємо термінатор рядка -} - -// Функція для пошуку підрядка з урахуванням "Hacker Script" -int search_string(const char* heap, const char* needle) { - int len_heap = strlen(heap); - int len_needle = strlen(needle); - - for (int i = 0; i <= len_heap - len_needle; i++) { - int j; - for (j = 0; j < len_needle; j++) { - if (hacker_script(heap[i + j]) != hacker_script(needle[j])) { - break; // Не співпадає - } - } - if (j == len_needle) { - return i; // Знайдено +// Функція для нормалізації рядка за правилами "Hacker Script" +void normalize(char* str) { + for (int i = 0; str[i]; i++) { + // Замінюємо великі літери на маленькі + str[i] = tolower(str[i]); + + // Заміна символів відповідно до "Hacker Script" + switch (str[i]) { + case 'o': str[i] = '0'; break; + case 'i': str[i] = '1'; break; + case 'z': str[i] = '2'; break; + case 'e': str[i] = '3'; break; + case 'a': str[i] = '4'; break; + case 's': str[i] = '5'; break; + case 'b': str[i] = '6'; break; // Залишаємо 'b' на 6 + case 't': str[i] = '7'; break; + case 'g': str[i] = '9'; break; // Додаємо 'g' на 9 + case 'q': str[i] = '9'; break; // Додаємо 'q' на 9 + default: break; // нічого не робимо для інших символів } } - return -1; // Не знайдено } -// Функція для читання однієї піци -int read_pizza(struct pizza* item) { - char line[LINESIZE]; // Для назви піци - char line2[LINESIZE]; // Для ціни - - // Читаємо назву піци - if (fgets(line, sizeof(line), stdin) == NULL) { - return 0; // Помилка при читанні +// Функція для зчитування страви +int read_menu_item(struct MenuItem* item) { + // Зчитуємо назву страви + if (fgets(item->dish, LINESIZE, stdin) == NULL) { + return 0; // Якщо зчитування не вдалося } + + // Перевіряємо, чи введено "end" + if (strcmp(item->dish, "end\n") == 0) { + return 0; // Якщо введено "end", виходимо + } + + item->dish[strcspn(item->dish, "\n")] = 0; // видаляємо символ нового рядка - // Видаляємо символ нового рядка з назви - line[strcspn(line, "\n")] = 0; - - // Читаємо ціну - if (fgets(line2, sizeof(line2), stdin) == NULL) { - return 0; // Помилка при читанні + // Зчитуємо ціну + if (scanf("%f", &item->price) != 1) { + getchar(); // очищуємо буфер вводу + return 0; // Якщо зчитування не вдалося } + getchar(); // очищуємо буфер вводу - // Перетворюємо рядок ціни у число з плаваючою комою - float value = strtof(line2, NULL); - if (value == 0.0F && line2[0] != '0') { - return 0; // Перетворення не вдалося - } - - // Копіюємо дані у структуру - item->prize = value; - strcpy(item->name, line); - return 1; // Успішно + return 1; // Успішне зчитування } -int main() { - struct pizza jedalny_listok[MAX_PIZZA]; // Масив для зберігання позицій меню - int counter = 0; +int main(void) { + struct MenuItem menu[LINESIZE]; + int item_count = 0; - printf("Zadaj hladanu surovinu:\n"); - char search_string_input[LINESIZE]; // Для пошукового запиту - fgets(search_string_input, sizeof(search_string_input), stdin); + char search_string[LINESIZE]; - // Видаляємо символ нового рядка з пошукового рядка - search_string_input[strcspn(search_string_input, "\n")] = 0; + printf("Zadaj hladanu surovinu: "); + fgets(search_string, LINESIZE, stdin); + search_string[strcspn(search_string, "\n")] = 0; // видаляємо символ нового рядка + + // Нормалізуємо рядок для пошуку + normalize(search_string); printf("Zadaj jedalny listok:\n"); - // Читаємо піци до тих пір, поки не буде помилка - while (read_pizza(&jedalny_listok[counter]) && counter < MAX_PIZZA) { - counter++; + + while (item_count < LINESIZE) { // Додаємо перевірку на розмір + struct MenuItem item; + if (!read_menu_item(&item)) { + break; // Виходимо з циклу при некоректному зчитуванні або "end" + } + + // Нормалізуємо назву страви + normalize(item.dish); + menu[item_count++] = item; // Додаємо страву в меню } - // Обробка пошуку - printf("Vyhovujuce jedla:\n"); - - char normalized_search[LINESIZE]; // Для нормалізованого пошукового рядка - normalize_string(search_string_input, normalized_search); // Нормалізуємо пошуковий рядок - - for (int i = 0; i < counter; i++) { - char normalized_name[LINESIZE]; // Для нормалізованої назви піци - normalize_string(jedalny_listok[i].name, normalized_name); // Нормалізуємо назву піци - - if (search_string(normalized_name, normalized_search) != -1) { - printf("%s má cenu %.2f\n", jedalny_listok[i].name, jedalny_listok[i].prize); + // Пошук і вивід знайдених страв + int found = 0; + for (int i = 0; i < item_count; i++) { + if (strstr(menu[i].dish, search_string) != NULL) { + printf("%s\n%.2f\n", menu[i].dish, menu[i].price); + found = 1; } } - printf("Nacitanych %d poloziek.\n", counter); + if (!found) { + printf("Zadana surovina nebola najdena.\n"); + } + + printf("Nacitanych %d poloziek.\n", item_count); + return 0; }