设计一个收银程序 checkCashRegister() ,其把购买价格(price)作为第一个参数 , 付款金额
(cash)作为第二个参数, 和收银机中零钱 (cid) 作为第三个参数. cid 是一个二维数组,存着当前可用的找零.
当收银机中的钱不够找零时返回字符串 “Insufficient Funds”. 如果正好则返回字符串 “Closed”.
否则,返回应找回的零钱列表,且由大到小存在二维数组中.
这是一些对你有帮助的资源:
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", 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]].
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]]) 应该返回 "Insufficient Funds".
代码如下:
function checkCashRegister(price, cash, cid) {
//先把小数转化为整数 按照分为单位转化
cash = cash * 100;
price = price * 100;
//计算应该找的钱
var change = cash - price,
changeLeft = change;
//获取钱柜中总的钱
var totalCid = getTotalCid(cid);
var result = [];
//如果要找的钱多于钱柜中的零钱返回 Insufficient Funds
if (change > totalCid) {
return 'Insufficient Funds';
} else if (change === totalCid) {//如果要找的钱刚好等于钱柜中的钱返回 Closed
return 'Closed';
}
//取出钱的名称 钱的总数和个数,并按照先找大钱的规则找零 ,把找的零钱存入一个数组中
for (var i = cid.length - 1; i >= 0; i--) {
var coinName = cid[i][0],
coinTotal = cid[i][1] * 100,
coinValue = getValue(coinName),
coinAmount = coinTotal / coinValue,
toReturn = 0;
while (changeLeft >= coinValue && coinAmount > 0) {
changeLeft -= coinValue;
coinAmount--;
toReturn++;
console.log(changeLeft);
}
if (toReturn > 0) {
result.push([coinName, toReturn * (coinValue / 100)]);
}
}
//判断所有的零钱够不够给
if (getTotalCid(result) != change) {
return 'Insufficient Funds';
}
return result;
//返回零钱数组中的所有零钱
function getTotalCid(cid) {
var total = 0;
for (var i = 0; i < cid.length; i++) {
total += cid[i][1] * 100;
}
return total;
}
function getValue(coinOrBill) {
switch (coinOrBill) {
case 'PENNY':
return 1;
case 'NICKEL':
return 5;
case 'DIME':
return 10;
case 'QUARTER':
return 25;
case 'ONE':
return 100;
case 'FIVE':
return 500;
case 'TEN':
return 1000;
case 'TWENTY':
return 2000;
case 'ONE HUNDRED':
return 10000;
}
}
}
// Example cash-in-drawer array:
// [["PENNY", 1.01], 一分钱 101张
// ["NICKEL", 2.05], 五分钱 41张
// ["DIME", 3.10], 一毛钱 31张
// ["QUARTER", 4.25], 2毛5分 17张
// ["ONE", 90.00], 一块钱 90张
// ["FIVE", 55.00], 五块钱 11张
// ["TEN", 20.00], 十块钱 2张
// ["TWENTY", 60.00], 二十块 3张
// ["ONE HUNDRED", 100.00]] 一百块 1张
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]]);