From 15399c7b75cf7f2a132f3f86321431ae74cc9497 Mon Sep 17 00:00:00 2001 From: Deinerovych Date: Fri, 8 Nov 2024 11:12:56 +0100 Subject: [PATCH] 44 --- cv7/program.c | 142 ++++++++++++++++++++++++-------------------------- 1 file changed, 69 insertions(+), 73 deletions(-) diff --git a/cv7/program.c b/cv7/program.c index b91422f..eab2a7a 100644 --- a/cv7/program.c +++ b/cv7/program.c @@ -10,7 +10,6 @@ typedef struct Node { struct Node *no; } Node; -// Создает новый узел с заданным текстом Node* create_node(const char* text) { Node *node = (Node*)malloc(sizeof(Node)); if (!node) { @@ -23,7 +22,68 @@ Node* create_node(const char* text) { return node; } -// Создает базу знаний, если файл не существует +Node* parse_knowledge_base(FILE *file) { + char line[MAX_LINE_LENGTH]; + + if (!fgets(line, sizeof(line), file) || line[0] == '\n') { + return NULL; + } + + line[strcspn(line, "\n")] = 0; + + Node *node = NULL; + if (line[0] == '*') { + node = create_node(line + 1); + } else { + node = create_node(line); + node->yes = parse_knowledge_base(file); + node->no = parse_knowledge_base(file); + } + return node; +} + +int count_products(Node *node) { + if (!node) return 0; + if (!node->yes && !node->no) return 1; + return count_products(node->yes) + count_products(node->no); +} + +void run_expert_system(Node *node, FILE *input) { + while (node) { + if (!node->yes && !node->no) { + printf("*%s\n", node->text); + printf("Koniec\n"); + return; + } + + printf("Odpovedajte 'a' pre prvu moznost alebo 'n' pre druhu moznost.\n"); + printf("%s\n", node->text); + + char answer; + if (fscanf(input, " %c", &answer) != 1) { + printf("Koniec\n"); + return; + } + + if (answer == 'a') { + node = node->yes; + } else if (answer == 'n') { + node = node->no; + } else { + printf("Koniec\n"); + return; + } + } +} + +void free_tree(Node *node) { + if (node) { + free_tree(node->yes); + free_tree(node->no); + free(node); + } +} + void create_default_knowledge_base() { FILE *file = fopen("knowledge_base.txt", "w"); if (!file) { @@ -38,76 +98,9 @@ void create_default_knowledge_base() { fclose(file); } -// Считывает базу знаний из файла и создает дерево -Node* parse_knowledge_base(FILE *file) { - char line[MAX_LINE_LENGTH]; - - if (!fgets(line, sizeof(line), file) || line[0] == '\n') { - return NULL; - } - - line[strcspn(line, "\n")] = 0; // Удаляем символ новой строки - - Node *node; - if (line[0] == '*') { - node = create_node(line + 1); // Создаем узел-ответ - } else { - node = create_node(line); // Создаем узел-вопрос - node->yes = parse_knowledge_base(file); // Рекурсивно читаем ветку "да" - node->no = parse_knowledge_base(file); // Рекурсивно читаем ветку "нет" - } - return node; -} - -// Подсчитывает количество листовых узлов (продуктов) -int count_products(Node *node) { - if (!node) return 0; - if (!node->yes && !node->no) return 1; // Листовой узел - это продукт - return count_products(node->yes) + count_products(node->no); -} - -// Запускает экспертную систему -void run_expert_system(Node *node) { - while (node) { - if (!node->yes && !node->no) { - printf("*%s\n", node->text); - printf("Koniec\n"); - return; - } - - printf("Odpovedajte 'a' pre prvu moznost alebo 'n' pre druhu moznost.\n"); - printf("%s\n", node->text); - - char answer; - if (scanf(" %c", &answer) != 1) { - printf("Koniec\n"); - return; - } - - if (answer == 'a') { - node = node->yes; - } else if (answer == 'n') { - node = node->no; - } else { - printf("Nespravny vstup.\nKoniec\n"); - return; - } - } -} - -// Освобождает выделенную память для дерева -void free_tree(Node *node) { - if (node) { - free_tree(node->yes); - free_tree(node->no); - free(node); - } -} - int main() { FILE *file = fopen("knowledge_base.txt", "r"); if (!file) { - // Если файла нет, создаем его create_default_knowledge_base(); file = fopen("knowledge_base.txt", "r"); if (!file) { @@ -117,10 +110,9 @@ int main() { } Node *root = parse_knowledge_base(file); - fclose(file); - if (!root) { printf("Báza znalostí sa nedá načítať.\n"); + fclose(file); return 1; } @@ -128,9 +120,13 @@ int main() { int product_count = count_products(root); printf("Pozna %d druhov ovocia a zeleniny.\n", product_count); - run_expert_system(root); - free_tree(root); + char line[MAX_LINE_LENGTH]; + while (fgets(line, sizeof(line), file) && line[0] != '\n'); + run_expert_system(root, file); + + free_tree(root); + fclose(file); return 0; }