diff --git a/cv7/program.c b/cv7/program.c index e3f1ea0..0a39228 100644 --- a/cv7/program.c +++ b/cv7/program.c @@ -3,118 +3,96 @@ #include typedef struct Node { - char *content; - struct Node *yes; - struct Node *no; + char text[100]; + struct Node* yes; + struct Node* no; } Node; -Node* create_node(const char *content) { - Node *new_node = (Node*)malloc(sizeof(Node)); - new_node->content = strdup(content); - new_node->yes = NULL; - new_node->no = NULL; - return new_node; +// Function to create a new node +Node* createNode(char* text) { + Node* node = (Node*)malloc(sizeof(Node)); + strcpy(node->text, text); + node->yes = NULL; + node->no = NULL; + return node; } -void free_tree(Node *root) { - if (root) { - free(root->content); - free_tree(root->yes); - free_tree(root->no); - free(root); - } -} +// Recursive function to read and build the tree +Node* readTree(FILE* file, int* count) { + char line[100]; -int count_answers(Node *root) { - if (!root) return 0; - if (root->yes == NULL && root->no == NULL) return 1; - return count_answers(root->yes) + count_answers(root->no); -} - -Node* parse_rules() { - char line[256]; - Node *root = NULL, *current = NULL; - Node *stack[100]; - int stack_top = -1; - - while (fgets(line, sizeof(line), stdin)) { - line[strcspn(line, "\n")] = 0; - if (strlen(line) == 0) break; - - if (line[0] == '*') { - Node *answer = create_node(line + 1); - if (stack_top >= 0) { - if (stack[stack_top]->yes == NULL) - stack[stack_top]->yes = answer; - else - stack[stack_top]->no = answer; - } - } else { - Node *question = create_node(line); - if (stack_top >= 0) { - if (stack[stack_top]->yes == NULL) - stack[stack_top]->yes = question; - else - stack[stack_top]->no = question; - } - stack[++stack_top] = question; - } + if (!fgets(line, sizeof(line), file) || strcmp(line, "\n") == 0) { + return NULL; } - if (stack_top >= 0) { - root = stack[0]; + // Remove newline character from line + line[strcspn(line, "\n")] = 0; + + // Check if the line is an answer (starts with '*') + if (line[0] == '*') { + (*count)++; + return createNode(line + 1); // Skip the '*' character } - return root; + // If it's a question, create a node and recursively read its children + Node* node = createNode(line); + node->yes = readTree(file, count); + node->no = readTree(file, count); + return node; } -void ask_question(Node *node) { - if (!node) return; +// Function to interact with the user and navigate the tree +void queryUser(Node* node) { + if (node == NULL) return; + if (node->yes == NULL && node->no == NULL) { - printf("*%s\n", node->content); // Removed extra space after "*" - printf("Koniec\n"); + printf("Expert z bufetu to vie. Je to: %s\n", node->text); return; } - printf("%s\n", node->content); + // Print question and get user's answer + printf("%s\n", node->text); + printf("Odpovedajte 'a' pre prvu moznost alebo 'n' pre druhu moznost.\n"); - char response; - while (1) { - response = getchar(); - getchar(); // Capture newline - if (response == 'a' && node->yes) { - ask_question(node->yes); - break; - } else if (response == 'n' && node->no) { - ask_question(node->no); - break; - } else { - printf("Nerozumiem\n"); - } + char answer; + scanf(" %c", &answer); + + if (answer == 'a') { + queryUser(node->yes); + } else if (answer == 'n') { + queryUser(node->no); + } else { + printf("Nespravny vstup.\n"); } } +// Function to free the tree +void freeTree(Node* node) { + if (node == NULL) return; + freeTree(node->yes); + freeTree(node->no); + free(node); +} int main() { - printf("Expert z bufetu to vie.\n"); - printf("Pozna 2 druhov ovocia a zeleniny.\n"); - printf("Odpovedajte 'a' pre prvu moznost alebo 'n' pre druhu moznost.\n"); - - char input[50]; - int understood = 0; // To track if the response was understood - - while (1) { - printf("Je to ovocie alebo zelenina\n"); - fgets(input, sizeof(input), stdin); - - if (strcmp(input, "a\n") == 0 || strcmp(input, "n\n") == 0) { - understood = 1; // Valid response received - break; - } else { - printf("Nerozumiem\n"); - if (understood) break; // Stop if an invalid input has already been handled - } + FILE* file = fopen("baza.txt", "r"); + if (!file) { + printf("Chyba pri nacitani suboru.\n"); + return 1; } - return 0; // Ensure correct return value -} \ No newline at end of file + int count = 0; + Node* root = readTree(file, &count); + fclose(file); + + if (root == NULL) { + printf("Chyba pri nacitani baze pravidiel.\n"); + return 1; + } + + printf("Pozna %d druhov ovocia a zeleniny.\n", count); + queryUser(root); + freeTree(root); + + return 0; +}