diff --git a/du6/program.c b/du6/program.c new file mode 100644 index 0000000..094bb25 --- /dev/null +++ b/du6/program.c @@ -0,0 +1,100 @@ +#include // knižnica pre vstup a výstup (printf, fgets) +#include // knižnica pre malloc, free +#include // knižnica pre prácu s reťazcami (strdup, strcspn) + +#define MAX 256 // maximálna dĺžka jednej riadky + +// definícia uzla stromu +typedef struct Node { + char *t; // text otázky alebo odpovede + int leaf; // 1 = list (odpoveď), 0 = otázka + struct Node *a; // ukazovateľ na "áno" podstrom + struct Node *n; // ukazovateľ na "nie" podstrom +} Node; + +char s[MAX]; // buffer pre načítanie jednej riadky + +// funkcia na načítanie stromu zo vstupu +Node* readTree() { + // načítame riadok, ak EOF alebo prázdny riadok, vrátime NULL + if (!fgets(s, MAX, stdin) || s[0]=='\n') return NULL; + + // odstránime znak nového riadku \n + s[strcspn(s, "\n")] = 0; + + // vytvoríme nový uzol + Node *x = calloc(1, sizeof(Node)); + + // nastavíme, či je list: ak riadok začína *, je to list + x->leaf = s[0]=='*'; + + // uložíme text: ak list, preskočíme *, inak uložíme celý riadok + x->t = strdup(s + (s[0]=='*' ? 1 : 0)); + + // ak nie je list, načítame podstromy áno a nie + if (!x->leaf) x->a = readTree(), x->n = readTree(); + + return x; // vrátime uzol +} + +// funkcia na spočítanie listov v strome +int count(Node *x) { + if (!x) return 0; // prázdny uzol = 0 + return x->leaf ? 1 : count(x->a) + count(x->n); // ak list, +1, inak spočítame podstromy +} + +// funkcia pre spustenie chatbota +void run(Node *x) { + if (!x) return; // prázdny uzol - nič nerobíme + + if (x->leaf) { // ak sme na liste (odpoveď) + printf("* %s\nKoniec\n", x->t); // vypíšeme odpoveď a koniec + return; + } + + printf("%s\n", x->t); // vypíšeme otázku + + if (!fgets(s, MAX, stdin)) { // načítame odpoveď od používateľa + printf("Odpovedajte 'a' alebo 'n'\n"); // ak nič, upozorníme + return; + } + + char c = s[0]; // berieme prvý znak odpovede + + // jednoduché if-else pre spracovanie odpovede + if (c == 'a') { + run(x->a); // ak áno, pokračujeme v ľavom podstrome + } else if (c == 'n') { + run(x->n); // ak nie, pokračujeme v pravom podstrome + } else { + printf("Odpovedajte 'a' alebo 'n'\n"); // iná odpoveď nie je platná + } +} + +// funkcia na uvoľnenie pamäte stromu +void freeTree(Node *x) { + if (!x) return; // prázdny uzol - nič nerobíme + freeTree(x->a); // uvoľníme ľavý podstrom + freeTree(x->n); // uvoľníme pravý podstrom + free(x->t); // uvoľníme text + free(x); // uvoľníme uzol +} + +// hlavná funkcia +int main() { + Node *root = readTree(); // načítame strom zo vstupu + + fgets(s, MAX, stdin); // prečítame prázdny riadok medzi databázou a vstupom používateľa + + int k = count(root); // spočítame počet listov (druhov tovaru) + + printf("MUDrC to vie.\n"); + printf("Pozna %d druhov ovocia a zeleniny.\n", k); + printf("Odpovedajte 'a' alebo 'n'\n"); + + run(root); // spustíme chatbota + + freeTree(root); // uvoľníme celú pamäť stromu + + return 0; // koniec programu +}