freeCodeCamp/guide/chinese/certifications/javascript-algorithms-and-d.../javascript-algorithms-and-d.../cash-register/index.md

7.1 KiB
Raw Blame History

title localeTitle
Cash Register 收银机

:triangular_flag_on_post:如果卡住,请记得使用**Read-Search-Ask** 。尝试配对程序:busts_in_silhouette:并编写自己的代码:pencil:

:checkered_flag:问题说明:

  • 您必须创建一个程序,该程序将返回包含status键和change键的对象。 status的值是字符串INSUFFICIENT_FUNDS CLOSEDOPEN change的值是更改到期的2D数组。

相关链接

  • 数据结构数组

:speech_balloon:提示1

  • 当你事先知道你的登记册中有多少钱时,这会更容易。为此,建议使用函数将此信息分配给变量。然后,您可以查看是否有足够的资金来完成交易并返回更改,或者您是否应关闭注册表。

现在尝试解决问题

:speech_balloon:提示2

  • 当您知道正在使用的每个账单或硬币的价值时这个问题会更容易而不仅仅是寄存器中每个账单或硬币的总和。例如知道镍的价值为0.05以及您在收银机中拥有价值2.05美元的镍币这一事实是有用的。

现在尝试解决问题

:speech_balloon:提示3

  • 在移动到下一个之前,您必须从一种类型的账单或硬币获得尽可能多的更改,从更大到更小的价值。继续前进,直到计算完所有变更为止。

现在尝试解决问题

扰流警报!

警告牌

提前解决!

:beginner:初学者代码解决方案:

// Create an array of objects which hold the denominations and their values 
 var denom = [ 
  { name: 'ONE HUNDRED', val: 100.00}, 
  { name: 'TWENTY', val: 20.00}, 
  { name: 'TEN', val: 10.00}, 
  { name: 'FIVE', val: 5.00}, 
  { name: 'ONE', val: 1.00}, 
  { name: 'QUARTER', val: 0.25}, 
  { name: 'DIME', val: 0.10}, 
  { name: 'NICKEL', val: 0.05}, 
  { name: 'PENNY', val: 0.01} 
 ]; 
 
 function checkCashRegister(price, cash, cid) { 
  var output = { status: null, change: [] }; 
  var change = cash - price; 
 
  // Transform CID array into drawer object 
  var register = cid.reduce(function(acc, curr) { 
    acc.total += curr[1]; 
    acc[curr[0]] = curr[1]; 
    return acc; 
  }, { total: 0 }); 
 
  // Handle exact change 
  if (register.total === change) { 
    output.status = 'CLOSED'; 
    output.change = cid; 
    return output; 
  } 
 
  // Handle obvious insufficient funds 
  if (register.total < change) { 
    output.status = 'INSUFFICIENT_FUNDS'; 
    return output; 
  } 
 
  // Loop through the denomination array 
  var change_arr = denom.reduce(function(acc, curr) { 
    var value = 0; 
    // While there is still money of this type in the drawer 
    // And while the denomination is larger than the change remaining 
    while (register[curr.name] > 0 && change >= curr.val) { 
      change -= curr.val; 
      register[curr.name] -= curr.val; 
      value += curr.val; 
 
      // Round change to the nearest hundreth deals with precision errors 
      change = Math.round(change * 100) / 100; 
    } 
    // Add this denomination to the output only if any was used. 
    if (value > 0) { 
        acc.push([ curr.name, value ]); 
    } 
    return acc; // Return the current change_arr 
  }, []); // Initial value of empty array for reduce 
 
  // If there are no elements in change_arr or we have leftover change, return 
  // the string "Insufficient Funds" 
  if (change_arr.length < 1 || change > 0) { 
    output.status = 'INSUFFICIENT_FUNDS'; 
    return output; 
  } 
 
  // Here is your change, ma'am. 
  output.status = 'OPEN'; 
  output.change = change_arr; 
  return output; 
 } 
 
 // test here 
 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]]); 

:rocket: 运行代码

代码说明:

首先创建一个对象数组其中包含每个面额或硬币面额的值以及带有状态和更改键的输出对象。接下来将CID数组转换为抽屉对象。然后处理确切变化和资金不足的条件。循环通过denom数组并更新变化和值,同时抽屉中仍然存在每种类型的denom ,而面额大于剩余的变化。如果使用任何此类型,则将此面额添加到change_arr的累加器中。在循环之后, change_arr是变化到期的2D数组从最高面额到最低面额排序。如果在没有元素change_arr或者你还欠变化,的状态返回输出对象INSUFFICIENT_FUNDS 。最后,您可以给出正确的更改。返回输出对象,状态为OPEN change_arr为change的值。

相关链接

:clipboard:捐款说明:

  • :warning: 请勿添加与任何现有解决方案类似的解决方案。如果您认为它**相似但更好** ,那么尝试合并(或替换)现有的类似解决方案。
  • 添加解决方案的说明。
  • 将解决方案分为以下类别之一 - 基本 中级高级:traffic_light:
  • 如果您添加了任何**相关的主要内容,**请仅添加您的用户名。 :warning: 不要 删除任何现有的用户名

看到:point_right: Wiki Challenge Solution Template供参考。