2016-11-17 10 views
1

このアルゴリズムの目的は、変更の整理された配列(通貨付き)を返すことです。私は休憩を入れても無限ループです。

"change"が0以上でないwhileループ関数の各ループ(つまりnot -ve)の間、 "change"が0でない限り、whileループwhileループを作成しました。

私は何が欠けていますか?

// 
function checkCashRegister(price, cash, cid) { 
    var change = cash-price; 
    var chArr = [["PENNY", 0], 
["NICKEL", 0], 
["DIME", 0], 
["QUARTER", 0], 
["ONE", 0], 
["FIVE", 0], 
["TEN", 0], 
["TWENTY", 0], 
["ONE HUNDRED", 0]]; 

    while (change !== 0) { 
    while (change - 100 > 0) { 
     chArr[8][1] += 100; 
     change -=100; 
     if (change <= 0) {break;} 
    } 
    while (change - 20 > 0) { 
     chArr[7][1] += 20; 
     change -=20; 
     if (change <= 0) {break;} 
    } 
    while (change - 10 > 0) { 
     chArr[6][1] += 10; 
     change -=10; 
     if (change <= 0) {break;} 
    } 
    while (change - 5 > 0) { 
     chArr[5][1] += 5; 
     change -=5; 
     if (change <= 0) {break;} 
    } 
    while (change - 1 > 0) { 
     chArr[4][1] += 1; 
     change -=1; 
     if (change <= 0) {break;} 
    } 
    while (change - 0.25 > 0) { 
     chArr[3][1] += 0.25; 
     change -=0.25; 
     if (change <= 0) {break;} 
    } 
    while (change - 0.1 > 0) { 
     chArr[2][1] += 0.1; 
     change -=0.1; 
     if (change <= 0) {break;} 
    } 
    while (change - 0.05 > 0) { 
     chArr[1][1] += 0.05; 
     change -=0.05; 
     if (change <= 0) {break;} 
    } 
    while (change - 0.01 > 0) { 
     chArr[0][1] += 0.01; 
     change -=0.01; 
     if (change <= 0) {break;} 
    } 
    if (change <= 0) {break;} 

    } 
    // Here is your change, ma'am. 
    return chArr; 
} 

checkCashRegister(17.46, 20.00, [["PENNY", 1.01], ["NICKEL", 2.05], ["DIME", 3.10], ["QUARTER", 4.25], ["ONE", 90.00], ["FIVE", 55.00], ["TEN", 20.00], ["TWENTY", 60.00], ["ONE HUNDRED", 100.00]]); 
+0

あなたは内側のループからちょうど壊れていますか? –

+1

このコードのような音はあまりにも複雑です... – Amessihel

+0

@Thomas外側のループにも余裕があります。しかし、ええ、それはあまりにも複雑です – Hespen

答えて

3

単なる現金部品をチェックし、残りが変更よりも大きい場合は小切手のみを使用する必要があります。 whileループの中でブレーク条件は必要ありません。

欠けているのは、変更が十分かどうかを確認することです。ここ

function checkCashRegister(price, cash, cid) { 
 
    var change = cash-price; 
 
    var chArr = [["PENNY", 0], ["NICKEL", 0], ["DIME", 0], ["QUARTER", 0], ["ONE", 0], ["FIVE", 0], ["TEN", 0], ["TWENTY", 0], ["ONE HUNDRED", 0]]; 
 

 
    while (change >= 100 && cid[8][1] >= 100) { 
 
     chArr[8][1] += 100; 
 
     cid[8][1] -= 100; 
 
     change -=100; 
 
    } 
 
    while (change >= 20 && cid[7][1] >= 20) { 
 
     chArr[7][1] += 20; 
 
     cid[7][1] -= 20; 
 
     change -=20; 
 
    } 
 
    while (change >= 10 && cid[6][1] >= 10) { 
 
     chArr[6][1] += 10; 
 
     cid[6][1] -= 10; 
 
     change -=10; 
 
    } 
 
    while (change >= 5 && cid[5][1] >= 5) { 
 
     chArr[5][1] += 5; 
 
     cid[5][1] -= 5; 
 
     change -=5; 
 
    } 
 
    while (change >= 1 && cid[4][1] >= 1) { 
 
     chArr[4][1] += 1; 
 
     cid[4][1] -= 1; 
 
     change -=1; 
 
    } 
 
    while (change >= 0.25 && cid[3][1] >= 0.25) { 
 
     chArr[3][1] += 0.25; 
 
     cid[3][1] -= 0.25; 
 
     change -=0.25; 
 
    } 
 
    while (change >= 0.1 && cid[2][1] >= 0.1) { 
 
     chArr[2][1] += 0.1; 
 
     cid[2][1] -= 0.1; 
 
     change -=0.1; 
 
    } 
 
    while (change >= 0.05 && cid[1][1] >= 0.05) { 
 
     chArr[1][1] += 0.05; 
 
     cid[1][1] -= 0.05; 
 
     change -=0.05; 
 
    } 
 
    while (change > 0 && cid[0][1] >= 0.01) { 
 
     chArr[0][1] += 0.01; 
 
     cid[0][1] -= 0.01; 
 
     change -=0.01; 
 
    } 
 
    
 
    // Here is your change, ma'am. 
 
    return chArr; 
 
} 
 

 
var register1 = [["PENNY", 1.01], ["NICKEL", 2.05], ["DIME", 3.10], ["QUARTER", 4.25], ["ONE", 90.00], ["FIVE", 55.00], ["TEN", 20.00], ["TWENTY", 60.00], ["ONE HUNDRED", 100.00]], 
 
    register2 = [["PENNY", 1.01], ["NICKEL", 2.05], ["DIME", 3.10], ["QUARTER", 4.25], ["ONE", 90.00], ["FIVE", 55.00], ["TEN", 20.00], ["TWENTY", 60.00], ["ONE HUNDRED", 100.00]]; 
 

 
console.log(checkCashRegister(17.46, 20.00, register1)); 
 
console.log(register1); 
 

 
console.log(checkCashRegister(19.50, 20.00, register2)); 
 
console.log(register2);
.as-console-wrapper { max-height: 100% !important; top: 0; }

+0

もちろん、コインの値を配列に入れて、forループを1つの周りに置くこともできます。しかし、彼のためにその仕事をしません:-) – RemcoGerlich

+0

なぜモジュロですか? – mplungjan

+1

すべての '>'は '> ='でなければなりません。 – RemcoGerlich

-1

理由である:各種類の最終的なコインは、アレイに追加されることはありません。

量が0.02,2セントであるとします。最終的なループでは、

while (change - 0.01 > 0) { 
    chArr[0][1] += 0.01; 
    change -=0.01; 
    if (change <= 0) {break;} 
} 

ガード(0.02 - 0.01 > 0)は真であるので、ループが入力され、変化が0.01となります。

次回、0.01 - 0.01 > 0であり、偽であるため、ループは入力されません。

そして外側のループは何度も繰り返し実行されます。これは、変更が0.01のままであり、決して低くなることはないからです。

>>=である必要があります。その後、すべてのブレークと外側のループ全体を削除することができます。

+0

ありがとう、それは動作します – BahaaZidan

+0

私は本当になぜこれがdownvotedされたのだろうか。 – RemcoGerlich

0

私はあなたのコードを再考すべきだと思う:

function checkCashRegister(price, cash) { 
    var change = cash - price; 

    var chObj = { 
    PENNY: 0, 
    NICKEL: 0, 
    QUARTER: 0, 
    ONE: 0, 
    FIVE: 0, 
    TEN: 0, 
    TWENTY: 0, 
    ONE_HUNDRED: 0 
    } 

    // Performs an euclidian division to get the quotient 
    // (in 750$, there are 7 times 100 ie quotient = 7)  
    chObj.ONE_HUNDRED = Math.floor(change/100); 
    // Now get the remainder (750 minus 7 times 100) 
    change = change % 100; 

    // So on... 
    chObj.TWENTY = Math.floor(change/20); 
    change = change % 20; 

    chObj.TEN = Math.floor(change/10); 
    change = change % 10; 

    chObj.FIVE = Math.floor(change/5); 
    change = change % 5; 

    chObj.ONE = Math.floor(change); 

    change = Math.floor((change - Math.floor(change)) * 100); 

    chObj.QUARTER = Math.floor(change/20)/100; 
    change = change % 25; 

    chObj.NICKEL = Math.floor(change/10)/100; 
    change = change % 10; 

    chObj.NICKEL = Math.floor(change)/100; 

    return chObj; 
} 

var chObj = checkCashRegister(245, 1000); 

for (var key in chObj) { 
    if (chObj.hasOwnProperty(key)) { 
    console.log(key + " : \t" + chObj[key]); 
    } 
} 

結果(コンソールを通して見ることができる):

PENNY :  0 
NICKEL : 0 
QUARTER : 0 
ONE : 0 
FIVE : 1 
TEN : 1 
TWENTY : 2 
ONE_HUNDRED : 7 

それはより向上させることが可能と私は思います。バイブルhereを参照してください。

+0

これは現金帳簿に各金種の無制限の金額があることを前提としています – mplungjan

+0

アスカーのコードは同じものと想定していますか? – Amessihel

+0

はい、その意図ははっきりしています - モジュロを使用するための依然の功績 – mplungjan

0

あなたの問題は、あなたが0に等しいかどうかをチェックしているし、あなたの実際の値が0.00であるということです.. [何か]あなたは文がif (change.toFixed(2) <= 0) {break;}

する場合、それは既知の問題 here

変更最後のだということを見ることができます

私はこの種の問題を回避するために、あなたのお金の計算をセントにするように変更することをお勧めします(1.0 $使用100セントではなく)。

関連する問題