HILFE Dringend switch case springt nicht raus

Goku

Mitglied
Hallo zusammen,

ich habe jetzt schon etwas herum gesucht aber komme einfach zu keinem Ergebnis leider muss ich morgen meine Hausarbeit abgeben und schaffe es nicht mein Programm ( Kaffeemaschine) fertig zu bekommen. Ich habe keine erfahrungen gehabt vorher mit Java aber jetzt habe ich es geschafft einwenig zu Programmieren.
Mein Problem ist, dass ich bei der auswahl vom Menue nicht heraus komme es frägt immer nur das Menue ab und macht nichts weiteres.

Code von der Steuereinheit lautet folgendermaßen:
Java:
public class Steuereinheit {



private static Muenzeinheit m = new Muenzeinheit();

private static  Depot d = new Depot();

private static Kaffeesorten k = null; //null damit am Anfang noch kein Objekt erzeugt wird erst nach eingabe des Kunden

private static Mahlwerk ma = new Mahlwerk();

private static Brueheinheit b = new Brueheinheit();



public static boolean kaffeeZubereiten() {

if (d.getBecher() != 0 || d.getKaffee() != 0 || d.getWasser() != 0) {

d.entnehmeBecher();

Display.anzeigen("Becher wurde entnommen.");

ma.mahlen(d);

b.bruehen(d);

Display.anzeigen("Kaffee und Wasser wurden gebrüht.");

if (k.getMilchEinheiten() != 0) {

d.entnehmeMilch(k.getMilchEinheiten());

Display.anzeigen("Milch wurde zugegeben");

}

if (k.getZuckerEinheiten() != 0) {

d.entnehmeZucker(k.getZuckerEinheiten());

Display.anzeigen("Zucker wurde zugegeben");

}

Display.anzeigen("Genießen Sie ihren Kaffee!"); // Letzte Ausgabe sobald ein Kaffee erfolgreich zubereitet wurde

return true;

}else

Display.anzeigen("Ein fehler ist aufgetreten wir wurden bereits Benachrichtigt und kümmern uns sofort darum"); // Becher, Wasser, Kaffee, Milch und Zucker wird bedarfsweise entnommen

return false;

}


    public static int menueAnzeigen(){                                  // Menü zur Kaffeeauswahl


        Display.anzeigen("Bitte Kaffeesorte auswählen.");

        Display.anzeigen(""); //LEERZEILE

        Display.anzeigen("Drücken Sie 1 für Schwarzer Kaffee       Preis: 1,00 EUR");

        Display.anzeigen("Drücken Sie 2 für Kaffee mit Milch        Preis: 1,20 EUR");

        Display.anzeigen("Drücken Sie 3 für Kaffee mit Zucker       Preis: 1,20 EUR");

        Display.anzeigen("Drücken Sie 4 für Kaffee mit Milch und Zucker Preis: 1,50 EUR");



    return Tastatur.eingabe();

}





public static void main(String[] args) {


boolean abbruch = false;


do {


switch (menueAnzeigen()){


case 1: // Das Kaffeeobjekt, das gewählt wurde wird hier erzeugt.

k = new Kaffeesorten("Schwarzer Kaffee",100, 0, 0); // So existiert immer nur ein Objekt

break;   // break sorgt fue das sofortige beenden der schleife wenn jeweiliger case eintrifft

case 2:

k = new Kaffeesorten("Kaffee mit Milch", 120,1, 0);

break;

case 3:

k = new Kaffeesorten("Kaffee mit Zucker",120, 0, 1);

break;

case 4:

k = new Kaffeesorten("Kaffee mit Milch und Zucker",180, 1, 1);

break;

default:

Display.anzeigen("Eine eingabe ist mit Hilfe der Tastatur nur zwischen 1-4 moeglich!");

continue; // continue sorgt dafür, dass die Schleifenbedingung noch einmal getestet wird


}

if (d.bestandPruefen() ) { // Prueft ob er Kaffee erstellen kann

if (m.auszahlungPruefen() ) {   // Prueft ob eine Auszahlung moeglich

if (d.milchBestand(k.getMilchEinheiten()) ) {   // Prueft die Methode von Depot (milchBestand(int menge) als menge wird die eingegebene menge von Kaffeesorten verwendet

if(d.zuckerBestand(k.getZuckerEinheiten()) ) {

if(m.geldEinzahlen(k.getPreis()) ) {     // das selbe wie oben Methode von Muenzdepot aber nimmt den eingegebenen Preis von Kaffeesorten

kaffeeZubereiten();   // sobald das obere alles Erfolgreich durchlaufen ist wird der Kaffee erstellt


}

}

}

}


}



}

while (abbruch == false);

}

}

Compiler zeigt immer nur an :
Bitte Kaffeesorte auswählen.



Drücken Sie 1 für Schwarzer Kaffee Preis: 1,00 EUR

Drücken Sie 2 für Kaffee mit Milch Preis: 1,20 EUR

Drücken Sie 3 für Kaffee mit Zucker Preis: 1,20 EUR

Drücken Sie 4 für Kaffee mit Milch und Zucker Preis: 1,50 EUR

1

Bitte Kaffeesorte auswählen.



Drücken Sie 1 für Schwarzer Kaffee Preis: 1,00 EUR

Drücken Sie 2 für Kaffee mit Milch Preis: 1,20 EUR

Drücken Sie 3 für Kaffee mit Zucker Preis: 1,20 EUR

Drücken Sie 4 für Kaffee mit Milch und Zucker Preis: 1,50 EUR

1

Bitte Kaffeesorte auswählen.



Drücken Sie 1 für Schwarzer Kaffee Preis: 1,00 EUR

Drücken Sie 2 für Kaffee mit Milch Preis: 1,20 EUR

Drücken Sie 3 für Kaffee mit Zucker Preis: 1,20 EUR

Drücken Sie 4 für Kaffee mit Milch und Zucker Preis: 1,50 EUR
 
Zuletzt bearbeitet:

Goku

Mitglied
Hi, danke für den Hinweise habe ich erledigt :).
Ich weiss leider wirklich nicht was da der Fehler ist, da ich alles wirklich 10x geprüft habe. Normalerweise müsste es funktionieren, da jede Methode eine return funktion hat, damit es weiter läuft.
 

Goku

Mitglied
Okay erledigt.

Java:
public class Tastatur {            /*Gesamte Klasse enthaelt nur eine Methode zur eingabe der Tasten um
                                    gesamten Automat anweisungen zu geben.*/

    public static int eingabe(){        //public ermoeglicht zugriff von �berall ohne Getter- oder Setter

        return IO.promptAndReadInt("");
    }
}
 

Goku

Mitglied
Die Klasse Tastatur und Display enthalten jeweils nur eine Methode.
Tastatur für eingaben und Display nur um etwas Anzeigen zu können.
 

Goku

Mitglied
Perfekt :) vielen vielen vieeeelen Dank hat funktioniert.
Nur macht die Maschine jetzt nicht mehr weiter also sobald ich eine Zahl eingebe passiert nichts mehr.
Compiler zeigt nur noch das Menue an.
Abbruch ist immer möglich sobald eine 0 eingegeben wird.
 

Robat

Top Contributor
Hast du denn mal mittels dem Debugger (oder Konsolenausgaben) geschaut, wie weit er in deinen if-Baum reingeht?
Sagt ja keiner, dass er in dem switch hängen bleibt - du kriegst aber nicht mit warum er kaffeeZubereiten() nicht aufruft.
 

mrBrown

Super-Moderator
Mitarbeiter
Eine deiner if-Abfragen wird nicht das erwartetet liefern - da solltest du mal ein paar Extra-Eingaben hinzufügen oder den Debugger nutzen ;)
 

Javinner

Top Contributor
Um zu prüfen, was dein Code mach, bzw. bis wohin er ausführt, eignet sich sehr gut die System Klasse.
Versuch folgendes: Schreibe System.out.println("Hier sollte jeweils die Zahl der case-Falls stehen"); in jeden case, aber vor dem break;
 

Goku

Mitglied
Dankeschön für eure schnellen antworten. Leider versteh ich grade nicht ganz wie mir der Debugger helfen kann ( hatte ich nie in der Vorlesung :() und mit Display.anzeigen ( Was muss ich dann hier eingeben)?
 

Robat

Top Contributor
Vergiss das mit dem Debugger erstmal - ist für den Anfang sicherlich nicht so zielführend.
Was wir meinen ist, dass du prüfen sollst bis zu welcher if-Anweisung er geht.
Java:
if(<condition1>) {
    Display.anzeigen("Hier geht er rein");
    if(<condition2>) {
          Display.anzeigen("Hier geht er auch rein..");
          // usw. usf.
    }
}

<condition1>, <condition2>, .. sind dann eben deine Bedingungen aus den if-Anweisungen.
 

Goku

Mitglied
Dankeschön. Jetzt habe ich verstanden was ihr meint. also habe es jetzt so geschrieben :
Java:
if (d.bestandPruefen() ) {     Display.anzeigen("IF 1");                                        // Prueft ob er Kaffee erstellen kann
                if (m.auszahlungPruefen() ) {    Display.anzeigen("IF 2");                                       // Prueft ob eine Auszahlung moeglich
                    if (d.milchBestand(k.getMilchEinheiten()) ) {        Display.anzeigen("IF 3");              // Prueft die Methode von Depot (milchBestand(int menge) als menge wird die eingegebene menge von Kaffeesorten verwendet
                        if(d.zuckerBestand(k.getZuckerEinheiten()) ) {Display.anzeigen("IF 4");   
                            if(m.geldEinzahlen(k.getPreis()) ) {        Display.anzeigen("IF 5");            // das selbe wie oben Methode von Muenzdepot aber nimmt den eingegebenen Preis von Kaffeesorten
                                kaffeeZubereiten();

Nun zeigt mir der Compiler ständig:
IF 1
IF 2
IF 1
IF 2
Und das ohne Stop.
Könnte es sein, dass ich die return befehle von meinen If Methoden verändern muss ?
 

Robat

Top Contributor
Nun ja jetzt weißt du auf jeden Fall, dass d.milchBestand(k.getMilchEinheiten()) niemals true zurückgibt.
Jetzt gilt es herauszufinden warum. Erhöhst du den Milchbestand denn ständig?
 

Goku

Mitglied
Jetzt lässt er mich einzahlen nur habe ich noch ein Problem unswar soll er bei der Einzahlung nur erkennen wenn ich 10Ct, 20Ct, 50Ct, 100Ct oder 200Ct eingebe. Dafür habe ich einen default erstellt aber er akzeptiert trotzdem 09Ct und 1 Ct und alles.
Einzahl (geldEinzahlen) Methode sieht folgendermaßen aus :
Java:
    public boolean geldEinzahlen(int preis) {
          summe = 0;
        do {                                                                        // schleife läuft so lange bis der Betrag vollständig bezahlt wurde o. mehr bezahlt wurde
            double fehlenderBetrag = (preis - summe) / 100.0;                        // Ausgabe des noch zu bezahlenden Betrags (Durch 100 teilen, damit Betrag in EURO angezgeigt wird
            Display.anzeigen(String.format("Zu bezahlen: %.2f €", fehlenderBetrag));
            Display.anzeigen("Abbruch mit 0");
            int eingabe = Tastatur.eingabe();
            if (eingabe == 0) {                                                                  // Abbruchfunktion, bei Abbruch wird sofort alles wieder ausgegeben
                Display.anzeigen("Eingeworfener Betrag " + summe + " wird ausgegeben");
                geldAuszahlen(summe);
                return false;
            }
           
            if (geldPruefen()) {
                    Display.anzeigen("Muenze wird nicht akzeptiert!");
                    geldAuszahlen(eingabe);            // Automat gibt eingeworfene Muenze wieder aus;
                return false;
            }
     
            summe += eingabe;
            switch (eingabe) {                                   // Eingezahlte Münzen werden im Münzdepot gespeichert
            case 10:
                zehnCtMuenzen++;
                break;
            case 20:
                zwanzigCtMuenzen++;
                break;
            case 50:
                fuenfzigCtMuenzen++;
                break;
            case 100:
                hundertCtMuenzen++;
                break;
            case 200:
                zweihundertCtMuenzen++;
                break;
//             default:
//                 Display.anzeigen("Eingabe pruefen");            // Default prueft auf Falsche eingabe (Geld)
            }
        } while (summe < preis);
        if (eingabe == 10 || eingabe == 20|| eingabe == 50|| eingabe == 100|| eingabe == 200) {
            summe += eingabe;
            }
            else {
                Display.anzeigen("Betrag nicht akzeptabel");
                //geldAuszahlen(eingabe);
        }
         restgeld = summe - preis;               
        if (summe > preis) {                                           // Ausgabe des Restbetrags
            if (geldAuszahlen(restgeld) == false) {                 
                Display.anzeigen("Rückgeldausgabe nicht möglich, bitte passend zahlen.");
                geldAuszahlen(summe);
                return false;
            }
        }
        return true;
    }
 

Javinner

Top Contributor
Da deine if-Abfrage nach der Zweiten Abfrage verlassen wird und die while Schleife eine endlose ist (was ich bereits schrieb), kommt es zu so einer Ausgabe. Ein kleines Beispiel untermauert es nocheinmal.
Was macht die Methode der Klasse Depot milchBestand();, was liefert die Methode getMilchEinheit() der Klasse Kaffeesorte?
Java:
public class Test
{

    public static void main(String[] args)
    {
        int bedingungA = 2;
        int bedingungB = 3;
        int bedingungC = 4;

        boolean runde = true;
        int i = 2;
        do {

            switch (i) {
                case 1:
                    System.out.println("Eins");
                case 2:
                    System.out.println("Zwei");
                default:
                    System.out.println("Default");
            }

            if (bedingungA > 1) {
                System.out.println("Bedingung A passiert");
                if (bedingungB > 2) {
                    System.out.println("Bedingung B passiert");
                    if (bedingungC > 3) {
                        System.out.println("Alle Bedingungen der Abfrage stimmen");
                    }
                }
            }
        } while (runde);
    }

}
/** Konsolenausgabe */
Zwei
Default
Bedingung A passiert
Bedingung B passiert
Alle Bedingungen der Abfrage stimmen
Zwei
Default
Bedingung A passiert
Bedingung B passiert
Alle Bedingungen der Abfrage stimmen
Zwei
Default
... //Endlosschleife
 

Goku

Mitglied
Hallo zusammen,
ich wollte mich noch einmal bei euch bedanken mein Programm hat voll funktioniert und war ein erfolg.
Ihr wart alle eine große Hilfe, Dankeschön
 

Neue Themen


Oben