Je suis toujours un débutant, un noob total ici, alors soyez patient, je suis tombé sur cet exercice qui consiste essentiellement à répartir le montant de pennys / cents en un nombre suffisant de pièces de 25,10,5,2,1.

J'essayais d'écrire uniquement avec des conditionnelles comme j'apprends encore, donc je ne suis pas familier avec les fonctions intégrées.

La fonction fonctionne bien avec le nombre 65 testé, donnant un tableau de 25, 25, 10, 5 respectivement

Cependant, lorsque j'ai testé avec le nombre 46, cela a donné un tableau de 25, 25, 10,, 5 25, 10, 10, 1, ce qui est évidemment faux et quelque chose ne va clairement pas avec ma fonction.

Pourriez-vous s'il vous plaît me signaler l'erreur.

Voici mon code et merci d'avance.

var co = [];
function coin(n){ //46


// co = [25,]


    if (n>=25){
        co.push("25");
        n = n-25;
        coin(n);
    }

    else if (n>=10){
        co.push("10");
        n = n-10;
        coin(n);
    }


    else if (n>=5){
        co.push("5");
        n = n -5;
        coin(n);
    }

    else if (n>=2){
        co.push("2");
        n = n - 2;
        coin(n);
    }

    else if (n>=1){
        co.push("1");
        n = n - 1;
        coin(n);
    }




    else if (n == 0){console.log(co);}


}
4
Mohamed Hegazy 7 mars 2016 à 03:02

4 réponses

Meilleure réponse

Le problème est que vous n'effacez pas le tableau lorsque vous appelez la fonction pour la deuxième fois. Vous devrez l'effacer à chaque fois.

Vous pouvez créer une nouvelle fonction Countcoin(n)

function Countcoin(n){
    co = [];
    coin(n)
}

Et appelez maintenant cette fonction au lieu de coin


Ou vous ne pouvez créer qu'une seule fonction mais en utilisant une boucle, pas une récursivité.

var co = [];
function coin(n){ 
    co=[];
    while(n!=0){
        if (n>=25){
            co.push("25");
            n = n-25;
        }
        else if (n>=10){
            co.push("10");
            n = n-10;
        }
        else if (n>=5){
            co.push("5");
            n = n -5;
        }
        else if (n>=2){
            co.push("2");
            n = n - 2;
        }
        else if (n>=1){
            co.push("1");
            n = n - 1;
        }
    }
    console.log(co);
}
3
Yazan W Yusuf 7 mars 2016 à 00:18

Vous pouvez effectuer chaque condition en:

  1. Division simple (arrondie vers le bas)

  2. Assignez le quotient à un var ou à un élément (comme une balise de sortie)

  3. Utilisez le modulo pour le prochain conditionnel

Extrait

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<style>
fieldset { width: 20ex; font: 400 16px/1.4 'consolas'; color: #00e; }
legend { font:inherit; font-size: 1.25rem; }
input, label, output { padding: 1px 3px; font:inherit;}
input { width: 7ex; }
output { width: 5ex; }
</style>
</head>

<body>
<header></header>
<form id="change" name="change">
<fieldset>
<legend>coinCounter</legend>
<label for="inp1">$</label><input id="inp1" name="inp1" placeholder="0.00"><br/>
<label for="q">Quarters: </label><output id="q" name="q" for="inp1">0</output><br/>
<label for="d">Dimes:&nbsp;&nbsp;&nbsp; </label><output id="d" name="d" for="inp1">0</output><br/>
<label for="n">Nickels:&nbsp; </label><output id="n" name="n" for="inp1">0</output><br/>
<label for="p">Pennies:&nbsp; </label><output id="p" name="p" for="inp1">0</output>
</fieldset>
</form>
<footer>Hit <kbd>&#9166; Return</kbd> before typing</footer>

<script>
var inp1 = document.getElementById('inp1');

inp1.addEventListener('input', function(e) {
	delay(coinCounter(this.value), 5000 );
}, false);

function coinCounter($) {
	var denomination = $.split('.');
	var dollars = Number(denomination[0] * 100);
	console.log('dollars: '+dollars);
	var cents = Number(denomination[1]);
	console.log('cents: '+cents);
  var total = Number(dollars + cents);
  console.log('total: '+total);
	var modQ, modD, modN;
	
	if(total >= 25){
		var quarter = Math.floor(total / 25);
		console.log('quarters: '+quarter);
		document.getElementById('q').innerHTML = quarter;
	}
	modQ = total % 25;
	
	if(modQ >= 10){
		var dime = Math.floor(modQ / 10);
		console.log('dimes: '+dime);
		document.getElementById('d').innerHTML = dime;
	}
	modD = modQ % 10;
	
	if(modD >= 5){
		var nickel = Math.floor(modD / 5);
		console.log('nickels: '+nickel);
		document.getElementById('n').innerHTML = nickel;
	}
	modN = modD %  5;
	
	if(modN){
		var penny = Math.floor(modN);
		console.log('pennies: '+penny);
		document.getElementById('p').innerHTML = penny;
	}
	else {
		modN = 0;
	}
  return false;
}

var delay = (function(){
  var timer = 0;
  return function(callback, ms){
  clearTimeout (timer);
  timer = setTimeout(callback, ms);
 };
})();
</script>
</body>
</html>
1
zer00ne 7 mars 2016 à 04:08

Puisque vous avez mentionné que vous appreniez, j'ai pensé proposer une méthode alternative - j'ai fourni une ventilation étape par étape.

Fonctions intégrées utilisées:

Array.prototype.reduce - s'applique une fonction par rapport à un accumulateur et chaque valeur du tableau (de gauche à droite) pour le réduire à une seule valeur.

function coins(cents) {
    return [25, 10, 5, 1].reduce(function(totalDenoms, denom) {

    // if we have any values for this denomination, add it to the final array
    for (var i = 0; i < Math.floor(cents/denom); i++) {
        totalDenoms.push(denom);
    }

    // set the remaining amount of cents to process
    cents = cents % denom;

    // return the accumulated totals
    return totalDenoms;

    }, []);
}
1
bruchowski 7 mars 2016 à 23:59

Votre code fonctionne très bien. Mais vous ne disposez que d'un tableau global co qui conserve la réponse précédente. Je pense donc que vous devriez initialiser un tableau à l'intérieur de votre fonction, puis le renvoyer.

1
forehead_sniffer 7 mars 2016 à 00:06