Ir ao conteúdo

Posts recomendados

Postado

Faça um programa na linguagem de programação C. Seu programa deve adivinhar um número entre 1 e 100 escolhido pelo usuário. O programa deve pedir para o usuário escolher um número, e depois propor valores para esse número. A cada número proposto pelo programa, deve pedir ao usuário informação sobre se seu número é igual, maior ou menor que o número escolhido. O programa deve usar essa informação para a próxima escolha. O programa deve identificar se o usuário estiver mentindo. O programa deve propor uma nova partida no final.

Pessoal eu preciso implementar um comando caso o usuario esteja mentindo nesse código como eu faço

#include <stdio.h>

void adivinha() {
    int aleatorio, ultimo=100,primeiro=1,tentativas=0;
    char simbolomate;
    do{
        aleatorio = primeiro + (ultimo-primeiro) /2;
        tentativas ++;
        printf("O número que você escolheu é maior,menor ou igual a %d? Digite '>', '<' ou '=' respectivamente\n Número de tentativas : %d\n",aleatorio,tentativas);
        scanf(" %c",&simbolomate);
        switch (simbolomate){
            case '=':
               printf("número correto");
               break;
            case '>':
               primeiro = aleatorio + 1;
               break;
            case '<':
               ultimo = aleatorio - 1;
               break;
        }
    } while(simbolomate != '=');
}

int main()
{
    int numero, tentar_de_novo=1;
    do{
        printf("Pense e digite um número de 1 a 100\n");
        scanf("%d",&numero);
        adivinha();
        printf("Se você deseja jogar novamente digite um qualquer numero, se não digite 0\n");
        scanf("%d",&tentar_de_novo);
    }while(tentar_de_novo);
    return 0;
}

 

  • Obrigado 1
Postado

@phinky88        essa função  adivinha  possui apenas variáveis locais , e sendo assim o que o usuário digitou lá função main , e não foi enviado por parâmetro , para essa função adivinha , o programa não sabe o número que o usuário digitou , e o computador só consegue tomar alguma decisão através de comparações , de um dado com outro , e quando os dois dados são idênticos uma área do  processador chamada de ALU  ( unidade de Lógica e Aritmética ) , seta a bandeira , "flag" Z , com o valor 1 em binário , e então o programa faz o que está dentro do comando   if , que é quem faz essa comparação , e caso não sejam iguais a flag z será resetada e terá o valor 0 , e assim o programa não faz o que está dentro do  if  , mas se o programa não tiver em mãos os dois dados para fazer essa comparação , ele não saberá se o usuário mentiu ou não , e uma forma de fazer isso sem enviar o número digitado pelo usuário por parâmetro para a função adivinha , é colocar essa variável numero como sendo do tipo Global , e lá na função adivinha fazer a comparação do número que o usuário escolheu como o programa apresentou , e através do resultado dessa comparação o programa saberá se o usuário mentiu ou não , pois ali do jeito que está no programa é o próprio usuário quem decide se o número é igual ou menor ou maior  , e se colocar que são iguais , mesmo não sendo , o programa aceita e termina , mas entendi que na verdade o que você quer é que o  programa decida por si só se o usuário está ou não está mentindo , e ele não tem condições de adivinhar nada  para fazer uma coisa dessas , pois se nem mesmo uma pessoa consegue fazer , então um programa de  computador , que é mais burro do que uma porta , não conseguirá nunca adivinhar nada , desculpe , mas do jeito que esse programa está é impossível conseguir isso que você pretende , e as modificações para que ele faça isso poderia ser assim   :

#include <stdio.h>
void adivinha()
{    
    int aleatorio, ultimo=100,primeiro=1,tentativas=0;    
    char simbolomate;    
    do
    {            
        aleatorio = primeiro + (ultimo-primeiro) /2;        
        tentativas ++;        
        printf("O número que você escolheu é maior,menor ou igual a %d? Digite '>', '<' ou '=' respectivamente\n Número de tentativas : %d\n",aleatorio,tentativas);        
        scanf(" %c",&simbolomate);        
        switch (simbolomate)
        {            
        case '=':               
            if(aleatorio != numero)printf("Mentiu !\n");               
            else printf("número correto");               
            break;            
        case '>':               
            if(aleatorio <= numero)printf("Mentiu !\n");               
            primeiro = aleatorio + 1;               
            break;            
        case '<':               
            if(aleatorio >= numero)printf("Mentiu !\n");               
            ultimo = aleatorio - 1;               
            break;        
        }    
    } while(simbolomate != '=' );
}
int numero;
int main()
{    
    int tentar_de_novo=1;    
    do
    {           
        printf("Pense e digite um número de 1 a 100\n");        
        scanf("%d",&numero);        
        adivinha();        
        printf("Se você deseja jogar novamente digite um qualquer numero, se não digite 0\n");        
        scanf("%d",&tentar_de_novo);    
    }while(tentar_de_novo);    
    return 16;
} 

 

  • Curtir 1
  • Haha 1
  • 3 anos depois...
Postado

@devair1010 |@phinky88 

 

Boa Noite!

Suponho que é um exercício sobre vetores, então, onde está  o vetor?

 

Em 15/12/2020 às 11:41, phinky88 disse:

Pessoal eu preciso implementar um comando caso o usuario esteja mentindo nesse código como eu faço

 

        — Acredito ser por meio dum vetor que se faz isso; o programa determina tuas mentiras ao verificar quais elementos no vetor de 1 a 100 estão logicamente excluídos. É nesse mesmo vetor, que está sinalizado um elemento que simboliza o número inicialmente escolhido por você.

 

Não sendo, a lógica permanece com 3 variáveis: os extremos e o valor escolhido pelo usuário. Deste modo, teu número estará entre os limites inferior e superior necessários aos 'palpites' aleatórios\pseudoaleatório no programa que se aproximam do número escolhido a cada ciclo e definem as mentiras: porque tudo além ou aquém dos limites é mentira.

  • Curtir 1
Postado

@Ansi C @Ansi C      você tem razão,  esse algoritmo  poderia ser feito usando vetor ,   e com certeza ficaria muito bom ,  te agradeço pela dica, porém no enunciado não diz que precisa ser com vetor,  e   na época não observei que o usuário pensa no número , mas também digita tal número , e assim o computador sabe qual número o usuário pensou , e também  se mentiu .       E nesse código que postei ficaram invertidos os operadores lógicos ">=" e "<=" e faltou o "default:" no switch / case , e o código ficou assim nessa nova versão :

 

#include    <stdio.h>
#include    <windows.h>
#include    <time.h>
#include    <locale.h>
/// did you mean => você quis dizer

void adivinha( int );

int main(int argc, char* argv[] )
{
  srand(time(NULL));
  setlocale(LC_ALL,"");

  int tentar_de_novo=1;
  do
  {
    printf("Pense e digite um número de 1 a 100\n");
    scanf("%d",&numero);
    adivinha();
    printf("Se você deseja jogar novamente digite um qualquer numero, se não digite 0\n");
    scanf("%d",&tentar_de_novo);
  }while(tentar_de_novo);

  printf("\n\n\n");
  return   0;
}
void adivinha( int numero )
{
  int  aleatorio   = 0   ,
       ultimo      = 100 ,
       primeiro    = 1   ,
       tentativas  = 0   ;
  char simbolomate = 0   ;
  do
  {
    aleatorio = primeiro + ( ultimo - primeiro ) / 2;
    tentativas++;
    printf ("O número que você escolheu é maior,menor ou igual a %d  ?\n"
            "Digite '>', '<' ou '=' respectivamente  \n"
            "Número de tentativas -----: %d \n",aleatorio,tentativas);
    scanf  (" %c",& simbolomate);
    switch (simbolomate)
    {
    case '=':
      if(aleatorio != numero)
        printf("Mentiu !\n");
      else
        printf("número correto");
      break;
    case '>':
      if(aleatorio >= numero)
        printf("Mentiu !\n");
      if(numero  > aleatorio)
        primeiro = aleatorio + 1;
      break;
    case '<':
      if(aleatorio <= numero)
        printf("Mentiu !\n");
      if(numero < aleatorio)
        ultimo  = aleatorio - 1;
      break;
    default:
      printf("Opção inváLida . . . !\n");
    }
  } while( aleatorio != numero || simbolomate != '=' );
}

 

  • Curtir 1
Postado

@devair1010

 

Boa Noite!

 

De fato, não precisa de um vetor para resolver esse problema. Foi um desejo que tive de momento. Minha solução é a tua solução: nela também o extremo inferior cresce a cada palpite ⇒escolha⇐ e o extremo superior diminui até que a diferença entre eles (isuperior - inferior) gera palpites próximos do número escolhido e por último ele.

 

 

Obrigado! 🙂 

 

 

 

  • Obrigado 1

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!