8
respostas

Alguém me explica a variável achou

Eu vi que o professor colocou ela em algumas partes do código mas não entendi como ela funciona, e como ela se conecta na função, fiquei confusa. var achou = false; e achou = true; como que funciona o true e false nesse código?

<meta charset="UTF-8">

<input/>
<button>Compare com o meu segredo</button>

<script>
    function sorteia() {

       return Math.round(Math.random() * 10);

    }

    function sorteiaNumeros(quantidade) {

        var segredos = [];

        var numero = 1;

        while(numero <= quantidade) {

              var numeroAleatorio = sorteia();
              var achou = false;

              if (numeroAleatorio !== 0) {
                     for(var posicao = 0; posicao < segredos.length; posicao++) {

                           if(segredos[posicao] == numeroAleatorio){
                                achou = true;
                                break;
                           }

                     }

                     if (achou == false) {
                           segredos.push(numeroAleatorio);
                           numero++;
                     }
              }

        }

        return segredos;

    }

    var segredos = sorteiaNumeros(3);

    console.log(segredos);

    var input = document.querySelector("input");
    input.focus();

    function verifica() {

       var achou = false;

       for(var posicao = 0; posicao < segredos.length; posicao++) {

              if(input.value == segredos[posicao]) {

                     alert("Você ACERTOU!");
                     achou = true;
                     break;
              } 
       }

       if(achou == false) {

              alert("Você ERROU!");
       }

       input.value = "";
       input.focus();

    }

    var button = document.querySelector("button");

    button.onclick = verifica;

</script>
8 respostas

Olá Vitória, tudo bem?

Vou te explicar passo a passo o porque o professor utilizou a variável "achou". Primeiro vamos entender esse true e false.

var achou = true;
var achou = false;

A variável "achou" está recebendo um objeto do tipo booleano. É um tipo de dado que representa apenas dois estados, verdadeiro(true) ou falso(false).

A primeira vez que é utilizado no código é na função sorteiaNumeros().

function sorteiaNumeros(quantidade) {

        var segredos = [];

        var numero = 1;

        while(numero <= quantidade) {

              var numeroAleatorio = sorteia();
              var achou = false;

O que foi feito aqui é que dentro do while, logo no começo, ele define a variável "achou" como false, logo após isso, temos:


              if (numeroAleatorio !== 0) {
                     for(var posicao = 0; posicao < segredos.length; posicao++) {

                           if(segredos[posicao] == numeroAleatorio){
                                achou = true;
                                break;
                           }

                     }

                     if (achou == false) {
                           segredos.push(numeroAleatorio);
                           numero++;
                     }
              }

        }

O que é ele faz aqui é o seguinte:

1 - O código entra no if (para entrar no if variável "numeroAleatorio" precisa ser diferente de 0);

2 - Após isso ele entra no for (que cria a variável "posição" que irá varrer a variável "segredos");

3 - E então entra no outro if (que será verdadeiro se a variável "segredos" na posição atual é igual a variável "numeroAleatorio").

Dentro do if temos a variável "achou" como verdadeiro (true), que significa que a variável "segredos" na posição atual é igual a variável "numeroAleatorio".

if(input.value == segredos[posicao]) {

                     alert("Você ACERTOU!");
                     achou = true;
                     break;
              } 

Continuando o código, o if e o for são encerrando e se inicia um novo if.

if(achou == false) {

              alert("Você ERROU!");
 }

Esse novo if verificará o estado atual do "achou". Tempos duas opções:

1 - A variável "achou" chegou neste ponto como true (verdadeiro) (pois dentro da estrutura for-if que acabamos de sair ela foi modificada para verdadeiro). LOGO não entrará nesse novo if e retornará ao inicio do WHILE (while(numero <= quantidade)).

2 - A variável "achou" chegou neste ponto como false (falso) (pois dentro da estrutura for-if que acabamos de sair ela NÃO foi modificada). LOGO entrará nesse novo if, mostrará o alert("Você ERROU!") e após isso retornará ao inicio do WHILE (while(numero <= quantidade)).

Dentro da função verifica() ACONTECE A MESMA COISA.

function verifica() {

       var achou = false;

       for(var posicao = 0; posicao < segredos.length; posicao++) {

              if(input.value == segredos[posicao]) {

                     alert("Você ACERTOU!");
                     achou = true;
                     break;
              } 
       }

       if(achou == false) {

              alert("Você ERROU!");
       }

       input.value = "";
       input.focus();

    }

Espero ter ajudado.

Nessa parte do código no for ele faz o número sorteado ser um dos números secretos, após isso ele sai do if e repete 3 vezes que é quantidade de números que eu quero sortear, depois de sortear os 3 números, ele vai para o if(achou == false) que eu não entendi, você poderia me ajudar?

if (numeroAleatorio !== 0) {
                     for(var posicao = 0; posicao < segredos.length; posicao++) {

                           if(segredos[posicao] == numeroAleatorio){
                                achou = true;
                                break;
                           }

                     }

                     if (achou == false) {
                           segredos.push(numeroAleatorio);
                           numero++;
                     }
              }

Na minha explicação acima eu expliquei o porque desse if(achou == false). De qualquer forma se ainda não entendeu pergunta no discord que te ajudo te explicando por voz.

Nessa parte do código no for ele faz o número sorteado ser um dos números secretos, após isso ele sai do if e repete 3 vezes que é quantidade de números que eu quero sortear, depois de sortear os 3 números, ele vai para o if(achou == false) que eu não entendi, você poderia me ajudar?

Não faz isso não , posso ajudar sim !

ele faz assim para cada número sorteado ele verifica se o numero esta dentro do array var segredos = []; se tiver ele não coloca esse numero repetido no array e se não tiver ou seja não é repetido ele coloca o novo número. esse bloco que vc menciona faz isto a checagem se é ou não repetido.

Em um determinado momento da aula ele fala : "Há um problema: foram gerados números aleatórios, entretanto, coincidiu de termos um número duplicado - isto não pode acontecer. " isto esta +_ em 2:25 do vídeo 08 Manipulando Array

Então ele cria essa condição no If dentro do for para não ocorrer a repetição dos numero na hora do sorteio: que faz o seguinte , para entender coloquei o que que cada condição executa ok :

1-número sorteado anteriormente e recebido pelo array 4 == 8 numero do novo sorteio da função sorteia() -->1ª condição

1- //aqui ele vê se são igual NÃO <--1ª condição

2- // ele entra e atribui na variável achou= verdadeiro <--1ª condição

3- //e aqui ele para o programa sai do if pra fazer um novo while <--1ª condição

4- número sorteado anteriormente e recebido pelo array 4 == 4 numero do novo sorteio da função sorteia() -->2ª condição

4- //aqui ele vê se são igual SIM <--2ª condição

5- //la em cima ele atribuiu var achou = false; <--2ª condição

6- //com esta função ele empurra push o numero no array segredos[]pois não é repetido <--2ª condição

7- //e aqui ele incrementa a variável contadora do while <--2ª condição

var numeroAleatorio = sorteia();
              var achou = false;

           if (numeroAleatorio !== 0) {        
                     for(var posicao = 0; posicao < segredos.length; posicao++) {   

           /***4- ***/       if(segredos[posicao] == numeroAleatorio){      /***1-***/
                                achou = true;     /***2-***/
                                break;                    /***3-***/
                           }

                     }

   /***5-***/    if (achou == false) {
  /***6-***/     segredos.push(numeroAleatorio);
 /***7-***/      numero++;
                     }
              }

Boa Sorte , Vamos que Vamos ;-).

P.S: Se eu estiver equivocado por gentileza me alert("<h1>Vc se equivocou!</h1>"); Obrigado pela oportunidade :)

E aí, Vitória!

Esse 'true' e 'false' é um tipo de dado na programação denominados como valores booleanos. Perceba que usamos estes tipos de dados direto, mas de forma meio implícita. Nas estruturas codicionais por exemplo quando quero que alguma instrução seja realizada de acordo com uma condição, por exemplo 'se número ser menor que 5', esta condição vai ser 'Verdadeira' ou 'Falsa', não existe 'Mais ou Menos', então o valor destas condições também são tipos booleanos e o interpretador internamente os trata como 'true' ou 'false'. Agora veremos como o 'true' e 'false' se comportam em seu código e por que foram utilizados:

Já utilizamos estruturas de controle antes, como o 'if' que realizará uma condição caso ela seja verdadeira ou o 'while' que realizará as instruções até que a condição de parada seja verdadeira, enquanto falsa ele fica repetindo o laço. Perceba que o conceito é o mesmo, são estruturas que controlam o fluxo do programa dependendo das condições (verdadeiras ou falsas). Vejamos a primeira declaração da variável 'achou':

<script>
    var achou = false;
</script>

Putzz, ela já recebe um valor booleano sendo falso, como assim? Pelo nome da variável sabemos que queremos encontrar alguma coisa no código, porém tal condição não foi cumprida, se a minha mãe fala para mim ir buscar pão, eu ainda não realizei a ação, poderiamos fazer assim:

<script>
    comprarPao = false;
</script>

Claramente eu ainda não cumpri minha missão de comprar pão, caso eu fosse na padaria, voltasse e falasse para minha mãe 'comprei pão!', minha mãe certamente falaria 'comprarPao = true' (se ela fosse um computador), ou seja, ela percebeu que a condição 'comprarPao' foi realizada e agora é verdadeira! Agora vamos verificar o código como um todo:

<meta charset="UTF-8">

<input/>
<button>Compare com o meu segredo</button>

<script>
    function sorteia() {
       return Math.round(Math.random() * 10);

    }

    function sorteiaNumeros(quantidade) {
        var segredos = [];
        var numero = 1;
        while(numero <= quantidade) {
              var numeroAleatorio = sorteia(); // Sorteia um número para adicionar na lista
              var achou = false; // achou se inicia em falso
              if (numeroAleatorio !== 0) { // Se numeroAleatorio ser diferente de zero
                     for(var posicao = 0; posicao < segredos.length; posicao++) {
                           if(segredos[posicao] == numeroAleatorio){ // E se o segredos[posicao] == numeroAleatorio
                                achou = true; // Achamos, o que? Um número diferente de zero e que já existe na lista segredos[posicao]
                                break; // Então quebramos o laço (break) e voltamos para o inicio do While
                           }
                     }
                     if (achou == false) { // Se o número ser diferente de zero e não achamos na lista: 'achou == false'
                           segredos.push(numeroAleatorio); /* Adicionamos na lista (a lista acaba não tendo valores repetidos
                       pois quando encontramos, não adicionamos) */
                           numero++;
                     }
              }
        }
        return segredos;
    }

    var segredos = sorteiaNumeros(3);
    console.log(segredos);
    var input = document.querySelector("input");
    input.focus();

    function verifica() {
       var achou = false; /* aqui a mesma coisa, iniciamos não achando nada*/
       for(var posicao = 0; posicao < segredos.length; posicao++) {
              if(input.value == segredos[posicao]) { /* se o valor inserido estiver na lista de números/segredos, o usuário achou o segredo */
                     alert("Você ACERTOU!"); 
                     achou = true; /* achou recebe true*/
                     break;
              } 
       }
       if(achou == false) { // Se ele não achou, achou é false 
              alert("Você ERROU!");
       }

       input.value = "";
       input.focus();
    }

    var button = document.querySelector("button");
    button.onclick = verifica;

</script>

Oii, Gabirel! Deixa eu ver se entendi, nesta parte if(segredos[posicao] == numeroAleatorio) se o número sorteado for igual ao número que tem no array ele não vai para o próximo if if (achou == false) ele volta para o inicio do while, por causa do break e o achou = true; ativa o break e valida o input.value == segredos[posicao], certo? No caso dele não achar o número no array ele vai para if (achou == false) que está fora do for e que inclui um novo numero no array e acrescenta +1 na var numero e continua a repetição?

Vou colocar aqui o que entendi sem os códigos:

Eu quero sortear números aleatórios que sejam diferente de zero, quando for diferente de zero eu também não quero que ele se repita, então tenho que fazer uma verificação, se encontrar o número que já tenha no array, faço um novo sorteio e senão encontrar este novo número no array eu incluo ele na minha lista até completar a quantidade de números secretos que eu defini.

while(numero <= quantidade) {

              var numeroAleatorio = sorteia();
              var achou = false;

              if (numeroAleatorio !== 0) {
                     for(var posicao = 0; posicao < segredos.length; posicao++) {

                           if(segredos[posicao] == numeroAleatorio){
                                achou = true;
                                break;
                           }

                     }

                     if (achou == false) {
                           segredos.push(numeroAleatorio);
                           numero++;
                     }
              }

        }

Isso aí, Vitória! É por aí, porém a instrução que está controlando o break seria a estrutura condicional 'if(segredos[posicao] == numeroAleatorio)', se for verdadeira, o break é executado juntamente com 'achou' recebendo 'true'.

Agora 'achou = true' serve justamente para a estrutura condicional 'if (achou == false)' não ser executada, assim como você disse "no caso dele não achar o número no array ele vai para 'if (achou == false)' que está fora do for e que inclui um novo numero no array e acrescenta +1 na var numero e continua a repetição enquanto 'numero ser menor ou igual a quantidade' (que é a condição do laço while)".

Posteriormente na função 'verifica()' a variável 'achou' está sendo declarada novamente com 'var achou = false', para fazer uma nova verificação semelhante a anterior.

Sua compreensão final está corretíssima, parabéns! O que falei aqui são apenas detalhes, porém se você focar em compreender apenas a essência do código, não necessariamente tudo o que está acontecendo (nem eu sei kk), mas melhorar esta noção aos poucos e vendo mais códigos semelhantes (que você com certeza verá ao percorrer dos estudos), acabamos percebendo certos padrões e começamos a entender melhor o que está acontecendo, ligando certos pontos.

Espero ter ajudado a tirar algumas de suas dúvidas!

Outra dica é que... lembre-se você pode nomear as variáveis do jeito que você quiser, se você preferir pode trocar 'achou' por 'acharNumeroIgualNoArray', já que as estruras condicionais estão verificando isto. Deixar um código legível para que você e outros possam compreender melhor é uma boa prática. E ao contrário do que muita gente fala, só por aumentar a quantidade de caracteres em um código não deixa o código sujo, ou com uma baixa performance. O que influência mesmo são as estruturas de dados, a execução de cálculos, operações de buscas, e por fim a arquitetura do sistema como um todo. Claro que como eu disse, se as estruturas condicionais já sugerem o que está sendo verificado, então seria meio redundante.