usaa24/cv7/program.c

96 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 SIZE 256
// Структура узла бинарного дерева
struct strom {
char otazka[SIZE];
struct strom* ano;
struct strom* nie;
};
// Функция для чтения базы правил из стандартного ввода
struct strom* nacitaj_strom() {
char buffer[SIZE];
if (!fgets(buffer, SIZE, stdin) || buffer[0] == '\n') {
return NULL; // Конец базы данных или пустая строка
}
struct strom* uzol = malloc(sizeof(struct strom));
if (!uzol) {
printf("Chyba: nedostatok pamäte.\n");
exit(1);
}
strcpy(uzol->otazka, buffer);
if (buffer[0] == '*') {
uzol->ano = uzol->nie = NULL; // Это лист (ответ)
} else {
uzol->ano = nacitaj_strom(); // Чтение ветви для "да"
uzol->nie = nacitaj_strom(); // Чтение ветви для "нет"
}
return uzol;
}
// Функция для освобождения памяти дерева
void znic_strom(struct strom* uzol) {
if (uzol) {
znic_strom(uzol->ano);
znic_strom(uzol->nie);
free(uzol);
}
}
// Функция для взаимодействия с пользователем (прохождение дерева)
void spusti_expert_system(struct strom* uzol) {
if (!uzol) return;
printf("%s", uzol->otazka);
if (!uzol->ano && !uzol->nie) {
printf("Koniec\n"); // Окончательный ответ с сообщением об окончании
return;
}
char odpoved;
if (scanf(" %c", &odpoved) != 1 || (odpoved != 'a' && odpoved != 'n')) {
printf("Nerozumiem\n");
return;
}
if (odpoved == 'a') {
spusti_expert_system(uzol->ano);
} else {
spusti_expert_system(uzol->nie);
}
}
// Функция для подсчета листьев дерева (окончательных ответов)
int pocet_listov(struct strom* uzol) {
if (!uzol) return 0;
if (!uzol->ano && !uzol->nie) return 1;
return pocet_listov(uzol->ano) + pocet_listov(uzol->nie);
}
// Главная функция
int main() {
struct strom* databaza_znalosti = nacitaj_strom();
if (!databaza_znalosti) {
printf("Chyba: databáza je prázdna alebo nesprávne formátovaná.\n");
return 1;
}
int pocet_tovarov = pocet_listov(databaza_znalosti);
printf("Expert z bufetu to vie.\n");
printf("Pozna %d druhov ovocia a zeleniny.\n", pocet_tovarov);
printf("Odpovedajte 'a' pre prvu moznost alebo 'n' pre druhu moznost.\n");
spusti_expert_system(databaza_znalosti);
znic_strom(databaza_znalosti);
return 0;
}