This commit is contained in:
Deinerovych 2024-11-08 11:05:41 +01:00
parent 48311a443e
commit 3e37cc7666

View File

@ -10,6 +10,7 @@ typedef struct Node {
struct Node *no; struct Node *no;
} Node; } Node;
// Создает новый узел с заданным текстом
Node* create_node(const char* text) { Node* create_node(const char* text) {
Node *node = (Node*)malloc(sizeof(Node)); Node *node = (Node*)malloc(sizeof(Node));
if (!node) { if (!node) {
@ -22,28 +23,31 @@ Node* create_node(const char* text) {
return node; return node;
} }
// Создает заранее заданное дерево знаний
Node* build_knowledge_tree() { Node* build_knowledge_tree() {
// Создаем корневой узел // Создаем корневой узел
Node *root = create_node("Rastie to na strome?"); Node *root = create_node("Rastie to na strome?");
// Создаем дочерние узлы для ответа "да" и "нет" // Добавляем варианты ответов
root->yes = create_node("Jablko"); root->yes = create_node("Jablko");
root->no = create_node("Rastie to pod zemou?"); root->no = create_node("Rastie to pod zemou?");
// Создаем узлы для поддерева "Rastie to pod zemou?" // Узлы для "Rastie to pod zemou?"
root->no->yes = create_node("Mrkva"); root->no->yes = create_node("Mrkva");
root->no->no = create_node("Šalát"); root->no->no = create_node("Šalát");
return root; return root;
} }
// Подсчитывает количество листовых узлов (продуктов)
int count_products(Node *node) { int count_products(Node *node) {
if (!node) return 0; if (!node) return 0;
if (!node->yes && !node->no) return 1; // Листовой узел - это продукт if (!node->yes && !node->no) return 1;
return count_products(node->yes) + count_products(node->no); return count_products(node->yes) + count_products(node->no);
} }
void run_expert_system(Node *node, FILE *input) { // Запускает экспертную систему
void run_expert_system(Node *node) {
while (node) { while (node) {
if (!node->yes && !node->no) { if (!node->yes && !node->no) {
printf("*%s\n", node->text); printf("*%s\n", node->text);
@ -55,7 +59,7 @@ void run_expert_system(Node *node, FILE *input) {
printf("%s\n", node->text); printf("%s\n", node->text);
char answer; char answer;
if (fscanf(input, " %c", &answer) != 1) { if (scanf(" %c", &answer) != 1) {
printf("Koniec\n"); printf("Koniec\n");
return; return;
} }
@ -71,6 +75,7 @@ void run_expert_system(Node *node, FILE *input) {
} }
} }
// Освобождает выделенную память для дерева
void free_tree(Node *node) { void free_tree(Node *node) {
if (node) { if (node) {
free_tree(node->yes); free_tree(node->yes);
@ -80,6 +85,7 @@ void free_tree(Node *node) {
} }
int main() { int main() {
// Создаем дерево знаний вручную
Node *root = build_knowledge_tree(); Node *root = build_knowledge_tree();
if (!root) { if (!root) {
@ -91,7 +97,7 @@ int main() {
int product_count = count_products(root); int product_count = count_products(root);
printf("Pozna %d druhov ovocia a zeleniny.\n", product_count); printf("Pozna %d druhov ovocia a zeleniny.\n", product_count);
run_expert_system(root, stdin); // Используем стандартный ввод для ответов run_expert_system(root);
free_tree(root); free_tree(root);
return 0; return 0;