Erstes "kleines" Programm

exylian

Mitglied
Hallo liebe Community,

seit kurzem Befasse ich mich nun mit dem programmieren und habe dies auch mit JAVA begonnen. Somit bin ich noch ein kompletter Neueinsteiger 🙂

Am gestrigen Abend habe ich mir mal die Zeit genommen und mir ein kleines Einkaufs Programm geschrieben.

Was mich interessieren würde, ob ich dort vielleicht Dinge zu sehr verkompliziert habe und es elegantere Lösungen gibt etc. - Lieber von beginn an richtig machen!

Desweiteren habe ich mir um die Console auf zuräumen Abhilfe geschaffen in dem mir das Programm zu einem Zeitpunkt einfach 20 leere Zeilen ausgibt. (ClearScreen.clearScreen();)

Gibt es dafür elegantere Varianten?


Hier mal mein Code der Main Klasse:

Java:
package de.felixhoevel;

import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;
import java.util.Scanner;

public class Main {

    public static void main(String[] args) {

        List<Integer> warenkorbBananen = new ArrayList<Integer>();
        List<Integer> warenkorbAepfel = new ArrayList<Integer>();
        List<Integer> warenkorbErdbeeren = new ArrayList<Integer>();
        List<Integer> warenkorbNutella = new ArrayList<Integer>();
        List<Integer> warenkorbBrot = new ArrayList<Integer>();

        while (true) {

            System.out.println("Welchen Artikel moechten sie einkaufen?");
            System.out.println("0 - Einkauf beenden");
            System.out.println("1 - Bananen");
            System.out.println("2 - Aepfel");
            System.out.println("3 - Erdbeeren");
            System.out.println("4 - Nutella");
            System.out.println("5 - Brot");
            System.out.println("6 - Rechnung anzeigen");

            switch (new Scanner(System.in).nextInt()) {
                case 0:
                    System.out.println("Auf Wiedersehen!");
                    System.exit(0);

                case 1:
                    int i = 0;
                    System.out.println("Die Bananen kosten: " + Prices.BANANEN);
                    System.out.println("Wie viele Bananen moechten sie kaufen?");
                    int numBananen = new Scanner(System.in).nextInt();
                    warenkorbBananen.add(i, numBananen);
                    ++i;

                    break;

                case 2:
                    int ii = 0;
                    System.out.println("Die Aepfel kosten: " + Prices.AEPFEL);
                    System.out.println("Wie viele Aepfel moechten sie kaufen?");
                    int numAepfel = new Scanner(System.in).nextInt();
                    warenkorbAepfel.add(ii, numAepfel);
                    ++ii;

                    break;

                case 3:
                    int iii = 0;
                    System.out.println("Die Erdbeeren kosten: " + Prices.ERDBAEREN);
                    System.out.println("Wie viele Erdbeeren moechten sie kaufen?");
                    int numErdbaeeren = new Scanner(System.in).nextInt();
                    warenkorbErdbeeren.add(iii, numErdbaeeren);
                    ++iii;

                    break;

                case 4:
                    int iiii = 0;
                    System.out.println("Das Nutella kostet: " + Prices.NUTELLA);
                    System.out.println("Wie viele Glaeser Nutella moechten sie kaufen?");
                    int numNutella = new Scanner(System.in).nextInt();
                    warenkorbNutella.add(iiii, numNutella);
                    ++iiii;

                    break;

                case 5:
                    int iiiii = 0;
                    System.out.println("Das Brot kostet: " + Prices.BROT);
                    System.out.println("Wie viele Brote moechten sie kaufen?");
                    int numBrot = new Scanner(System.in).nextInt();
                    warenkorbBrot.add(iiiii, numBrot);
                    ++iiiii;

                    break;

                case 6:
                    // Bananen
                    ListIterator<Integer> liBananen = warenkorbBananen.listIterator();
                    int summeBananen = 0;
                    while (liBananen.hasNext()) {
                        summeBananen += liBananen.next();
                    }
                    double preisBananenGesammt = summeBananen * Prices.BANANEN;

                    //Aepfel
                    ListIterator<Integer> liAepfel = warenkorbAepfel.listIterator();
                    int summeAepfel = 0;
                    while (liAepfel.hasNext()) {
                        summeAepfel += liAepfel.next();
                    }
                    double preisAepfelGesammt = summeAepfel * Prices.AEPFEL;

                    //Erdbeeren
                    ListIterator<Integer> liErdbeeren = warenkorbErdbeeren.listIterator();
                    int summeErdbeeren = 0;
                    while (liErdbeeren.hasNext()) {
                        summeErdbeeren += liErdbeeren.next();
                    }
                    double preisErdbeerenGesammt = summeErdbeeren * Prices.ERDBAEREN;

                    //Nutella
                    ListIterator<Integer> liNutella = warenkorbNutella.listIterator();
                    int summeNutella = 0;
                    while (liNutella.hasNext()) {
                        summeNutella += liNutella.next();
                    }
                    double preisNutellaGesammt = summeNutella * Prices.NUTELLA;

                    //Brot
                    ListIterator<Integer> liBrot = warenkorbBrot.listIterator();
                    int summeBrot = 0;
                    while (liBrot.hasNext()) {
                        summeBrot += liBrot.next();
                    }
                    double preisBrotGesammt = summeBrot * Prices.BROT;

                    double preisGesammtNetto = preisBananenGesammt + preisAepfelGesammt + preisErdbeerenGesammt + preisNutellaGesammt + preisBrotGesammt;
                    double preisGesammtBrutto = preisGesammtNetto * 1.07;

                    //Runden
                    preisGesammtNetto = Math.round((preisGesammtNetto * 100d) / 100d);
                    preisGesammtBrutto = Math.round((preisGesammtBrutto * 100d) / 100d);

                    ClearScreen.clearScreen();
                    System.out.println("Ihre Rechnung:");
                    System.out.println(summeBananen + "x Bananen(" + Prices.BANANEN + ")   Gesammt: " + preisBananenGesammt);
                    System.out.println(summeAepfel + "x Aepfel(" + Prices.AEPFEL + ")   Gesammt: " + preisAepfelGesammt);
                    System.out.println(summeErdbeeren + "x Erdbeeren(" + Prices.ERDBAEREN + ")   Gesammt: " + preisErdbeerenGesammt);
                    System.out.println(summeNutella + "x Nutella(" + Prices.NUTELLA + ")   Gesammt: " + preisNutellaGesammt);
                    System.out.println(summeBrot + "x Brot(" + Prices.BROT + ")   Gesammt: " + preisBrotGesammt);
                    System.out.println("");
                    System.out.println("Preis Netto: " + preisGesammtNetto);
                    System.out.println("zzgl. 7% MwSt");
                    System.out.println("Preis Brutto: " + preisGesammtBrutto);

                    try {
                        Thread.sleep(5000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }

                    ClearScreen.clearScreen();
                    break;



                default:
                    System.out.println("Falsche Eingabe");
                    continue;
            }
        }


    }
}


Ich freue mich auf Rückmeldung und verbleibe

Mit freundlichen Grüßen
Felix
 
Ich würd anstelle deiner vielen Listen eine Map (zum Beispiel HashMap) verwenden.
Dann könntest du es wie folgt machen:
Java:
static HashMap<String,Integer> warenkorb = new HashMap<String,Integer>();

public static void add(String gegenstand,int anzahl) {
    warenkorb.put(gegenstand,warenkorb.get(gegenstand)+anzahl);
}
public static void remove(String gegenstand,int anzahl) {
    warenkorb.put(gegenstand,warenkorb.get(gegenstand)-anzahl);
}
public static int get(String gegenstand) {
    return warenkorb.get(gegenstand);
}
Mit diesen Methoden könntest du dann Gegenstände in den Warenkorb hinzufügen,entfernen und überprüfen wieviel drin ist.

Edit: static hinzugefügt
 
Zuletzt bearbeitet:
Ich denke nicht, dass das so funktioniert. Bei case 0 hast du am Ende das break vergessen. Und wenn du zwei mal Bananen kaufts gehts sicher auch nicht, da du die Variable, welche den Index der Liste speichert, immer wieder neu initialisierst beim nächsten Schleifendurchlauf.

Versuche objektorientiert zu programmieren...

Bezüglich deiner Frage, ich glaube nicht dass das geht. Du kannst formatierte Ausgaben machen.

Bei Linux in der Konsole werden bei dem Befehl "clear" übrigens auch nur Leerzeilen ausgegeben, von dem her ist es sicher nicht schlecht.
 
Hallo,

while(true)-Schleifen macht man nicht. Die Schleife sollte jederzeit beendbar sein. Du kannst zum Beispiel am Anfang eine Variable machen, welche den Wert true hat und diese z.B. am Ende des Einkaufs auf false setzen.

Du hast bisher alles in der Main-Methode stehen, dadurch ist diese auch sehr sehr lang. Versuche vielleicht, sehr ähnliche Code-Abschnitte in einzelne Methoden zu schreiben. Du sparst dir Schreibarbeit und der Code wird übersichtlicher.

Versuche, dir gleich englische Bezeichnungen für Variablen, Klassen, Objekte etc. anzugewöhnen.

Bisher belegst du bei allen Listen immer nur die erste Position. Wenn es dir rein um die Anzahl der Artikel geht, kannst du auch normale int-Variablen benutzen anstelle der Listen.

Anstatt der fünf Listen für die einzelnen Lebensmittel könnte man auch mit Maps arbeiten, hier hättest du immer Schlüssel-Wert-Paare, z.B. anzahlErdbeeren => 4, anzahlBananen => 2, etc.
Oder man könnte eine allgemeine List<Lebensmittel> anlegen, aber das geht schon in Richtung Vererbung und ist vielleicht noch zu viel "magic".


Viele Grüße,
Saheeda
 

Neue Themen


Zurück
Oben