Pizzabestellung

C

Cloooud

Mitglied
Hallo und zwar habe ich diese Aufgabe zu lösen, jetzt wäre meine Frage, wie speichere ich die Preise in float ein?

Schreiben Sie ein ausführbares Programm, das eine Pizzabestellung simuliert.

Nach einer Begrüßung soll dem Benutzer ein Menü präsentiert werden, in dem 3 Optionen zur Auswahl stehen:

  1. Salami Pizza 5.50Euro
  2. Veggi Pizza 4.30Euro
  3. Ende

Bei Auswahl einer Pizza wird ein entsprechender Preis aufsummiert und das Menü erscheint erneut.

Dieser Vorgang wird wiederholt, bis der Benutzer die 3. Option "Ende" wählt.

Dann wird nach der Lieferentfernung in vollen km gefragt und folgendermaßen ein Rabatt berechnet:

  • 10 Prozent, wenn die Entfernung maximal 2km beträgt, weil der Lieferbote dann laufen kann
  • 10 Prozent, wenn die Entfernung mindestens 20km beträgt, weil die Pizza dann kalt ankommt
  • zusätzlich 10 Prozent, wenn die Bestellung einen Wert von 10Euro überschreitet
  • und zusätzlich 10 Prozent, wenn die Bestellung einen Wert von 20Euro überschreitet (zusätzlich also 20% Rabatt bei Bestellungen über 20€)


Zuletzt wird der endgültige Rabatt und der resultierende Preis präsentiert und das Programm endet.

Java:
public class Pizzaa {

    public static void main(String[] args) {
        System.out.println("Willkommen! Bestellung:");

Habe auch noch nicht viel..
 
JensXF

JensXF

Mitglied
Mit dem f erkennt Java den Wert als float an, sonst würde er daraus ein Double machen bzw. deine IDE fängt an zu meckern das du den Wert zu float casten sollst.
Das Euro-Zeichen musst du weiterhin bei deiner Ausgabe anhängen.
Java:
System.out.println(preisSalamiPizza + "€");
 
C

Cloooud

Mitglied
Hab das jetzt so, kann man das fürs erste so lassen?
Bin natürlich noch nicht fertig...

Java:
public class Pizzaa {

    public static void main(String[] args) {
        System.out.println("Willkommen! Bestellung:");
        
        float preisSalamiPizza = 5.50f;
        System.out.println("1.Salami Pizza"  +  preisSalamiPizza + "Euro");
        
        float preisVeggiPizza = 4.30f;
        System.out.println("2.Veggi Pizza"  +  preisVeggiPizza +   "Euro");
        
        System.out.println("Ende!");
        
        
        System.out.println("Bitte Lieferentfernung [km] eingeben:");
        
        
        
    }}
 
JensXF

JensXF

Mitglied
Wenn du das Programm ausführst siehst du ja was gerade alles nicht so passt.

Willkommen! Bestellung:
1.Salami Pizza5.5Euro
2.Veggi Pizza4.3Euro
Ende!
Bitte Lieferentfernung [km] eingeben:

Zeilenumbrüche, ein paar Leerzeichen, die "3." vor Ende, die zweite Nachkommastelle.
Lass die Variable besser aus dem print-Befehl raus und nutze sie nur zum rechnen.

Vielleicht so
Java:
public static void main(String[] args) {
        
        float preisSalamiPizza = 5.50f;
        float preisVeggiPizza = 4.30f;
        
        System.out.println("Willkommen!");
        System.out.println("Bitte geben Sie Ihre Bestellung ein.");
        System.out.println("");
        
        System.out.println("1. Salami Pizza 5,50 Euro");       
        System.out.println("2. Veggi Pizza 4,30 Euro");
        System.out.println("3. Ende!");
        

    }
 
C

CyborgIstDoof

Mitglied
Salami-Pizza für 5,50 €
Ich finde Veggi Pizza schlimmer...

@Cloooud ich habe dir das mal "skizziert". Wichtig ist zu wissen, dass es beim Rechnen mit float's zu Ungenauigkeiten kommen kann... Zudem sollte erst der Rabatt berechnet werden und dann abgezogen werden....

Java:
    @SuppressWarnings("resource")
    public static void main(String[] args) {
        System.out.println("Willkommen! Bestellung:");
        float sum = 0f;
        int o;
        do {
            System.out.println("1: Salami Pizza 5.50 €");
            System.out.println("2: Veggi Pizza 4.30 €");
            System.out.println("3: Ende");
            o = new Scanner(System.in).nextInt();
            if (o == 1) {
                sum += 5.50f;
            }
            if (o == 2) {
                sum += 4.30f;
            }
            System.out.println("Zwischensumme: " + sum);
        } while (o != 3);
        System.out.println("Entfernung in km (natürliche Zahl):");
        int e = new Scanner(System.in).nextInt();
        int a = 0;
        if (e <= 2 || e >= 20) {
            a += 10;
            System.out.println("-10%, denn e <= 2 || e >= 20");
        }
        if (sum >= 10) {
            a += 10;
            System.out.println("-10%, denn sum >= 10");
        }
        if (sum >= 20) {
            a += 10;
            System.out.println("-10%, denn sum >= 20");
        }
        sum *= (100 - a) / 100.0f;
        System.out.println("Zwischensumme: " + sum);
        System.out.println(String.format(Locale.ROOT, "%.2f €", sum));
    }

o ist hier Option, e ist hier Entfernung und a ist hier Rabatt. Es geht bestimmt noch einfacher bzw kürzer....
 
Lion.King

Lion.King

Mitglied
Kann man es auch ohne dem Scanner machen, da sonst bei mir die Fehlermeldung kommt:

/Pizza.java:11: error: cannot find symbol
o = new Scanner(System.in).nextInt();
^
symbol: class Scanner
location: class Pizza
/Pizza.java:21: error: cannot find symbol
int e = new Scanner(System.in).nextInt();
^
symbol: class Scanner
location: class Pizza
/Pizza.java:37: error: cannot find symbol
System.out.println(String.format(Locale.ROOT, "%.2f €", sum));
^
symbol: variable Locale
location: class Pizza
3 errors
 
mihe7

mihe7

Top Contributor
Du brauchst schon die dazugehörigen imports -> das Raussuchen überlasse ich Dir oder Deiner IDE :)
 
JensXF

JensXF

Mitglied
Kleiner Plan was du Schritt für Schritt machen kannst um weiter zu kommen.

1. Variablen für die Pizzen deklarieren und initialisieren
2. Variable für den Gesamtpreis
3. Um das Menu eine while-Schleife
4. Deine Switch case Abfrage mit in die Schleife
5. Scanner für Nutzereingabe anlegen https://javabeginners.de/Ein-_und_Ausgabe/Scanner.php
6. Variable in der du die Eingabe speicherst

Poste gerne dein Code nach jedem oder nach jedem zweiten Schritt.
Aber bitte, bitte - mit Zucker obendrauf, in CodeTags (Das Symbol oben links </>) :)
 
C

Cloooud

Mitglied
Ich finde Veggi Pizza schlimmer...

@Cloooud ich habe dir das mal "skizziert". Wichtig ist zu wissen, dass es beim Rechnen mit float's zu Ungenauigkeiten kommen kann... Zudem sollte erst der Rabatt berechnet werden und dann abgezogen werden....

Java:
    @SuppressWarnings("resource")
    public static void main(String[] args) {
        System.out.println("Willkommen! Bestellung:");
        float sum = 0f;
        int o;
        do {
            System.out.println("1: Salami Pizza 5.50 €");
            System.out.println("2: Veggi Pizza 4.30 €");
            System.out.println("3: Ende");
            o = new Scanner(System.in).nextInt();
            if (o == 1) {
                sum += 5.50f;
            }
            if (o == 2) {
                sum += 4.30f;
            }
            System.out.println("Zwischensumme: " + sum);
        } while (o != 3);
        System.out.println("Entfernung in km (natürliche Zahl):");
        int e = new Scanner(System.in).nextInt();
        int a = 0;
        if (e <= 2 || e >= 20) {
            a += 10;
            System.out.println("-10%, denn e <= 2 || e >= 20");
        }
        if (sum >= 10) {
            a += 10;
            System.out.println("-10%, denn sum >= 10");
        }
        if (sum >= 20) {
            a += 10;
            System.out.println("-10%, denn sum >= 20");
        }
        sum *= (100 - a) / 100.0f;
        System.out.println("Zwischensumme: " + sum);
        System.out.println(String.format(Locale.ROOT, "%.2f €", sum));
    }

o ist hier Option, e ist hier Entfernung und a ist hier Rabatt. Es geht bestimmt noch einfacher bzw kürzer....
Danke dir erstmal!
Bei mir kommt diese Fehlermeldung, wie behebe ich diese?

Exception in thread "main" java.lang.Error: Unresolved compilation problem:
Locale cannot be resolved to a variable

at Pizza.main(Pizza.java:38)
 
JensXF

JensXF

Mitglied
Hier noch eine mögliche Lösung

Java:
import java.text.DecimalFormat;
import java.util.Scanner;

public class PizzaBestellung {

    public static void main(String[] args) {

        final float PREIS_SALAMI_PIZZA = 5.50f;
        final float PREIS_VEGGI_PIZZA = 4.30f;

        System.out.println("Willkommen beim Pizza Online Express!");
        System.out.println("     Lecker - Günstig - Schnell\n");
        System.out.println("Bitte geben Sie Ihre Bestellung mittels der angegebener Nr. ein.\n");

        DecimalFormat df = new DecimalFormat("0.00");
        Scanner scanner = new Scanner(System.in);
        boolean ende = false;
        int eingabe;
        float preisGesamt = 0f;

        while (!ende) {
            System.out.println("1. Salami Pizza " + df.format(PREIS_SALAMI_PIZZA) + " €");
            System.out.println("2. Veggi Pizza " + df.format(PREIS_VEGGI_PIZZA) + " €");
            System.out.println("3. Ende!");
            System.out.println("\nZwischensumme: " + df.format(preisGesamt) + " €");
            eingabe = scanner.nextInt();

            if (eingabe == 1) {
                preisGesamt += PREIS_SALAMI_PIZZA;
            } else if (eingabe == 2) {
                preisGesamt += PREIS_VEGGI_PIZZA;
            } else if (eingabe == 3) {
                ende = true;
            } else {
                System.out.println("Keine korrekte Auswahl. Versuchen Sie es nochmal.\n");
            }
        }

        System.out.println("\nBitte Lieferentfernung [km] eingeben:");

        float rabatt = 0f;
        eingabe = scanner.nextInt();

        if (eingabe <= 2 || eingabe >= 20) {
            rabatt += 10;
        }

        if (preisGesamt >= 10 && preisGesamt < 20) {
            rabatt += 10;
        } else if (preisGesamt >= 20) {
            rabatt += 20;
        }

        scanner.close();

        System.out.println("\nPreis: " + df.format(preisGesamt) + " €");
        System.out.println("Rabatt: " + df.format(rabatt) + " %");
        System.out.println("Ihr Preis: " + df.format(preisGesamt -= (preisGesamt / 100 * rabatt)) + " €");
    }
}
 
C

CyborgIstDoof

Mitglied
  • Scanner bitte nicht schließen
  • if-else-if ist unschön
  • "\n" ist unschön
  • Zwischenergebnisse sollten noch nicht gerundet werden
  • Die letzte implizite Zuweisung ist ohne Effekt
  • Auf die Variablen-Deklaration-Reihenfolge achtgeben
:)
 
JensXF

JensXF

Mitglied
Danke für dein Feedback @CyborgIstDoof .

Zu 1. Warum sollte man den Scanner nicht schließen. Wenn man es nicht soll, warum gibt es dann die Methode Scanner.close.

Zu 2. OK. Werde ich nochmal ändern.

Zu 3. Finde ich eigentlich auch. Dachte aber das ein System.out.println(" ") mir eher negativ angekreidet wird.

Zu 4. Ist doch nur für die Ausgabe der Zwischensumme, gerechnet wird doch weiterhin mit der ungerundeten Variable. Denke ich jedenfalls.

Zu 5. Weiß ich jetzt leider nicht genau was du meinst. Ich vermute mal irgendwas mit dieser Zeile:

Java:
    System.out.println("Ihr Preis: " + df.format(preisGesamt -= (preisGesamt / 100 * rabatt)) + " €");

Zu 6. Du meinst sicher folgende Zeilen. Währe es so besser?

Java:
boolean ende = false;
DecimalFormat df = new DecimalFormat("0.00");
float preisGesamt = 0f;
Scanner scanner = new Scanner(System.in);       
int eingabe;
 
mihe7

mihe7

Top Contributor
Zu 1. Warum sollte man den Scanner nicht schließen. Wenn man es nicht soll, warum gibt es dann die Methode Scanner.close.
Mit close() wird der übergebene Reader/Stream auch geschlossen. Es gilt der Grundsatz: schließe nichts, was Du geöffnet hast. In Deinem Fall übergibst Du System.in -> hast Du nicht geöffnet -> sollst Du nicht schließen. Wenn Du das machst, kannst Du System.in im weiteren Verlauf des Programms nicht mehr verwenden, probiers einfach mal aus :)

Zu 5. Weiß ich jetzt leider nicht genau was du meinst. Ich vermute mal irgendwas mit dieser Zeile:
Ja, Du hast hier ein -= stehen, weist den neuen Wert also preisGesamt zu, verwendest danach die Variable aber nicht mehr -> kein Effekt.

Zu 6. Du meinst sicher folgende Zeilen. Währe es so besser?
Variablen so spät wie möglich und entsprechend ihrer "Verwendungsdauer" deklarieren. Im Prinzip ist das auf Deinem Kommentar #19 schon ok: df und scanner sind eher Konstanten als Variablen, könnte man also auch final deklarieren und relativ weit an den Anfang stellen (was Du ja auch getan hast), eingabe, preisGesamt und ende sind Variablen, wobei ende nur für die Schleife benötigt wird und daher unmittelbar vor die Schleife gesetzt werden sollte.
 
JensXF

JensXF

Mitglied
Überarbeitet mit Dank an @CyborgIstDoof und @mihe7

Java:
import java.text.DecimalFormat;
import java.util.Scanner;

public class PizzaBestellung {

    @SuppressWarnings("resource")
    public static void main(String[] args) {

        final float PREIS_SALAMI_PIZZA = 5.50f;
        final float PREIS_VEGGI_PIZZA = 4.30f;

        System.out.println("Willkommen beim Pizza Online Express!");
        System.out.println("     Lecker - Günstig - Schnell");
        System.out.println("");
        System.out.println("Bitte geben Sie Ihre Bestellung mittels der angegebener Nr. ein.");
        System.out.println("");

        DecimalFormat df = new DecimalFormat("0.00");
        Scanner scanner = new Scanner(System.in);
        float preisGesamt = 0f;
        int eingabe;
        boolean ende = false;

        while (!ende) {
            System.out.println("1. Salami Pizza " + df.format(PREIS_SALAMI_PIZZA) + " €");
            System.out.println("2. Veggi Pizza " + df.format(PREIS_VEGGI_PIZZA) + " €");
            System.out.println("3. Ende!");
            System.out.println("");
            System.out.println("Zwischensumme: " + df.format(preisGesamt) + " €");
            eingabe = scanner.nextInt();

            if (eingabe == 1) {
                preisGesamt += PREIS_SALAMI_PIZZA;
            }
            if (eingabe == 2) {
                preisGesamt += PREIS_VEGGI_PIZZA;
            }
            if (eingabe == 3) {
                ende = true;
            }
            if (eingabe < 1 || eingabe > 3) {
                System.out.println("Keine korrekte Auswahl. Versuchen Sie es nochmal.");
                System.out.println("");
            }
        }

        System.out.println("");
        System.out.println("Bitte Lieferentfernung [km] eingeben:");

        eingabe = scanner.nextInt();
        float rabatt = 0f;

        if (eingabe <= 2 || eingabe >= 20) {
            rabatt += 10;
        }
        if (preisGesamt >= 10) {
            rabatt += 10;
        }
        if (preisGesamt >= 20) {
            rabatt += 10;
        }

        System.out.println("");
        System.out.println("Preis: " + df.format(preisGesamt) + " €");
        System.out.println("Rabatt: " + df.format(rabatt) + " %");
        System.out.println("Ihr Preis: " + df.format(preisGesamt - (preisGesamt / 100 * rabatt)) + " €");
    }
}
 
Kotelettklopfer

Kotelettklopfer

Mitglied
Hallo und zwar habe ich diese Aufgabe zu lösen, jetzt wäre meine Frage, wie speichere ich die Preise in float ein?

Schreiben Sie ein ausführbares Programm, das eine Pizzabestellung simuliert.

Nach einer Begrüßung soll dem Benutzer ein Menü präsentiert werden, in dem 3 Optionen zur Auswahl stehen:

  1. Salami Pizza 5.50Euro
  2. Veggi Pizza 4.30Euro
  3. Ende

Bei Auswahl einer Pizza wird ein entsprechender Preis aufsummiert und das Menü erscheint erneut.

Dieser Vorgang wird wiederholt, bis der Benutzer die 3. Option "Ende" wählt.

Dann wird nach der Lieferentfernung in vollen km gefragt und folgendermaßen ein Rabatt berechnet:

  • 10 Prozent, wenn die Entfernung maximal 2km beträgt, weil der Lieferbote dann laufen kann
  • 10 Prozent, wenn die Entfernung mindestens 20km beträgt, weil die Pizza dann kalt ankommt
  • zusätzlich 10 Prozent, wenn die Bestellung einen Wert von 10Euro überschreitet
  • und zusätzlich 10 Prozent, wenn die Bestellung einen Wert von 20Euro überschreitet (zusätzlich also 20% Rabatt bei Bestellungen über 20€)


Zuletzt wird der endgültige Rabatt und der resultierende Preis präsentiert und das Programm endet.

Java:
public class Pizzaa {

    public static void main(String[] args) {
        System.out.println("Willkommen! Bestellung:");

Habe auch noch nicht viel..
Die Idee klau ich mir mal als Übungsaufgabe :) Danke
 

Oben