From d4c98240d00e1ed35e83874ed8cb62ada5ee2e3f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jana=20Kapalkov=C3=A1?= Date: Thu, 16 Apr 2026 13:21:15 +0200 Subject: [PATCH] commit --- du5/program.c | 93 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 93 insertions(+) create mode 100644 du5/program.c diff --git a/du5/program.c b/du5/program.c new file mode 100644 index 0000000..d0d1ed0 --- /dev/null +++ b/du5/program.c @@ -0,0 +1,93 @@ +#include +#include +#include + +#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; +} \ No newline at end of file