usaa24/cv7/program.c

119 lines
4.0 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 <stdlib.h>
#include <string.h>
#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("Nerozumiem\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);
// Виведення повідомлення про завершення вводу
printf("Koniec vstupu\n");
// Звільняємо пам'ять
freeTree(root);
return 0;
}