MC 202 - EF - Atividade de Laboratório no. 6

 

Descrição do Problema: Qual é o bicho? (ou a árvore que 'aprende').

O objetivo desta atividade é usar uma árvore binária para armazenar características de animais e através de perguntas e respostas, navegar na árvore. A árvore binária terá a seguinte organização: 

Durante uma 'sessão de perguntas', o programa vai fazendo perguntas ao usuário até descobrir 'qual é o bicho' ou se esgotarem as possibilidades (características). Nesse caso, o programa pede ao usuário uma característica e o nome do bicho, armazenando-os na árvore.  Na próxima sessão de perguntas, essa informação é usada para descobrir o próximo bicho.

Um programa parecido, construído através da mesma técnica descrita acima,  pode ser encontrado na web em  http://www.animalgame.com/play/.

A técnica é bem simples e despretensiosa. Se você quiser conhecer uma abordagem mais elaborada para esse tipo de problema, dê uma olhada em  http://www.20q.org/ (depois de concluir o trabalho, é claro!). Se você usa Linux numa máquina Intel (ou equivalente), pode experimentar o programa chamado 'bichos'  em  http://www.ic.unicamp.br/~vanini/mc202/programas/bichos  , que apresenta o comportamento esperado para esta atividade.

Exemplo de uma sessão

No 'diálogo' mostrado a seguir, o texto em preto corresponde à saída escrita pelo programa e o texto em azul, corresponde ao texto digitado pelo usuário. Inicialmente, a árvore vai estar vazia e o programa começa perguntando por um novo bicho.

 

uma característica do bicho:

tem penas

nome do bicho:

galinha

continua ?(s/n)

s

o bicho tem penas ? (s/n)

s

o bicho é galinha ? (s/n)

n

uma característica do bicho:

se alimenta do néctar das flores

nome do bicho:

beija-flor

continua ?(s/n)

s

o bicho tem penas ? (s/n)

s

o bicho é galinha ? (s/n)

s

(!!!) viu como sou esperto ?

continua ? (s/n)

n

 

Recomendações:

Toda a memória alocada dinamicamente deve ser liberada.

 

Para a leitura das respostas do usuário use a função getLine() mostrada abaixo. Como essa função usa gets(), o gcc pode gerar um alerta indicando que a mesma não deve ser usada - não se preocupe com isso.

 

char* copyStr(char* str){

  char *p = (char*) malloc(strlen(str)+1);

  strcpy(p,str);

}

 

char* getLine(){

  char line[256];

  if(gets(line)!= NULL) return copyStr(line);

  else return NULL;

} 

 

Data de Entrega: 06/10/08