[SOLVED]

Hello for my recent assignment I've been tasked to create a ticket machine which accepts payments in and allows you to cancel them. A recent extension to the assignment was to count how many of the pennies being added were a certain type of penny, e.g 10p, 20p, 50p.

I managed to get the program to accurately count the number of 10p within the machine but when I tried with 20's I came to a dead end.

Heres the code that calculates how many 10/20/50ps are in the machine:

class ProcessMoney { int ticket; int cost = 0; int machine; int pence = 0; int calc = 0; public void setTicketPrice( int amount ) { ticket = amount; } public int getTicketPrice() { return ticket; } public void add( int coin ) { cost = cost + coin; if ( coin == 10 ){ calc = calc + 1; } } public boolean enough() { return true; } public int getPaidSoFar() { return cost; } public void cancel() { cost = 0; } public void bought() { machine = machine + cost; cost = 0; } public int moneyInMachine() { return machine; } public int getCoins( int coin ) { if ( coin == 10 ){ pence = machine * 100; calc = pence / 1000; } else if ( coin == 20 ){ pence = machine * 100; calc = pence / 2000; } return calc; } }

Heres the code for testing it:

class Main { private static ProcessMoney pm = new ProcessMoney(); public static void main( String args[] ) { int res = 0, expected = 100; test( "setTicketPrice() & getTicketPrice() "); pm.setTicketPrice( expected ); res = pm.getTicketPrice(); check( res == expected, "Ticket price is %d should be %d", res, expected ); expected = 200; pm.setTicketPrice( expected ); res = pm.getTicketPrice(); check( res == expected, "Ticket price is %d should be %d", res, expected ); test( "add() & getPaidSoFar()"); pm.add( 10 ); pm.add( 20 ); pm.add( 30 ); expected = 60; res = pm.getPaidSoFar(); check( res == expected, "Money entered into machine is %d should be %d", res, expected ); pm.add( 20 ); pm.add( 40 ); pm.add( 40 ); expected = 160; res = pm.getPaidSoFar(); check( res == expected, "Money entered into machine is %d should be %d", res, expected ); test( "add() & cancel()"); pm.add( 10 ); pm.add( 20 ); pm.add( 30 ); expected = 0; pm.cancel(); res = pm.getPaidSoFar(); check( res == expected, "money entered into machine is now %d should be 0", res ); pm.add( 100 ); pm.add( 200 ); pm.add( 300 ); expected = 0; pm.cancel(); res = pm.getPaidSoFar(); check( res == expected, "money entered into machine is now %d should be 0", res ); test( "enough()"); pm.setTicketPrice( 200 ); pm.add( 100 ); pm.add( 100 ); pm.add( 0 ); expected = 200; check( pm.enough(), "Enough money entered into machine 200 for 200 ticket" ); pm.cancel(); pm.setTicketPrice( 210 ); pm.add( 100 ); pm.add( 100 ); pm.add( 20 ); expected = 200; check( pm.enough(), "Enough money entered into machine 220 for 210 ticket" ); pm.cancel(); test( "bought() & moneyInMachine()"); pm.setTicketPrice( 200 ); pm.add( 100 ); pm.add( 100 ); pm.add( 0 ); if ( pm.enough() ) { pm.bought(); } expected = 200; res = pm.moneyInMachine(); check( expected == res, "Total money in machine %d should be %d", res, expected ); res = pm.getPaidSoFar(); check( res == 0, "Money for ticket in machine is %d should be 0", res ); pm.cancel(); pm.setTicketPrice( 200 ); pm.add( 100 ); pm.add( 100 ); pm.add( 10 ); if ( pm.enough() ) { pm.bought(); } expected = 410; res = pm.moneyInMachine(); check( expected == res, "Total money in machine %d should be %d", res, expected ); res = pm.getPaidSoFar(); check( res == 0, "Money for ticket in machine is %d should be 0", res ); test("Count coins"); pm = new ProcessMoney(); checkRecord( 10, 2 ); checkRecord( 20, 4 ); checkRecord( 50, 3 ); checkRecord( 100, 3 ); checkRecord( 200, 2 ); System.out.println( "Success" ); } private static void checkRecord( int coin, int howMany ) { pm.setTicketPrice( howMany * coin ); for ( int i=1; i<=howMany*2; i++ ) { pm.add( coin ); } pm.cancel(); for ( int i=1; i<=howMany; i++ ) { pm.add( coin ); } pm.bought(); int actual = pm.getCoins( coin ); check( howMany == actual, "Expected %d - %dp coins found %d - %dp coins", howMany, coin, actual, coin ); } private static String what = ""; public static void check( boolean ok, String fmt, Object... params ) { if ( ! ok ) { System.out.println( what ); System.out.print("ERROR: " ); System.out.printf( fmt, params ); System.out.println(); System.exit(-1); } } public static void test( String str ) { what = "Test: " + str; } }

For example when I run the program at the moment it runs perfectly for the 10ps however when I run it for 20ps I get these results back:

Test: Count coins

ERROR: Expected 4 - 20p coins found 5 - 20p coins