usaa24/cv7/program.c
2024-11-06 09:44:29 +01:00

104 lines
2.9 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, "Ошибка выделения памяти.\n");
exit(1);
}
strncpy(node->text, text, MAX_LINE_LENGTH);
node->yes = NULL;
node->no = NULL;
return node;
}
// Рекурсивная функция для построения дерева
Node* parse_knowledge_base(FILE *file) {
char line[MAX_LINE_LENGTH];
if (!fgets(line, sizeof(line), file)) {
return NULL;
}
// Удаление символа новой строки
line[strcspn(line, "\n")] = 0;
// Если строка начинается с '*', это ответный узел
if (line[0] == '*') {
return create_node(line + 1); // Пропустить '*'
} else {
// Иначе это вопросный узел
Node *node = create_node(line);
node->yes = parse_knowledge_base(file);
node->no = parse_knowledge_base(file);
return node;
}
}
// Функция для подсчета товаров
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("Expert z bufetu to vie: %s.\n", node->text);
return;
}
printf("%s\n", node->text);
printf("Odpovedajte 'a' pre prvu moznost alebo 'n' pre druhu moznost: ");
char answer;
scanf(" %c", &answer);
if (answer == 'a') {
node = node->yes;
} else if (answer == 'n') {
node = node->no;
} else {
printf("Neplatná odpoveď. Koniec.\n");
return;
}
}
}
// Основная функция
int main() {
FILE *file = fopen("knowledge_base.txt", "r");
if (!file) {
fprintf(stderr, "Не удалось открыть файл базы знаний.\n");
return 1;
}
Node *root = parse_knowledge_base(file);
fclose(file);
if (!root) {
printf("База знаний не может быть загружена.\n");
return 1;
}
int product_count = count_products(root);
printf("Pozna %d druhov ovocia a zeleniny.\n", product_count);
run_expert_system(root);
// Освобождение памяти
free(root);
return 0;
}