对于我最近的任务,我的任务是创建一个售票机,它可以接受付款并允许您取消付款。最近对该任务的扩展是计算添加的便士中有多少是某种类型的便士,例如 10 便士、20 便士、50 便士。
我设法让程序准确计算机器内 10p 的数量,但是当我尝试使用 20 时遇到了麻烦。
例如,当我运行该程序时,它在 10ps 上完美运行,但是当我运行它 20ps 时,我得到了这些结果:
测试:数硬币
错误:预期 4 - 20p 硬币发现 5 - 20p 硬币
下面是计算机器中有多少个 10/20/50ps 的代码:
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;
}
}
下面是测试它的代码:
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;
}
}