Update cv7/program.c
This commit is contained in:
		
							parent
							
								
									df58b3b609
								
							
						
					
					
						commit
						11f5b61d7d
					
				
							
								
								
									
										120
									
								
								cv7/program.c
									
									
									
									
									
								
							
							
						
						
									
										120
									
								
								cv7/program.c
									
									
									
									
									
								
							| @ -0,0 +1,120 @@ | ||||
| #include <stdio.h> | ||||
| #include <stdlib.h> | ||||
| #include <string.h> | ||||
| 
 | ||||
| // Структура вузла для дерева знань
 | ||||
| typedef struct Node { | ||||
|     char *question_or_answer; | ||||
|     struct Node *yes_branch; | ||||
|     struct Node *no_branch; | ||||
| } Node; | ||||
| 
 | ||||
| // Функція для створення нового вузла
 | ||||
| Node* createNode(char *text) { | ||||
|     Node *newNode = (Node*)malloc(sizeof(Node)); | ||||
|     if (!newNode) { | ||||
|         printf("Помилка виділення пам'яті.\n"); | ||||
|         exit(1); | ||||
|     } | ||||
|     newNode->question_or_answer = strdup(text); // Копіюємо текст у вузол
 | ||||
|     newNode->yes_branch = NULL; | ||||
|     newNode->no_branch = NULL; | ||||
|     return newNode; | ||||
| } | ||||
| 
 | ||||
| // Функція для побудови дерева з бази знань
 | ||||
| Node* buildTree(FILE *file) { | ||||
|     char buffer[256]; | ||||
|     if (!fgets(buffer, sizeof(buffer), file) || buffer[0] == '\n') { | ||||
|         return NULL; // Кінець бази знань
 | ||||
|     } | ||||
| 
 | ||||
|     buffer[strcspn(buffer, "\n")] = '\0'; // Видаляємо символ нового рядка
 | ||||
| 
 | ||||
|     Node *node = NULL; | ||||
|     if (buffer[0] == '*') { // Якщо рядок починається з '*', це кінцева відповідь
 | ||||
|         node = createNode(buffer + 1); // Створюємо вузол з відповіддю, без '*'
 | ||||
|     } else { // Інакше це питання
 | ||||
|         node = createNode(buffer); // Створюємо вузол з питанням
 | ||||
|         node->yes_branch = buildTree(file); // Рекурсивно будуємо гілку "так"
 | ||||
|         node->no_branch = buildTree(file);  // Рекурсивно будуємо гілку "ні"
 | ||||
|     } | ||||
|     return node; | ||||
| } | ||||
| 
 | ||||
| // Функція для підрахунку кількості кінцевих відповідей (листків) у дереві
 | ||||
| int countAnswers(Node *node) { | ||||
|     if (node == NULL) return 0; | ||||
|     if (node->yes_branch == NULL && node->no_branch == NULL) return 1; // Листок
 | ||||
|     return countAnswers(node->yes_branch) + countAnswers(node->no_branch); | ||||
| } | ||||
| 
 | ||||
| // Функція для діалогу з користувачем
 | ||||
| void runExpertSystem(Node *node) { | ||||
|     while (node != NULL) { | ||||
|         // Якщо вузол є кінцевою відповіддю, виводимо її і завершуємо
 | ||||
|         if (node->yes_branch == NULL && node->no_branch == NULL) { | ||||
|             printf("Відповідь: %s\n", node->question_or_answer); | ||||
|             return; | ||||
|         } | ||||
| 
 | ||||
|         // Виводимо питання
 | ||||
|         printf("%s (Введіть 'y' для так або 'n' для ні): ", node->question_or_answer); | ||||
| 
 | ||||
|         // Читаємо відповідь користувача
 | ||||
|         char choice; | ||||
|         scanf(" %c", &choice); | ||||
| 
 | ||||
|         // Обробка відповіді
 | ||||
|         switch (choice) { | ||||
|             case 'y': // Якщо "так"
 | ||||
|                 node = node->yes_branch; | ||||
|                 break; | ||||
|             case 'n': // Якщо "ні"
 | ||||
|                 node = node->no_branch; | ||||
|                 break; | ||||
|             default: // Некоректний ввід
 | ||||
|                 printf("Некоректне значення. Завершення програми.\n"); | ||||
|                 return; | ||||
|         } | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| // Рекурсивна функція для звільнення пам'яті
 | ||||
| void freeTree(Node *node) { | ||||
|     if (node == NULL) return; | ||||
|     freeTree(node->yes_branch); | ||||
|     freeTree(node->no_branch); | ||||
|     free(node->question_or_answer); // Звільняємо текст питання/відповіді
 | ||||
|     free(node); // Звільняємо сам вузол
 | ||||
| } | ||||
| 
 | ||||
| int main() { | ||||
|     // Відкриваємо файл із базою знань
 | ||||
|     FILE *file = fopen("data.txt", "r"); | ||||
|     if (!file) { | ||||
|         printf("Не вдалося відкрити файл бази знань.\n"); | ||||
|         return 1; | ||||
|     } | ||||
| 
 | ||||
|     // Будуємо дерево знань з файлу
 | ||||
|     Node *root = buildTree(file); | ||||
|     fclose(file); | ||||
| 
 | ||||
|     // Перевірка, чи дерево успішно збудовано
 | ||||
|     if (root == NULL) { | ||||
|         printf("Помилка завантаження бази знань.\n"); | ||||
|         return 1; | ||||
|     } | ||||
| 
 | ||||
|     // Рахуємо кількість видів у базі знань
 | ||||
|     int totalAnswers = countAnswers(root); | ||||
|     printf("Експертна система знає %d видів.\n", totalAnswers); | ||||
| 
 | ||||
|     // Запускаємо діалог з користувачем
 | ||||
|     runExpertSystem(root); | ||||
| 
 | ||||
|     // Звільняємо пам'ять
 | ||||
|     freeTree(root); | ||||
|     return 0; | ||||
| } | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user