#include #include #include typedef struct Node { char *text; 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; } void uvolni(Node *uzol) { if (uzol) { free(uzol->text); uvolni(uzol->yes); uvolni(uzol->no); free(uzol); } } void naloz_bazu(Node **root, FILE *file) { char line[256]; if (fgets(line, sizeof(line), file) == NULL || line[0] == '\n') { *root = NULL; return; } if (line[0] == '*') { *root = vytvor_uzol(line + 1); // odstránenie '*' } else { *root = vytvor_uzol(line); naloz_bazu(&((*root)->yes), file); naloz_bazu(&((*root)->no), file); } } int spocitaj_druhy(Node *uzol) { if (!uzol) return 0; if (!uzol->yes && !uzol->no) return 1; // odpoveď return spocitaj_druhy(uzol->yes) + spocitaj_druhy(uzol->no); } void znalostny_system(Node *uzol) { char odpoved; while (uzol) { if (!uzol->yes && !uzol->no) { printf("Expert z bufetu to vie: %s\n", uzol->text); break; } printf("%s (a/n): ", uzol->text); scanf(" %c", &odpoved); if (odpoved == 'a') { uzol = uzol->yes; } else if (odpoved == 'n') { uzol = uzol->no; } else { printf("Nespravny vstup, program konci.\n"); break; } } } int main(int argc, char *argv[]) { if (argc < 2) { printf("Chyba: zadajte cestu k súboru ako argument.\n"); return 1; } FILE *file = fopen(argv[1], "r"); if (!file) { printf("Chyba pri otváraní súboru.\n"); return 1; } Node *root = NULL; naloz_bazu(&root, file); fclose(file); if (root == NULL) { printf("Chyba: nepodarilo sa načítať bázu pravidiel.\n"); return 1; } int druhy = spocitaj_druhy(root); printf("Expert z bufetu to vie.\nPozna %d druhov ovocia a zeleniny.\n", druhy); printf("Odpovedajte 'a' pre prvu moznost alebo 'n' pre druhu moznost.\n"); znalostny_system(root); uvolni(root); return 0; }