usaa24/cv7/program.c

78 lines
2.0 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>
typedef struct Node {
char *text;
struct Node *yes;
struct Node *no;
} Node;
Node* vytvor_uzol(char *text) {
Node *uzol = (Node*)malloc(sizeof(Node));
uzol->text = strdup(text);
uzol->yes = NULL;
uzol->no = NULL;
return uzol;
}
void uvolni(Node *uzol) {
if (uzol) {
free(uzol->text);
uvolni(uzol->yes);
uvolni(uzol->no);
free(uzol);
}
}
int spocitaj_druhy(Node *uzol) {
if (!uzol) return 0;
if (!uzol->yes && !uzol->no) return 1; // Это лист, т.е. ответ
return spocitaj_druhy(uzol->yes) + spocitaj_druhy(uzol->no);
}
void znalostny_system(Node *uzol) {
char odpoved;
while (uzol) {
if (!uzol->yes && !uzol->no) {
printf("Expert z bufetu to vie: %s\n", uzol->text);
break;
}
printf("%s\nOdpovedajte 'a' pre prvu moznost alebo 'n' pre druhu moznost: ", uzol->text);
odpoved = getchar();
getchar(); // Считываем '\n'
if (odpoved == 'a') {
uzol = uzol->yes;
} else if (odpoved == 'n') {
uzol = uzol->no;
} else {
printf("Nespravny vstup, program konci.\n");
break;
}
}
}
int main() {
// Создаем дерево вопросов и ответов вручную
Node *root = vytvor_uzol("Je to ovocie alebo zelenina?");
root->yes = vytvor_uzol("*Jablko");
root->no = vytvor_uzol("*Mrkva");
// Подсчитываем количество видов
int druhy = spocitaj_druhy(root);
printf("Expert z bufetu to vie.\nPozna %d druhov ovocia a zeleniny.\n", druhy);
// Выводим инструкцию для пользователя
printf("Odpovedajte 'a' pre prvu moznost alebo 'n' pre druhu moznost.\n");
// Запускаем систему вопросов и ответов
znalostny_system(root);
// Освобождаем память
uvolni(root);
return 0;
}