Build a Cash Register Project - Build a Cash Register

Tell us what’s happening:

My code passes / used to pass all the tests, but only when the CID array has the right values. How do I get all of them to pass at the same time.

Your code so far

<!DOCTYPE html>
<html lang="en">
  <head>
  </head>

  <body>
    <input id="cash" type="number">
    <div id="change-due"></div>
    <button id="purchase-btn"></button>


    <script src="script.js"></script>
  </body>

</html>

let price = 19.5;
let cid = [
  ['PENNY', .01],
  ['NICKEL', 0],
  ['DIME', 0],
  ['QUARTER', 0],
  ['ONE', 1],
  ['FIVE', 0],
  ['TEN', 0],
  ['TWENTY', 0],
  ['ONE HUNDRED', 0]
];
const cash = document.getElementById("cash");
const changeDue = document.getElementById("change-due");
const purchaseBtn = document.getElementById("purchase-btn");
let cashInDrawer=0;

for(let i = 0; i<cid.length; i++){
  let j = 1;
  cashInDrawer+=cid[i][j];
}


const drawerLogic = () => {
  if(cash.value<price) {
    alert("Customer does not have enough money to purchase the item");
    return;
  } else if(parseFloat(cash.value)===price) {
    changeDue.innerText="No change due - customer paid with exact cash";
    return;
  } else {
    let dollars = Math.floor(cash.value-price);
    
    let cents = cash.value - dollars - price;
    
    let quarters;
    let dimes;
    let nickles;
    let pennies;
    let hundreds;
    let twentys;
    let tens;
    let fives;
    let ones;
    let message = `Status:`;

    if(dollars>=100 && cid[8][1]>=100) {
      for(let i = 1; cid[8][1]>=100 && dollars>=100; i++) {
        hundreds = i;
        dollars-=100;
        cid[8][1]-=100;
        
      }
    } if(dollars>=20 && cid[7][1]>=20) {
      
      for(let i = 1; cid[7][1]>=20 && dollars>=20; i++) {
        twentys = i;
        dollars-=20;
        cid[7][1]-=20;
        
      }
    } if(dollars>=10 && cid[6][1]>=10) {
      for(let i = 1; cid[6][1]>=10 && dollars>=10; i++) {
        tens = i;
        dollars-=10;
        cid[6][1]-=10;
        
      }
    } if(dollars>=5 && cid[5][1]>=5) {
      for(let i = 1; cid[5][1]>=5 && dollars>=5; i++) {
        fives = i;
        dollars-=5;
        cid[5][1]-=5;
        
      }
    } if(dollars>=1 && cid[4][1]>=1) {
      for(let i = 1; cid[4][1]>=1 && dollars>=1; i++) {
        ones = i;
        dollars-=1;
        cid[4][1]-=1;
        
      }
    }


    if(cents>=.25 && cid[3][1]>=.25) {
      for(let i = 1; cid[3][1]>=.25 && cents>=.25; i++) {
        quarters = i;
        cents-=.25;
        cid[3][1]-=.25;
        
      }
    } if(cents>=.10 && cid[2][1]>=.10) {
      for(let i = 1; cid[2][1]>=.10 && cents>=.1; i++) {
        dimes = i;
        cents-=.10;
        cid[2][1]-=.10;
        
      }
    } if(cents>=.05 && cid[1][1]>=.05) {
      for(let i = 1; cid[1][1]>=.05 && cents>= .05; i++) {
        nickles = i;
        cents-=.05;
        cid[1][1]-=.05;
       
      }
    } if(cid[0][1]>=.01) {
      for(let i = 1; cid[0][1]>=0.01 && cents>= 0.01; i++) {
        pennies = i;
        cents = (cents - .01).toFixed(2);
        cid[0][1]= (cid[0][1]-.01).toFixed(2);
        //console.log(pennies, i, cents, cid[0][1]>=0.01 && cents>= 0.01, cid[0][1]);

      }
    }
    

    if(cashInDrawer<parseFloat(cash.value)-price || cents!=0) {
      console.log(cents);
      message += ` INSUFFICIENT_FUNDS`;
      
      return changeDue.innerText=message;
    }
    if(cashInDrawer===(parseFloat(cash.value)-price) && price<parseFloat(cash.value)) {
      message += ` CLOSED`;
      
    } else if(cashInDrawer>parseFloat(cash.value)-price && price<parseFloat(cash.value)) {
      message += ` OPEN`;
      
    }

    if(hundreds) {
      message+= ` HUNDRED: $${hundreds*100}`;
    }

    if(twentys) {
      message+= ` TWENTY: $${twentys*20}`;
    }

    if(tens) {
      message+= ` TEN: $${tens*10}`;
    }

    if(fives) {
      message+= ` FIVE: $${fives*5}`;
    }

    if(ones) {
      message+= ` ONE: $${ones}`;
    }

    if(quarters) {
      message+= ` QUARTER: $${quarters*.25}`;
    }

    if(dimes) {
      message+= ` DIME: $${dimes*.1}`;
    }

    if(nickles) {
      message+= ` NICKLE: $${nickles*.05}`;
    }

    if(pennies) {
      message+= ` PENNY: $${pennies * .01}`;
      
    }
    
    return changeDue.innerText=message;
  }
}
    
purchaseBtn.addEventListener("click", () => {
  drawerLogic();
  
  
  });

 file: styles.css

Your browser information:

User Agent is: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36 Edg/130.0.0.0

Challenge Information:

Build a Cash Register Project - Build a Cash Register

You should not have computations like this out in the global scope.

i can move it, but does this break anything. every test passes but 19, and as far as i can tell the check for STATUS: CLOSED works

Yes, having code floating around in the global scope destroys all the reusability of your functions.

i moved it and now 1-18 always pass, what are your thoughts for 19?

show your updated code please, so we can see

1 Like
let price = 19.5;
let cid = [
  ['PENNY', 0.5],
  ['NICKEL', 0],
  ['DIME', 0],
  ['QUARTER', 0],
  ['ONE', 0],
  ['FIVE', 0],
  ['TEN', 0],
  ['TWENTY', 0],
  ['ONE HUNDRED', 0]
];
const cash = document.getElementById("cash");
const changeDue = document.getElementById("change-due");
const purchaseBtn = document.getElementById("purchase-btn");




const drawerLogic = () => {

let cashInDrawer=0;

for(let i = 0; i<cid.length; i++){
  let j = 1;
  cashInDrawer+=cid[i][j];
}


  if(cash.value<price) {
    alert("Customer does not have enough money to purchase the item");
    return;
  } else if(parseFloat(cash.value)===price) {
    changeDue.innerText="No change due - customer paid with exact cash";
    return;
  } else {
    let dollars = Math.floor(cash.value-price);
    
    let cents = cash.value - dollars - price;
    
    let quarters;
    let dimes;
    let nickles;
    let pennies;
    let hundreds;
    let twentys;
    let tens;
    let fives;
    let ones;
    let message = `Status:`;

    if(dollars>=100 && cid[8][1]>=100) {
      for(let i = 1; cid[8][1]>=100 && dollars>=100; i++) {
        hundreds = i;
        dollars-=100;
        cid[8][1]-=100;
        
      }
    } if(dollars>=20 && cid[7][1]>=20) {
      
      for(let i = 1; cid[7][1]>=20 && dollars>=20; i++) {
        twentys = i;
        dollars-=20;
        cid[7][1]-=20;
        
      }
    } if(dollars>=10 && cid[6][1]>=10) {
      for(let i = 1; cid[6][1]>=10 && dollars>=10; i++) {
        tens = i;
        dollars-=10;
        cid[6][1]-=10;
        
      }
    } if(dollars>=5 && cid[5][1]>=5) {
      for(let i = 1; cid[5][1]>=5 && dollars>=5; i++) {
        fives = i;
        dollars-=5;
        cid[5][1]-=5;
        
      }
    } if(dollars>=1 && cid[4][1]>=1) {
      for(let i = 1; cid[4][1]>=1 && dollars>=1; i++) {
        ones = i;
        dollars-=1;
        cid[4][1]-=1;
        
      }
    }


    if(cents>=.25 && cid[3][1]>=.25) {
      for(let i = 1; cid[3][1]>=.25 && cents>=.25; i++) {
        quarters = i;
        cents-=.25;
        cid[3][1]-=.25;
        
      }
    } if(cents>=.10 && cid[2][1]>=.10) {
      for(let i = 1; cid[2][1]>=.10 && cents>=.1; i++) {
        dimes = i;
        cents-=.10;
        cid[2][1]-=.10;
        
      }
    } if(cents>=.05 && cid[1][1]>=.05) {
      for(let i = 1; cid[1][1]>=.05 && cents>= .05; i++) {
        nickles = i;
        cents-=.05;
        cid[1][1]-=.05;
       
      }
    } if(cid[0][1]>=.01) {
      for(let i = 1; cid[0][1]>=0.01 && cents>= 0.01; i++) {
        pennies = i;
        cents = (cents - .01).toFixed(2);
        cid[0][1]= (cid[0][1]-.01).toFixed(2);
        //console.log(pennies, i, cents, cid[0][1]>=0.01 && cents>= 0.01, cid[0][1]);

      }
    }
    

    if(cashInDrawer<parseFloat(cash.value)-price || cents!=0) {
      console.log(cents);
      message += ` INSUFFICIENT_FUNDS`;
      
      return changeDue.innerText=message;
    }
    if(cashInDrawer===(parseFloat(cash.value)-price) && price<parseFloat(cash.value)) {
      message += ` CLOSED`;
      
    } else if(cashInDrawer>parseFloat(cash.value)-price && price<parseFloat(cash.value)) {
      message += ` OPEN`;
      
    }

    if(hundreds) {
      message+= ` HUNDRED: $${hundreds*100}`;
    }

    if(twentys) {
      message+= ` TWENTY: $${twentys*20}`;
    }

    if(tens) {
      message+= ` TEN: $${tens*10}`;
    }

    if(fives) {
      message+= ` FIVE: $${fives*5}`;
    }

    if(ones) {
      message+= ` ONE: $${ones}`;
    }

    if(quarters) {
      message+= ` QUARTER: $${quarters*.25}`;
    }

    if(dimes) {
      message+= ` DIME: $${dimes*.1}`;
    }

    if(nickles) {
      message+= ` NICKLE: $${nickles*.05}`;
    }

    if(pennies) {
      message+= ` PENNY: $${pennies * .01}`;
      
    }
    
    return changeDue.innerText=message;
  }
}
    
purchaseBtn.addEventListener("click", () => {
  drawerLogic();
  
  
  });

this code as is passes 1-18 on my end

edit: i lied 13 also doesnt pass

I’ve edited your code for readability. When you enter a code block into a forum post, please precede it with a separate line of three backticks and follow it with a separate line of three backticks to make it easier to read.

You can also use the “preformatted text” tool in the editor (</>) to add backticks around text.

See this post to find the backtick on your keyboard.
Note: Backticks (`) are not single quotes (').

you have some issues, 13 also fails sometimes

13 and 19 have different values each time they run, but I am having difficulties in getting some values your code fail for, as your function changes cid while executing, which is a bad idea

how would you recommend i record the decreasing cash amount in the drawer without changing cid? maybe creating a shallow array based off of it?

you can try, there are different possible ways

what would you do? or are you not allowed to tell me that

I could tell you, but this is your exam, I would not feel I respect the Academic Honesty Policy if I told you how to implement your function

i see. would using a .map on the cid array be a possible solution or is that the wrong direction.

What would you use the map for?

I don’t know, I have no idea what you want to do with it. Try it out, and find out

to avoid altering the original cid array and the problems that causes

How though? How does map do that for you?

im not sure maybe map isnt the correct choice but i want to use an array method to populate a new array with the value of the denominations from cid

let price = 19.5;
let cid = [
  ['PENNY', 0.5],
  ['NICKEL', 0],
  ['DIME', 0],
  ['QUARTER', 0],
  ['ONE', 0],
  ['FIVE', 0],
  ['TEN', 0],
  ['TWENTY', 0],
  ['ONE HUNDRED', 0]
];
const cash = document.getElementById("cash");
const changeDue = document.getElementById("change-due");
const purchaseBtn = document.getElementById("purchase-btn");




const drawerLogic = () => {


let cashArr=[];

for(let i = 0; i<cid.length; i++){
  let j = 1;
  cashArr[i]=parseFloat(cid[i][j]);
}

let cashInDrawer = 0;
for(let i = 0; i<cashArr.length; i++) {
  cashInDrawer+=cashArr[i];
}


  if(cash.value<price) {
    alert("Customer does not have enough money to purchase the item");
    return;
  } else if(parseFloat(cash.value)===price) {
    changeDue.innerText="No change due - customer paid with exact cash";
    return;
  } else {
    let dollars = Math.floor(cash.value-price);
    
    let cents = cash.value - dollars - price;
    
    let quarters;
    let dimes;
    let nickles;
    let pennies;
    let hundreds;
    let twentys;
    let tens;
    let fives;
    let ones;
    let message = `Status:`;

    if(dollars>=100 && cashArr[8]>=100) {
      for(let i = 1; cashArr[8]>=100 && dollars>=100; i++) {
        hundreds = i;
        dollars-=100;
        cashArr[8]-=100;
        
      }
    } if(dollars>=20 && cashArr[7]>=20) {
      
      for(let i = 1; cashArr[7]>=20 && dollars>=20; i++) {
        twentys = i;
        dollars-=20;
        cashArr[7]-=20;
        
      }
    } if(dollars>=10 && cashArr[6]>=10) {
      for(let i = 1; cashArr[6]>=10 && dollars>=10; i++) {
        tens = i;
        dollars-=10;
        cashArr[6]-=10;
        
      }
    } if(dollars>=5 && cashArr[5]>=5) {
      for(let i = 1; cashArr[5]>=5 && dollars>=5; i++) {
        fives = i;
        dollars-=5;
        cashArr[5]-=5;
        
      }
    } if(dollars>=1 && cashArr[4]>=1) {
      for(let i = 1; cashArr[4]>=1 && dollars>=1; i++) {
        ones = i;
        dollars-=1;
        cashArr[4]-=1;
        
      }
    }


    if(cents>=.25 && cashArr[3]>=.25) {
      for(let i = 1; cashArr[3]>=.25 && cents>=.25; i++) {
        quarters = i;
        cents-=.25;
        cashArr[3]-=.25;
        
      }
    } if(cents>=.10 && cashArr[2]>=.10) {
      for(let i = 1; cashArr[2]>=.10 && cents>=.1; i++) {
        dimes = i;
        cents-=.10;
        cashArr[2]-=.10;
        
      }
    } if(cents>=.05 && cashArr[1]>=.05) {
      for(let i = 1; cashArr[1]>=.05 && cents>= .05; i++) {
        nickles = i;
        cents-=.05;
        cashArr[1]-=.05;
       
      }
    } if(cashArr[0]>=.01) {
      for(let i = 1; cashArr[0]>=0.01 && cents>= 0.01; i++) {
        pennies = i;
        cents = (cents - .01).toFixed(2);
        cashArr[0]= (cashArr[0]-.01).toFixed(2);
        

      }
    }
    

    if(cashInDrawer<parseFloat(cash.value)-price || cents!=0) {
      console.log(cents);
      message += ` INSUFFICIENT_FUNDS`;
      
      return changeDue.innerText=message;
    }
    if(cashInDrawer===(parseFloat(cash.value)-price) && price<parseFloat(cash.value)) {
      message += ` CLOSED`;
      
    } else if(cashInDrawer>parseFloat(cash.value)-price && price<parseFloat(cash.value)) {
      message += ` OPEN`;
      
    }

    if(hundreds) {
      message+= ` HUNDRED: $${hundreds*100}`;
    }

    if(twentys) {
      message+= ` TWENTY: $${twentys*20}`;
    }

    if(tens) {
      message+= ` TEN: $${tens*10}`;
    }

    if(fives) {
      message+= ` FIVE: $${fives*5}`;
    }

    if(ones) {
      message+= ` ONE: $${ones}`;
    }

    if(quarters) {
      message+= ` QUARTER: $${quarters*.25}`;
    }

    if(dimes) {
      message+= ` DIME: $${dimes*.1}`;
    }

    if(nickles) {
      message+= ` NICKLE: $${nickles*.05}`;
    }

    if(pennies) {
      message+= ` PENNY: $${pennies * .01}`;
      
    }
    
    return changeDue.innerText=message;
  }
}
    
purchaseBtn.addEventListener("click", () => {
  drawerLogic();
  
  
  });

new code replaces all references to cid in the function drawerLogic with references to array cashArr. 13 and 19 still failing?