126 lines
2.4 KiB
C
126 lines
2.4 KiB
C
#include<stdio.h>
|
|
#include<stdlib.h>
|
|
#include<string.h>
|
|
#define SIZE 100
|
|
|
|
struct tree{
|
|
char question[SIZE];
|
|
struct tree* left;
|
|
struct tree* right;
|
|
};
|
|
|
|
struct tree* read_tree();
|
|
void system_execute(struct tree* root);
|
|
int get_input(char *string);
|
|
int type_count(struct tree* root);
|
|
void destroy(struct tree* root);
|
|
|
|
|
|
int main(){
|
|
struct tree* root = NULL;
|
|
root = read_tree();
|
|
|
|
char resp[SIZE];
|
|
memset(resp,0,SIZE);
|
|
get_input(resp);
|
|
if(strlen(resp)>1){
|
|
puts("Expert z bufetu to vie.");
|
|
puts("Chybna databaza");
|
|
exit(0);
|
|
}
|
|
|
|
|
|
puts("Expert z bufetu to vie.");
|
|
printf("Pozna %d druhov ovocia a zeleniny.\n",type_count(root));
|
|
puts("Odpovedajte 'a' pre prvu moznost alebo 'n' pre druhu moznost.");
|
|
|
|
system_execute(root);
|
|
|
|
getchar();
|
|
puts("Koniec");
|
|
|
|
destroy(root);
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
struct tree* read_tree(){
|
|
char buffer[SIZE];
|
|
memset(buffer,0,SIZE);
|
|
|
|
int flag = get_input(buffer);
|
|
if(flag==-1){
|
|
puts("Expert z bufetu to vie.");
|
|
puts("Chybna databaza");
|
|
exit(0);
|
|
}
|
|
|
|
struct tree* node = calloc(1,sizeof(struct tree));
|
|
memcpy(node->question,buffer,SIZE);
|
|
// Ak je nacitany riadok listovy uzol ,tak netreba robit nic
|
|
// inak rekurzivne nacitanie laveho syna
|
|
// a rekurzivne nacitanie praveho syna
|
|
if(node->question[0]!='*'){
|
|
node->left = read_tree();
|
|
node->right = read_tree();
|
|
}
|
|
return node;
|
|
}
|
|
|
|
|
|
int get_input(char *string){
|
|
char* r = fgets(string,SIZE,stdin);
|
|
if(r==NULL){
|
|
return -1;//EOF
|
|
}
|
|
string[strlen(string)-1]='\0';
|
|
return 1;
|
|
}
|
|
|
|
|
|
void system_execute(struct tree* root){
|
|
if(root==NULL){
|
|
return;
|
|
}
|
|
printf("%s\n",root->question);
|
|
if(root->question[0]=='*'){
|
|
return;
|
|
}
|
|
char *resp = calloc(SIZE,sizeof(char));
|
|
|
|
int flag = get_input(resp);
|
|
if(flag==-1){
|
|
puts("Koniec vstupu");
|
|
exit(0);
|
|
}
|
|
if(resp[0]=='a'){
|
|
system_execute(root->left);
|
|
}else if(resp[0]=='n'){
|
|
system_execute(root->right);
|
|
}else{
|
|
puts("Nerozumiem");
|
|
exit(0);
|
|
}
|
|
}
|
|
|
|
|
|
int type_count(struct tree* root){//https://www.youtube.com/watch?v=Uze4GgUj3Fs&feature=emb_logo
|
|
if(root==NULL){
|
|
return 0;
|
|
}
|
|
if(root->question[0]=='*'){
|
|
return 1;
|
|
}
|
|
int count= type_count(root->left)+type_count(root->right);
|
|
return count;
|
|
}
|
|
|
|
void destroy(struct tree* root){
|
|
if (root == NULL){
|
|
return;
|
|
}
|
|
destroy(root->left);
|
|
destroy(root->right);
|
|
free(root);
|
|
} |