usaa24/cv7/program.c
2024-11-08 11:05:41 +01:00

106 lines
2.7 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_LINE_LENGTH 100
typedef struct Node {
char text[MAX_LINE_LENGTH];
struct Node *yes;
struct Node *no;
} Node;
// Создает новый узел с заданным текстом
Node* create_node(const char* text) {
Node *node = (Node*)malloc(sizeof(Node));
if (!node) {
fprintf(stderr, "Memory allocation error.\n");
exit(1);
}
strncpy(node->text, text, MAX_LINE_LENGTH);
node->yes = NULL;
node->no = NULL;
return node;
}
// Создает заранее заданное дерево знаний
Node* build_knowledge_tree() {
// Создаем корневой узел
Node *root = create_node("Rastie to na strome?");
// Добавляем варианты ответов
root->yes = create_node("Jablko");
root->no = create_node("Rastie to pod zemou?");
// Узлы для "Rastie to pod zemou?"
root->no->yes = create_node("Mrkva");
root->no->no = create_node("Šalát");
return root;
}
// Подсчитывает количество листовых узлов (продуктов)
int count_products(Node *node) {
if (!node) return 0;
if (!node->yes && !node->no) return 1;
return count_products(node->yes) + count_products(node->no);
}
// Запускает экспертную систему
void run_expert_system(Node *node) {
while (node) {
if (!node->yes && !node->no) {
printf("*%s\n", node->text);
printf("Koniec\n");
return;
}
printf("Odpovedajte 'a' pre prvu moznost alebo 'n' pre druhu moznost.\n");
printf("%s\n", node->text);
char answer;
if (scanf(" %c", &answer) != 1) {
printf("Koniec\n");
return;
}
if (answer == 'a') {
node = node->yes;
} else if (answer == 'n') {
node = node->no;
} else {
printf("Nespravny vstup.\nKoniec\n");
return;
}
}
}
// Освобождает выделенную память для дерева
void free_tree(Node *node) {
if (node) {
free_tree(node->yes);
free_tree(node->no);
free(node);
}
}
int main() {
// Создаем дерево знаний вручную
Node *root = build_knowledge_tree();
if (!root) {
printf("Báza znalostí sa nedá načítať.\n");
return 1;
}
printf("Expert z bufetu to vie.\n");
int product_count = count_products(root);
printf("Pozna %d druhov ovocia a zeleniny.\n", product_count);
run_expert_system(root);
free_tree(root);
return 0;
}