#include #include #include #include #define SIZE 256 // Štruktúra pre uzol binárneho stromu typedef struct TreeNode { char value[SIZE]; // Otázka alebo odpoveď struct TreeNode* yes; // Ukazovateľ na "áno" vetvu struct TreeNode* no; // Ukazovateľ na "nie" vetvu } TreeNode; // Funkcia na načítanie stromu z pravidiel v súbore TreeNode* read_tree(FILE* file) { char buffer[SIZE]; if (fgets(buffer, SIZE, file) == NULL || buffer[0] == '\n') { return NULL; // Koniec súboru alebo prázdny riadok } // Vytvoríme nový uzol a skopírujeme hodnotu TreeNode* node = (TreeNode*)malloc(sizeof(TreeNode)); strncpy(node->value, buffer, SIZE); // Ak je to odpoveď (začína hviezdičkou), uzol je listový if (buffer[0] == '*') { node->yes = NULL; node->no = NULL; } else { // Inak načítame rekurzívne "áno" a "nie" podstromy node->yes = read_tree(file); node->no = read_tree(file); } return node; } // Funkcia na uvoľnenie stromu z pamäte void destroy_tree(TreeNode* node) { if (node == NULL) return; destroy_tree(node->yes); destroy_tree(node->no); free(node); } // Funkcia na výpis stromu s odsadením (na ladenie) void print_tree(TreeNode* node, int offset) { if (node == NULL) return; for (int i = 0; i < offset; i++) { printf(" "); } printf("%s", node->value); // Rekurzívne vypíšeme "áno" a "nie" podstromy if (node->yes) print_tree(node->yes, offset + 3); if (node->no) print_tree(node->no, offset + 3); } // Funkcia na spočítanie listových uzlov (tovarov) int count_leaves(TreeNode* node) { if (node == NULL) return 0; if (node->yes == NULL && node->no == NULL) return 1; // Je to listový uzol return count_leaves(node->yes) + count_leaves(node->no); } // Funkcia na spustenie znalostného systému void run_system(TreeNode* node) { if (node == NULL) return; // Ak je uzol listový (odpoveď), vypíšeme odpoveď a skončíme if (node->yes == NULL && node->no == NULL) { printf("MUDrC to vie.\n"); printf("%s", node->value); return; } // Zobrazíme otázku a čakáme na vstup používateľa printf("%s", node->value); char answer; scanf(" %c", &answer); // Podľa odpovede pokračujeme v "áno" alebo "nie" vetve if (answer == 'a') { run_system(node->yes); } else if (answer == 'n') { run_system(node->no); } else { printf("Odpovedajte 'a' alebo 'n'\n"); } } // Hlavná funkcia int main() { FILE* file = fopen("baza.txt", "r"); if (!file) { fprintf(stderr, "Nepodarilo sa otvoriť súbor\n"); return 1; } // Načítanie stromu z pravidiel v súbore TreeNode* root = read_tree(file); fclose(file); // Skontrolujeme, či je súbor správne načítaný if (root == NULL) { printf("Chyba: neplatná báza pravidiel\n"); return 1; } // Spočítame listové uzly (tovary) int leaves_count = count_leaves(root); printf("Pozná %d druhov ovocia a zeleniny.\n", leaves_count); // Spustíme znalostný systém run_system(root); // Uvoľníme pamäť destroy_tree(root); return 0; }