-1

私の最近の任務では、支払いを受け入れ、支払いをキャンセルできる券売機を作成する任務を負っています。この割り当てに対する最近の拡張は、追加されたペニーのうち、特定の種類のペニー (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;
  }

}
4

2 に答える 2

0

あなたのadd(int coin)方法を見てください。それがあなたの問題の始まりです。

また、@Msonicのデバッガーの使用に関するアドバイスは優れています。

于 2012-04-11T20:29:35.337 に答える
0

問題は、マシンのお金が 1 つのチェック コールから次のチェック コールまでクリアされないことです。コードをテストした方法は次のとおりです。

private static void checkRecord( int coin, int howMany )  {

 pm.setTicketPrice( howMany * coin );

 System.out.println("Before, Machine has"+pm.moneyInMachine());<---added print
 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();
 System.out.println("After, Machine has"+pm.moneyInMachine());<---added print
 int actual = pm.getCoins( coin );
 check( howMany == actual,
        "Expected %d - %dp coins found %d - %dp coins", 
         howMany, coin, actual, coin  );}

これが私のために印刷されたものです(システムの終了も停止し、常に印刷されました):

Before, Machine has0
After, Machine has20
Test: Count coins
ERROR: Expected 2 - 10p coins found 2 - 10p coins
Before, Machine has20
After, Machine has100
Test: Count coins
ERROR: Expected 4 - 20p coins found 5 - 20p coins
Before, Machine has100
After, Machine has250
Test: Count coins
ERROR: Expected 3 - 50p coins found 5 - 50p coins
Before, Machine has250
After, Machine has550
Test: Count coins
ERROR: Expected 3 - 100p coins found 5 - 100p coins
Before, Machine has550
After, Machine has950
Test: Count coins
ERROR: Expected 2 - 200p coins found 5 - 200p coins
于 2012-04-11T20:11:48.737 に答える