Solucionado (ver solução)

Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

Solucionado
(ver solução)
4
respostas

[Dúvida] questões 5, 6 e 10 da quarta lista de exercícios

alguém poderia, por favor, me explicar a lógica da solução?

Eu achei um pouco difícil o próprio enunciado porque eu preencheria o numeroDigitado, ao mesmo tempo que deveria criar um laço de repetições até que o numeroDigitado fosse zero e a quantidade de numeroDigitado diferente de zero seria computado

Ponto 1 que eu não entendi:

é possível ter um laço de repetição comigo alterando manualmente uma variável entre cada rodada?

Ponto 2. seria tido um input para cada rodada e elas seriam computadas contando as repetições e quantidades de vezes que o número zero(o) não foi designado para o numeroDigitado?

Ponto 3. não seria mais proveitoso conhecermos listas antes para ai então aplicarmos um laço de repetições que simule todas as alterações do númeroDigitado até que fosse o zero.

Ponto4. Não seria interessante estabelecer um limite de 0 a 10 por exemplo, para que o numero vá decrescendo até chegar ao zero, se o objetivo deste exercício seria lidar com o laço de repetição e incremento para as variáveis repetições e quantidade de tentativas até o acerto?

// 5. Receber números até digitar 0 (simulado com array) 

let numeroDigitado;
let quantidade = 0;
let repeticoes = 0;

do {
  // simulação manual de entrada
  if (repeticoes === 0) {
    numeroDigitado = 5; // o numero de repetições não deveria ser zero somente se eu digitasse o número zero(0) no primeiro preenchimento do numeroDigitado?
  } else if (repeticoes === 1) {
    numeroDigitado = 10;
  } else {
    numeroDigitado = 0;
  }

  if (numeroDigitado !== 0) {
    quantidade++;
  }

  repeticoes++;
} while (numeroDigitado !== 0);

console.log("Total de números digitados: " + quantidade);

Esse é realmente o exercício que vocês gostariam que resolvessemos com o que sabemos até agora?

// 5. Receber números até digitar 0

// Simule a digitação de números usando uma variável numeroDigitado.     
         // (primeiro passo é criar a variável número digitado - let numeoDigitado)
// Use um do...while para repetir a execução até que o valor seja 0.
        // vale relembrar que o número digitado é alterado manualmente a cada repetição
// Conte quantos números diferentes de zero foram digitados e mostre o total no console ao final.

// Observação:
// Considere que o valor de numeroDigitado é alterado manualmente a cada repetição.
4 respostas

Olá, Esperidião! Tudo bem?

Vamos entender a lógica por trás do exercício 5 da sua lista de exercícios.

A ideia principal aqui é usar um laço do...while para simular a entrada de números até que o número digitado seja zero. Durante esse processo, você deve contar quantos números diferentes de zero foram "digitados".

Vamos aos seus pontos

Ponto 1: Sim, é possível ter um laço de repetição onde você altera manualmente uma variável a cada rodada. No seu caso, a variável numeroDigitado é alterada manualmente dentro do laço para simular a entrada de números.

Ponto 2: A cada iteração do laço, você simula um novo número sendo "digitado". Se o número for diferente de zero, você incrementa a variável quantidade, que conta quantos números diferentes de zero foram "digitados".

Ponto 3: Conhecer listas (ou arrays) pode ser útil, mas o foco deste exercício é entender o funcionamento do laço do...while. Ele é usado quando você quer que o bloco de código seja executado pelo menos uma vez, o que é o caso aqui, já que você quer garantir que pelo menos uma entrada seja processada.

Ponto 4: Estabelecer um limite de 0 a 10 para o número pode ser uma abordagem interessante para outros tipos de exercícios, mas aqui o objetivo é praticar a lógica de repetição até que uma condição específica seja atendida (neste caso, até que o número digitado seja zero).

Exemplo

No seu código, você está simulando entradas com os valores 5, 10 e 0. O laço do...while continua executando até que numeroDigitado seja zero. Durante as iterações, você conta quantas vezes um número diferente de zero foi "digitado", incrementando a variável quantidade sempre que numeroDigitado não for zero.

Espero ter ajudado e fico à disposição se precisar.

Abraço e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado

Olá, Daniel! Agradeço pelo retorno e por esclarecer o objetivo pedagógico de exercitar o do...while.

Entendi a ideia de tentar simular o comportamento de um usuário. No entanto, a minha dificuldade com os exercícios 5, 6 e 10 não foi com a sintaxe do laço ou com estruturas condicionais (as quais consegui aplicar nos demais exercícios da lista), mas sim por uma incompatibilidade entre o enunciado e a mecânica de execução do JavaScript:

Iteração vs. Interação: Um laço no JS roda de forma síncrona em frações de milissegundo. Sem uma instrução de bloqueio/espera para leitura de terminal (como readline ou prompt), é tecnicamente impossível para um ser humano "alterar uma variável manualmente entre cada rodada" enquanto o loop executa.

A perda do fluxo dinâmico: Para fazer o código rodar sem travar em um loop infinito, o gabarito precisou usar um contador auxiliar (passo === 0, passo === 1) dentro do próprio laço para injetar os valores. Ao pré-programar a sequência de entradas dentro do código-fonte, o laço deixa de tratar uma condição indeterminada/dinâmica e passa a seguir um roteiro 100% estático.

Comportamento humano imprevisível: Em um cenário real (como um menu ou jogo de adivinhação), o usuário pode escolher a mesma opção várias vezes ou digitar valores em qualquer ordem. Tentar simular esse fator humano engessando valores num if/else dentro do loop descaracteriza a própria razão de ser do do...while. o indíviduo pode checar o saldo, depois fazer um depósito e depois checar o saldo novamente até pedir para sair

Acredito que forçar essa simulação sem o uso de Arrays ou de ferramentas de leitura de dados acaba gerando um ruído de lógica para quem está tentando entender o fluxo de execução real de um programa.

Agradeço pela atenção e pelo suporte!

Abraços,
Esperidião

solução!

Fala, Esperidião! Aqui é o Vinny, instrutor do curso. Vim me meter na conversa pq tua crítica é boa.

onde tu tem razão

A palavra "manualmente" no enunciado tá infeliz, e vou pedir pro time revisar. JavaScript não pausa um laço síncrono pra um humano digitar. Sem uma leitura de terminal, não existe alterar variável "entre as rodadas".

O que o enunciado quer dizer é: o valor de numeroDigitado muda dentro do laço, a cada repetição. Quem muda é o código, não tu.

onde eu discordo

Isso não te obriga a um roteiro estático de if (passo === 0)... else if (passo === 1). Dá pra sortear o número:

let numeroDigitado;
let quantidade = 0;

do {
  numeroDigitado = Math.floor(Math.random() * 11);
  console.log("Digitou: " + numeroDigitado);

  if (numeroDigitado !== 0) {
    quantidade++;
  }
} while (numeroDigitado !== 0);

console.log("Total de números diferentes de zero: " + quantidade);

destrinchando a linha do sorteio

Math.random() devolve um decimal entre 0 (inclusive) e 1 (exclusive). Tipo 0.0341, 0.7712, 0.9998. Nunca chega no 1 cravado.

Aí vem a conta:

  • Math.random() → algo entre 0 e 0.999999...
  • * 11 → algo entre 0 e 10.999999...
  • Math.floor(...) → arredonda pra baixo, sobra um inteiro de 0 a 10

O 11 ali é a quantidade de valores possíveis, não o valor máximo. Se tu quer de 0 a 10, são onze números contando o zero. Multiplica por 11.

Quer de 1 a 6 (dado)? A fórmula geral é:

Math.floor(Math.random() * (max - min + 1)) + min;

Roda esse código umas cinco vezes. Cada execução vai dar um total diferente. Às vezes o primeiro sorteio já cai no zero e o quantidade termina em 0 — que é exatamente o caso que tu levantou lá no comentário do código.

por que isso mata as tuas três objeções

Fluxo dinâmico: o laço não sabe quantas vezes vai rodar. Pode ser 1, pode ser 30. Condição indeterminada de verdade, sem contador auxiliar nenhum.

Comportamento imprevisível: pode repetir o mesmo número, pode vir em qualquer ordem. É o "fator humano" que tu descreveu no exemplo do caixa eletrônico.

Sem array, sem leitura de terminal: só com o que tu já viu até aqui no curso.

e quando a entrada for de verdade?

Agora vale lembrar: como a gente roda em Node, não tem prompt(). A leitura de terminal vem do módulo readline, e ela é assíncrona — ou seja, não é troca de uma linha só. Fica mais ou menos assim:

import * as readline from "node:readline/promises";

const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
});

let numeroDigitado;
let quantidade = 0;

do {
  const resposta = await rl.question("Digite um número (0 para sair): ");
  numeroDigitado = Number(resposta);

  if (numeroDigitado !== 0) {
    quantidade++;
  }
} while (numeroDigitado !== 0);

console.log("Total de números diferentes de zero: " + quantidade);

rl.close();

O que eu quero que tu repare é o miolo: a condição do while, o if do contador e o console.log final são idênticos aos da versão sorteada. Muda só a linha que produz o valor. A lógica de repetição e a origem do dado são coisas separadas.

a sacada que tu já teve sem perceber

Isso que tu chamou de "roteiro 100% estático" tem nome no mundo real: stub. Quando a gente testa código que depende de fonte externa (usuário, API, banco), troca a fonte real por uma controlada — que é literalmente o que aquele if (passo === 0) do gabarito faz.

E valeu por trazer isso com esse nível de detalhe. Comentário assim é o que faz o curso melhorar.

Abraço!

ensaio 1:
Digitou: 8
Digitou: 3
Digitou: 7
Digitou: 7
Digitou: 5
Digitou: 8
Digitou: 4
Digitou: 1
Digitou: 3
Digitou: 0
Total de números diferentes de zero: 9

ensaio 2:
Digitou: 2
Digitou: 3
Digitou: 4
Digitou: 9
Digitou: 7
Digitou: 6
Digitou: 3
Digitou: 2
Digitou: 8
Digitou: 9
Digitou: 4
Digitou: 1
Digitou: 9
Digitou: 4
Digitou: 3
Digitou: 10
Digitou: 7
Digitou: 10
Digitou: 10
Digitou: 8
Digitou: 4
Digitou: 4
Digitou: 5
Digitou: 3
Digitou: 7
Digitou: 9
Digitou: 9
Digitou: 1
Digitou: 7
Digitou: 7
Digitou: 1
Digitou: 8
Digitou: 0
Total de números diferentes de zero: 32

Ensaio 3:
Digitou: 10
Digitou: 7
Digitou: 9
Digitou: 8
Digitou: 9
Digitou: 2
Digitou: 2
Digitou: 0
Total de números diferentes de zero: 7

Ensaio 4:
Digitou: 5
Digitou: 8
Digitou: 2
Digitou: 8
Digitou: 5
Digitou: 9
Digitou: 5
Digitou: 5
Digitou: 8
Digitou: 7
Digitou: 0
Total de números diferentes de zero: 10

Ensaio 5:
Digitou: 4
Digitou: 9
Digitou: 8
Digitou: 1
Digitou: 0
Total de números diferentes de zero: 4

uma dúvida técnica, posso dizer que Math.floor( ) e Math.random( ) são um método ou uma função?

o Do...While funcionou perfeitamente, mas consegui compreender profundamente o código rodando um sorteio, apresentando o número sorteado, e computando via incremento a quantidade a cada numeroDigitado !== 0 .

Só confesso que ainda preciso de mais algumas horas voos para conseguir traduzir a questão a com a elegância que você escreveu o código.

let numeroDigitado;
let quantidade = 0;

do {
  numeroDigitado = Math.floor(Math.random() * 11);
  console.log("Digitou: " + numeroDigitado); // número digitado sendo alterado a cada novo ciclo

  if (numeroDigitado !== 0) {
    quantidade++;  // incremento para contar os casos dos números digitados diferentes de zero
  }
} while (numeroDigitado !== 0); // Condição para que laço se encerre

console.log("Total de números diferentes de zero: " + quantidade);

Eu não conhecia a funções/métodos para rodar o sorteio randômico, não sabia desse potencial estocástico do JS, mas gostei e quero ficar bom o suficiente para saber o que mais posso fazer com o JS

Ps.: Já cheguei na parte do readline neste fim de semana, e foi muito satisfatório ver o Do ... while funcionando através do readline.

import * as readline from "node:readline/promises";

const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
});

let numeroDigitado;
let quantidade = 0;

do {
  const resposta = await rl.question("Digite um número (0 para sair): ");
  numeroDigitado = Number(resposta); // a minha resposta está como o argumento do Number ou vem do conjunto Number(resposta)? ainda estou me aprofundando sobre readline.

  if (numeroDigitado !== 0) {
    quantidade++;
  }
} while (numeroDigitado !== 0);

console.log("Total de números diferentes de zero: " + quantidade);

rl.close();