Update cv7/program.c
This commit is contained in:
		
							parent
							
								
									e3952af035
								
							
						
					
					
						commit
						1c188d677a
					
				
							
								
								
									
										162
									
								
								cv7/program.c
									
									
									
									
									
								
							
							
						
						
									
										162
									
								
								cv7/program.c
									
									
									
									
									
								
							| @ -3,118 +3,96 @@ | ||||
| #include <string.h> | ||||
| 
 | ||||
| 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
 | ||||
| } | ||||
|     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; | ||||
| } | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user