programa em C de adivinhar

daminufe_tig

Power Member
olá, eu quero fazer um programa em C que "advinhe" o número que o utilizador pensou entre 0 e 100. Mas para isso tenho de perguntar se o número é maior ou menor:

por exemplo:

eu penso no número 13
o output do programa será:

O número é 50?
não
é maior ou menor?
menor
o número é 25?
não
é maior ou menor?
menor
o número é 12?
não
é maior ou menor?
maior
o número é 18?
não
é maior ou menor?
é menor
o número é 14?
não
é maior ou menor?
é menor

FIM DE JOGO, o número é 13...

Não sei se me entenderam, mas eu sei k preciso de um ciclo while, mas não consigo chegar a um rsultado final..





 
aconselho-te ou a por opções do tipo (m) e (m) > ou < ou numéricas,pois ler strings dá MUITO mais trabalho,e não é viável para opções(tinhas de ler a string..comparar...)

ês o número,e vais pô-lo a perguntar enquanto o número escrito(que presumo que estejas a fazer metade ou o dobro do anterior) seja igual...

além de que não tens ai a opcao de o programa acertar...do tipo na mouche,parar logo...não tens isso muito bem estruturado.
Nem sequer tens o passo(quantas unidades salta) de iteração em iteração.

tenta no papel primeiro prever todas as possibilidades...
 
Boas!

Pegando na (boa) sugestão do banid0, de realçar que utilizando um char podes recorrer ao uso de switch-cases que apenas aceitam tipos "enumeráveis" (inteiros e caracteres), isto vai-te poupar bastante trabalho com comparações parvas e vai-te reduzir o código a larga escala para não dizer que o vai tornar mais perceptivel :P

Ou seja, só boas coisas :x2:

Sobre a forma como vais tentar adivinhar..., julgo que já percebeste que é boa ideia ir "particionando" em metades, certo?

abraços, HecKel
 
Eu falava na forma de ele ir adivinhando ;)

Tens de ir reduzindo hipoteses, não deves fazer totalmente aleatório, senão nunca mais sais daí :)

Se tens entre 0 e 10, e o computador dá 6 e dizes que é abaixo ele deve saber que a partir desse momento só deve considerar o 0,1,2,3,4,5 e excluir totalmente o resto, é disto que eu falo quando digo particionar ;)

abraços, HecKel
 
E fazer uma espécie de binary search.

Se é de 0 a 100, escolhes 50, para eliminar logo metade das hipóteses. Se é maior, escolhes 75, uma vez que o teu intervalo é só entre 50 e 100.

Ou seja, o número que escolhes é o número (min+max)/2.

Espero que isto ajude.
 
é isso mesmo que o heckel disse, é necessário ir particionando o número em metades.. eu não percebo é como!!

Boas!

Simples, só tens de definir limites :) (inicialmente 0 e maximo permitido)

Se X é maior que max/2 então minimo passa a ser (max/2)+1 e o máximo mantem, se X é menor que max/2 então minimo mantem e max passa a ser max/2 -1

Fazes isto recursivamente até min = max :)

abraços, HecKel
 
vai em pseudo-código :P Não te quero fazer a papinha toda ;)

Código:
max <- limite superior
min <- limite inferior
repete
INICIO
  escreve("O numero é " + min + (max - min)/2 + "?");
  le(resposta);
  se reposta é sim
    sai do ciclo
  se resposta é não
    escreve("O numero é maior?");
    le(resposta);
    se resposta é sim
      min<-min+(max-min)/2 + 1
    se resposta é não
      max<-min+(max-min)/2 - 1
FIM (do repete)

Isto já te deve dar uma grande ajuda ;) Julgo que não cometi gafes nos cáculos dos max e min atribuidos, no entanto também é algo que podes confirmar facilmente, sempre serve para testares o debug manual ;)

abraços, HecKel
 
Back
Topo