From 77b8d634189ef19d2b4ebe50c86cc0be1f6f30d5 Mon Sep 17 00:00:00 2001 From: Viktor Daniv Date: Fri, 15 Nov 2024 00:46:23 +0000 Subject: [PATCH] Update cv7/program.c --- cv7/program.c | 131 ++++++++++++++++++++------------------------------ 1 file changed, 51 insertions(+), 80 deletions(-) diff --git a/cv7/program.c b/cv7/program.c index fd1c09a..ab37498 100644 --- a/cv7/program.c +++ b/cv7/program.c @@ -1,103 +1,74 @@ #include #include #include +#include -// Štruktúra pre uzol v binárnom strome -typedef struct Node { - char text[100]; - int is_answer; // 1 pre odpoveď, 0 pre otázku - struct Node *yes_branch; - struct Node *no_branch; -} Node; +#define SIZE 256 -// Vytvára nový uzol s textom a typom (odpoveď alebo otázka) -Node *create_node(const char *text, int is_answer) { - Node *node = malloc(sizeof(Node)); - if (!node) { - printf("Chyba: Nepodarilo sa alokovať pamäť.\n"); - exit(1); +// Struktúra uzla +typedef struct tree { + char value[SIZE]; + struct tree* left; + struct tree* right; +} Tree; + +// Funkcia na vytvorenie nového uzla +Tree* create_node(const char* value) { + Tree* node = malloc(sizeof(Tree)); + if (node) { + strncpy(node->value, value, SIZE); + node->left = NULL; + node->right = NULL; } - strcpy(node->text, text); - node->is_answer = is_answer; - node->yes_branch = NULL; - node->no_branch = NULL; return node; } -// Funkcia na načítanie bázy pravidiel do binárneho stromu -Node *load_rules(FILE *file, int *num_answers) { - char line[100]; - if (!fgets(line, sizeof(line), file) || line[0] == '\n') { - return NULL; // Prázdny riadok, koniec pravidiel +// Funkcia na načítanie stromu +Tree* read_tree() { + char buffer[SIZE]; + memset(buffer, 0, SIZE); + + // Čítanie riadku + if (!fgets(buffer, SIZE, stdin)) { + return NULL; } - int is_answer = line[0] == '*'; - char *text = is_answer ? line + 1 : line; - text[strcspn(text, "\n")] = 0; // Odstráni znak nového riadka + // Odstránenie znaku nového riadku + buffer[strcspn(buffer, "\n")] = 0; - Node *node = create_node(text, is_answer); - if (is_answer) { - (*num_answers)++; + if (buffer[0] == '\0') { + return NULL; // Prázdny riadok znamená koniec + } + + Tree* node = create_node(buffer); + + // Ak ide o odpoveď, nečítame podstromy + if (buffer[0] == '*') { return node; } - node->yes_branch = load_rules(file, num_answers); - node->no_branch = load_rules(file, num_answers); + // Čítanie podstromov (ľavý a pravý uzol) + node->left = read_tree(); + node->right = read_tree(); return node; } -// Funkcia na kladenie otázok používateľovi -void ask_questions(Node *node) { - while (node) { - printf("%s\n", node->text); - if (node->is_answer) { - printf("Koniec.\n"); - return; - } - - char answer; - printf("Odpovedajte 'a' pre prvú možnosť alebo 'n' pre druhú možnosť: "); - scanf(" %c", &answer); - - if (answer == 'a') { - node = node->yes_branch; - } else if (answer == 'n') { - node = node->no_branch; - } else { - printf("Neplatná odpoveď, koniec.\n"); - return; - } +// Funkcia na zničenie stromu +void destroy_tree(Tree* tree) { + if (tree) { + destroy_tree(tree->left); + destroy_tree(tree->right); + free(tree); } } -// Uvoľní pamäť pre všetky uzly v binárnom strome -void free_tree(Node *node) { - if (node) { - free_tree(node->yes_branch); - free_tree(node->no_branch); - free(node); +// Funkcia na preorder výpis stromu +void print_tree(Tree* tree, int offset) { + if (tree == NULL) return; + for (int i = 0; i < offset; i++) { + printf(" "); } -} - -int main() { - FILE *file = fopen("rules.txt", "r"); - if (!file) { - printf("Chyba: Nepodarilo sa otvoriť súbor s pravidlami.\n"); - return 1; - } - - int num_answers = 0; - Node *root = load_rules(file, &num_answers); - fclose(file); - - if (!root) { - printf("Chyba: Nepodarilo sa načítať bázu pravidiel.\n"); - return 1; - } - - printf("Pozná %d druhov ovocia a zeleniny.\n", num_answers); - ask_questions(root); - free_tree(root); - - return 0; + printf("%s\n", tree->value); + print_tree(tree->left, offset + 3); + print_tree(tree->right, offset + 3); } \ No newline at end of file