美文网首页让前端飞
【Javascript】收银找零程序

【Javascript】收银找零程序

作者: 雨水之后 | 来源:发表于2017-11-30 13:38 被阅读0次

设计一个收银程序checkCashRegister(),其把购买价格(price)作为第一个参数,付款金额 (cash)作为第二个参数,和收银机中零钱 (cid) 作为第三个参数。

cid是一个二维数组,存着当前可用的找零,如:

[
    ["PENNY", 1.01], //1分
    ["NICKEL", 2.05], //5分
    ["DIME", 3.10], //10分
    ["QUARTER", 4.25], //25分
    ["ONE", 90.00], //100分
    ["FIVE", 55.00], //500分
    ["TEN", 20.00], //1000分
    ["TWENTY", 60.00], //2000分
    ["ONE HUNDRED", 100.00] //10000分
]

当收银机中的钱不够找零时返回字符串 “Insufficient Funds”。

如果正好则返回字符串 “Closed”。

否则,返回应找回的零钱列表,且由大到小存在二维数组中。

function checkCashRegister(price, cash, cid) {

  //全部变成以“分”为单位
  price *= 100;
  cash *= 100;

  //计算应找数额
  //用changeLeft记录每一轮找钱之后的剩余应找数额
  var change = cash - price;
  var changeLeft = change;

  //定义结果数组
  var result = [];

  //获取收银机内总钱数(分)
  function getCidTotal(cid){
    var total = 0;
    for(var i=0;i<cid.length;i++){
      total += cid[i][1];
    }
    return total.toFixed(2)*100;
  }

  var cidTotal = getCidTotal(cid);

  //如果应找数额大于收银机内总钱数,那明显钱不够找的
  if(change > cidTotal){
    return "Insufficient Funds";
  }
  //刚好相等的话,就肯定要“closed”了
  else if(change === cidTotal){
    return "Closed";
  }

  //创建一个对象,存放每种面额的单位(分)
  var coinValueObj = {
    "PENNY": 1,
    "NICKEL": 5,
    "DIME": 10,
    "QUARTER": 25,
    "ONE": 100,
    "FIVE": 500,
    "TEN": 1000,
    "TWENTY": 2000,
    "ONE HUNDRED": 10000
  };

  //一个个面额去检查够不够找
  //从大面额往小面额循环,以此保证大面额能率先被用掉
  for(var i=cid.length-1;i>=0;i--){

    var coinName = cid[i][0]; //获取面额名称
    var coinTotal = cid[i][1]*100; //获取该面额现有钱数(分)
    var coinValue = coinValueObj[coinName]; //获取该面额的单位(分)
    var coinAmount = coinTotal / coinValue;  //获取该面额的单位数量

    var toReturn = 0;  //记录应该返回result的面额单位的数量

    //如果应找数额大于等于该面额单位面值,同时该面额单位数量大于0的话,那就证明这个面额还有的找
    while(changeLeft >= coinValue && coinAmount > 0){
      changeLeft -= coinValue;
      coinAmount--;
      toReturn++;
    }

    //当应返回的面额单位数量大于0时,就可以把这个面额的名字和已经减掉的数额插进result数组内
    if(toReturn > 0){
      result.push([coinName,toReturn*coinValue/100]);
    }

  }

  //如果最终result数组内的总钱数依然无法与应找数额配平,那就证明:尽管应找金额小于收银机内的总钱数,但有些面额是找不开的
  //比如现在要找400分,可是你整个收银机里只有一个500分硬币,那么你也是无法找钱的,你总不能亏100分然后找出去吧?
  if(getCidTotal(result)!==change){
    return "Insufficient Funds";
  }

  //返回结果数组
  return result;

}

THE END.

相关文章

网友评论

    本文标题:【Javascript】收银找零程序

    本文链接:https://www.haomeiwen.com/subject/qyjvbxtx.html