2012-04-11 9 views
-1

私の最近の任務では、支払いを受け取り、取り消すことを可能にするチケット機を作成する任務がありました。最近の割り当ての拡張は、追加されるペニーの数が特定の種類のペニー(たとえば10p、20p、50p)であるかをカウントすることでした。「機械」内のコイン型コインの枚数

マシン内の10pの数を正確にカウントするプログラムを手に入れましたが、20秒で試してみると問題があります。

テスト:私は、現時点では、プログラムを実行する例えば

は、それは私がは20psのためにそれを実行したときに、私は戻って、これらの結果を得るしかし10PSのために完璧に動作しますカウントコイン

ERROR:4期待します -

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にコード用の10/20/50PSが機械内にあるどのように多くの計算

相続コード20Pコイン - 20Pコイン5見出さテストしてください:

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; 
    } 

} 
+1

デバッガでコードを実行しましたか?あなたは簡単にあなたの問題を見つけることができます。 – Msonic

答えて

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 
+0

プリントがちょっと奇妙に見えるので、明確にするだけです。最初のコール(2つの10pコインが追加されています)からのあなたの20人はまだマシンにいます。したがって、小切手は80ポンドを期待したとき合計100ペンスを見いだします。したがって、マシンのコインを1つの小切手から次の小切手までクリアするか、または予想された数を考慮に入れる必要があります。 –

0

はあなたadd(int coin)方法を見てみましょう。それはあなたの問題 であるところです。

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

関連する問題