diff --git a/cv1/program.c b/cv1/program.c index f6812f3..162a963 100644 --- a/cv1/program.c +++ b/cv1/program.c @@ -1,18 +1,24 @@ #include #include #include -#include #define LINESIZE 100 -#define MAX_PIZZAS 100 +#define MAX_PIZZA 100 +// Структура для зберігання інформації про піцу struct pizza { - float prize; - char name[LINESIZE]; + float prize; // Ціна піци + char name[LINESIZE]; // Назва піци }; +// Функція для перетворення символу у "Hacker Script" char hacker_script(char c) { - // Перетворення відповідно до "Hack3r scr1pt" + // Приводимо до нижнього регістру + if (c >= 'A' && c <= 'Z') { + c += 32; // Перетворюємо у нижній регістр + } + + // Замінюємо літери на цифри switch (c) { case 'o': return '0'; case 'i': return '1'; @@ -20,75 +26,105 @@ char hacker_script(char c) { case 'e': return '3'; case 'a': return '4'; case 's': return '5'; - case 'd': return '6'; + case 'b': return '6'; case 't': return '7'; - case 'b': return '8'; + case 'g': return '8'; case 'q': return '9'; - default: return tolower(c); // Зробити маленьким + default: return c; // Повертаємо без змін } } -void normalize(char *input, char *output) { - for (int i = 0; input[i] != '\0'; i++) { +// Функція для нормалізації рядка +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[strlen(input)] = '\0'; // Завершити рядок + output[i] = '\0'; // Додаємо термінатор рядка } -int read_pizza(struct pizza *item) { - char line[LINESIZE]; - if (fgets(line, sizeof(line), stdin) == NULL) return 0; - - // Зчитування назви - strcpy(item->name, line); - - // Зчитування ціни - if (fgets(line, sizeof(line), stdin) == NULL) return 0; - - // Перетворення рядка на float - item->prize = strtof(line, NULL); - if (item->prize == 0.0F) return 0; // Перевірка на успішність - - return 1; // Успішно зчитано -} +// Функція для пошуку підрядка з урахуванням "Hacker Script" +int search_string(const char* heap, const char* needle) { + int len_heap = strlen(heap); + int len_needle = strlen(needle); -int search_string(const char *haystack, const char *needle) { - for (int i = 0; haystack[i] != '\0'; i++) { + for (int i = 0; i <= len_heap - len_needle; i++) { int j; - for (j = 0; needle[j] != '\0' && haystack[i + j] == needle[j]; j++); - if (needle[j] == '\0') return i; // Знайдено + for (j = 0; j < len_needle; j++) { + if (hacker_script(heap[i + j]) != hacker_script(needle[j])) { + break; // Не співпадає + } + } + if (j == len_needle) { + return i; // Знайдено + } } return -1; // Не знайдено } -int main() { - char search[LINESIZE]; - struct pizza menu[MAX_PIZZAS]; - char normalized_search[LINESIZE]; - int count = 0; +// Функція для читання однієї піци +int read_pizza(struct pizza* item) { + char line[LINESIZE]; // Для назви піци + char line2[LINESIZE]; // Для ціни - printf("Zadaj hladanu surovinu:\n"); - fgets(search, sizeof(search), stdin); - search[strcspn(search, "\n")] = 0; // Прибрати символ нового рядка + // Читаємо назву піци + if (fgets(line, sizeof(line), stdin) == NULL) { + return 0; // Помилка при читанні + } + + // Видаляємо символ нового рядка з назви + line[strcspn(line, "\n")] = 0; - // Нормалізація пошукового рядка - normalize(search, normalized_search); - - printf("Zadaj jedalny listok:\n"); - while (read_pizza(&menu[count]) && count < MAX_PIZZAS) { - count++; + // Читаємо ціну + if (fgets(line2, sizeof(line2), stdin) == NULL) { + return 0; // Помилка при читанні } - // Пошук і вивід результатів - printf("Znalezené jedlá:\n"); - for (int i = 0; i < count; i++) { - char normalized_name[LINESIZE]; - normalize(menu[i].name, normalized_name); + // Перетворюємо рядок ціни у число з плаваючою комою + float value = strtof(line2, NULL); + if (value == 0.0F && line2[0] != '0') { + return 0; // Перетворення не вдалося + } + + // Копіюємо дані у структуру + item->prize = value; + strcpy(item->name, line); + return 1; // Успішно +} + +int main() { + struct pizza jedalny_listok[MAX_PIZZA]; // Масив для зберігання позицій меню + int counter = 0; + + printf("Zadaj hladanu surovinu:\n"); + char search_string_input[LINESIZE]; // Для пошукового запиту + fgets(search_string_input, sizeof(search_string_input), stdin); + + // Видаляємо символ нового рядка з пошукового рядка + search_string_input[strcspn(search_string_input, "\n")] = 0; + + printf("Zadaj jedalny listok:\n"); + // Читаємо піци до тих пір, поки не буде помилка + while (read_pizza(&jedalny_listok[counter]) && counter < MAX_PIZZA) { + counter++; + } + + // Обробка пошуку + 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%.2f\n", menu[i].name, menu[i].prize); + printf("%s má cenu %.2f\n", jedalny_listok[i].name, jedalny_listok[i].prize); } } - printf("Nacitanych %d poloziek.\n", count); + printf("Nacitanych %d poloziek.\n", counter); return 0; }