diff --git a/cv7/program.c b/cv7/program.c index 80a4b91..d78d3c1 100644 --- a/cv7/program.c +++ b/cv7/program.c @@ -2,76 +2,90 @@ #include #include +#define MAX_LENGTH 100 + typedef struct Node { - char *text; + char text[MAX_LENGTH]; struct Node *yes; struct Node *no; } Node; -Node* vytvor_uzol(char *text) { - Node *uzol = (Node*)malloc(sizeof(Node)); - uzol->text = strdup(text); - uzol->yes = NULL; - uzol->no = NULL; - return uzol; +Node* create_node(char *text) { + Node *new_node = (Node*)malloc(sizeof(Node)); + strcpy(new_node->text, text); + new_node->yes = NULL; + new_node->no = NULL; + return new_node; } -void uvolni(Node *uzol) { - if (uzol) { - free(uzol->text); - uvolni(uzol->yes); - uvolni(uzol->no); - free(uzol); +void free_tree(Node *node) { + if (node == NULL) return; + free_tree(node->yes); + free_tree(node->no); + free(node); +} + +Node* load_knowledge_base() { + char line[MAX_LENGTH]; + if (!fgets(line, MAX_LENGTH, stdin)) return NULL; + + if (line[0] == '\n') return NULL; + + // Создание узла + Node *node = create_node(line); + + if (line[0] != '*') { + node->yes = load_knowledge_base(); + node->no = load_knowledge_base(); } + return node; } -int spocitaj_druhy(Node *uzol) { - if (!uzol) return 0; - if (!uzol->yes && !uzol->no) return 1; // Это лист, т.е. ответ - return spocitaj_druhy(uzol->yes) + spocitaj_druhy(uzol->no); +int count_items(Node *node) { + if (node == NULL) return 0; + if (node->text[0] == '*') return 1; + return count_items(node->yes) + count_items(node->no); } -void znalostny_system(Node *uzol) { - char odpoved; +void ask_question(Node *node) { + if (node == NULL) return; + + printf("%s", node->text); - while (uzol) { - if (!uzol->yes && !uzol->no) { - printf("Expert z bufetu to vie: %s\n", uzol->text); - break; - } + if (node->text[0] == '*') { + printf("Expert z bufetu to vie.\n"); + return; + } - printf("%s\nOdpovedajte 'a' pre prvu moznost alebo 'n' pre druhu moznost: ", uzol->text); - odpoved = getchar(); - getchar(); // Считываем '\n' + char answer; + printf("Odpovedajte 'a' pre prvu moznost alebo 'n' pre druhu moznost.\n"); + if (scanf(" %c", &answer) != 1) { + printf("Neplatny vstup.\n"); + return; + } - if (odpoved == 'a') { - uzol = uzol->yes; - } else if (odpoved == 'n') { - uzol = uzol->no; - } else { - printf("Nespravny vstup, program konci.\n"); - break; - } + if (answer == 'a') { + ask_question(node->yes); + } else if (answer == 'n') { + ask_question(node->no); + } else { + printf("Neplatny vstup.\n"); } } int main() { - // Создаем дерево вопросов и ответов вручную - Node *root = vytvor_uzol("Je to ovocie alebo zelenina?"); - root->yes = vytvor_uzol("*Jablko"); - root->no = vytvor_uzol("*Mrkva"); - - // Подсчитываем количество видов - int druhy = spocitaj_druhy(root); - printf("Expert z bufetu to vie.\nPozna %d druhov ovocia a zeleniny.\n", druhy); + Node *root = load_knowledge_base(); - // Выводим инструкцию для пользователя - printf("Odpovedajte 'a' pre prvu moznost alebo 'n' pre druhu moznost.\n"); + if (root == NULL) { + printf("Chyba pri nacitani bazy pravidiel.\n"); + return 1; + } - // Запускаем систему вопросов и ответов - znalostny_system(root); + int item_count = count_items(root); + printf("Pozna %d druhov ovocia a zeleniny.\n", item_count); - // Освобождаем память - uvolni(root); + ask_question(root); + + free_tree(root); return 0; }