#include #include #include #include #include #define SIZE 256 struct tree { char value[SIZE]; struct tree* left; struct tree* right; }; // Funkcia na odstránenie bieleho miesta z reťazca void trim_whitespace(char* str) { int i = strlen(str) - 1; while (i >= 0 && isspace(str[i])) { str[i] = '\0'; i--; } } // Funkcia na načítanie stromu z pravidiel struct tree* read_tree() { char buffer[SIZE]; // Načítanie riadku if (fgets(buffer, SIZE, stdin) == NULL) { return NULL; } // Ak je prázdny riadok, vráť NULL if (buffer[0] == '\n') { return NULL; } // Odstráň biele miesto trim_whitespace(buffer); // Vytvorenie nového uzla struct tree* node = (struct tree*)calloc(1, sizeof(struct tree)); strcpy(node->value, buffer); // Ak nie je listový uzol (nezačína sa *), rekurzívne načítaj ľavého a pravého syna if (buffer[0] != '*') { node->left = read_tree(); node->right = read_tree(); } return node; } // Funkcia na uvoľnenie pamäte stromu void destroy_tree(struct tree* tree) { if (tree == NULL) { return; } destroy_tree(tree->left); destroy_tree(tree->right); free(tree); } // Funkcia na spočítanie listových uzlov (odpovedí) int count_answers(struct tree* tree) { if (tree == NULL) { return 0; } // Ak je listový uzol (odpoveď) if (tree->value[0] == '*') { return 1; } // Inak rekurzívne spočítaj odpovede z podstromov return count_answers(tree->left) + count_answers(tree->right); } // Funkcia na spustenie znalostného systému void run_knowledge_system(struct tree* node) { if (node == NULL) { return; } // Vypíš otázku/odpoveď printf("%s\n", node->value); // Ak je to listový uzol (odpoveď), skonči if (node->value[0] == '*') { return; } // Ak má potomkov, pokračuj podľa odpovede používateľa if (node->left != NULL || node->right != NULL) { char answer[10]; // Načítaj odpoveď používateľa if (fgets(answer, sizeof(answer), stdin) == NULL) { printf("Koniec\n"); return; } // Spracuj odpoveď if (answer[0] == 'a') { run_knowledge_system(node->left); } else if (answer[0] == 'n') { run_knowledge_system(node->right); } else { printf("Nespravny vstup.\n"); return; } } printf("Koniec\n"); } int main() { // Načítanie bázy pravidiel struct tree* knowledge_base = read_tree(); // Overenie, či nasleduje prázdny riadok char empty_line[SIZE]; if (fgets(empty_line, SIZE, stdin) == NULL || empty_line[0] != '\n') { printf("Nespravna baza pravidiel.\n"); if (knowledge_base != NULL) { destroy_tree(knowledge_base); } return 1; } // Overenie platnosti bázy pravidiel if (knowledge_base == NULL) { printf("Nespravna baza pravidiel.\n"); return 1; } // Spočítanie a výpis počtu tovarov int answer_count = count_answers(knowledge_base); printf("Expert z bufetu to vie.\n"); // Medzery namiesto podtržníkov printf("Pozna %d druhov ovocia a zeleniny.\n", answer_count); printf("Odpovedajte 'a' pre prvu moznost alebo 'n' pre druhu moznost.\n"); // Spustenie znalostného systému run_knowledge_system(knowledge_base); // Vyčistenie pamäte destroy_tree(knowledge_base); return 0; }