Output Fehler (Java-Programm Kuchen)

Euler123

Mitglied
Hallo,
Diesmal habe ich einen Output-Fehler in Teilaufgabe 2 (Teilaufgabe 1 funktioniert 😎). Die genaue Aufgabenstellung lautet:

Aufgabe 02​

Teil 1 1 von 1 Tests bestanden​

Schreiben Sie ein Programm, das berechnet, wie viele Kuchen mit einer gegebenen Menge von Zutaten gebacken werden können. Einfachheitshalber verwenden wir folgendes Grundrezept:

Benötigte Zutatenmengen pro Kuchen:

  • Mehl (in g): 200
  • Zucker (in g): 100
  • Eier (Stück): 2
Der Benutzer wird aufgefordert, die verfügbare Menge der jeweiligen Zutaten einzugeben (in ganzen Zahlen). Danach soll ausgegeben werden, wie viele Kuchen mit diesen Menge gebacken werden können. Zusätzlich soll der verbleibende Rest pro Zutat ausgegeben werden.

Beispiel:

? Mehl: 1000
? Zucker: 400
? Eier: 7
Anzahl der Kuchen: 3
Rest: 400g Mehl, 100g Zucker, 1 Ei(er)

Beispiel:

? Mehl: 400
? Zucker: 400
? Eier: 4
Anzahl der Kuchen: 2
Rest: 0g Mehl, 200g Zucker, 0 Ei(er)

Teil 2 0 von 1 Tests bestanden​

Wir nehmen an, die in Teil 1 gebackenen Kuchen sowie andere Speisen werden gegen freiwillige Spenden an eine Gruppe von Personen verteilt. Das Programm soll die eingenommene Spendensumme berechnen und auf Grundlage der Erzeugungskosten ausgeben, ob durch die Spendeneinnahmen ein Gewinn erzielt wurde oder ein Verlust entsteht. Die Erzeugungskosten für die Kuchen sind einzugeben.

Zuerst sollen die für das Backen entstandenen Erzeugungskosten (als Kommazahl) und die Anzahl der spendenden Personen eingegeben werden. Danach soll pro Person die Höhe der gegebenen Spende (als Kommazahl) eingegeben werden.

Sobald aufgrund der zuletzt eingegebenen Spende die laufende Spendensumme mindestens so hoch ist wie die Kosten, soll ein Hinweis ausgegeben werden (siehe Beispiel). Danach kann es noch weitere Spenden geben. Wird kein Gewinn erzielt (also übersteigen die Kosten die Gesamtspenden), soll das Programm am Ende "Verlust" ausgeben.

Achten Sie bei der Formatierung darauf, dass sie exakt den Beispielen entspricht.

Beispiel:

? Kosten: 5.20
? Anzahl der Abnehmer: 5
? Spende: 2.50
? Spende: 0.80
? Spende: 2.00
--- Gewinnzone ---
? Spende: 0.50
? Spende: 1.00
Gesamtspenden: 6.8

Beispiel:

? Kosten: 4.80
? Anzahl der Abnehmer: 3
? Spende: 0.5
? Spende: 1
? Spende: 0.20
Gesamtspenden: 1.7
Verlust

Beispiel:

? Kosten: 20
? Anzahl der Abnehmer: 2
? Spende: 20
--- Gewinnzone ---
? Spende: 0
Gesamtspenden: 20.0
Mein Code lautet:
Java:
package einfprog;

public class Bsp02 {
    public static void main(String[] args) {
        // TODO: Implement.
        SavitchIn in = new SavitchIn();
        
        // Zutatenmengen pro Kuchen
        int mehlProKuchen = 200;
        int zuckerProKuchen = 100;
        int eierProKuchen = 2;

        System.out.print("? Mehl: ");
        int verfuegbaresMehl = in.readInt();
        System.out.print("? Zucker: ");
        int verfuegbarerZucker = in.readInt();
        System.out.print("? Eier: ");
        int verfuegbareEier = in.readInt();

        // Anzahl der Kuchen
        int anzahlKuchen = Math.min(
            verfuegbaresMehl / mehlProKuchen,
            Math.min(verfuegbarerZucker / zuckerProKuchen, verfuegbareEier / eierProKuchen)
        );

        // Rest
        int restMehl = verfuegbaresMehl - anzahlKuchen * mehlProKuchen;
        int restZucker = verfuegbarerZucker - anzahlKuchen * zuckerProKuchen;
        int restEier = verfuegbareEier - anzahlKuchen * eierProKuchen;

        System.out.println("Anzahl der Kuchen: " + anzahlKuchen);
        System.out.println("Rest: " + restMehl + "g Mehl, " + restZucker + "g Zucker, " + restEier + " Ei(er)");

        
        //Teil 2
        
        System.out.print("? Kosten: ");
        double kosten = in.readDouble();

        System.out.print("? Anzahl der Abnehmer: ");
        int anzahlAbnehmer = in.readInt();

        // Gesamtspenden und Anzahl der Spenden
        double gesamtspenden = 0;
        int spendenAnzahl = 0;

        boolean gewinnZoneErreicht = false;

        // Eingabe der Spenden pro Person
        while (true) {
            System.out.print("? Spende: ");
            double spende = in.readDouble();

            gesamtspenden += spende;

            if (!gewinnZoneErreicht && gesamtspenden >= kosten) {
                gewinnZoneErreicht = true;
                System.out.println("--- Gewinnzone ---");
            }

            // Wenn alle Personen gespendet haben
            if (spendenAnzahl == anzahlAbnehmer) {
                break;
            }
        }

        System.out.println("Gesamtspenden: " + gesamtspenden);

        // Prüfen, ob Gewinn oder Verlust erzielt wurde
        if (gesamtspenden >= kosten) {
            
        } else {
            System.out.println("Verlust");
        }
    }
}

Hierbei entsteht folgende Fehlermeldung:
1699125626371.png

Falls mit jemand einen Tipp geben könnte, was ich in der Zweiten Teilaufgabe eventuell falsch mache, wäre ich sehr dankbar!
 
Du erhöhst die Variable spendenAnzahl nicht. --> Endlosscheifle.
Eine for next Schleife über die Variable anzahlAbnehmer wäre vielleicht besser.
Eine for next Schleife ist mir leider noch nicht bekannt (nur die normalen if-Schleifen - kann man das mit der auch lösen?). verstehe ich das richtig, dass ich momentan eine Endlosschleife habe - wie kann ich das unterbinden?
LG
 
Eine for next Schleife ist mir leider noch nicht bekannt (nur die normalen if-Schleifen - kann man das mit der auch lösen?). verstehe ich das richtig, dass ich momentan eine Endlosschleife habe - wie kann ich das unterbinden?
Es gibt keine if Schleifen. Daher ist die Frage, was Du da nun genau sagen willst.

Wenn Du "normale for Schleifen" meintest: Das ist das, was @Blender3D als for next Schleife bezeichnet hat. Neben dieser Schleife gibt es (ab Java 8) noch die for each Schleife.

Generell kannst Du sowas aber auch mit eine while Schleife abhandeln falls Du die for Schleife noch nicht können solltest und das eine Anforderung ist.

Generell ist es bei sowas immer sinnvoll, eben explizit keine Endlosschleife zu verwenden (also kein while(true)). Und der Ansatz sollte immer so sein, dass man sich den Lösungsweg erst in Worten überlegt. Schreibe eine genaue Anleitung, die zum Ziel führt und spiel dies dann mit Stift und Zettel durch.

Wenn Du dann den Lösungsweg verstanden hast, dann kannst Du Code schreiben.

Was da dann auch hilft: Wenn Du schon Methoden schreiben kannst, dann unterteile das Problem in Teilprobleme und löse jedes Teilproblem eigenständig. Dann löst Du unter dem Strich nur ganz einfache, kleine Probleme und bekommst so dann das ganze Problem gelöst.


Aber wenn man den Code, den Du da hast im Detail betrachtet, dann ist das Problem schon deutlich benannt worden:
Du erhöhst die Variable spendenAnzahl nicht.
spendenAnzahl ist 0 und bleibt immer 0. Daher wird die Bedingung der if Anweisung spendenAnzahl == anzahlAbnehmer nie true ergeben (so AnzahlAbnehmer != 0)

In der while Schleife also ein einfaches spendenAnzahl++; würde dieses Problem bereits beheben.
 
Es gibt keine if Schleifen. Daher ist die Frage, was Du da nun genau sagen willst.

Wenn Du "normale for Schleifen" meintest: Das ist das, was @Blender3D als for next Schleife bezeichnet hat. Neben dieser Schleife gibt es (ab Java 8) noch die for each Schleife.

Generell kannst Du sowas aber auch mit eine while Schleife abhandeln falls Du die for Schleife noch nicht können solltest und das eine Anforderung ist.

Generell ist es bei sowas immer sinnvoll, eben explizit keine Endlosschleife zu verwenden (also kein while(true)). Und der Ansatz sollte immer so sein, dass man sich den Lösungsweg erst in Worten überlegt. Schreibe eine genaue Anleitung, die zum Ziel führt und spiel dies dann mit Stift und Zettel durch.

Wenn Du dann den Lösungsweg verstanden hast, dann kannst Du Code schreiben.

Was da dann auch hilft: Wenn Du schon Methoden schreiben kannst, dann unterteile das Problem in Teilprobleme und löse jedes Teilproblem eigenständig. Dann löst Du unter dem Strich nur ganz einfache, kleine Probleme und bekommst so dann das ganze Problem gelöst.


Aber wenn man den Code, den Du da hast im Detail betrachtet, dann ist das Problem schon deutlich benannt worden:

spendenAnzahl ist 0 und bleibt immer 0. Daher wird die Bedingung der if Anweisung spendenAnzahl == anzahlAbnehmer nie true ergeben (so AnzahlAbnehmer != 0)

In der while Schleife also ein einfaches spendenAnzahl++; würde dieses Problem bereits beheben.
@KonradN: Anstatt von if-Schleife meinte ich natürlich while-Schleife (und habe wahrscheinlich an die if-Anweisung gedacht). Danke für die Korrektur:

spendenAnzahl ist 0 und bleibt immer 0. Daher wird die Bedingung der if Anweisung spendenAnzahl == anzahlAbnehmer nie true ergeben (so AnzahlAbnehmer != 0)​

Danke für die genaue Ausführung
 
Sehr gerne. Ich hoffe, Du kommst damit jetzt weiter. Wenn Du weitere Hilfe brauchst, dann einfach wieder melden.
 
Sehr gerne. Ich hoffe, Du kommst damit jetzt weiter. Wenn Du weitere Hilfe brauchst, dann einfach wieder melden.
Sehr gerne. Ich hoffe, Du kommst damit jetzt weiter
Leide noch nicht 🙃! Um das Problem jetzt noch mal zusammenzufassen - In meinem momentanen Code erhöhe ich die Spendenanzahl nicht und das Problem liegt an der while-Schleife?
Java:
spendenAnzahl++;
müsste eine Inkremente-Operation sein - aber ich baue das irgendwie noch falsch ein (es entsteht entweder die gleiche Fehlermeldung oder ein time out!).
 
Da müsstest Du dann noch einmal den ganzen Code zeigen, den Du jetzt hast. Du kannst den ja auch selbst durchspielen um zu schauen, was er da so macht. Das hat den Vorteil, dass Du dann entweder den Debugger nutzen kannst oder Du kannst noch mehr Informationen angeben.

Und was ist der genaue Fehler. In dem Bildschirmfoto wird ganz offensichtlich auch das Format angemeckert - evtl. musst Du Zahlen noch richtig formatieren z.b. auf zwei Nachkommastellen. Aber da müsste man einfach die genaue Aufgabenstellung zu wissen.
 
Da müsstest Du dann noch einmal den ganzen Code zeigen, den Du jetzt hast. Du kannst den ja auch selbst durchspielen um zu schauen, was er da so macht. Das hat den Vorteil, dass Du dann entweder den Debugger nutzen kannst oder Du kannst noch mehr Informationen angeben.

Und was ist der genaue Fehler. In dem Bildschirmfoto wird ganz offensichtlich auch das Format angemeckert - evtl. musst Du Zahlen noch richtig formatieren z.b. auf zwei Nachkommastellen. Aber da müsste man einfach die genaue Aufgabenstellung zu wissen.
Ich habe jetzt nochmals versucht meinen Fehler zu verstehen:
Der Fehler liegt vermutlich in der while-Schleife (true). Um zu verhindern, dass das Programm in eine "Endlosschleife" gerät, muss innerhalb der Schleife ein Break ausgeführt werden. Die einzige Pause in der Schleife ist bedingt: if (spendenAnzahl == anzahlAbnehmer) { break; }. Die Schleife wird also dann und nur dann beendet, wenn (spendenAnzahl == anzahlAbnehmer) wahr ist. Aber nichts in der Schleife wird einen dieser Werte ändern. Die Schleife wird also entweder einmal durchlaufen oder "für immer".

Richtig soweit?

Gelöst bekomme ich das Porblem aber trotzdem nicht
Java:
spendenAnzahl++;
habe ich jetzt vergeblich versucht in folgenden Code einzusetzen:
Code:
package einfprog;

public class Bsp02 {
    public static void main(String[] args) {
        // TODO: Implement.
        SavitchIn in = new SavitchIn();
        
        // Zutatenmengen pro Kuchen
        int mehlProKuchen = 200;
        int zuckerProKuchen = 100;
        int eierProKuchen = 2;

        System.out.print("? Mehl: ");
        int verfuegbaresMehl = in.readInt();
        System.out.print("? Zucker: ");
        int verfuegbarerZucker = in.readInt();
        System.out.print("? Eier: ");
        int verfuegbareEier = in.readInt();

        // Anzahl der Kuchen
        int anzahlKuchen = Math.min(
            verfuegbaresMehl / mehlProKuchen,
            Math.min(verfuegbarerZucker / zuckerProKuchen, verfuegbareEier / eierProKuchen)
        );

        // Rest
        int restMehl = verfuegbaresMehl - anzahlKuchen * mehlProKuchen;
        int restZucker = verfuegbarerZucker - anzahlKuchen * zuckerProKuchen;
        int restEier = verfuegbareEier - anzahlKuchen * eierProKuchen;

        System.out.println("Anzahl der Kuchen: " + anzahlKuchen);
        System.out.println("Rest: " + restMehl + "g Mehl, " + restZucker + "g Zucker, " + restEier + " Ei(er)");

        
        //Teil 2
        
        System.out.print("? Kosten: ");
        double kosten = in.readDouble();

        System.out.print("? Anzahl der Abnehmer: ");
        int anzahlAbnehmer = in.readInt();

        // Gesamtspenden und Anzahl der Spenden
        double gesamtspenden = in.readInt();
        int spendenAnzahl = in.readInt();

        boolean gewinnZoneErreicht = false;

        // Eingabe der Spenden pro Person
        while (true) {
            System.out.print("? Spende: ");
            double spende = in.readDouble();
            
            gesamtspenden += spende;

            if (!gewinnZoneErreicht && gesamtspenden >= kosten) {
                gewinnZoneErreicht = true;
                System.out.println("--- Gewinnzone ---");
            spendenAnzahl ++;
            }
            
            // Wenn alle Personen gespendet haben
            if (spendenAnzahl == anzahlAbnehmer) {
                break;
            }

        }

        System.out.println("Gesamtspenden: " + gesamtspenden);

        // Prüfen, ob Gewinn oder Verlust erzielt wurde
        if (gesamtspenden >= kosten) {
            
        } else {
            System.out.println("Verlust");
        }
    }
}

Wenn kein Time out entsteht, bekomme ich folgende Fehlermeldung:
1699297512304.png
 
Wann wird denn jetzt der Wert erhöht? Und wann willst du ihn erhöhen?

Willst du ihn nur ein Mal erhöhen, wenn die Grenze erreicht wird?
 
Wann wird denn jetzt der Wert erhöht? Und wann willst du ihn erhöhen?

Willst du ihn nur ein Mal erhöhen, wenn die Grenze erreicht wird?
So wie ich die Aufgabe verstehe, muss die Anzahl der Abnehmer mit der Anzahl der Spenden übereinstimmen (dass ist ja dann User Imput). Wenn die Gewinnzone erreicht wird, dann soll "---Gewinnzone---" ausgegeben werden und danach eventuelle weitere Spenden. Falls kein Gewinn vorherrscht soll Verlust ausgegeben werden.

Wenn ich es richtig verstehe werden jetzt nach der Gewinnzone keine Spenden ausgegeben, wo aber welche ausgegeben werden müssten, dalls vorhanden!?
 
Java:
        //Teil 2
        
        System.out.print("? Kosten: ");
        double kosten = in.readDouble();

        System.out.print("? Anzahl der Abnehmer: ");
        int anzahlAbnehmer = in.readInt();

        // Gesamtspenden und Anzahl der Spenden
        double gesamtspenden = 0;
        int spendenAnzahl = 0;

        boolean gewinnZoneErreicht = false;

        // Eingabe der Spenden pro Person
            while (spendenAnzahl < anzahlAbnehmer) {
            spendenAnzahl ++;
            System.out.print("? Spende: ");
            double spende = in.readDouble();
            gesamtspenden += spende;

            if (!gewinnZoneErreicht && gesamtspenden >= kosten) {
                gewinnZoneErreicht = true;
                System.out.println("--- Gewinnzone ---");
            }
        }

        System.out.println("Gesamtspenden: " + gesamtspenden);

        // Prüfen, ob Gewinn oder Verlust erzielt wurde
        if (gesamtspenden >= kosten) {
            
        } else {
            System.out.println("Verlust");
        }
    }
}

Damit hats funktioniert - hab jetzt die while-Schleife einfach noch mal ganz neu angefangen.
 

Neue Themen


Zurück
Oben