usaa24/cv1/program.c

131 lines
4.4 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define LINESIZE 100
#define MAX_PIZZA 100
// Структура для зберігання інформації про піцу
struct pizza {
float prize; // Ціна піци
char name[LINESIZE]; // Назва піци
};
// Функція для перетворення символу у "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; // Знайдено
}
}
return -1; // Не знайдено
}
// Функція для читання однієї піци
int read_pizza(struct pizza* item) {
char line[LINESIZE]; // Для назви піци
char line2[LINESIZE]; // Для ціни
// Читаємо назву піци
if (fgets(line, sizeof(line), stdin) == NULL) {
return 0; // Помилка при читанні
}
// Видаляємо символ нового рядка з назви
line[strcspn(line, "\n")] = 0;
// Читаємо ціну
if (fgets(line2, sizeof(line2), stdin) == NULL) {
return 0; // Помилка при читанні
}
// Перетворюємо рядок ціни у число з плаваючою комою
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 má cenu %.2f\n", jedalny_listok[i].name, jedalny_listok[i].prize);
}
}
printf("Nacitanych %d poloziek.\n", counter);
return 0;
}