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

Minha cabeça deu um nó

Olá amigos ,

Juro que tentei compreender, mas acho que tenho de voltar as aulas e ver novamente sobre as informações do loop. Tentei passo a passo e descrevendo o que era para ocorrer, entretanto ainda assim o resultado dá outro. De modo geral era para ser : Usuário informa login e senha , se estiver correto ("Bem-vindo ao sistema " + loginInformado) e apresenta ("olá" + loginInformado) , uma vez tendo acertado ambos, irá igualar as tentativas atuais ao máximo de tentativas , para que possa sair do loop. Não acertando ambos, quero que apareça na 3 tentativa de erro como alerta = (" Entre em contato com a administração para realizarmos sua identificação : adm@adm.com.br ou 9.8888-7777 de Seg a Sex entre 08h á 20h ") , caso não seja a terceira tentativa , ("Login inválido. Tente novamente") e soma mais uma tentativa , até acertar ou dar o número de tentativas máximas. Bem, minha cabeça deu um nó e já estou com dor de cabeça, o programa quando não acertava na primeira tentativa , mesmo que estivesse com o Login e Senha cadastrado , ele dava como se estivesse errado. Nào compreendi muito bem o fechamento dos últimos {} Se alguém puder comentar passo a passo, de forma bem lenta mesmo , eu agradeço. Obrigado !

<meta charset="UTF-8">

<script>

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

    var maximoTentativas = 3;
    var tentativaAtual = 1;

    while (tentativaAtual<=maximoTentativas ) {

//Irá realizar o loop enquanto o número de tentativas for menor ou igual máximo de tentativas. Em seguida irá exibir os campos de Login e Senha para o usuário inserir.

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

//Se o Login e Senha forem iguais aos cadastrados , então exibe o alert e iguala as tentativas ao máximo de tentativas, fazendo ter  fim o while (???).

// Caso não esteja certo o Login ou a Senha e o número de tentativas for 3, irá exibir um alerta dizendo que atingiu o número  máximo de tentativas 3. 

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

        alert("Bem-vindo ao sistema " + loginInformado);
        document.write("olá " +  loginCadastrado )
        tentativaAtual == maximoTentativas; 
    } else {
        if (tentativaAtual == maximoTentativas) {
                alert(" Entre em contato com a administração para realizarmos sua identificação : adm@adm.com.br ou 9.8888-7777 de Seg a Sex entre 08h á 20h ");

// Caso não tenha atingido o número máximo de tentativas, abrirá informando que o Login é inválido, e soma mais uma tentativa ao contador.           
            }  else {

                    alert("Login inválido. Tente novamente");}

                     tentativaAtual++  
                 //(???) 
             }}
</script>
4 respostas

Olá, Lucas. Tudo beleza?

Notei que você teve algumas dificuldades e estou aqui pra ajudar.

Abaixo você verá como resolvi o problema de acordo com o código que você passou.

Minha solução comentada:

<meta charset="UTF-8" />

<script>
  var loginCadastrado = 'alura'
  var senhaCadastrada = 'alura321'

  var maximoTentativas = 3
  var tentativaAtual = 1

  // Esta nova variável servirá como interruptor do while, 
  // ou seja, ela vai determinar se o prompt continua ou para de executar
  var verifica = true

    // Perceba que a var 'verifica' se torna condição para o While, conforme o comentário anterior
    // Isso significa que se 'verifica' receber 'false', o loop é quebrado... 
    // Você verá a importância disso mais à frente
  while (tentativaAtual <= maximoTentativas && verifica) {

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

    if ( loginCadastrado == loginInformado && senhaCadastrada == senhaInformada ) {
      alert('Bem-vindo ao sistema ' + loginInformado)
      document.write('olá ' + loginCadastrado)

      // Neste momento, o login e senha estão corretos. 
      // Por isso, while precisa parar de perguntar login e senha. Então...
      verifica = false;

    } else {
      if (tentativaAtual == maximoTentativas) {
        alert(' Entre em contato com a administração para realizarmos sua identificação : adm@adm.com.br ou 9.8888-7777 de Seg a Sex entre 08h á 20h ' )

        // Neste momento, as tentativas acabaram. 
       // Daí, while precisa parar de perguntar login e senha. Então usa o interruptor de novo...
        verifica = false;

      } else {
        alert('Login inválido. Tente novamente')
      }
      //Aqui eu preferi fazer com que a adição para a var 'tentativaAtual' fosse feita em caso de qualquer erro
      //Isso é importante para que ao atingir o número máximo de tentativas, a ação correta aconteça no primeiro 'else if' lá em cima
      //Caso contrário, a mensagem no 'alert' de "Login inválido" será emitida mesmo após gastar todas as tentativas
      tentativaAtual++;
    }

  }
</script>

Em resumo, foram os pequenos detalhes que acabaram atrapalhando de alcançar o objetivo.

Nos momentos em que não consegue achar os erros, sugiro que você procure dar um tempo para a mente processar tudo. Digo por experiência própria: ter essa etapa é essencial na resolução de atividades mais complexas.

Parabéns por se empenhar nos estudos e não guardar sua dúvida. Fez muito bem em compartilhar aqui no fórum!

Espero ter te ajudado. Em caso de outras dúvidas, conte comigo.

Tenha bons estudos :)

Olá Joab, muitíssimo obrigado pela ajuda ! Vi que explicou de forma bem simples e achei fantástico a ideia do verifica ! Ainda tenho algumas dúvidas para tentar encontrar as falhas no que eu estava escrevendo,

while (tentativaAtual<=maximoTentativas )

Ele não seria capaz de funcionar como o interruptor ? Mesmo acertando o Login e Senha, na primeira vez,

  1. ele prosseguia aparecendo o prompt eternamente, pois não havia acionado o interruptor para ter o fim do While, não entendi, pois teoricamente se estava certo, estaria igual ao número máximo de tentativas, logo seria para parar no primeiro IF, não ?
  2. Não aparecia o
    `document.write("olá " +  loginCadastrado )``
    Essas foram as dúvidas que vieram a mente de imediato, acho que talvez me enrolei com o fechamento das chaves também {} que seria onde inicia e termina a função. Peço desculpas e já agradeço novamente !!! Fiquei intrigado de onde exatamente tava errando, o código que o prof. passou foi esse :
<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");
            }
        }

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

</script>

Não consegui entender onde me perdi para dar resultados diferentes do programa dele.

solução!

Respondendo as perguntas

  1. No seu código, se continuou perguntando login e senha devido às condições do While. while(tentativaAtual <= maximoTentativas)

No seu código apresentado, quando login e senha estavam corretos, acontecia tentativaAtual = maximoTentativas... Ou seja, a condição While continuava 'true'. Por isso, continuava perguntando. Para que o while parasse, precisa acontecer tentativaAtual > maximoTentativas. Isso nos leva ao segundo ponto.

  1. Comparando seu código com o do instrutor, a diferença de logica que eu percebi foi:

O instrutor também utiliza do número máximo de tentativas como interruptor do while, assim como você também fez.

No entanto, a diferença vai se encontrar na adição da variável tentativaAtual.

No seu código e do instrutor, quando o login e senha estão corretos acontece tentativaAtual = maximoTentativas. Mas somente no caso do instrutor, perceba que a adição da var tentativaAtual acontecerá em seguida.

É aí que está a diferença principal, Lucas.

Em seu código, tentativaAtual = tentativaAtual + 1 acontece dentro do par de chaves IF {}, ou seja, só acontece adição em condição IF... Mas é preciso que aconteça sempre para fazer o while ser interrompido.

Por isso o instrutor declara tentativaAtual = tentativaAtual + 1 fora do par de chaves do IF {}. Como resultado o loop while do instrutor é quebrado, pois tentativaAtual > maximoTentativas

Aconselho que você veja esse detalhe, pois apesar de sutil, trouxe muita diferença na logica.

Espero que dê pra entender rsrs. Se desejar, posso te responder mais rápido pelo Discord storgeon#3799

Sucesso demais kkkk , muitíssimo obrigado Joab , apesar de não utilizar muito o discord eu enviei um convite, obrigado !!