pvjc26/du5/program.c

89 lines
2.6 KiB
C

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
struct uzol { //zakladna struktura, kam nahram otazky a referencie
char otazka[100];
struct uzol *lavy;
struct uzol *pravy;
};
struct uzol* nacitaj_data() { // todo, rekurzivne pomazat z pamate
char riadok[100]; // o velkosti otazky alebo ovocia
if (!fgets(riadok, 100, stdin)) return NULL; // ak nahram NULL
if (riadok[0] == '\n') return NULL; // ak vyenterujem input
// mozno bude treba osetrit ak by bol namiesto otazky rovno produkt, prv ocakavam otazku
struct uzol* uzol = malloc (sizeof(struct uzol)); // alokujem pre kazdy novy uzol binarneho stromu
strcpy (uzol -> otazka, riadok); // nakopcim stdin do textoveho pola struktury
//kontrola hviezdicky, ak najdem, nepokracujem v strome tym smerom
if (riadok[0] == '*') {
uzol -> lavy = NULL;
uzol -> pravy = NULL;
} else { // rekurzivne nacitam najprv lavy koren, potom pravy ak to bola otazka
uzol -> lavy = nacitaj_data();
uzol -> pravy = nacitaj_data();
}
return uzol; // vyplneny strom
}
int zrataj_produkty(struct uzol* uzol) {
if (uzol == NULL) return 0; // ak je NULL, vratim nic
if (uzol -> pravy == NULL && uzol -> lavy == NULL) return 1; //ak nemam pokracovanie ale existujem, vratim 1
return zrataj_produkty(uzol -> pravy) + zrataj_produkty(uzol -> lavy); // pozbieram existencne jednotky
}
void spustac(struct uzol* uzol) {
if (uzol == NULL) return; // ak nemam strom koncim
printf ("%s",uzol -> otazka); // vypisem content textu struktury
if (uzol -> pravy == NULL && uzol -> lavy == NULL) { // ak nema pokracovanie, napisem ze nema pokracovanie
printf ("Koniec\n");
return;
}
char odpoved; // iacitavam a/n
if (scanf(" %c",&odpoved) != 1) { // ak mi nenacita hodnotu
printf ("Koniec vstupu\n");
return;
}
if (odpoved == 'a') {
spustac (uzol -> lavy);
} else if (odpoved == 'n') {
spustac (uzol -> pravy);
} else {
printf ("Nerozumiem\n");
}
}
void destroy_tree (struct uzol* strom){
if (strom == NULL) return;
destroy_tree(strom -> lavy);
destroy_tree(strom -> pravy);
free(strom);
}
int main() {
struct uzol* strom = nacitaj_data();
if (!strom) return 0;
int listy = zrataj_produkty(strom);
printf("Expert z bufetu to vie.\n");
printf("Pozna %d druhov ovocia a zeleniny.\n", listy);
printf("Odpovedajte 'a' pre prvu moznost alebo 'n' pre druhu moznost.\n");
spustac(strom);
destroy_tree(strom);
return 0;
}