Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 我创造了一个;收银机;Freecodecamp的函数,但由于某些原因,最后两个测试不是';你不及格吗?_Javascript_Algorithm_Testing_Data Structures_Ecmascript 6 - Fatal编程技术网

Javascript 我创造了一个;收银机;Freecodecamp的函数,但由于某些原因,最后两个测试不是';你不及格吗?

Javascript 我创造了一个;收银机;Freecodecamp的函数,但由于某些原因,最后两个测试不是';你不及格吗?,javascript,algorithm,testing,data-structures,ecmascript-6,Javascript,Algorithm,Testing,Data Structures,Ecmascript 6,我创建了这个函数,但是最后两个测试 checkCashRegister(19.5, 20, [["PENNY", 0.01], ["NICKEL", 0], ["DIME", 0], ["QUARTER", 0], ["ONE", 1], ["FIVE", 0], ["TEN", 0], ["TWENTY", 0], ["ONE

我创建了这个函数,但是最后两个测试

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: []}.
checkCashRegister(19.5, 20, [["PENNY", 0.5], ["NICKEL", 0], ["DIME", 0], ["QUARTER", 0], ["ONE", 0], ["FIVE", 0], ["TEN", 0], ["TWENTY", 0], ["ONE HUNDRED", 0]]) should return {status: "CLOSED", change: [["PENNY", 0.5], ["NICKEL", 0], ["DIME", 0], ["QUARTER", 0], ["ONE", 0], ["FIVE", 0], ["TEN", 0], ["TWENTY", 0], ["ONE HUNDRED", 0]]}.
不要通过。我的代码有什么问题

任务是:

设计一个收银机抽屉函数
checkcashrister()
,该函数接受购买价格作为第一个参数(
price
),付款作为第二个参数(
cash
),收银机抽屉(
cid
)作为第三个参数

cid
是一个二维数组,列出可用货币

checkcashlister()
函数应始终返回带有
status
键和
change
键的对象

返回
{状态:“资金不足”,更改:[]}
如果抽屉中的现金少于到期的零钱,或者如果您无法返回准确的零钱

返回{status:“CLOSED”,change:[…]},抽屉中的现金作为键
change
的值(如果它等于到期的更改)

否则,返回
{status:“OPEN”,change:[…]}
,以硬币和纸币的形式到期,按从高到低的顺序排序,作为
change
键的值

我的代码:

const资金不足={
状态:“资金不足”,
更改:[]
};
常数已关闭\u CID={
状态:“已关闭”,
更改:[]
};
常数位置\u CID=[
[100',100],
[20,20],,
[10',10],
[5',5],
[1',1],
[1/4',0.25],
[DIME',0.1],
[‘镍’,0.05],
[便士,0.01]
];
常量add=(a,b)=>a+b[1];
常量支票收银机=(价格、现金、cid)=>{
让finalChange=[];
让changeDue=现金-价格;
const cidSum=cid.reduce(add,0).toFixed(2);
/*
如果确实有足够的钱来提供零钱,那么
状态键为“关闭”,更改键为
抽屉中的现金(cid)。
*/
如果(cidSum==变更到期日){
返回{
已关闭(CID),,
更改:cid
};
}
/*
如果没有足够的钱提供更改,则状态键
为“资金不足”,且更改键为空数组。
*/
if(cidSum<变更到期日){
返还资金不足;
}
/*
如果有足够的钱来提供零钱的话
把零钱放在抽屉里,然后往下走
从高到低的货币单位列表,将它们推到
更改数组,并从两个现金中减去它们
欠款和抽屉中的现金(cid)。
*/
设cidReverse=cid.reverse();
位置CID.map((位置CID,索引)=>{
const billValue=posCid[1];
而(changeDue>=billValue&&cidcreverse[index][1]>=billValue){
changeDue-=billValue;//从票据价值减去应支付的变更
changeDue=changeDue.toFixed(2);//修复舍入错误
const hasbillvalueready=finalChange.filter(p=>p[0]==cidReverse[index][0]);
如果(hasbillvalueready.length>0){
finalChange=finalChange.map(k=>(k[0]==posCid[0]&&[k[0],(k[1]+=billValue)])|[k[0],k[1]];
}否则{
finalChange.push([cidReverse[index][0],billValue]);
}
cidReverse[index][1]-=billValue;//从抽屉中的现金中减去票据价值
}
});
如果(更改到期日!==0){
返回{
状态:“打开”,
更改:最终更改
};
}否则{
返还资金不足;
}
};
常数价格=19.5;
const cash=200;
常数cid=[
[PENNY',1.01],
[‘镍’,2.05],
[DIME',3.1],
[四分之一,4.25],
[1',90],
[5',55],
[10',20],
[20',60],
[100',100]
];
//支票收银机(价格、现金、cid);
console.log(
支票收银机(19.5、20、[
[“便士”,1.01],
[“镍”,2.05],
[“一角”,3.1],
[“季度”,4.25],
[“一”,90],
[“五”,55],
[“十”,20],
[“二十”,60],
[“一百”,一百]
]),
支票收银机(19.5,20,[“便士”,0.01],“镍币”,0],“一角”,0],“四分之一”,0],“一”,1],“五”,0],“十”,0],“二十”,0],“一百”,0]],“应归还”,“{状态:“资金不足”,更改:[]},
支票收银机(19.5,20,[“便士”,0.5],“镍币”,0],“一角”,0],“五”,0],“十”,0],“二十”,0],“一百”,0]],“应归还”,“{状态:“关闭”,更改:[“便士”,0.5],“镍币”,0],“一角”,0],“五”,0],“十”,0],“二十”,0],“一百”,0]}
需要解决两个问题:

  • 当到期变更正好是收银机中的内容时,代码返回一个结构不正确的对象:

    return {
      CLOSED_CID,
      change: cid
    };
    
    这将创建一个属性
    CLOSED\u CID
    ,该属性的值是一个具有嵌套
    状态和
    更改
    属性的对象。。。在父级添加另一个
    change
    属性。相反,您应该忘记预定义的
    CLOSED_CID
    对象,然后执行以下操作:

    return {
      status: "CLOSED",
      change: cid
    };
    
  • 是否返回状态
    未结
    资金不足
    的决定应基于相反的条件。当您将所有变更金额归于票据时,您应该返回
    OPEN
    。因此,改变这一点:

    if (changeDue !== 0) {
      return {
        status: 'OPEN',
        change: finalChange
      };
    } else {
      return INSUFFICIENT_FUNDS;
    }
    
    致:

备注:
toFixed
方法返回一个字符串。最好将结果显式转换回数字数据类型。目前在代码中它没有问题,因为当您执行
-=
==
时,转换会隐式进行,但出于代码维护的原因,您最好不要依赖于此。因此,无论何时调用
toFixed
,都要添加一个一元
+

const cidSum = +cid.reduce(add, 0).toFixed(2);
// ...
changeDue = +changeDue.toFixed(2);
然而,我建议所有的计算都以美分为单位,所以所有的计算都是用整数值来完成的,而整数值不会因为不精确而受到影响


我想您已经找到了解决方案,并且面临着同样的挑战。

我给您写了一个片段。请以有用的方式格式化结果
const cidSum = +cid.reduce(add, 0).toFixed(2);
// ...
changeDue = +changeDue.toFixed(2);