Calculate change and display available notes with Javascript

Asked

Viewed 964 times

3

I have a class activity to do, where I must receive from the user the amount of the purchase and the amount paid, and then display the change. So far ok, only it also asks to display in a textarea the notes used in the change, always informing as few notes as possible, example:

vlrCompra = 53,00
vlrPago = 100,00
vlrTroco = 47,00 

notasTroco = 
4 notas de 10,00
1 nota   de  5,00
2 notas  de  1,00

I have no idea how to do that last part, someone to help me? The notes I have are 1, 5, 10, 50

Here’s what I’ve done so far:

function calculaTroco(){

    var valorCompra = parseFloat($("#valorCompra").val());
    var valorPago = parseFloat($("#valorPago").val());
    var valorTroco = 0;


    if (valorPago == valorCompra){
        valorTroco = 0;
        $("#valorTroco").val(valorTroco);
        alert("Não gerou troco");

    }else if(valorPago > valorCompra){

        valorTroco = valorPago - valorCompra;
        $("#valorTroco").val(valorTroco);

    }else{
        alert("Não gerou troco (Valor pago menor que valor da compra)");
    }

    $("#valorCompra").val("");
    $("#valorPago").val("");
    $("#valorCompra").focus();
}

Remembering that I need to do this part of the notes in another Function, so far we have learned array, for...

Part of HTML:

<!DOCTYPE html>
<html lang="pt-BR">
    <head>
        <meta charset="utf-8"/>
        <title>Calcular Troco</title>
        <script type="text/javascript" src="jquery.js"></script>
    </head>
    <body>

        <form id="formulario">
            <fieldset>
                <legend>Calcular Troco</legend>

                <label for="valorCompra" >Valor da compra:</label>
                <input type="text" id="valorCompra" name="valorCompra" /><br />

                <label for="valorPago" >Valor pago:</label>
                <input type="text" id="valorPago" name="valorPago" /><br /><br />

                <button type="button" id="button" onclick="calculaTroco()">Calcular troco</button><br /><br />

                <label for="valorTroco" >Valor do troco:</label>
                <input type="text" id="valorTroco" name="valorTroco" readonly="readonly"/><br /><br />  

                <label for="notasUtilizadas">Notas utilizadas:</label>
                <textarea rows="3" id="notasUtilizadas" readonly="readonly" ></textarea><br/>

            </fieldset>
        </form>
    <script type="text/javascript" src="troco.js"></script>
    </body>

</html>
  • 2

    I won’t do your exercise for you, but you’ll need to understand about remainder of division and entire division (you can truncate a normal division) to solve your problem.

  • fernandosavio could give me more tips for getting the exercise? I will need to use arrays?

  • You can even use arrays, but it’s not part of your core problem. You need to learn what the division and its rest are for. You need to understand how you figure out how many X’s fit inside as many Y’s...

3 answers

7

This is an example of how to iterate over an array of notes, and use association to store the amount of each. I leave the manipulation of this result to you.

function gerarTroco(valor) {
  // Notas disponíveis
  var notas = [50, 10, 5, 1]
  // Troco é um objeto, associando notas com a quantidade necessária
  var troco = {'50': 0, '10': 0, '5': 0, '1': 0}
  
  // Itero sobre o array de notas
  for (var nota of notas) {
    // Se o valor restante for maior que minha nota atual..
    while (valor >= nota) {
      // incremento a propriedade do objeto correspondente a nota
      troco[nota] += 1
      // e reduzo o valor restante pelo valor da nota
      valor -= nota
    }
  }

  return troco
}

console.log('Troco para 58:', gerarTroco(58))

  • thank you so much for the help user156436

4


Create your own function to calculate notes and use an array of values in descending order:

var notas = [50,10,5,1];

Send the change value to the function and loop the array by deducting the change value by dividing the number of notes x the value of the array note, creating a string with the information that will be sent to the textarea. At the end the function will return the string with the right amount of notes.

Behold:

function calculaTroco(){

    var valorCompra = parseFloat($("#valorCompra").val());
    var valorPago = parseFloat($("#valorPago").val());
    var valorTroco = 0;
    
    if (valorPago == valorCompra){
        valorTroco = 0;
        $("#valorTroco").val(valorTroco);
        alert("Não gerou troco");

    }else if(valorPago > valorCompra){

        valorTroco = valorPago - valorCompra;
        $("#valorTroco").val(valorTroco);
        
        // envia para o textarea o retorno da função calculaNotas
        $("#notasUtilizadas").val(calculaNotas(valorTroco));

    }else{
        alert("Não gerou troco (Valor pago menor que valor da compra)");
    }

    $("#valorCompra").val("");
    $("#valorPago").val("");
    $("#valorCompra").focus();

}

// função para calcular as notas
function calculaNotas(troco){
   var notas = [50,10,5,1];
   var texto = '';
   for(var x=0; x < notas.length; x++){
      if(troco >= notas[x]){
         var div = Math.floor(troco/notas[x]);
         texto += div + " notas de "+notas[x]+"\n";
         troco -= div*notas[x];
      }
      
   }
   return texto;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<form id="formulario">
   <fieldset>
       <legend>Calcular Troco</legend>

       <label for="valorCompra" >Valor da compra:</label>
       <input type="text" id="valorCompra" name="valorCompra" /><br />

       <label for="valorPago" >Valor pago:</label>
       <input type="text" id="valorPago" name="valorPago" /><br /><br />

       <button type="button" id="button" onclick="calculaTroco()">Calcular troco</button><br /><br />

       <label for="valorTroco" >Valor do troco:</label>
       <input type="text" id="valorTroco" name="valorTroco" readonly/><br /><br />  

       <label for="notasUtilizadas">Notas utilizadas:</label>
       <textarea rows="3" id="notasUtilizadas" readonly ></textarea><br/>

   </fieldset>
</form>

  • 2

    Splitting is a very expensive operation and is not necessary, just decrease the value of the change note and only increase the index of the note array when the current note is larger than the change. See user156436 response.

  • 1

    I can even agree that the way the other friend did is much more practical, but in the context of the AP code will take a certain amount of work to assemble the text within the textarea :D

  • 1

    Sam thank you so much, you helped me so much

  • @user156424 You’re welcome, friend. Here’s how to thank on [tour]. Abs!

0

I did once using Node, which worked great!

function sacarDinheiro(valorSaque) {
    let contador100 = 0
    let contador50 = 0
    let contador10 = 0
    let contador5 = 0
    let contador1 = 0
    let valorNota = calcularValorNota(valorSaque)
    while (valorSaque >= valorNota) {
        switch (valorNota) {
            case 100:
                valorSaque -= 100
                contador100++
                break
            case 50:
                valorSaque -= 50
                contador50++
                break
            case 10:
                valorSaque -= 10
                contador10++
                break
            case 5:
                valorSaque -= 5
                contador5++
                break
            case 1:
                contador1++
                valorSaque -= 1
                break
        }

        valorNota = calcularValorNota(valorSaque)

    }
    return elaborarResultado(contador100, contador50, contador10, contador5, contador1)
}

function calcularValorNota(valorSaque) {
    if (valorSaque >= 100) {
        return 100
    } else if (valorSaque >= 50) {
        return 50
    } else if (valorSaque >= 10) {
        return 10
    } else if (valorSaque >= 5) {
        return 5
    } else if (valorSaque >= 1) {
        return 1
    }
}

function elaborarResultado(contador100, contador50, contador10, contador5, contador1) {
    let resultado = ''

    if (contador100 > 0) {
        resultado += `${contador100} nota(s) de R$ 100. `
    }

    if (contador50 > 0) {
        resultado += `${contador50} nota(s) de R$ 50. `
    }

    if (contador10 > 0) {
        resultado += `${contador10} nota(s) de R$ 10. `
    }

    if (contador5 > 0) {
        resultado += `${contador5} nota(s) de R$ 5. `
    }

    if (contador1 > 0) {
        resultado += `${contador1} nota(s) de R$ 1. `
    }

    return resultado
}

console.log(sacarDinheiro(47))
console.log(sacarDinheiro(298));

Browser other questions tagged

You are not signed in. Login or sign up in order to post.