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

Dúvida sobre o usuário poder inserir um número real. (2° TÓPICO)

Tive que criar outro tópico porque acabei marcando o anterior como resolvido sem querer.

Essa era minha dúvida inicial:

"Primeiramente, este foi o código que digitei. Eu fiquei bem satisfeito, apesar de ter atolado em algumas partes kkkk. Mas é da vida!

Dúvida abaixo do código..."

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

    function pularLinha() {

        document.write("<br><br>");
    }

    function mostrar(frase) {

        document.write(frase);
        pularLinha();
    }

    function sorteia(n) {

        return Math.round(Math.random() * n);
    }

    var numeroSorte = sorteia(10);
    console.log(numeroSorte);

    var chuteUsuario = parseInt(prompt("Chute um número de 0 a 10:"));

    if (chuteUsuario == numeroSorte) {

        mostrar("Parabéns, você acertou! O número sorteado pelo computador foi " + numeroSorte + " =)");

    } else {

        if (chuteUsuario > numeroSorte) {

            mostrar("Que pena, o número que você chutou é maior do que o sorteado pelo computador =(");
            mostrar("O número que o computador sorteou foi " + numeroSorte + ".");

        } else {

            mostrar("Que pena, o número que você chutou é menor do que o sorteado pelo computador =("); 
            mostrar("O número que o computador sorteou foi " + numeroSorte + ".");
        }

    }

</script>

"Bom, quando chamo o prompt, antes dele, eu especifico que quero um número inteiro através do parseInt correto? Mas, e seu exibisse para o usuário a seguinte mensagem: "Chute um número real igual ou menor que 10", como eu faria isso? Tem alguma função no JS que me permita trabalhar com números reais? Detalhe, tem que funcionar do mesmo jeito tanto pra quando o usuário digitar um inteiro ou um número com vírgula (claro, estou ciente que é usado o ponto no lugar da vírgula).

Só uma observação, eu ainda estou aprendendo a lógica de programação então, tente me explicar de uma forma condizente com conhecimento de alguém que está dando os primeiros passos ok!? Desde de já sou grato pela compreensão."

Aí um cara me respondeu:

"Fala Vinicius, Tudo bem?

Fiz algumas alterações tentando chegar no resultado que eu entendi que você queria na dúvida enviada.

Comentei as linhas que alterei no código tentando deixar claro o meu raciocínio para chegar no resultado final."

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

    function pularLinha() {

        document.write("<br><br>");
    }

    function mostrar(frase) {

        document.write(frase);
        pularLinha();
    }

    function sorteia(n) {
        // criei uma variável para receber o numero sorteado, sem arredondar com a função Round()
        var sorteado = Math.random() * n;

        // estou retornando, como resultado final da função, o número sorteado
        // fixei o número de casas decimais para 1 através do método 'toFixed' passado 1 como parâmetro indicando que quero apenas 1 casa decimal
        // usei o método para strings 'replace' e informei para o javascript alterar tudo que for '.' para ','
        return sorteado.toFixed(1).replace('.',',')
    }

    var numeroSorte = sorteia(10);
    console.log(numeroSorte);

    // como o JS já transformou o resultado do número sorteado para string (utilizando o toFixed já altera o tipo numero para tipo string) eu retirei a função que transforma o numero digitado para tipo number
    // todo prompt recebido é uma string. Então não mudei mais nada no código. A comparação lógica vai ser string == string
    var chuteUsuario = prompt("Chute um número de 0 a 10:");
    console.log(chuteUsuario)
    if (chuteUsuario == numeroSorte) {

        mostrar("Parabéns, você acertou! O número sorteado pelo computador foi " + numeroSorte + " =)");

    } else {

        if (chuteUsuario > numeroSorte) {

            mostrar("Que pena, o número que você chutou é maior do que o sorteado pelo computador =(");
            mostrar("O número que o computador sorteou foi " + numeroSorte + ".");

        } else {

            mostrar("Que pena, o número que você chutou é menor do que o sorteado pelo computador =("); 
            mostrar("O número que o computador sorteou foi " + numeroSorte + ".");
        }

    }

</script>
4 respostas

Em seguida respondi:

"Fala camarada! Então, não é bem isso que eu queria, pois por exemplo, eu abri o programa e no console vi que o número sorteado era 7,0, assim, eu digitei 7 como chute, só que, o programa me mostrou que eu havia errado. Vou tentar reformular as perguntas pois acho que não fui muito feliz nas anteriores haha.

1) Eu quero saber se há uma função* que converta qualquer número que o usuário digitar através do prompt para número real. Da mesma forma que o parseInt converte para número inteiro, quero saber se tem outra função que converta para um número real, ou seja, número com vírgula mas, não literalmente com vírgula.

*Quando estudei um pouquinho de python 3, tinha uma função chamada "float", que, se eu digitasse 1, por exemplo, através da interação com o usuário, ela convertia esse 1 para 1.0.

2) Daí digamos que o programa sorteie o número 7.0 e eu digite apenas 7, logo, eu devo acertar pois matematicamente falando, 7 possui o mesmo valor de 7.0. Claro que se o programa sortear por exemplo 3.1, aí eu vou ter que digitar exatamente 3.1 mesmo!

Percebi também que pedir para o usuário poder digitar qualquer número real menor ou igual a dez é loucura de mais pois ele simplesmente poderia escrever 0.97438765873 ou qualquer outro que seria impossível de acertar. Então acho melhor especificar que o prompt pedirá ao usuário que digite um número real de no máximo uma casa decimal que seja menor ou igual a dez. Assim, ele não poderá digitar um número como 0.76 ou 0.93764, somente 0.7 ou 0.9.

Desculpe pelo trabalhão!"

Essas são as dúvidas.

Fala Vinicius,

Acabei entendendo errado, né? kkk

Acho que consegui compreender melhor tua dúvida e a solução me pareceu até mais simples que a primeira que te enviei.

Segue abaixo comentado.

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

    function pularLinha() {

        document.write("<br><br>");
    }

    function mostrar(frase) {

        document.write(frase);
        pularLinha();
    }

    function sorteia(n) {

        var sorteado = Math.random() * n;
        // Adicionei a funçao parseFloat para permitir que seja decimal !ATENÇÃO! não adiciona .0 quando for .0 igual no python mas permite que 1.0 seja igual a 1
        // Explico mais por dentro do return: pegamos o numero sorteado e transformamamos em string para adicionar 1 casa decimal. Depois envolvemos essa string no parseFloat para transformar em número.
        return parseFloat(sorteado.toFixed(1));
    }

    var numeroSorte = sorteia(10);
    console.log(numeroSorte);

    // tratei o valor recebido no prompt para permitir que o usuario envie o numero a virgula.
    // fiz a substituição da virgula para ponto e transformei o valor em number para permitir a comparação com o numero sorteado
    var chuteUsuario = parseFloat(prompt("Chute um número de 0 a 10:").replace(',','.'));
    console.log(chuteUsuario);

    if (chuteUsuario == numeroSorte) {

        mostrar("Parabéns, você acertou! O número sorteado pelo computador foi " + numeroSorte + " =)");

    } else {

        if (chuteUsuario > numeroSorte) {

            mostrar("Que pena, o número que você chutou é maior do que o sorteado pelo computador =(");
            mostrar("O número que o computador sorteou foi " + numeroSorte + ".");

        } else {

            mostrar("Que pena, o número que você chutou é menor do que o sorteado pelo computador =(");
            mostrar("O número que o computador sorteou foi " + numeroSorte + ".");
        }

    }

</script>

Dá uma testada e confere se é isso mesmo para me dar um feedback, por favor.

Abraço.

Meu amigo, que show!!!!!! Era isso mesmo! Funcionou do jeito que especifiquei.

Percebi que o segredo tá no bloco da função sorteia e preciso dar uma analisada com mais calma nele para entender profundamente o que que tá acontecendo kk.

Mas não entendi direito esse seu comentário:

// Adicionei a funçao parseFloat para permitir que seja decimal !ATENÇÃO! não adiciona .0 quando for .0 igual no python mas permite que 1.0 seja igual a 1

Consegue me explicar melhor por favor?

Outra dúvida é que, o replace serve para permitir que o usuário possa digitar um número tanto com vírgula quanto com o ponto? E também, não importa como ele digite, seja com ponto, vírgula ou sem nenhum dos dois, pois no final será convertido pelo parseFloat né?

solução!

Vinicius,

Sobre o comentário eu quis deixar claro que, caso o Math.random escolhesse o 1.0 não iria aparecer 1.0 no console e sim apenas 1, entende?

O replace é um método de string que substitui qualquer valor por outro. A sintaxe é replace('alterarEsteValor','porEste')

No seu caso ficou replace(',','.') para substituir virgula por ponto.

Caso o usuário insira o ponto, o replace não irá agir e o código segue normalmente.

Qualquer valor digitado será convertido para number float por conta da função parseFloat que colocamos ali.

Se você inserir um texto, o console irá mostrar um NaN (not a number). Não é possível converter letra e número, neste caso. Uma forma de assegurar que receberemos um número ali é verificarmos se o que foi digitado é uma letra.

Lembra que se for digitado uma letra será retornar um NaN? Podemos verificar usando essa informação inserindo um laço de repetição while. Enquanto for NaN pediremos que o usuário corrija o input por um número.

O código abaixo deve ser inclído logo após o recebimento do prompt e antes da verificação if.

while (isNaN(chuteUsuario)) {
    chuteUsuario = parseFloat(prompt('Você digitou um número inválido. Tente novamente.'))
}

Segue abaixo código completo.

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

    function pularLinha() {

        document.write("<br><br>");
    }

    function mostrar(frase) {

        document.write(frase);
        pularLinha();
    }

    function sorteia(n) {

        var sorteado = Math.random() * n;
        // Adicionei a funçao parseFloat para permitir que seja decimal !ATENÇÃO! não adiciona .0 quando for .0 igual no python mas permite que 1.0 seja igual a 1
        // Explico mais por dentro do return: pegamos o numero sorteado e transformamamos em string para adicionar 1 casa decimal. Depois envolvemos essa string no parseFloat para transformar em número.
        return parseFloat(sorteado.toFixed(1));
    }

    var numeroSorte = sorteia(10);
    console.log(numeroSorte);

    // tratei o valor recebido no prompt para permitir que o usuario envie o numero a virgula.
    // fiz a substituição da virgula para ponto e transformei o valor em number para permitir a comparação com o numero sorteado
    var chuteUsuario = parseFloat(prompt("Chute um número de 0 a 10:").replace(',', '.'));
    console.log(chuteUsuario);

    while (isNaN(chuteUsuario)) {
        chuteUsuario = parseFloat(prompt('Você digitou um número inválido. Tente novamente.'))
    }

    if (chuteUsuario == numeroSorte) {

        mostrar("Parabéns, você acertou! O número sorteado pelo computador foi " + numeroSorte + " =)");

    } else {

        if (chuteUsuario > numeroSorte) {

            mostrar("Que pena, o número que você chutou é maior do que o sorteado pelo computador =(");
            mostrar("O número que o computador sorteou foi " + numeroSorte + ".");

        } else {

            mostrar("Que pena, o número que você chutou é menor do que o sorteado pelo computador =(");
            mostrar("O número que o computador sorteou foi " + numeroSorte + ".");
        }

    }

</script>