2012-04-11 8 views
-1

Für meine kürzliche Aufgabe wurde ich damit beauftragt, einen Ticketautomaten zu entwickeln, der Zahlungen akzeptiert und Ihnen erlaubt, diese zu stornieren. Eine kürzliche Erweiterung der Aufgabe bestand darin, zu zählen, wieviele der hinzugefügten Pennies eine bestimmte Art von Penny waren, z. B. 10p, 20p, 50p.Anzahl der Münzen in einer "Maschine"

Ich habe es geschafft, dass das Programm genau die Anzahl von 10p innerhalb der Maschine zählt, aber ich habe ein Problem, wenn ich mit 20 versuchte.

Zum Beispiel, wenn ich das Programm im Moment führen Sie es läuft perfekt für die 10ps jedoch, wenn ich es für 20ps betreibe ich diese Ergebnisse zurück:

Test: Anzahl Münzen

ERROR: Erwartete 4 - 20p Münzen gefunden 5 - 20p Münzen

Heres der Code, wie viele 10/20/50 ps sind in der Maschine berechnet:

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 der Code für testet es:

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

Haben Sie Ihren Code mit einem Debugger durchgegangen? Sie könnten Ihr Problem auf diese Weise leicht finden. – Msonic

Antwort

0

Das Problem ist, dass Ihr Geld Maschine nicht von einem Scheck Aufruf an den nächsten gelöscht wird. Hier ist, wie ich Ihren Code getestet:

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

Hier ist, was es für mich gedruckt (Ich hörte auch das System verlassen und immer ausgedruckt):

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

Nur um klarzustellen, da der Druck ein bisschen seltsam aussieht. Ihre 20 vom ersten Anruf (wo 2 10p Münzen hinzugefügt werden), sind noch in der Maschine. Der Scheck findet also 100 p total, wenn er 80 erwartet. Sie müssen also entweder die Münzen in der Maschine von einem Scheck zum nächsten leeren oder dies für die erwartete Zahl berücksichtigen. –

0

Werfen Sie einen Blick auf Ihre add(int coin) Methode. Das ist, wo Ihr Problem beginnt.

Auch @ Msonic Ratschläge, einen Debugger zu verwenden, ist ausgezeichnet.

Verwandte Themen