1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

programa em C de adivinhar

Discussão em 'Programação' iniciada por daminufe_tig, 3 de Janeiro de 2007. (Respostas: 10; Visualizações: 3209)

  1. daminufe_tig

    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..





     
  2. banid0

    banid0 Power Member

    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...
     
  3. HecKel

    HecKel The WORM

    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
     
  4. MarcosFonseca

    MarcosFonseca Power Member

    Mas ele o programa não vai pedir o numero ao utilizador...só vai perguntar se sim ou se não...o numero fica na nossa cabeça!
     
  5. HecKel

    HecKel The WORM

    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
     
  6. Warrior

    Warrior Power Member

    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.
     
  7. daminufe_tig

    daminufe_tig Power Member

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

    HecKel The WORM

    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
     
  9. daminufe_tig

    daminufe_tig Power Member

    eu já tentei, mas não consigo implementar o programa.. será k me podia fazer aí um algoritmo, no ciclo de repetição?
     
  10. HecKel

    HecKel The WORM

    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
     
  11. daminufe_tig

    daminufe_tig Power Member

    obrigado!! já consegui fazer o programa!! :)
     

Partilhar esta Página