Schoko Automat

Status
Nicht offen für weitere Antworten.

Gerd

Mitglied
Hi !

Ich soll als Projekt einen Automaten erstellen in den man beliebig viele Sorten hinzufügen kann. Mein Vorschlag ist unten angegeben. Er funktioniert auch solange man nur eine Sorte hinzufügt. Wenn man 2 Sorten hinzufügt passiert es allerdings das man sich die ausgewählte Sorte so oft man will wieder herrausgegeben kann obwohl diese längst nicht mehr enthalten sein müsste. Es muss also irgend ein Fehler in der dispense() Methode vorliegen. Danke schon mal für die Hilfe!


Code:
package prog2.project2;

import java.util.ArrayList;
/**
 * 


 * Diese Klasse implementiert das Interface {@link IChocolateVendingMachine}.
 * </p>
 *
 * 


 * In BlueJ können Sie über den Menüpunkt "Tools - Project Documentation" eine HTML-Dokumentation erzeugen. Dadurch erhalten Sie
 * Zugriff auf die von uns vorgegebene Spezifikation dieser Klasse. Weiter können Sie direkt im BlueJ Editor auf die Dokumentation
 * zurückgreifen. Wählen Sie dazu in der Toolbar des Editors "Interface" statt "Implementation" aus. Weitere Informationen finden
 * Sie im Kapitel "10.4 Generating documentation" des offiziellen BlueJ Tutorials.
 * </p>
 */
public class ChocolateVendingMachine implements IChocolateVendingMachine {

    /**
     * Konstruiert einen neuen Verkaufsautomaten. Der Automat ist leer (beinhaltet keine Produkte) und die Summe der Preise der
     * bisher verkauften Artikel ist 0.
     */
    
    private int balance;
    private int total;
    private ArrayList <IChocolate> Inhalt = new ArrayList <IChocolate> ();
    private IChocolate selection;
 
    
    public ChocolateVendingMachine() {
        
        balance = 0;
        total = 0;
     
      
    }
        
    public void clearBalance() {
      
        System.out.println ("Rückgeld: " + balance);
        balance = 0;
    }

    public IChocolate dispense() {
        
       
       
       for (IChocolate item : Inhalt){
            

            if(selection == null){ 
            System.out.println(NO_ITEM_SELECTED);
            return null;}
            
          
            if(item.getPrice()<= balance){
            System.out.println("Folgendes Produkt wurde gekauft: " + selection);
            balance -= item.getPrice(); 
            total += item.getPrice(); 
            Inhalt.remove(selection);
            return selection;

          
        
             
            
        }
           
            else
                System.out.println(NOT_ENOUGH_MONEY);
                
          
       }  
       
     if (Inhalt.size() == 0)
       System.out.println("Der Automat ist leer.");
      return null;
            
    }

    public int getBalance() {
      
        return balance;
    }

    public int getNumberOfItems() {
       
     
        return Inhalt.size();
    }

    public int getTotal() {
        
        return total;
    }

    public int getTotalValueOfProducts() {
        
        
        int TotalValueOfProducts = 0;
        for (IChocolate item : Inhalt){
        TotalValueOfProducts += item.getPrice();
        }
        return TotalValueOfProducts;
    }

    public void insertMoney(int money) {
        
        
        if(money > 0) {
            balance += money;
        }
        
        else {
            System.out.println(NEGATIVE_MONEY);
         }
    }

    public boolean isEmpty() {
        
        if (Inhalt.size() == 0)
        return true;
        else
        return false;
    }

    public void printInventory() {
        
       if (Inhalt.size() == 0)
       System.out.println("Der Automat ist leer.");
       else
       
       System.out.println("Folgende Produkte sind verfügbar:");
        
       for (IChocolate item : Inhalt) 
       { 
             System.out.println("\r" + item.toString()); 
       } 

    }

    public void resetTotal() {
        
        total = 0;
    }

    public void restock(IChocolate item) {
        
        Inhalt.add(item);
        

    }

    public void select(String productDescription) {
        
       
        selection = null; 
        for (IChocolate item : Inhalt){
            if(item.getDescription() == productDescription ){
            selection = item;}
      
     
      }
    } 
}
 

Zed

Bekanntes Mitglied
Mir fällt nichts auf sollte so funktionieren.
Der Fehler muss wo anderst liegen.

Mein Tip wäre mal in dispense() zu Prüfen ob das Produkt überhaupt noch verfügbar ist.

Du machst das zwar in select() aber den Fehler kannst denke ich provuzieren wenn selection != null ist aber dispence() aufgerufen wird.
 
S

SlaterB

Gast
das Problem ist, dass du immer nur das Objekt 'selection' entfernst,
auch wenn dieses gar nicht mehr in der Liste ist,

also auf jeden Fall
Inhalt.remove(item);
statt
Inhalt.remove(selection);
falls das überhaupt geht während der Schleife
(sonst das Objekt merken, Schleife beenden, und dann entfernen)

aber generell solltest du vielleicht selection entfernen und dir nur productDescription merken,
und dann bei allen items nach der richtigen productDescription schauen,

im Moment vergleichst du die enthalten Objekte übrigens überhaupt nicht mit selection...

-----

eine allgemein kompilierbare Version (noch mit den Fehlern):

Code:
package test;

import java.util.ArrayList;

public class ChocolateVendingMachine
{
    private static int dingPreis;

    private int balance;
    private int total;
    private ArrayList<Ding> inhalt = new ArrayList<Ding>();
    private Ding selection;

    public ChocolateVendingMachine()
    {
        balance = 0;
        total = 0;
    }

    public void clearBalance()
    {
        System.out.println("Rückgeld: " + balance);
        balance = 0;
    }

    public Ding dispense()
    {
        System.out.println("inhalt: " + inhalt.size());
        for (Ding item : inhalt)
        {
            if (selection == null)
            {
                System.out.println("nix selektiert");
                return null;
            }

            if (item.getPrice() <= balance)
            {
                System.out.println("Folgendes Produkt wurde gekauft: " + selection + ", " + item.getPrice() + ", " + balance);
                balance -= item.getPrice();
                total += item.getPrice();
                inhalt.remove(selection);
                return selection;
            }
            else
                System.out.println("negatives Geld");
        }

        if (inhalt.size() == 0) System.out.println("Der Automat ist leer.");
        return null;
    }

    public int getBalance()
    {
        return balance;
    }

    public int getNumberOfItems()
    {
        return inhalt.size();
    }

    public int getTotal()
    {
        return total;
    }

    public int getTotalValueOfProducts()
    {
        int TotalValueOfProducts = 0;
        for (Ding item : inhalt)
        {
            TotalValueOfProducts += item.getPrice();
        }
        return TotalValueOfProducts;
    }

    public void insertMoney(int money)
    {
        if (money > 0)
        {
            balance += money;
        }
        else
        {
            System.out.println("negatives Geld");
        }
    }

    public boolean isEmpty()
    {

        if (inhalt.size() == 0)
            return true;
        else
            return false;
    }

    public void printInventory()
    {

        if (inhalt.size() == 0)
            System.out.println("Der Automat ist leer.");
        else
            System.out.println("Folgende Produkte sind verfügbar:");

        for (Ding item : inhalt)
        {
            System.out.println(item.toString());
        }

    }

    public void resetTotal()
    {
        total = 0;
    }

    public void restock()
    {
        inhalt.add(new Ding());
    }

    public void select(String productDescription)
    {
        selection = null;
        for (Ding item : inhalt)
        {
            if (item.getDescription() == productDescription)
            {
                selection = item;
            }
        }
    }


    public static void main(String[] args)
    {
        ChocolateVendingMachine m = new ChocolateVendingMachine();
        m.restock();
        m.restock();
        m.restock();
        m.printInventory();
        m.select("Ding");
        m.dispense();
        m.insertMoney(2);
        m.dispense();
        m.dispense();
        m.dispense();
    }

    class Ding
    {
        int preis;

        Ding()
        {
            dingPreis++;
            this.preis = dingPreis;

        }

        public int getPrice()
        {
            return preis;
        }

        public String getDescription()
        {
            return "Ding";
        }

        public String toString()
        {
            return "Ein " + getDescription() + ", Preis " + preis;
        }

    }
}
 

Gerd

Mitglied
Wenn ich es so mache wie folgt scheint es jedenfalls zu klappen:

Code:
public Ding dispense()
    {
        System.out.println("inhalt: " + inhalt.size());
        for (Ding item : inhalt)
        {
            if (selection == null)
            {
                System.out.println("nix selektiert");
                return null;
            }

            if (item.getPrice() <= balance)
            {
                System.out.println("Folgendes Produkt wurde gekauft: " + selection + ", " + item.getPrice() + ", " + balance);
                balance -= item.getPrice();
                total += item.getPrice();
                inhalt.remove(selection);
                selection = null;
                return selection;
            }

Das Problem ist nur was gebe ich dann als return ?
Laut Aufgabe soll ich die toString() Mehtode aus der Klasse IChoclate verwenden was ich aber irgendwie nicht hinbekomme.

Die Klasse sieht so aus:

Code:
package prog2.project2;

/**
 * 


 * Diese Klasse implementiert das Interface {@link IChocolate}.
 * </p>
 *
 * 


 * In BlueJ können Sie über den Menüpunkt "Tools - Project Documentation" eine HTML-Dokumentation erzeugen. Dadurch erhalten Sie
 * Zugriff auf die von uns vorgegebene Spezifikation dieser Klasse. Weiter können Sie direkt im BlueJ Editor auf die Dokumentation
 * zurückgreifen. Wählen Sie dazu in der Toolbar des Editors "Interface" statt "Implementation" aus. Weitere Informationen finden
 * Sie im Kapitel "10.4 Generating documentation" des offiziellen BlueJ Tutorials.
 * </p>
 */
public class Chocolate implements IChocolate {

    /**
     * Erzeugt ein neues Produkt.
     *
     * @param description
     *            Produktbeschreibung
     * @param price
     *            Preis des Produktes
     */
    private int p;
    private String d;
    
    public Chocolate(String description, int price) {
        super();
        p = price;
        d = description;
        
        
    }

    public String getDescription() {
        
        return d;
    }

    public int getPrice() {
        
        return p;
    }

    @Override
    public String toString() {
        return getDescription() + " - " + getPrice();
    }

}
[/code]
 
S

SlaterB

Gast
> Das Problem ist nur was gebe ich dann als return ?

inhalt.remove(selection);
IChocolate temp = selection
selection = null;
return temp;

> Laut Aufgabe soll ich die toString() Mehtode aus der Klasse IChoclate verwenden was ich aber irgendwie nicht hinbekomme.

das hat nix mit dem bisherigen zu tun? und ist auch keine vollständige Frage,
was willst du damit sagen?
 

Gerd

Mitglied
Wenn man so wie du meintest

Inhalt.remove(item);

benutzt wird jedenfalls das falsche Objekt entfernt.
 
S

SlaterB

Gast
sehr überzeugend
(Eile ist kein Grund, nicht gleich auf das andere Forum mitzuverlinken)
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben