#include #include #include #include #define SIZE 256 struct tree { char value[SIZE]; int id; struct tree* left; struct tree* right; }; int read_line(char* buf) { if (!fgets(buf, SIZE, stdin)) return 0; int len = strlen(buf); while (len > 0 && (buf[len-1] == '\n' || buf[len-1] == '\r')) { buf[--len] = '\0'; } return 1; } struct tree* read_tree(int* counter) { char buffer[SIZE]; if (!read_line(buffer)) return NULL; if (buffer[0] == '\0') return NULL; struct tree* node = calloc(1, sizeof(struct tree)); assert(node); strcpy(node->value, buffer); node->id = (*counter)++; //відповідь (*.), то це лист → не читаємо дітей if (buffer[0] == '*') { node->left = NULL; node->right = NULL; return node; } node->left = read_tree(counter); node->right = read_tree(counter); return node; } void destroy_tree(struct tree* node) { if (!node) return; //якщо вузла немає → нічого робити destroy_tree(node->left); destroy_tree(node->right); free(node); } int count_leaves(struct tree* node) { if (!node) return 0; //порожнє дерево if (!node->left && !node->right) //якщо це лист return 1; return count_leaves(node->left)+count_leaves(node->right); } void run_system(struct tree* node) { printf("Odpovedajte 'a' pre prvu moznost alebo 'n' pre druhu moznost.\n"); while (node) { printf("%s\n", node->value); //виводимо питання чи відповідь if (!node->left && !node->right) { printf("Koniec\n"); return; } char c; if (scanf(" %c", &c) != 1) { printf("Koniec vstupu\n"); return; } if (c == 'a') //так → йдемо в ліву гілку node = node->left; else if (c == 'n') //ні → вправо node = node->right; else { printf("Nerozumiem\n"); return; } } } int main() { int counter=0; //нумерація вузлів struct tree* root =read_tree(&counter); char check[SIZE]; if (!fgets(check, SIZE, stdin) || !(check[0]=='\n' || check[0]=='\r')) { printf("Chybna databaza\n"); destroy_tree(root); return 0; } int leaves = count_leaves(root); printf("Expert z bufetu to vie.\n"); printf("Pozna %d druhov ovocia a zeleniny.\n", leaves); run_system(root); destroy_tree(root); return 0; }