pvjc26/du5/program.c
2026-04-16 19:36:17 +00:00

127 lines
2.4 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define SIZE 256
typedef struct Tree {
char text[SIZE];
int isAnswer;
struct Tree *yes;
struct Tree *no;
} Tree;
// читання дерева (preorder)
Tree* readTree() {
char line[SIZE];
if (fgets(line, SIZE, stdin) == NULL) return NULL;
line[strcspn(line, "\r\n")] = 0;
if (line[0] == '\0') return NULL;
Tree *node = (Tree*)malloc(sizeof(Tree));
node->yes = NULL;
node->no = NULL;
if (line[0] == '*') {
node->isAnswer = 1;
char *p = line + 1;
while (*p == ' ') p++;
strcpy(node->text, p);
} else {
node->isAnswer = 0;
strcpy(node->text, line);
node->yes = readTree();
node->no = readTree();
}
return node;
}
// перевірка порожнього рядка після дерева
int EmptyLine() {
char line[SIZE];
if (fgets(line, SIZE, stdin) == NULL) return 0;
return line[0] == '\n';
}
// підрахунок листків
int Leaves(Tree *node) {
if (!node) return 0;
if (node->isAnswer) return 1;
return Leaves(node->yes) + Leaves(node->no);
}
// очищення пам’яті
void freeTree(Tree *node) {
if (!node) return;
freeTree(node->yes);
freeTree(node->no);
free(node);
}
// гра
void start(Tree *node) {
char input[SIZE];
while (node && !node->isAnswer) {
printf("%s\n", node->text);
if (fgets(input, SIZE, stdin) == NULL) {
printf("Koniec vstupu\n");
return;
}
int i = 0;
while (input[i] == ' ' || input[i] == '\t') i++;
if (input[i] == 'a') {
node = node->yes;
} else if (input[i] == 'n') {
node = node->no;
} else {
printf("Nerozumiem\n");
return;
}
}
if (node && node->isAnswer) {
printf("*%s\n", node->text);
printf("Koniec\n");
}
}
int main() {
printf("Expert z bufetu to vie.\n");
Tree *root = readTree();
if (!root) {
printf("Chyba nacitania\n");
return 0;
}
if (!EmptyLine()) {
printf("Chyba nacitania\n");
freeTree(root);
return 0;
}
printf("Pozna %d druhov ovocia a zeleniny.\n", Leaves(root));
printf("Odpovedajte 'a' pre prvu moznost alebo 'n' pre druhu moznost.\n");
start(root);
freeTree(root);
return 0;
}