diff --git a/cv1/program.c b/cv1/program.c index 3e2cf0e..42d9fb6 100644 --- a/cv1/program.c +++ b/cv1/program.c @@ -1,88 +1,103 @@ #include #include +#include #include -// Функція для порівняння символів за правилами Hack3r scr1pt -int isHack3rEquivalent(char c1, char c2) { - char table[256] = {0}; - table['0'] = 'o'; table['o'] = '0'; - table['1'] = 'i'; table['i'] = '1'; - table['2'] = 'z'; table['z'] = '2'; - table['3'] = 'e'; table['e'] = '3'; - table['4'] = 'a'; table['a'] = '4'; - table['5'] = 's'; table['s'] = '5'; - table['6'] = 'b'; table['b'] = '6'; - table['7'] = 't'; table['t'] = '7'; - table['8'] = 'b'; table['b'] = '8'; - table['9'] = 'q'; table['q'] = '9'; +#define BUFFER_SIZE 100 +#define MAX_PIZZAS 100 - c1 = tolower(c1); - c2 = tolower(c2); +struct pizza { + float cost; + char name[BUFFER_SIZE]; +}; - if (c1 == c2) return 1; - return table[(unsigned char)c1] == c2; -} - -// Функція для перевірки наявності ключового слова в назві -int isHack3rMatch(const char *name, const char *search) { - int name_len = strlen(name); - int search_len = strlen(search); - - for (int i = 0; i <= name_len - search_len; i++) { - int match = 1; - for (int j = 0; j < search_len; j++) { - if (!isHack3rEquivalent(name[i + j], search[j])) { - match = 0; - break; - } - } - if (match) return 1; +// Преобразование символа в Leetspeak +char to_leetspeak(char ch) { + switch (tolower(ch)) { + 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 't': return '7'; + case 'b': return '8'; + default: return tolower(ch); } - return 0; } -int main() -{ - char line[200]; - char name[100]; - char price[20]; - int count = 0; +// Преобразование строки в Leetspeak +void apply_leetspeak(char *input) { + for (int i = 0; input[i] != '\0'; i++) { + input[i] = to_leetspeak(input[i]); + } +} - printf("Zadaj hladanu surovinu:"); - fgets(name, sizeof(name), stdin); - name[strcspn(name, "\n")] = 0; // Видаляємо символ нового рядка +// Проверка на наличие подстроки в строке +int has_substring(const char *name, const char *keyword) { + char modified_name[BUFFER_SIZE]; + char modified_keyword[BUFFER_SIZE]; + strncpy(modified_name, name, BUFFER_SIZE); + strncpy(modified_keyword, keyword, BUFFER_SIZE); + + apply_leetspeak(modified_name); + apply_leetspeak(modified_keyword); + + return strstr(modified_name, modified_keyword) != NULL; +} + +// Функция для считывания одной пиццы +int load_pizza(struct pizza* p) { + char temp_price[BUFFER_SIZE]; + + // Чтение названия пиццы + if (!fgets(p->name, BUFFER_SIZE, stdin)) { + return 0; // Ошибка при чтении или конец ввода + } + + // Удаление символа новой строки + p->name[strcspn(p->name, "\n")] = '\0'; + + // Чтение стоимости пиццы + if (!fgets(temp_price, BUFFER_SIZE, stdin)) { + return 0; // Ошибка при чтении или конец ввода + } + + // Преобразование строки в число с плавающей точкой + p->cost = strtof(temp_price, NULL); + return p->cost > 0 || strcmp(temp_price, "0.0") == 0; +} + +int main() { + char query[BUFFER_SIZE]; + struct pizza pizzas[MAX_PIZZAS]; + int pizza_count = 0; + + // Ввод поискового запроса + printf("Zadaj hladanu surovinu:\n"); + fgets(query, BUFFER_SIZE, stdin); + query[strcspn(query, "\n")] = '\0'; // Удаление символа новой строки + + // Ввод данных о пиццах printf("Zadaj jedalny listok:\n"); - - // Зчитуємо рядки, поки є вхідні дані - while (fgets(line, sizeof(line), stdin) != NULL) { - line[strcspn(line, "\n")] = 0; // Видаляємо символ нового рядка - - // Якщо рядок порожній, зупиняємо цикл - if (strcmp(line, "") == 0) { - break; - } - - if(line[0] == '\0') - { - break; - } - - // Зчитуємо наступний рядок, що містить ціну - if (fgets(price, sizeof(price), stdin) == NULL) { - break; // Якщо більше немає рядків, виходимо - } - price[strcspn(price, "\n")] = 0; // Видаляємо символ нового рядка - - // Якщо знайдено збіг, виводимо назву і ціну - if (isHack3rMatch(line, name)) { - printf("\n%s\n%s\n", line, price); - - } - count++; + while (pizza_count < MAX_PIZZAS && load_pizza(&pizzas[pizza_count])) { + pizza_count++; } - printf("Nacitanych %d poloziek.\n", count); + int match_count = 0; + + // Поиск пицц, соответствующих запросу + for (int i = 0; i < pizza_count; i++) { + if (has_substring(pizzas[i].name, query)) { + printf("Пицца: %s\n", pizzas[i].name); + printf("Цена: %.2f\n", pizzas[i].cost); + match_count++; + } + } + + // Вывод общего количества считанных позиций + printf("Nacitanych %d poloziek.\n", pizza_count); return 0; } \ No newline at end of file