天天看點

[JavaScript] 小練習 Cash Register 找零錢

原題:

Design a cash register drawer function 

checkCashRegister()

that accepts purchase price as the first argument (

price

), payment as the second argument (

cash

), and cash-in-drawer (

cid

) as the third argument.

cid 

is a 2D array listing available currency.

The 

checkCashRegister()

function should always return an object with a  

status 

key and a 

change 

key.

為幫助了解,提供正确的輸入與輸出對如下:

checkCashRegister(19.5, 20, [["PENNY", 1.01], ["NICKEL", 2.05], ["DIME", 3.1], ["QUARTER", 4.25], ["ONE", 90], ["FIVE", 55], ["TEN", 20], ["TWENTY", 60], ["ONE HUNDRED", 100]]) should return an object.
           
checkCashRegister(19.5, 20, [["PENNY", 1.01], ["NICKEL", 2.05], ["DIME", 3.1], ["QUARTER", 4.25], ["ONE", 90], ["FIVE", 55], ["TEN", 20], ["TWENTY", 60], ["ONE HUNDRED", 100]]) should return {status: "OPEN", change: [["QUARTER", 0.5]]}.
           
checkCashRegister(3.26, 100, [["PENNY", 1.01], ["NICKEL", 2.05], ["DIME", 3.1], ["QUARTER", 4.25], ["ONE", 90], ["FIVE", 55], ["TEN", 20], ["TWENTY", 60], ["ONE HUNDRED", 100]]) should return {status: "OPEN", change: [["TWENTY", 60], ["TEN", 20], ["FIVE", 15], ["ONE", 1], ["QUARTER", 0.5], ["DIME", 0.2], ["PENNY", 0.04]]}.
           
checkCashRegister(19.5, 20, [["PENNY", 0.01], ["NICKEL", 0], ["DIME", 0], ["QUARTER", 0], ["ONE", 1], ["FIVE", 0], ["TEN", 0], ["TWENTY", 0], ["ONE HUNDRED", 0]]) should return {status: "INSUFFICIENT_FUNDS", change: []}.
           

請先自行練習,以下為本人編碼,略長,僅供參考。 

function checkCashRegister(price, cash, cid) {
  var change = [];
  var output = {
    status : '',
    change : []
  }
  
  // checkout how much money in total for a 2D array
  function sumAllChanges(arr){
    var sum = 0;
    for(let i=0 ; i< arr.length;i++){
      sum += arr[i][1];
    }
    return sum;
  }

  var changeDue = cash - price;
  var cashierBalance = sumAllChanges(cid);  

  // 3 conditions 
  if(cashierBalance - changeDue == 0){
    output.status = 'CLOSED'
    output.change = cid;
    return output;
    }
    else if (cashierBalance - changeDue < 0){
      output.status = 'INSUFFICIENT_FUNDS';
      return output;
    }
    else {
        var currArr = [[100, 0],[20, 0],[10, 0],[5, 0],[1, 0],[0.25, 0],[0.1, 0],[0.05, 0],[0.01,0]];
        let j = 0;
        while(changeDue && j < currArr.length){
          let changeCalculated = parseInt((changeDue*100)/(currArr[j][0]*100));
          //for certain currency unit, changeAvailable means available units from cid
          let changeAvailable = parseInt((cid[currArr.length-1-j][1]*100)/(currArr[j][0]*100));
          currArr[j][1] = Math.min(changeAvailable,changeCalculated);
          changeDue -= currArr[j][0] * currArr[j][1];
          //!!! this is where error comes from !!!
          changeDue = changeDue.toFixed(2);
          if(currArr[j][1]) {
            let temp=[];
            temp[0] = cid[currArr.length-1-j][0];
            temp[1] = currArr[j][1]*currArr[j][0];
            output.change.push(temp);
          }
          j++;
        }
        if(sumAllChanges(output.change) < changeDue){
          output.status = 'INSUFFICIENT_FUNDS';
          output.change = [];
        } else output.status = 'OPEN';

        return output;
    }
}

checkCashRegister(19.5, 20, [["PENNY", 1.01], ["NICKEL", 2.05], ["DIME", 3.1], ["QUARTER", 4.25], ["ONE", 90], ["FIVE", 55], ["TEN", 20], ["TWENTY", 60], ["ONE HUNDRED", 100]]);
           

繼續閱讀