Ainda não tem acesso? Estude com a gente! Matricule-se
Ainda não tem acesso? Estude com a gente! Matricule-se

Solucionado (ver solução)

Não está funcionando do jeito que achei

Primeiramente, não tinha ideia nenhuma de como fazer para repetir no máximo 3 vezes até que dei uma olhada na opinião do instrutor para ter uma ideia do que fazer, mas preferi insistir na resolução que eu mesmo já tinha escrito.

Encontrei dois problemas no meu código:

1) Se eu digitar corretamente o login, mas errar propositalmente a senha, ou digitar errado o login mas digitar corretamente a senha, o programa não faz nada. Ele simplesmente não exibe nada, nem que eu errei ou acertei. Mas se eu errar propositalmente tanto o login quanto a senha o programa "funciona" menos o segundo "else" que é a minha próxima dúvida.

2) No segundo "else" do programa, simplesmente não acontece nada e não exibe o "alert" de tentativas excedidas.

No que eu errei?

E por favor, sejam sinceros, meu código ficou mais complicado do que o código do professor? Por que eu acho que, se tem um jeito mais simples de se fazer a mesma coisa, não há necessidade de complicar mais a vida né. E só por uma questão de eficiência mesmo, e não por preguiça de ter que escrever o código.

<meta charset="UTF-8">
<script>

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

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

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

        alert("Bem-vindo ao sistema " + loginInformado);
    } else {

        var contadorLimite = 2;

        if (contadorLimite <= 3) {

            while (loginCadastrado != loginInformado && senhaCadastrada != senhaInformada && contadorLimite <= 3) {

                console.log(contadorLimite);
                alert("Login inválido. Tente novamente");
                loginInformado = prompt("Informe seu login");
                senhaInformada = prompt("Informe sua senha");
                contadorLimite = contadorLimite + 1;

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

                    alert("Bem-vindo ao sistema " + loginInformado);
                }
            }
        } else {

            alert("Número de tentativas excedido. Tente novamente mais tarde.");
        }
    }

</script>
4 respostas

Olá Vinícius tudo bem?

No seu whilte

while (loginCadastrado != loginInformado && senhaCadastrada != senhaInformada && contadorLimite <= 3)

Você está validando se (login != And senha !=) ou seja só irá entrar no seu while caso o login e a senha forem errados.

Quanto ao seu código tenho algumas observações:

1 - Você está repetindo o código para fazer a validação dos dados, poderia utilizar uma estrutura de do...while

2 - Esse if que você está fazendo é desnecessário if (contadorLimite <= 3) já que você está atribuindo o valor 2 logo acima, portanto ele sempre será verdadeiro.

Essa seria um possível solução:

    <script>

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

        var numeroTentativas = 1;
        var loginEfetuado = false;
        do {
            var loginInformado = prompt("Informe seu login");
            var senhaInformada = prompt("Informe sua senha");                

            if (loginCadastrado == loginInformado && senhaCadastrada == senhaInformada) {    
                loginEfetuado = true;
                alert("Bem-vindo ao sistema " + loginInformado);
            } else {
                alert("Login inválido. Tente novamente - Tentativas = " + numeroTentativas);
                numeroTentativas++;
            }
        } while (numeroTentativas <= 3 && loginEfetuado == false)

        if (loginEfetuado == false) {
            alert("Número de tentativas excedido. Tente novamente mais tarde.");
        }

    </script>

Espero ter ajudado e bons estudos :)

solução

Fala amigo, eu corrigi os erros que você pontuou, muito obrigado. Mas sinceramente, em minha opinião, claro, achei o código que você me passou mais complicado.

E nessa parte do seu código não está faltando um abre chaves ( { )?

while (numeroTentativas <= 3 && loginEfetuado == false)

        if (loginEfetuado == false) {
            alert("Número de tentativas excedido. Tente novamente mais tarde.");
        }

Bom, no fim das contas eu ajustei meu código e suas observações foram bem valiosas, obrigado. Fiquei bem satisfeito com o resultado final e acho que está razoavelmente simples de entendê-lo.

Segue o resultado final:

<meta charset="UTF-8">
<script>

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

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

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

        alert("Bem-vindo ao sistema " + loginInformado);
    } else {

        var tentativas = 2;

        while (tentativas > 0) {

            console.log(tentativas + " tentativa(s) restante(s)");    
            alert("Login inválido. Tente novamente");
            loginInformado = prompt("Informe seu login");
            senhaInformada = prompt("Informe sua senha");
            tentativas = tentativas - 1;

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

                alert("Bem-vindo ao sistema " + loginInformado);
                tentativas = tentativas - 2;
            }
        }

        if (tentativas == 0) {

            alert("Número de tentativas excedido. Tente novamente mais tarde.");
        }
    }   
</script>

Legal que gostou, não está faltando chaves no caso o comando que usei é o Do...While

diferente do while padrão, esse comando sempre executa ao menos uma vez e no while ele valida se deve continuar o log, então as chaves ficam assim:

do {
} while (condição)

E no seu último código, continua tendo o mesmo IF duas vezes :D

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

Ué, mas seu eu tirar esse segundo if:

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

Ele não mostrará ao usuário caso ele acerte na segunda ou terceira tentativa... De que outro jeito poderia escrever sem alterar muito a estrutura do meu código?

Obs.: Agora realmente está tudo funcionando. Pode não ser o melhor jeito de fazer o código mas, está funcionando =)

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software