設計一個收銀程序 checkCashRegister()
,其把購買價格(price
)做爲第一個參數 , 付款金額 (cash
)做爲第二個參數, 和收銀機中零錢 (cid
) 做爲第三個參數.數組
cid
是一個二維數組,存着當前可用的找零.測試
當收銀機中的錢不夠找零時返回字符串 "Insufficient Funds
". 若是正好則返回字符串 "Closed
".設計
不然, 返回應找回的零錢列表,且由大到小存在二維數組中.code
checkCashRegister(19.50, 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]])
應該返回一個數組.checkCashRegister(19.50, 20.00, [["PENNY", 0.01], ["NICKEL", 0], ["DIME", 0], ["QUARTER", 0], ["ONE", 0], ["FIVE", 0], ["TEN", 0], ["TWENTY", 0], ["ONE HUNDRED", 0]])
應該返回一個字符串.checkCashRegister(19.50, 20.00, [["PENNY", 0.50], ["NICKEL", 0], ["DIME", 0], ["QUARTER", 0], ["ONE", 0], ["FIVE", 0], ["TEN", 0], ["TWENTY", 0], ["ONE HUNDRED", 0]])
應該返回一個字符串.checkCashRegister(19.50, 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]])
應該返回 [["QUARTER", 0.50]]
.checkCashRegister(3.26, 100.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]])
應該返回 [["TWENTY", 60.00], ["TEN", 20.00], ["FIVE", 15], ["ONE", 1], ["QUARTER", 0.50], ["DIME", 0.20], ["PENNY", 0.04]]
.這個就是平時的自動找零機須要作的代碼。主要是要構建現金面值數組,從大到小找零便可,具體分析見代碼註釋。ip
function checkCashRegister2(price, cash, cid) { // 1. 定義現金面值,經過 100 倍變換爲整數,方便計算 var cashValMap = [ ["ONE HUNDRED", 10000], ["TWENTY", 2000], ["TEN", 1000], ["FIVE", 500], ["ONE", 100], ["QUARTER", 25], ["DIME", 10], ["NICKEL", 5], ["PENNY", 1] ]; // 2. 計算找零的總數 var change= Math.round((cash - price) * 100); // 3. 轉換 cid 數組爲對象,而且加入 total 表示零錢總數 var cidObject = cid.reduce(function(arr, cur) { arr[cur[0]] = Math.round(cur[1] * 100); arr.total += arr[cur[0]]; return arr; }, {total: 0}); // 4. 判斷若是零錢總數和須要找零同樣,則返回 closed if (cidObject.total == change) return "closed"; // 5. 判斷若是零錢總數小於找零數目,則返回 Insufficient Funds if (cidObject.total < change) return "Insufficient Funds"; // 6. 從大到小遍歷現金面值,比較零錢數,計算出合適的找零數目,返回找零數組 var retArr = cashValMap.reduce(function(acc, cur) { var tmp = Math.min(Math.floor(change / cur[1]) * cur[1], cidObject[cur[0]]); change -= tmp; if (tmp > 0) { acc.push([cur[0], parseFloat((tmp / 100).toFixed(2))]); } return acc; }, []); // 7. 判斷是否零錢足夠組合成須要的找零數 if (change !== 0) return "Insufficient Funds"; return retArr; }