1
resposta

Variáveis declaradas fora do while estão funcionando diferente das variáveis declaradas dentro dele e neste caso especifico não estou entendo o por quê?

No programa que eu construi, declarei as variáveis primeiro na main, const int, int e bool antes do laço while. porém quando fiz dessa forma, o cout do if declara sempre a mesma sainda, sendo menor ou maior ele falava o mesmo da primeira tentativa. quando eu declarei dentro do while da forma como o professor fez rodou normal, não entendi a causa dele não rodar com as declarações fora do while.

Programa que fiz:

#include <iostream>

using namespace std;

int main(){
    const int NUMERO_SECRETO = 42; 
    int chute=0;
    bool acertou = chute == NUMERO_SECRETO;
    bool maior = chute > NUMERO_SECRETO;
    bool NAO_ACERTOU= true;

    cout <<"*********************************" << endl;
    cout <<"Bem-vindos ao jogo da adivinhacao" << endl;
    cout <<"*********************************" << endl;

    while (NAO_ACERTOU)
    {
        cout << "Qual o seu chute?" << endl;
        cin >> chute;
        cout <<"O valor do chute eh: "<< chute << endl;

            if (acertou)
            {
                cout<< "Voce acertou, parabens!!" <<endl;
                NAO_ACERTOU = false;
            }
            else if (maior)
            {
                cout<< "O numero que voce chutou e maior que o numero secreto" <<endl;
            }
            else   
            {
                cout<< "O numero que voce chutou eh menor" <<endl;
            }

    } 

    system("pause");
    return 0;
}

xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx O programa que rodou normal:

#include <iostream>

using namespace std;

int main(){

    const int NUMERO_SECRETO = 42;
    bool NAO_ACERTOU= true;

    cout <<"*********************************" << endl;
    cout <<"Bem-vindos ao jogo da adivinhacao" << endl;
    cout <<"*********************************" << endl;

    while (NAO_ACERTOU)
    {

        int chute;

        cout << "Qual o seu chute?" << endl;
        cin >> chute;
        cout <<"O valor do chute eh: "<< chute << endl;
        bool acertou = chute == NUMERO_SECRETO;
        bool maior = chute > NUMERO_SECRETO;

            if (acertou)
            {
                cout<< "Voce acertou, parabens!!" <<endl;
                NAO_ACERTOU = false;
            }
            else if (maior)
            {
                cout<< "O numero que voce chutou e maior que o numero secreto" <<endl;
            }
            else   
            {
                cout<< "O numero que voce chutou eh menor" <<endl;
            }

    } 

    system("pause");
    return 0;
}
1 resposta

Olá, Gabriel!

Pelo que pude entender, a inicialização das variáveis "acertou" e "maior" estão condicionadas a expressões (retornando verdadeiro ou falso) que são analisadas antes da execução do while(). Por isso, dentro do while-statement, ao tentar verificar "if (acertou)" - que deveria ter um valor diferente do valor de inicialização da variável - você estará utilizando o primeiro valor contido nesta variável (que deve ser falso, pois 0 != 42). No segundo código, você consegue ter uma execução mais próxima de seu objetivo, pois a expressão neste caso passa a ser "<input do usuário> == NUMERO_SECRETO". Veja que no primeiro código, você não altera o valor de "acertou" com a informação recém adquirida.

Deixarei aqui uma sugestão simples:

#include <iostream>

using namespace std;

int main(){
    const int NUMERO_SECRETO {42};
    int chute {};
    bool acertou {};
    bool maior {};
    bool NAO_ACERTOU {true};

    cout <<"*********************************" << endl;
    cout <<"Bem-vindos ao jogo da adivinhacao" << endl;
    cout <<"*********************************" << endl;

    while (NAO_ACERTOU)
    {
        cout << "Qual o seu chute?" << endl;
        cin >> chute;
        cout <<"O valor do chute eh: "<< chute << endl;
        acertou = chute == NUMERO_SECRETO;
        maior = chute > NUMERO_SECRETO;

            if (acertou)
            {
                cout<< "Voce acertou, parabens!!" <<endl;
                NAO_ACERTOU = false;
            }
            else if (maior)
            {
                cout<< "O numero que voce chutou e maior que o numero secreto" <<endl;
            }
            else
            {
                cout<< "O numero que voce chutou eh menor" <<endl;
            }

    }

    system("pause");
    return 0;
}

Outra sugestão seria:

#include <iostream>

using namespace std;

int main(){
    const int NUMERO_SECRETO {42};
    int chute {};
    bool NAO_ACERTOU {true};

    cout <<"*********************************" << endl;
    cout <<"Bem-vindos ao jogo da adivinhacao" << endl;
    cout <<"*********************************" << endl;

    while (NAO_ACERTOU)
    {
        cout << "Qual o seu chute?" << endl;
        cin >> chute;
        cout <<"O valor do chute eh: "<< chute << endl;

            if (chute == NUMERO_SECRETO)
            {
                cout<< "Voce acertou, parabens!!" <<endl;
                NAO_ACERTOU = false;
            }
            else if (chute > NUMERO_SECRETO)
            {
                cout<< "O numero que voce chutou e maior que o numero secreto" <<endl;
            }
            else
            {
                cout<< "O numero que voce chutou eh menor" <<endl;
            }

    }

    system("pause");
    return 0;
}