Solucionado (ver solução)
Solucionado
(ver solução)
7
respostas

DUVIDA SOBRE VARIAVEL

Acompanhando o vídeo, coloquei meu código pra rodar, mas ele dá um erro dizendo que a variável 'maior' não foi declarada, só que estou fazendo acompanhando linha por linha do professor, alguém poderia me ajudar?? O ERRO ESTÁ NA LINHA 56, NO ELSE IF(MAIOR)

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(){
    printf("**********************************************\n");
    printf("*** Bem vindo ao nosso jogo de adivinhacao ***\n");
    printf("**********************************************\n");


    srand(time(0));//sempre usando antes do rand(), para mudar o seed

    int numerosecreto = 1 + (rand() % 100);//USA-SE O % PARA DEFINIR QUAIS NUMEROS VAO DE X A Y, EX: 0 A 100.

    int chute;
    int tentativas = 1;
    int i;
    double pontos = 1000;

    int acertou = 0;

    int nivel;
    printf("Qual o nivel de dificuldade?\n");
    printf("(1)Facil (2)Medio (3)Dificil\n\n");
    printf("Escolha: ");
    scanf("%d", &nivel);

    int numerodetentativas;
    if(nivel == 1){
        numerodetentativas = 20;
    } else if(nivel == 2){
        numerodetentativas = 15;
    } else {
        numerodetentativas = 6;
    }
    printf("Chute um numero entre 1 e 100\n");
    for(i = 1; i <= numerodetentativas; i++){
    //while(1){
        printf("Tentativa %d\n", tentativas);//tentaticas é usado apenas para mostrar o valor da tentativa
        printf("Qual o seu chute? ");
        scanf("%d", &chute);
        printf("Seu chute foi %d\n", chute);

        if(chute < 0){
            printf("Voce nao pode chutar numeros negativos!\n");
            continue;

        int maior = (chute > numerosecreto);
        acertou = (chute == numerosecreto); //SERÁ VERIFICADO SE RETORNA UM VALOR VERDADEIRO(1) OU FALSO(0)
        //int maior = chute > numerosecreto;

        }
        if(acertou){
            break; //USADO PRA QUEBRAR O LOOP
        }
        else if(maior){
            printf("Seu chute foi maior que o numero secreto\n");
        }
        else {
            printf("Seu chute foi menor que o numero secreto\n");
        }
        //tentativas++;

        double pontosperdidos = (double)(chute - numerosecreto) / (double)2;//casting, usado para converter variavel, pois sem isso, como o compilador ler da direita para esquerda, retornaria valores inteiros.
        pontos -= abs(pontosperdidos);//abs usado para retornar o valor absoluto do numero negativo
    }

    printf("Fim de Jogo!!\n");
    if(acertou){
        printf("Voce ganhou!\n");
        printf("Voce acertou em %d tentativas\n", tentativas);
        printf("Total de pontos: %.1f", pontos);
    } else {
        printf("Voce perdeu! Tente de novo.\n");
    }


}
7 respostas

Olá Otacílio tudo bem?

Então o problema em questão se trata do escopo da variável, você está criando e inicializando a variável dentro do escopo em um if e tentando acessar a variável fora, seu incremento da tentativa também está comentado o que remove a contagem das tentativas,

para solucionar o problema basta criar e inicializar a variável em um escopo global habilitando todo código a acessar a mesma sem problemas,

...
    int chute;
    int tentativas = 1;
    int i;
    double pontos = 1000;
    int maior = 0;
    int acertou = 0;

    int nivel;
    printf("Qual o nivel de dificuldade?\n");
    printf("(1)Facil (2)Medio (3)Dificil\n\n");
    printf("Escolha: ");
    scanf("%d", &nivel);

    int numerodetentativas;
    if(nivel == 1){
        numerodetentativas = 20;
    } else if(nivel == 2){
        numerodetentativas = 15;
    } else {
        numerodetentativas = 6;
    }
    printf("Chute um numero entre 1 e 100\n");
    for(i = 1; i <= numerodetentativas; i++){
    //while(1){
        printf("Tentativa %d\n", tentativas);//tentaticas é usado apenas para mostrar o valor da tentativa
        printf("Qual o seu chute? ");
        scanf("%d", &chute);
        printf("Seu chute foi %d\n", chute);

        if(chute < 0){
            printf("Voce nao pode chutar numeros negativos!\n");
            continue;

        maior = (chute > numerosecreto);
        acertou = (chute == numerosecreto); //SERÁ VERIFICADO SE RETORNA UM VALOR VERDADEIRO(1) OU FALSO(0)
        //int maior = chute > numerosecreto;

        }
        if(acertou){
            break; //USADO PRA QUEBRAR O LOOP
        }
        else if(maior){
            printf("Seu chute foi maior que o numero secreto\n");
        }
        else {
            printf("Seu chute foi menor que o numero secreto\n");
        }
        tentativas++;

...

Espero ter ajudado e bons estudos,

Abraço

Renan Lopes

Renan obrigado pela ajuda, mas encontrei outro erro. Primeiramente, se puder me esclarecer isso ficaria extremamente grato: pelo que entendi, o incremento em tentativas seria para fazer o loop no while, estou certo ou errado? Já o novo erro que está dando é no programinha ja, so mostra que o valor está menor do que o numero secreto. Eu entendi como vc falou e o porque estava dando erro na variavel maior, Muito obrigado por isso.

Olá Otacílio que ótimo,

Entendi seu problema, ele está na apresentação da informação do numero de tentativas, você está incrementando a variável (i++) usando o for mas na impressão está usando a variável (tentativas),

Seu código

...
 printf("Chute um numero entre 1 e 100\n");
    for(i = 1; i <= numerodetentativas; i++){
    //while(1){
        printf("Tentativa %d\n", tentativas);//tentaticas é usado apenas para mostrar o valor da tentativa
        printf("Qual o seu chute? ");
        scanf("%d", &chute);
        printf("Seu chute foi %d\n", chute);
...

Recomendado

...
 printf("Chute um numero entre 1 e 100\n");
    for(i = 1; i <= numerodetentativas; i++){
    //while(1){
        printf("Tentativa %d\n", i);//tentativas é usado apenas para mostrar o valor da tentativa
        printf("Qual o seu chute? ");
        scanf("%d", &chute);
        printf("Seu chute foi %d\n", chute);
...

Usando o código correto você poderá comentar novamente o número de tentativas e a apresentação da informação estará correta,

Espero ter ajudado e bons estudos,

Abraços

Renan Lopes

Entendi, só que o arquivo quando compila, no executável, ainda está mostrando qualquer valor que eu coloco no chute como menor do que o numero secreto, mesmo colocando 100 ele diz que o numero é menor.

código atualizado:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(){
    printf("**********************************************\n");
    printf("*** Bem vindo ao nosso jogo de adivinhacao ***\n");
    printf("**********************************************\n");


    srand(time(0));//sempre usando antes do rand(), para mudar o seed

    int numerosecreto = 1 + (rand() % 100);//USA-SE O % PARA DEFINIR QUAIS NUMEROS VAO DE X A Y, EX: 0 A 100. NESSE CASO TERIA NUMEROS DE 1 A 100[1 +(rand()%100)]
    int maior = 0;
    int chute;
    int tentativas = 1;
    int i;
    double pontos = 1000;

    int acertou = 0;

    int nivel;
    printf("Qual o nivel de dificuldade?\n");
    printf("(1)Facil (2)Medio (3)Dificil\n\n");
    printf("Escolha: ");
    scanf("%d", &nivel);

    int numerodetentativas;
    switch(nivel){
        case 1: numerodetentativas = 20; break;
        case 2: numerodetentativas = 15; break;
        default: numerodetentativas = 6; break;
    }

    printf("Chute um numero entre 1 e 100\n");
    for(i = 1; i <= numerodetentativas; i++){

        printf("Tentativa %d de %d\n", i, numerodetentativas);//tentaticas é usado apenas para mostrar o valor da tentativa
        printf("Qual o seu chute? ");
        scanf("%d", &chute);
        printf("Seu chute foi %d\n", chute);

        if(chute < 0){
            printf("Voce nao pode chutar numeros negativos!\n");
            continue;

        maior = (chute > numerosecreto);
        acertou = (chute == numerosecreto); //SERÁ VERIFICADO SE RETORNA UM VALOR VERDADEIRO(1) OU FALSO(0)
        //int maior = chute > numerosecreto;

        }
        if(acertou){
            break; //USADO PRA QUEBRAR O LOOP
        }
        else if(maior){
            printf("Seu chute foi maior que o numero secreto\n");
        }
        else {
            printf("Seu chute foi menor que o numero secreto\n");
        }
        tentativas++;

        double pontosperdidos = (double)(chute - numerosecreto) / (double)2;//casting, usado para converter variavel, pois sem isso, como o compilador ler da direita para esquerda, retornaria valores inteiros.
        pontos -= abs(pontosperdidos);//abs usado para retornar o valor absoluto do numero negativo
    }

    printf("Fim de Jogo!!\n");
    if(acertou){
        printf("Voce ganhou!\n");
        printf("Voce acertou em %d tentativas\n", tentativas);
        printf("Total de pontos: %.1f", pontos);
    } else {
        printf("Voce perdeu! Tente de novo.\n");
    }


}
solução!

Olá Otacílio,

Então, a comparação de (maior) e (acertou) está sendo feita no escopo do if de proteção para números negativos e como você inicializou tanto (maior) como (acertou) em escopo global com os valores 0 (false) ele sempre vai para o else do final, para corrigir basta remover as verificações de (acertou) e (maior) de dentro do escopo do if e inserir no escopo do loop (for),

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(){
    printf("**********************************************\n");
    printf("*** Bem vindo ao nosso jogo de adivinhacao ***\n");
    printf("**********************************************\n");


    srand(time(0));//sempre usando antes do rand(), para mudar o seed

    int numerosecreto = 1 + (rand() % 100);//USA-SE O % PARA DEFINIR QUAIS NUMEROS VAO DE X A Y, EX: 0 A 100. NESSE CASO TERIA NUMEROS DE 1 A 100[1 +(rand()%100)]
    int maior = 0;
    int chute;
    int tentativas = 1;
    int i;
    double pontos = 1000;

    int acertou = 0;

    int nivel;
    printf("Qual o nivel de dificuldade?\n");
    printf("(1)Facil (2)Medio (3)Dificil\n\n");
    printf("Escolha: ");
    scanf("%d", &nivel);

    int numerodetentativas;
    switch(nivel){
        case 1: numerodetentativas = 20; break;
        case 2: numerodetentativas = 15; break;
        default: numerodetentativas = 6; break;
    }

    printf("Chute um numero entre 1 e 100\n");
    for(i = 1; i <= numerodetentativas; i++){

        printf("Tentativa %d de %d\n", i, numerodetentativas);//tentaticas é usado apenas para mostrar o valor da tentativa
        printf("Qual o seu chute? ");
        scanf("%d", &chute);
        printf("Seu chute foi %d\n", chute);

        maior = (chute > numerosecreto);
        acertou = (chute == numerosecreto); //SERÁ VERIFICADO SE RETORNA UM VALOR VERDADEIRO(1) OU FALSO(0)
        //int maior = chute > numerosecreto;

        if(chute < 0){
            printf("Voce nao pode chutar numeros negativos!\n");
            continue;
        }
        if(acertou){
            break; //USADO PRA QUEBRAR O LOOP
        }
        else if(maior){
            printf("Seu chute foi maior que o numero secreto\n");
        }
        else {
            printf("Seu chute foi menor que o numero secreto\n");
        }
        // tentativas++;

        double pontosperdidos = (double)(chute - numerosecreto) / (double)2;//casting, usado para converter variavel, pois sem isso, como o compilador ler da direita para esquerda, retornaria valores inteiros.
        pontos -= abs(pontosperdidos);//abs usado para retornar o valor absoluto do numero negativo
    }

    printf("Fim de Jogo!!\n");
    if(acertou){
        printf("Voce ganhou!\n");
        printf("Voce acertou em %d tentativas\n", tentativas);
        printf("Total de pontos: %.1f", pontos);
    } else {
        printf("Voce perdeu! Tente de novo.\n");
    }


}

Abraços

Renan Lopes

Consegui aqui, muito obrigado mesmo Renan. Só tenho que praticar mais pra fixar melhor. =)

Otacílio que ótimo,

Parabéns pelo entusiasmo e pela solução, estudando você vai longe e pode contar com nosso fórum pra qualquer dúvida ou necessidade,

"Code is better together and with coffee" =)

Cheers,

Renan Lopes