1
resposta

while e acertou

Fiz meu codigo um pouco diferente e usando while, mas gostaria de entender por que que na condicao do while eu tenho que colocar ! ao inves de apenas acertou, afinal eu atribuo 1 depois. Se alguem puder dar um suporte eu agradeco.

#include<stdio.h>

main(){

printf("BEM VINDO AO JOGO DA ADIVINHACAO\n");

int nsecreto=23, chute=0, acertou=0, tent=0; while(acertou){ printf("Qual nsecreto?\n"); scanf("%d",&chute); if(chute<0){ printf("valor invalido, tente novamente\n"); tent--; }else if (chute==nsecreto){ acertou=1; printf("PARABENS VOCE ACERTOU\n"); }else if(chute>nsecreto){ printf("nsecreto menor\n"); }else{ printf("nsecreto maior\n"); } tent++; }printf("Numero de tentativas igual a %d",tent); return 0; }

1 resposta

Você primeiro precisa entender a estrutura de loop while() em c.

O while em c, funciona da seguinte forma:

while == enquanto
(Condition) == Condição a ser verificada

No while em c tem como parâmetros uma condição que, se for verdadeiro a condição o código dentro das -> {} será executado em loop até que essa condição seja falsa;

No c um numero <= 0 é igual a falso e qualquer numero > 0 é igual à verdadeiro. EX:


while(1){} // verdadeiro, vai executar infinitamente

while(0){} // falso, nâo vai executar nenhuma vez

Agora se eu colocar antes da condição um '!', significa que eu estou invertendo os valores, EX:


while(!1){} // falso, nâo vai executar nenhuma vez

while(!0){} // verdadeiro, vai executar infinitamente

No seu código a variável acertou começa com 0, ou seja começa como falso, então o loop nunca vai começar por isso do ! para negar a condição, assim interpretando como verdadeira.

Eu refatorei o codigo de uma forma que explica melhor:

#include <stdbool.h> // Biblioteca que permite a utilização do "true" e "false" para melhor leitura, porém continua sendo uns e zeros.
#include <stdio.h>

int main() {
  printf("BEM VINDO AO JOGO DA ADIVINHACAO\n");

  int nsecreto = 23;
  int chute = 0;
  int nao_acertou = true; // Enquanto não acertou continuara como verdadeiro, pois a verdade é que o jogador não acertou ainda.
  int tent = 0;

  while (nao_acertou) {
    tent++;
    printf("Qual nsecreto?\n");
    scanf("%d", &chute);
    if (chute < 0) {
      printf("valor invalido, tente novamente\n");
      tent--;
    } else if (chute == nsecreto) {
      nao_acertou = false; // Aqui o jogador acertou ou seja essa variavel vai ser uma mentira/falsa a partir de agora.
      printf("PARABENS VOCE ACERTOU\n");
    } else if (chute < nsecreto) {
      printf("chute é menor que o numero secreto\n");
    } else {
      printf("Chute é maior que numero secreto\n");
    }
  }

  printf("\n\tNumero de tentativas igual a %d\n", tent);
}

DICAS: Recomendo dar uma olhada na tabela verdade. Um exemplo desse mesmo jogo para vocẽ ter como referencia: Jogo_da_adivinhação Ultima dica, começa a preocupar com identação, pois isso vai ajudar quem ler o código e você quando estiver codando.