Hello everyone.
This is the first time I am asking about my code.
I started coding by myself, I am only studying at freecodecamp and nothing else.
I think I was doing good actually, until I came to a point that I need a real help from someone else, because I am stuck for some days at this project, and the anytime I said “now I got it”, it didn’t work.
My code doesn’t give an error, but it doesn’t meet some criteria of the solution, I don’t know why.
First of all, I am sorry for primitive coding style, I confess I am just a beginner and I don’t have anyone else to correct me. So please think about it when you harshly criticise my code. I know.
Anyway, after posting my code, I will try to explain what I have done.
my code is here (it is Cash Register Challenge):
function checkCashRegister(price, cash, cid) {
var numPrice = price.toFixed(2);
var numCash = cash.toFixed(2);
var numCoin = [];
var revCoin = [];
var totalCid = [];
var totalCid100 = [];
var totalAmount = 0;
var coinUnits = [1, 5,10, 25, 100, 500, 1000, 2000, 10000];
var numChange = [];
var changeArr = [];
var cashBackArr= [];
var revCashBackArr= [];
var clearArr =[];
var pushedArr= [];
var tempArr=[];
var otherArr =[];
var combinedArr = [];
var nonZeroArr = [];
var diffArr = [];
var lastObj = {};
var unitArr = ["PENNY", "NICKEL","DIME","QUARTER","ONE","FIVE","TEN","TWENTY","ONE HUNDRED"];
var revUnitArr = [];
for (let i = 0; i < cid.length; i++) {
numCoin[i] = ((cid[i][1]*100).toFixed(2)/coinUnits[i]);
totalCid.push(cid[i][1]);
totalCid100.push((cid[i][1]*100).toFixed(2))
totalAmount = (totalCid.reduce((a, b) => a + b, 0).toFixed(2));
}
revCoin = numCoin.slice().reverse();
revUnitArr = unitArr.slice().reverse();
let change100 = Math.round((numCash*100).toFixed(2) - (numPrice*100).toFixed(2));
let total100 = Math.round((totalAmount*100).toFixed(2));
//first console
console.log("change100",change100, "total100", total100)
console.log("numCoin",numCoin)
function sortCoin(change, numCoin) {
var numChange = [];
for ( let i=0;i<numCoin.length;i++)
{
numChange[8] = (change - (change % 10000))/10000;
if (numChange[8]>numCoin[8]) { numChange[8]=numCoin[8]};
numChange[7] = ((change - numChange[8]*10000)-(change%2000))/2000;
if (numChange[7]>numCoin[7]) { numChange[7]=numCoin[7]};
numChange[6] = ((change - numChange[8]*10000 - numChange[7]*2000)-(change%1000))/1000;
if (numChange[6]>numCoin[6]) { numChange[6]=numCoin[6]};
numChange[5] = ((change - numChange[8]*10000 - numChange[7]*2000-numChange[6]*1000)-(change%500))/500;
if (numChange[5]>numCoin[5]) { numChange[5]=numCoin[5]};
numChange[4] = ((change - numChange[8]*10000 - numChange[7]*2000-numChange[6]*1000-numChange[5]*500)-(change%100))/100;
if (numChange[4]>numCoin[4]) { numChange[4]=numCoin[4]};
numChange[3] = ((change - numChange[8]*10000 - numChange[7]*2000-numChange[6]*1000-numChange[5]*500-numChange[4]*100)-(change%25))/25;
if (numChange[3]>numCoin[3]) { numChange[3]=numCoin[3]};
numChange[2] = Math.round(((change - numChange[8]*10000 - numChange[7]*2000-numChange[6]*1000-numChange[5]*500-numChange[4]*100-numChange[3]*25)-(change%10))/10);
if (numChange[2]>numCoin[2]) { numChange[2]=numCoin[2]};
numChange[1] = ((change - numChange[8]*10000 - numChange[7]*2000-numChange[6]*1000-numChange[5]*500-numChange[4]*100-numChange[3]*25-numChange[2]*10)-(change%5))/5;
numChange[0] = ((change - numChange[8]*10000 - numChange[7]*2000-numChange[6]*1000-numChange[5]*500-numChange[4]*100-numChange[3]*25-numChange[2]*10-numChange[1]*5)-(change%1))/1;
return numChange;
}
}
numChange = sortCoin(change100, numCoin);
//second console
console.log("numChange", numChange)
for (let a = 0; a<numChange.length; a++) {
if (numChange[a]>numCoin[a]) {
numChange[a]=numCoin[a]
};
}
cashBackArr = [["PENNY", numChange[0]*0.01], ["NICKEL", numChange[1]*0.05],["DIME", numChange[2]*0.10],["QUARTER", numChange[3]*0.25],["ONE", numChange[4]*1],["FIVE", numChange[5]*5],["TEN", numChange[6]*10],["TWENTY", numChange[7]*20],["ONE HUNDRED", numChange[8]*100]];
revCashBackArr = cashBackArr.slice();
revCashBackArr.reverse();
for (let k = 0; k < revCashBackArr.length;k++) {
if (revCashBackArr[k][1] !== 0) {
clearArr.push(revCashBackArr[k]);}
}
//third console
console.log ("clearArr", clearArr);
if(change100 > total100) {
return {status: "INSUFFICIENT_FUNDS", change: []};
}
if(change100 == total100) {
return {status: "CLOSED", change: [...cid]}
}
for (let i = 0; i < cashBackArr.length; i++) {
if (change100 < total100 && cashBackArr[1][i]>=cid[1][i]) {
return {status: "INSUFFICIENT_FUNDS", change: []};
} else if (change100 < total100 && cashBackArr[1][i] < cid[1][i]){
return {status: "OPEN", change: [...clearArr]};
}
}
}
checkCashRegister(3.26, 100, [["PENNY", 1.01], ["NICKEL", 2.05], ["DIME", 3.1], ["QUARTER", 4.25], ["ONE", 90], ["FIVE", 55], ["TEN", 20], ["TWENTY", 60], ["ONE HUNDRED", 100]]);
checkCashRegister(19.5, 20, [["PENNY", 1.01], ["NICKEL", 2.05], ["DIME", 3.1], ["QUARTER", 4.25], ["ONE", 90], ["FIVE", 55], ["TEN", 20], ["TWENTY", 60], ["ONE HUNDRED", 100]]);
USer Agent I took:
Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:101.0) Gecko/20100101 Firefox/101.0
challenge is:
[https://www.freecodecamp.org/learn/javascript-algorithms-and-data-structures/javascript-algorithms-and-data-structures-projects/cash-register]
Now, I am sharing what I have thought by these lines.
-
I know there may be a lot of unnecessary variables, I will try to refine them, delete unused ones. But for the learning purpose, I am trying to set every variables.
-
I have been hurt by the toFixed(2) and round() and variable*100 kind of conversions. I started with normal values, but later I realized I need to multiply everything by 100. And for example, in the 25 cents, I really had difficult times, but I solved.
-
I calculated total Amount of Money in cash-in-drawer. I calculated cash-price =change100
-
I am checking the results by using console.log() at most of the turning points.
-
I spent very most of my time creating a sortCoin function. It isa result of very delicate and elaborated work of hours and hours. and it works, I tried it one by one. I put “if cases” between the lines, as cash-in-drawer may have less amount of money.
-
normally, I deleted the for(a=0) part, as it is useless, but I tried to change the if lines in the function sortCoin(), so I left it here for now.
-
I created and array for CashBack.
-
I cleared the zero elements of the array.
-
I tried to make comparisons for each case.
-
if(change100 > total100) works. if(change100 == total100) is working too.
-
I am not sure if I made it right but
if (change100 < total100 && cashBackArr[1][i]>=cid[1][i])
meaning change is less than total amount, but the cash back is more than the current money in the drawer. status: “INSUFFICIENT_FUNDS”, change: , so it works I guess…
And the last part…
And I failed at the latest part I guess.
else if (change100 < total100 && cashBackArr[1][i] < cid[1][i]){
return {status: “OPEN”, change: […clearArr]};
meaning change is enough in drawer, and the cash back is less than the money in the drawer. clearArr is the array that zero elements are reduced.
I am in serious need of help. I am dealing with this project for many days, and I am stuck.
Please help me. What am I missing here? (except the high quality coding style)
Thanks in advance.