This commit is contained in:
Jana Kapalková 2026-04-16 13:21:15 +02:00
parent 48fe51b4cd
commit d4c98240d0

93
du5/program.c Normal file
View File

@ -0,0 +1,93 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define SIZE 1024
struct Node {
char value[SIZE];
struct Node* left;
struct Node* right;
};
void destroy_tree(struct Node* node) {
if (node == NULL) return;
destroy_tree(node->left);
destroy_tree(node->right);
free(node);
}
struct Node* read_tree(void) {
char buffer[SIZE] = {0};
char* r = fgets(buffer, SIZE, stdin);
if (r == NULL || buffer[0] == '\n' || buffer[0] == '\r') {
return NULL;
}
struct Node* node = calloc(1, sizeof(struct Node));
if (node == NULL) return NULL;
memcpy(node->value, buffer, SIZE);
if (buffer[0] != '*') {
node->left = read_tree();
if (node->left == NULL) {
destroy_tree(node);
return NULL;
}
node->right = read_tree();
if (node->right == NULL) {
destroy_tree(node);
return NULL;
}
}
return node;
}
int count_leaves(const struct Node* node) {
if (node == NULL) return 0;
if (node->left == NULL && node->right == NULL) return 1;
return count_leaves(node->left) + count_leaves(node->right);
}
void run_system(struct Node* node) {
if (node == NULL) return;
printf("%s", node->value);
if (node->left == NULL && node->right == NULL) {
printf("End\n");
return;
}
char answer[SIZE];
if (fgets(answer, SIZE, stdin) == NULL) return;
answer[strcspn(answer, "\r\n")] = '\0';
if (strcmp(answer, "y") == 0) {
run_system(node->left);
} else if (strcmp(answer, "n") == 0) {
run_system(node->right);
} else {
printf("I don't understand\n");
}
}
int main(void) {
struct Node* root = read_tree();
if (root == NULL) {
printf("Error: failed to load the rule base.\n");
return 1;
}
char sep[SIZE];
if (fgets(sep, SIZE, stdin) == NULL || (sep[0] != '\n' && sep[0] != '\r')) {
printf("Error: missing blank separator line.\n");
destroy_tree(root);
return 1;
}
int leaves = count_leaves(root);
printf("The Expert System is ready.\n");
printf("It knows %d types of fruits and vegetables.\n", leaves);
printf("Answer 'y' (yes) or 'n' (no)\n");
run_system(root);
destroy_tree(root);
return 0;
}