Wie schreibe ich das Programm weiter?

1 Antwort

Beginne nicht mit dem Schreiben von Quellcode, sondern beschreibe erst einmal schrittweise den Programmablauf. Mache dir dazu eine Skizze / mal einen Programmablaufplan / erstelle ein Struktogramm / schreibe Stichpunkte / o.ä..

Dies hilft dir letzten Endes auch zu erfassen, welche Kontrollstrukturen du benötigst, um das Programm sich so verhalten zu lassen, wie angefordert.

Zudem brauchst du ja noch den mathematischen Weg, um den Rabatt berechnen zu können. Das beschränkt sich, soweit ich es überflogen habe, glücklicherweise nur auf eine einfache Dreisatzrechnung.

Bei 10 Prozent:

Rabatt = Preis / 100 * 10
Endpreis = Preis - Rabatt

Außerdem musst du noch wissen, wie du Eingaben einlesen kannst. Dafür eignet sich eine Instanz der Scanner-Klasse.

Ein einfaches Beispiel:

import java.util.Scanner;

public class Main {
  public static void main(String[] args) {
    Scanner reader = new Scanner(System.in);
    String name = reader.next();
    int age = reader.nextInt();
  }
}

Dieses Programm liest nacheinander zwei Werte aus dem Eingabekanal der Konsole. Einmal einen String und einmal eine Zahl.

Und zu guter Letzt, da es eine häufige Fehlerquelle ist: Vergleiche Strings stets mit equals, nicht mit dem Vergleichsoperator. Letzterer schaut bei Referenzen, ob beide an der gleichen Stelle im Speicher liegen, nicht nach Wertgleichheit.

Beispiel mit equals:

String word1 = "some word";
String word2 = "another word";

if (word1.equals(word2)) {
  // words are equal ...
}

Loooollyyy 
Fragesteller
 06.06.2021, 14:54

Kann man das auch so machen?

import java.util.Scanner;
public class Pizza{


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));
    }}
0
regex9  06.06.2021, 15:23
@Loooollyyy

1) Du legst jedesmal ein neues Scanner-Objekt an:

o = new Scanner(System.in).nextInt();

Dabei brauchst du nur eines (wie oben gezeigt): Das macht deinen Code kürzer und verschleudert auch nicht unnötig Ressourcen.

2) An dieser Stelle:

if (o == 1) {
  sum += 5.50f;
}

if (o == 2) {
  sum += 4.30f;
}

würde ich dir noch zu einem if-else if (oder switch) raten. Aktuell muss der Computer in jedem Fall immer beide Vergleiche vornehmen, obwohl von Beginn an (für dich) klar ist, dass nur ein Fall zutreffen kann. Die Variable o hat nur einen Wert (1 / 2 / einen anderen). Mit einer der vorgeschlagenen Kontrollstrukturen würde im besten Fall nur ein Vergleich für den Computer notwendig sein und im schlechtesten Fall zwei Vergleiche (wie derzeit).

3) Ich würde dir noch empfehlen, deinen Variablen eindeutige, aussagekräftige Namen zu geben. Mit a, o, e, ... kann man, wenn man den Programmcode liest, nichts anfangen und man ist gezwungen, ihren Sinn erst zu entschlüsseln. Mit guten Bezeichnern hingeegen bleibt der Programmcode lesbar und ist somit auch einfacher zu verstehen. Fehlerquellen reduziert es in diesem Sinne ebenso.

PS.: Die Programmlogik habe ich jetzt nicht geprüft. Das kannst du ja über Tests selbst machen.

1
Loooollyyy 
Fragesteller
 06.06.2021, 21:17
@regex9

so in etwa?

 import java.util.Scanner;
public class Pizza{


public static void main(String[] args) {
        System.out.println("Willkommen! Bestellung:");
        float sum = 0f;
        int option;
        do {
            System.out.println("1: Salami Pizza 5.50 €");
            System.out.println("2: Veggi Pizza 4.30 €");
            System.out.println("3: Ende");
            
            if(option == 1) {
                sum += 5.50f;
            }
            else (option == 2) {
                sum += 4.30f;}
            
            System.out.println("Zwischensumme: " + sum);
        } while (option != 3);
        
        System.out.println("Entfernung in km (natürliche Zahl):");
       
        int a = 0;
        int entfernung;
		if (entfernung <= 2 || entfernung >= 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));
    }}

Da kommt mir aber diese Fehlermeldung, weiß allerdings ehrlich gesagt, wie ich das zu beheben habe, außer das jetzt mit der Klammer...

The left-hand side of an assignment must be a variable

Syntax error, insert "AssignmentOperator Expression" to complete Assignment

Syntax error, insert ";" to complete Statement

Locale cannot be resolved to a variable

at Pizza.main(Pizza.java:16)

0
regex9  06.06.2021, 22:21
@Loooollyyy

Rätst du gerade? Du liest aktuell gar nichts mehr ein.

Zu (vermutlich) Zeile 16: Ein else-Zweig hat keinen Kopf mit Bedingung (es heißt ja auch: wenn ... sonst ...). Ein if-else if hingegegen schon.

if (option == 1) {
  sum += 5.50f;
}
else if (option == 2) {
  sum += 4.30f;
}

Für die Locale-Klasse muss im Übrigen der Import angegeben werden, wenn nicht bereits getan.

import java.util.Locale;
0