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

posição da variável: tentativaAtual

Galera, não entendi a lógica por trás de colocar a variável "tentativaAtual = tentativaAtual +1" antes de fechar a última chave.

Pra mim o lógico seria colocar essa variável dentro do bloco do último "else", já que é nesse ponto onde há a informação para tentar novamente.

O pensamento seria +/- assim: Já que você já passou por todas as etapas e chegou na instrução final, aqui é onde você perde uma tentativa. E logo após o programa dá um looping.

É claro que tentei dessa forma e não funcionou. Queria entender o motivo.

<meta charset="UTF-8">

<script>

    var loginCadastrado = "alura";
    var senhaCadastrada = "alura321";

    var maximoTentativas = 3;
    var tentativaAtual = 1;

    while(tentativaAtual <= maximoTentativas) {

        var loginInformado = prompt("Informe seu login");
        var senhaInformada = prompt("Informe sua senha");

        if( loginCadastrado == loginInformado && senhaCadastrada == senhaInformada ) {

            alert("Bem-vindo ao sistema, " + loginInformado);

            tentativaAtual = maximoTentativas; // acertou, então faço o gasto de todas as tentativas para sair do loop. Lá embaixo vai incrementar + 1! 

        } else {

            if (tentativaAtual == 3) {
                alert("Número permitido de tentativas ultrapassado!");
            } else {
                alert("Login inválido. Tente novamente");
            ~~tentativaAtual = tentativaAtual +1~~
            }
        }

       // vai para a próxima tentativa
        **tentativaAtual = tentativaAtual +1**  
    }

</script>
4 respostas

Na verdade, o tentativaAtual = tentativaAtual + 1 é utilizado nos dois casos (quando a senha está correta ou incorreta). Quando o login está correto a tentativaAtual = maximoTentativas, e nesse caso o while ainda continua porque a condição é tentativaAtual ser menor ou igual ao maximoTentativas. Por isso é necessário somar 1 ao tentativaAtual para que agora ele seja maior que maximoTentativas e dessa forma o loop seja quebrado. Já que tentativaAtual = tentativaAtual + 1 é utilizado nas duas condições é possível colocá-lo somente uma vez depois do if e else.

Eae, Paulo. blz? Acho que vc não entendeu muito bem a pergunta. Vou tentar ser mais claro.

Esse primeiro programa não funciona. Ele leva a variável "tentativaAtual = tentativaAtual +1" dentro do bloco do último ELSE.

<meta charset="UTF-8">

<script>

    var loginCadastrado = "alura";
    var senhaCadastrada = "alura321";

    var maximoTentativas = 3;
    var tentativaAtual = 1;

    while(tentativaAtual <= maximoTentativas) {

        var loginInformado = prompt("Informe seu login");
        var senhaInformada = prompt("Informe sua senha");

        if( loginCadastrado == loginInformado && senhaCadastrada == senhaInformada ) {

            alert("Bem-vindo ao sistema, " + loginInformado);

            tentativaAtual = maximoTentativas + 1;

        } else {

            if (tentativaAtual == 3) {
                alert("Número permitido de tentativas ultrapassado!");
            } else {
                alert("Login inválido. Tente novamente");
               tentativaAtual = tentativaAtual +1; 
            }

        }

    }

</script>

Esse segundo programa funciona. Ele leva a variável "tentativaAtual = tentativaAtual +1" dentro do bloco do primeiro ELSE.

<meta charset="UTF-8">

<script>

    var loginCadastrado = "alura";
    var senhaCadastrada = "alura321";

    var maximoTentativas = 3;
    var tentativaAtual = 1;

    while(tentativaAtual <= maximoTentativas) {

        var loginInformado = prompt("Informe seu login");
        var senhaInformada = prompt("Informe sua senha");

        if( loginCadastrado == loginInformado && senhaCadastrada == senhaInformada ) {

            alert("Bem-vindo ao sistema, " + loginInformado);

            tentativaAtual = maximoTentativas + 1;

        } else {

            if (tentativaAtual == 3) {
                alert("Número permitido de tentativas ultrapassado!");
            } else {
                alert("Login inválido. Tente novamente");

            }
           tentativaAtual = tentativaAtual +1;
        }

    }

</script>

Pq no primeiro código o programa não para de perguntar o login e senha mesmo já tendo atingido o número de tentativas?

solução!

Vamos considerar que alguém errou 3 vezes. Agora númeroTentativas == 3, correto? Até aí o programa funciona normal. O problema é que quando passa a valer 3 você fica travado no primeiro if que exibe a mensagem e nunca entra no segundo else que faz a soma para o tentativaAtual passar a ser maior que 3 e encerrar o loop. No código acontece mais ou menos isso:

Considerando que o login esteja errado em todas as tentativas:

1º - Com tentativaAtual valendo 1 você acaba caindo no segundo else (Marquei com o símbolo &) e soma 1 ao seu valor, portanto tentativaAtual passa a valer 2.

2º - Com tentativaAtual valendo 2 você acaba caindo no segundo else (Marquei com o símbolo &) e soma 1 ao seu valor, portanto tentativaAtual passa a valer 3.

3º - Com tentativaAtual valendo 3 você acaba caindo no if (Marquei com o símbolo %) e apenas exibe uma mensagem, e o valor de tentativaAtual continua valendo 3.

Dessa forma, a etapa 3º continuará acontecendo porque o valor de tentativaAtual nunca é alterado e while(tentativaAtual <= maximo tentativas) nunca é falso. Obs: o while acaba ficando assim while(3 <= 3) e desse jeito continua executando.

O erro acontece porque após tentativaAtual chegar no valor de 3 não tem nenhum modo para que seu valor seja alterado (apenas se acertar corretamente a senha).

while(tentativaAtual <= maximoTentativas){
    if(){
        ...
        tentativaAtual = maximoTentativas + 1;
    } else {
        if(tentativaAtual == 3){ //%
            alert("Já que aqui não tem uma soma, 
            o tentativa atual continua valendo 3 e 
            continua atendendo a condição do while 
            em que tentativaAtual == maximoTentativas");
        } else { //&
            tentativaAtual = tentativaAtual + 1;
        }
    }

} 

Nossa.. tem razão. Era tão simples. Demorei pra enxergar isso.

Obrigado!