#include #include #include #define SIZE 256 // Структура вузла дерева struct TreeNode { char *value; // текст питання або відповіді struct TreeNode *left; // "так" гілка struct TreeNode *right; // "ні" гілка }; // Функція для створення вузла дерева з текстом struct TreeNode* createNode(const char *text) { struct TreeNode *node = (struct TreeNode*) malloc(sizeof(struct TreeNode)); node->value = strdup(text); node->left = NULL; node->right = NULL; return node; } // Функція для завантаження бази знань у форматі pre-order struct TreeNode* loadTree(FILE *file) { char buffer[SIZE]; if (!fgets(buffer, SIZE, file) || buffer[0] == '\n') { return NULL; } // Створюємо вузол для поточного рядка struct TreeNode *node = createNode(buffer); // Якщо це відповідь (починається з '*'), то повертаємо листовий вузол if (buffer[0] == '*') { return node; } // Інакше рекурсивно завантажуємо лівий і правий нащадки node->left = loadTree(file); node->right = loadTree(file); return node; } // Рекурсивна функція для підрахунку товарів у базі знань int countItems(struct TreeNode *node) { if (node == NULL) { return 0; } if (node->left == NULL && node->right == NULL) { return 1; // Листовий вузол є товаром } return countItems(node->left) + countItems(node->right); } // Функція для запуску експертної системи з питаннями і відповідями void runExpertSystem(struct TreeNode *node) { if (node == NULL) return; // Виводимо поточне питання або відповідь printf("%s", node->value); // Якщо це листовий вузол, то закінчуємо роботу if (node->left == NULL && node->right == NULL) { printf("Koniec\n"); return; } // Отримуємо відповідь користувача char answer; scanf(" %c", &answer); // пробіл перед %c для пропуску зайвих пробілів // Переходимо до відповідного нащадка if (answer == 'a') { runExpertSystem(node->left); } else if (answer == 'n') { runExpertSystem(node->right); } else { printf("Koniec vstupu\n"); // Неправильна відповідь } } // Функція для очищення пам'яті void freeTree(struct TreeNode *node) { if (node == NULL) return; freeTree(node->left); freeTree(node->right); free(node->value); free(node); } int main() { // Відкриваємо файл з базою знань // В даному випадку, ми використовуємо stdin (вхід з консолі) struct TreeNode *root = loadTree(stdin); // Перевірка наявності порожнього рядка після бази знань if (root == NULL) { printf("Помилка: База знань некоректна або пуста.\n"); return 0; } // Рахуємо кількість товарів і виводимо повідомлення int itemCount = countItems(root); printf("Expert z bufetu to vie.\n"); printf("Pozna %d druhov ovocia a zeleniny.\n", itemCount); printf("Odpovedajte 'a' pre prvu moznost alebo 'n' pre druhu moznost.\n"); // Запуск експертної системи runExpertSystem(root); // Звільняємо пам'ять freeTree(root); return 0; }