Обновить cv7/program.c
This commit is contained in:
		
							parent
							
								
									66a9235437
								
							
						
					
					
						commit
						4129be96c3
					
				
							
								
								
									
										112
									
								
								cv7/program.c
									
									
									
									
									
								
							
							
						
						
									
										112
									
								
								cv7/program.c
									
									
									
									
									
								
							| @ -2,76 +2,90 @@ | ||||
| #include <stdlib.h> | ||||
| #include <string.h> | ||||
| 
 | ||||
| #define MAX_LENGTH 100 | ||||
| 
 | ||||
| typedef struct Node { | ||||
|     char *text; | ||||
|     char text[MAX_LENGTH]; | ||||
|     struct Node *yes; | ||||
|     struct Node *no; | ||||
| } Node; | ||||
| 
 | ||||
| Node* vytvor_uzol(char *text) { | ||||
|     Node *uzol = (Node*)malloc(sizeof(Node)); | ||||
|     uzol->text = strdup(text); | ||||
|     uzol->yes = NULL; | ||||
|     uzol->no = NULL; | ||||
|     return uzol; | ||||
| Node* create_node(char *text) { | ||||
|     Node *new_node = (Node*)malloc(sizeof(Node)); | ||||
|     strcpy(new_node->text, text); | ||||
|     new_node->yes = NULL; | ||||
|     new_node->no = NULL; | ||||
|     return new_node; | ||||
| } | ||||
| 
 | ||||
| void uvolni(Node *uzol) { | ||||
|     if (uzol) { | ||||
|         free(uzol->text); | ||||
|         uvolni(uzol->yes); | ||||
|         uvolni(uzol->no); | ||||
|         free(uzol); | ||||
| void free_tree(Node *node) { | ||||
|     if (node == NULL) return; | ||||
|     free_tree(node->yes); | ||||
|     free_tree(node->no); | ||||
|     free(node); | ||||
| } | ||||
| 
 | ||||
| Node* load_knowledge_base() { | ||||
|     char line[MAX_LENGTH]; | ||||
|     if (!fgets(line, MAX_LENGTH, stdin)) return NULL; | ||||
| 
 | ||||
|     if (line[0] == '\n') return NULL; | ||||
| 
 | ||||
|     // Создание узла
 | ||||
|     Node *node = create_node(line); | ||||
| 
 | ||||
|     if (line[0] != '*') { | ||||
|         node->yes = load_knowledge_base(); | ||||
|         node->no = load_knowledge_base(); | ||||
|     } | ||||
|     return node; | ||||
| } | ||||
| 
 | ||||
| int spocitaj_druhy(Node *uzol) { | ||||
|     if (!uzol) return 0; | ||||
|     if (!uzol->yes && !uzol->no) return 1; // Это лист, т.е. ответ
 | ||||
|     return spocitaj_druhy(uzol->yes) + spocitaj_druhy(uzol->no); | ||||
| int count_items(Node *node) { | ||||
|     if (node == NULL) return 0; | ||||
|     if (node->text[0] == '*') return 1; | ||||
|     return count_items(node->yes) + count_items(node->no); | ||||
| } | ||||
| 
 | ||||
| void znalostny_system(Node *uzol) { | ||||
|     char odpoved; | ||||
| void ask_question(Node *node) { | ||||
|     if (node == NULL) return; | ||||
|      | ||||
|     printf("%s", node->text); | ||||
| 
 | ||||
|     while (uzol) { | ||||
|         if (!uzol->yes && !uzol->no) { | ||||
|             printf("Expert z bufetu to vie: %s\n", uzol->text); | ||||
|             break; | ||||
|         } | ||||
|     if (node->text[0] == '*') { | ||||
|         printf("Expert z bufetu to vie.\n"); | ||||
|         return; | ||||
|     } | ||||
| 
 | ||||
|         printf("%s\nOdpovedajte 'a' pre prvu moznost alebo 'n' pre druhu moznost: ", uzol->text); | ||||
|         odpoved = getchar(); | ||||
|         getchar(); // Считываем '\n'
 | ||||
|     char answer; | ||||
|     printf("Odpovedajte 'a' pre prvu moznost alebo 'n' pre druhu moznost.\n"); | ||||
|     if (scanf(" %c", &answer) != 1) { | ||||
|         printf("Neplatny vstup.\n"); | ||||
|         return; | ||||
|     } | ||||
| 
 | ||||
|         if (odpoved == 'a') { | ||||
|             uzol = uzol->yes; | ||||
|         } else if (odpoved == 'n') { | ||||
|             uzol = uzol->no; | ||||
|         } else { | ||||
|             printf("Nespravny vstup, program konci.\n"); | ||||
|             break; | ||||
|         } | ||||
|     if (answer == 'a') { | ||||
|         ask_question(node->yes); | ||||
|     } else if (answer == 'n') { | ||||
|         ask_question(node->no); | ||||
|     } else { | ||||
|         printf("Neplatny vstup.\n"); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| int main() { | ||||
|     // Создаем дерево вопросов и ответов вручную
 | ||||
|     Node *root = vytvor_uzol("Je to ovocie alebo zelenina?"); | ||||
|     root->yes = vytvor_uzol("*Jablko"); | ||||
|     root->no = vytvor_uzol("*Mrkva"); | ||||
| 
 | ||||
|     // Подсчитываем количество видов
 | ||||
|     int druhy = spocitaj_druhy(root); | ||||
|     printf("Expert z bufetu to vie.\nPozna %d druhov ovocia a zeleniny.\n", druhy); | ||||
|     Node *root = load_knowledge_base(); | ||||
|      | ||||
|     // Выводим инструкцию для пользователя
 | ||||
|     printf("Odpovedajte 'a' pre prvu moznost alebo 'n' pre druhu moznost.\n"); | ||||
|     if (root == NULL) { | ||||
|         printf("Chyba pri nacitani bazy pravidiel.\n"); | ||||
|         return 1; | ||||
|     } | ||||
|      | ||||
|     // Запускаем систему вопросов и ответов
 | ||||
|     znalostny_system(root); | ||||
|     int item_count = count_items(root); | ||||
|     printf("Pozna %d druhov ovocia a zeleniny.\n", item_count); | ||||
| 
 | ||||
|     // Освобождаем память
 | ||||
|     uvolni(root); | ||||
|     ask_question(root); | ||||
|      | ||||
|     free_tree(root); | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user