-1

对于我最近的任务,我的任务是创建一个售票机,它可以接受付款并允许您取消付款。最近对该任务的扩展是计算添加的便士中有多少是某种类型的便士,例如 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;
  }

}
4

2 回答 2

0

问题是你的机器钱没有从一个支票电话到下一个支票电话中清除。这是我测试您的代码的方法:

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 回答
0

看看你的add(int coin)方法。这就是你的问题开始的地方。

@Msonic 使用调试器的建议也很棒。

于 2012-04-11T20:29:35.337 回答