私の最近の任務では、支払いを受け入れ、支払いをキャンセルできる券売機を作成する任務を負っています。この割り当てに対する最近の拡張は、追加されたペニーのうち、特定の種類のペニー (10 ペンス、20 ペンス、50 ペンスなど) がいくつあったかを数えることでした。
マシン内の 10p の数を正確にカウントするプログラムを取得することができましたが、20's で試したときに問題が発生しました。
たとえば、現時点でプログラムを実行すると、10ps で完全に実行されますが、20ps で実行すると、次の結果が返されます。
テスト: コインを数える
エラー: 予想される 4 - 20 ペンスのコイン 5 - 20 ペンスのコインが見つかりました
マシンにある 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;
}
}