Erste Schritte Im Tante-Emma-Laden mehrere Artikel kaufen mit if-Abfrage

jaykop

Mitglied
Hallo,

Ich lerne gerade java und habe hier einen Code geschrieben womit man z.B in einem Tante-Emma-Laden nur ein Artikel von mehreren auswählen und davon den Gesamtpreis ausrechnen kann.

Ich stelle mir aber gerade die Frage wie ich es am besten machen soll wenn man mehrere Artikel kaufen will ? und davon den Gesamtpreis ausrechnen möchte.

Wäre nett wenn mir einer da einen ansatz geben kann.

Java:
    public static void main(String[] args) {

        // Mehrwertsteuersatz
        double mwstSatz = 0;

        //Grundpreis des Artikels
        double grundpreis = 0.0;


        // Scanner anlegen
        Scanner sc = new Scanner(System.in);

        // Formatierung für 2 nachkommerstellen
        DecimalFormat f = new DecimalFormat("#0.00");

        
        // Einlesen Artikel
        System.out.println("Was hätten Sie gerne: ");
        String artikel = sc.next();

        
        // Vergleich der Tastatur eingaben ignoriere groß klein schreibung
        if (artikel.equalsIgnoreCase("gummibaerchen")) {
            grundpreis = 0.05;
            mwstSatz = 7;
            

        } else if (artikel.equalsIgnoreCase("playstation")) {

            grundpreis = 199;
            mwstSatz = 0.19;

        } else if (artikel.equalsIgnoreCase("lakritzstangen")) {

            grundpreis = 0.30;
            mwstSatz = 7;

        } else {

            System.out.println("Artikel nicht vorhanden!");   

        }


        // Einlesen Anzahl
        System.out.println("Geben Sie die Anzahl ein: ");
        int anzahl = sc.nextInt();
        sc.close();

        // Berechnung der Gesamtsumme, Netto Betrag und mwst

        double gesamtSumme = anzahl * grundpreis;
        double netto = gesamtSumme / (1 + mwstSatz);
        double mwst = gesamtSumme - (gesamtSumme / (1 + mwstSatz));

        System.out.println(anzahl + " mal " + artikel + " ohne MWST für " + (f.format(netto)));
        System.out.println("Mwst: " + (f.format(mwst)));
        System.out.println("Endpreis: " + (f.format(gesamtSumme)));


    }
 
Tja du könntest die Syntax so umbazuen, dass er nicht nur einen Artikel akzeptiert, sondern ein Array. Zum Beispiel:
F: "Was hätten Sie gerne:"
A: Produkt1, Produkt2, produkt2

Dann könntest du mit String.split(",") daraus ein Array mit Produkten machen und über dieses iterieren 🙂
 
Denke einfach, wie in der "realen Welt".
Wenn du etwas einkaufst, legst du es in einen Warenkorb. Vielleicht hast du dir auch eine Einkaufsliste geschrieben, um nichts zu vergessen.

In Java gibt es vorgefertigte Objekte (Collections), die andere Objekte aufnehmen können.
Dein Vorhaben ließe sich z.B. mit einer [japi]ArrayList[/japi] lösen.
 
Naja soweit ich mich erinnern kann bracuhte man für diese Aufgabe noch kein Array das hat er erst ab Blatt6 oder 7 richtig behandelt 😀 aber ist schon gut wenn man sich frühzeitig darauf einstellt und natürlich der OOP Ansatz kommt immer ganz gross in der Klausur also fleißig lernen :rtfm: und auf Gott hofen beim Bereendorf
 
Danke! Glück werde ich sicherlich gebrauchen.

Ja arrays kommen erst viel später. Ich dachte mir jetzt das diese Aufgabe sich auch gut eignet um die Arrays sich anzugucken.
 
Zuletzt bearbeitet:
Was mir nach den Recherchen gerade so an ideen einfällt ist das ich die tastatur eingabe ja mit diesem code Teil in eine liste packen kann.

Java:
       ArrayList liste = new ArrayList();
       
       Scanner sc = new Scanner(System.in);
       
       
       System.out.println("Was hätten Sie gerne: ");
       String artikel = sc.next();
       liste.add(artikel);

so damit habe ich aber noch nicht das Problem mit den mehreren Artikel gelöst. Damit weitere Artikel in die liste rein können müsste ich jetzt doch eine while schleife bilden richtig? oder habe ich es falsch verstanden. hmmm

Das mit dem String.Split(",") bekomme ich bei diesem beispiel irgend wie nicht hin da ich nicht weiss wie ich das einsetzen soll.
 
sc.next() gibt dir einen String zurück. Und zwar den, den der Nutzer eingetippt hat.
Wenn dieser nun schreibt: Produkt1, Produkt2, produkt2,
dann kannst du
Java:
 String[] produkte =sc.next().split(",");
dir ein Stringarray mit den Podukten holen.
Ist das besser verständlich?
 
Danke erst mal an alle die mithelfen.

OK ich kann mir jetzt einmal mit dem verfahren von "njans"

Java:
String[] produkte =sc.next().split(",");

oder mit dem code unten die Daten in eine liste Paken. Was ich mich jetzt frage ist wie man die Sachen aus der liste vergleicht und zusamenrechnet. Jedes Produkt hat ja verschiedene Preise. Die Preise muss ich ja irgend wie zu den Produkten zuordnen können. Mit den if abfragen die ich ganz oben in dem Ersten code benutzt habe funktioniert es nicht ;(


Java:
       int zahler = 0;
       

      // Eingabe von 3 Produkten
       while (zahler <= 2) {
       
       System.out.println("Was hätten Sie gerne: ");
       String produkte = sc.next();
       liste.add(produkte);
       
       zahler++;
       }
        
        // ausgabe des Arrays liste
        System.out.println(liste);
 
Das sollte aber mit equalsIgnoreCase gehen.
Ich würde aber noch an dem eingegebenen String .trim() aufrufen, damit da keine Leerzeichen sind.


prizipiell würdest du dann sowas haben:
Java:
for (String eingabe : produkte )
{
  if (eingabe.trim().equalsIgnoreCase("gummibaerchen"))
  {
    // Verarbeite die Daten, wie du es wolltest
  } 
  else if (eingabe.trim().equalsIgnoreCase("playstation"))
  {
    // usw.
  }
  
}
 
Hey,

danke dir "njans" hat wunderbar geklappt :toll:
Ich stelle meine Lösung unten rein. Mich würde aber noch interessieren woher du den Befehlt zum vergleichen für Split gefunden hast ? Will nähmlich selbständig arbeiten können und nicht immer wieder in Forum fragen stellen.

Hier ist mein Code womit ich den Preis der Produkte zusammenrechnen kann. Da fehlt jetzt nur der teil wo ich auch die Anzahl der Prdukte eintippen kann. Damit ich den Produkt namen nicht zweimal eintippen muss.

Wenn man den Code kürzer oder besser machen kann würde ich mich bedanken wenn mir das einer zeigen können wie es besser ginge.
Java:
public static void main(String[] args) {


        DecimalFormat f = new DecimalFormat("#0.00");

        double grundpreis = 0;
        double gesamtMwstSatz = 0;
        double mwstSatz07 = 0;
        double mwstSatz19 = 0;
        double gesamtSumme = 0;
        double netto = 0;
        double gesamtNetto = 0;
        int zahler = 0;

        ArrayList liste = new ArrayList();

        Scanner sc = new Scanner(System.in);


        // Eingabe des Produktes
        System.out.println("Was hätten Sie gerne: ");
        String[] produkte = sc.next().split(",");

        // Spliten und Auslesen der Produkte
        for (String eingabe : produkte) {

            {
                if (eingabe.trim().equalsIgnoreCase("gummibaerchen")) {
                    grundpreis = 0.05;
                    mwstSatz07 = 0.07;

                } else if (eingabe.trim().equalsIgnoreCase("playstation")) {
                    grundpreis = 199;
                    mwstSatz19 = 0.19;

                } else if (eingabe.trim().equalsIgnoreCase("lakritzstangen")) {

                    grundpreis = 0.30;
                    mwstSatz07 = 0.07;

                }

                // Berechnung der Gesamt Summe    
                gesamtSumme += grundpreis;

                // Zusammenrechnen der Mehrwerksteuer bei 19% und 07%
                if (mwstSatz19 > 0) {
                    netto = gesamtSumme / (1 + mwstSatz19);
                } else if (mwstSatz07 > 0) {
                    netto = gesamtSumme / (1 + mwstSatz07);
                }

                //Ausgabe Zwischensumme Netto und Brutto Betrag
                gesamtNetto += netto;
                System.out.println("Zwischensumme Netto: " + netto);
                System.out.println("Zwischensumme: " + gesamtSumme);
            }
        }


        // Ausgabe des zu zahlenden Betrages
        System.out.println("ENDE Netto: " + (f.format(netto)));
        System.out.println("ENDE GesamtSumme: " + (f.format(gesamtSumme)));
    }
 
Zuletzt bearbeitet:
Hey jaykop,

bin selber noch recht unerfahren in Java, da ich es erst knapp 4 Woche mache,
habe mich aber mal mit deinem Programm beschäftigt und es meiner Meinung nach
etwas Optimiert 😉

Java:
public static void main(String[] args) 
	{
		System.out.println("Was hätte sie denn gerne?");
		System.out.println();
		System.out.println("1. Gummibärchen");
		System.out.println("2. Playstation");	//Tante-Emma-Laden und eine Playstation xD??
		System.out.println("3. Lakritzstangen");
		
		Scanner sc = new Scanner(System.in);
		
		System.out.println();
		System.out.println("Ihre Wahl,bitte mit Kommata trennen! ");
		String[] wahl = sc.next().split(",");          
//Eingabe der Menüpunkte und Sortiertung durch das Kommata
		int lang = wahl.length; 
		for(int i = 0;i<lang;i++)
		{
			if(Integer.parseInt(wahl[i]) > 3 || Integer.parseInt(wahl[i]) <1)	//Falls eine Zahl nicht einer Menüwahl entspricht
				wahl[i] = "0";			//Wird die Wahl auf 0 gesetzt!
		}
		
		System.out.println(); System.out.println("Wie viele hätten Sie gerne davon?(selbe Reihenfolge bitte und trennen mit Kommata!)");
		String[] anzahl = sc.next().split(",");  //Ähnliche Abfrage mit der Anzahl
		double grundpreis = 0;
		double mwstSatz07 = 0;      //Erst jetzt initalisierung der Variablen, vorher unnötig!
        double mwstSatz19 = 0; 
        double gesamtSumme = 0;
        double netto = 0;  
		
//Überprüfen, was der Fall ist, für jede Stelle des Arrays
		for(int i = 0;i<lang;i++)
		{
			switch(Integer.parseInt(wahl[i]))
			{
			case 0: break;	//bleibt leer
			case 1: if(Integer.parseInt(anzahl[i])>0)
					{
					grundpreis = 0.05 * Integer.parseInt(anzahl[i]);
					}
             //Sicherstellung das eine Anzahl eingegeben wurde die Größer als 0 ist!
			else grundpreis = 0;
					mwstSatz07 = 0.07;
					break;
			case 2: if(Integer.parseInt(anzahl[i])>0)
					{
					grundpreis = 199 * Integer.parseInt(anzahl[i]);
					}
			else grundpreis = 0;
					mwstSatz19 = 0.19;
					break;
			case 3:	if(Integer.parseInt(anzahl[i])>0)
					{
					grundpreis = 0.30 * Integer.parseInt(anzahl[i]);
					}
			else grundpreis = 0;
					mwstSatz07 = 0.07;
					break;
			}
			// Berechnung der Gesamt Summe  
			gesamtSumme += grundpreis;

	        // Zusammenrechnen der Mehrwertsteuer bei 19% und 07%
	        if (mwstSatz19 > 0) {
	            netto = gesamtSumme / (1 + mwstSatz19);
	        } else if (mwstSatz07 > 0) {
	            netto = gesamtSumme / (1 + mwstSatz07);
	        }
	        
	        double gesamtNetto = 0;
	        gesamtNetto += netto;
	        
	        System.out.println();//Zur besseren Übersicht ;)
	        System.out.println("Zwischensumme Netto: " + netto);
            System.out.println("Zwischensumme: " + gesamtSumme);
		}
		System.out.println();	//Zur besseren Übersicht ;)
        DecimalFormat f = new DecimalFormat("#0.00");
        // Ausgabe des zu zahlenden Betrages
        System.out.println("ENDE Netto: " + (f.format(netto)));
        System.out.println("ENDE GesamtSumme: " + (f.format(gesamtSumme)));
        
	}

Ganz simple in etwa.
Anstatt einer Eingabe der Ware, habe ich ein Menü erstellt, woraus man wählen kann, welches Produkt man möchte, ähnlich wie bei der Pizzeria (nr.2 Salami etc.).
So hast du auch kein Problem mehr mit dem verschreiben oder ähnlichem.

Mein Programm ablauf:
- Abfrage menüpunkte (eins oder mehrere)
- anzahl abefragt (selbe reihenfolge wie die menüpunkte)
- überprüft ob Menüpunkte auch richtig, andernfalls => 0
- ausgewertet was der Fall ist für die Länge des Arrays
- Zusammengerechnet
- Ausgegeben

Also recht simple ^^
Wenn du fragen hast, werde ich gerne zur Verfügung stehen!
 
Zuletzt bearbeitet:
Hey Kruzgoth,

das ist auch ne Coole Lösung war eigentlich mein nächstes Ziel es mit switch and case zu machen.
Es erleichtert einem echt die arbeit beim auswählen der Produkte.
Danke!

Jetzt habe ich das Ziel das ganze mit mehreren Klassen zu machen. Damit ich die Klassen besser kennenlernen und mich ein bischen in das Thema OOP einarbeite. Wird glaub ich komplizierter werden da ich noch keine Idee habe wie ich mit den Methoden die Preise zusammenrechnen lassen könnte. Ich kann zwar bis jetzt mit get die Methoden aufrufen nur mehr weiß ich leider noch nicht 😀
 
Zuletzt bearbeitet:
Du könntest Methoden oder auch "Funktionen" schreiben, die einen Wert
als Rückgabe liefern.

z.B.:
Java:
public double nettoberechnen(double gesamt, double netto){
.....

return neuerNettowert;

Anstellte des double nach "public" kannst du auch beliebige andere Wertekonstellationen reinsetzen,
wie z.B: "int" oder "String"
nur musst du dabei beachten, dass der Rückgabe-Wert dieser Funktion dann ebenfalls
aus der gleichen Variable bestehen muss.
Lautet deine Funktion z.B. public String... xxxx
muss der Rückgabe-Wert auch ein String sein.

Und OOP ist an sich recht leicht, größtenteils musst du nur einen Code haben, denn du irgendwie absondern kannst und dann in eine Klasse stecken.

Beispiel:
Java:
int rechne = 0;
int rechne2 = 0;
int gesamt = 0;
Scanner sc = new Scanner();
rechne = sc.next();
rechne2 = sc.next();
gesamt = rechne + rechne2

könnte aussehen in einer Klasse

Java:
public class Test 
{
             public int rechne(int rechne, int rechne2)
             {
             return (rechne+rechne2);
             }
}

Dann fehlt dir nur der Aufruf
Java:
Test a = new Test();
int gesamt = a.rechne(rechne,rechne2); //Müssen natürlich Initialisiert sein


PS: switch-case ist nichts anderes als eine if-else if abfrage ^^
 
Zuletzt bearbeitet:
Also wenn du dir mal Maps und Lists anschauen willst, dann kannst du dir folgendes Beispiel anschauen:
Java:
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Scanner;

public class Shop {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        DecimalFormat f = new DecimalFormat("#0.00");
        String line;

        System.out.println("Was hätte sie denn gerne?");
        System.out.println("Für x Mal die Nummer y geben Sie bitte \"x y\" ein.");
        System.out.println();

        for (int i = 0; i < PRODUCTS.size(); i++) {
            System.out.println(i + 1 + ". " + PRODUCTS.get(i).getName());
        }
        System.out.println();

        boolean isFinished = false;
        do {
            line = sc.nextLine();
            // leere zeile überprüfen
            if (line == null || line.trim().length() == 0) {
                isFinished = true;
            }
            // format überprüfen
            else if (!line.matches("\\d+ \\d+")) {
                System.err.println("Falsches Format, bitte erneut versuchen");
            }
            else {
                String[] values = line.trim().split(" ");
                int product = Integer.parseInt(values[1]) - 1;
                int amount = Integer.parseInt(values[0]);
                if (product < 0 || product >= PRODUCTS.size()) {
                    System.err.println("Ungültiges Produkt, bitte erneut versuchen");
                }
                else if (amount <= 0) {
                    System.err.println("Ungültige Anzahl, bitte erneut versuchen");
                }
                else {
                    addToReceipt(PRODUCTS.get(product), amount);
                }
            }
        }
        while (!isFinished);

        double sum = 0;
        double netto = 0;
        for (Map.Entry<Product, Integer> entry : receipt.entrySet()) {
            int amount = entry.getValue();
            Product product = entry.getKey();
            double priceSum = amount * product.getPrice();

            sum += priceSum;
            netto += priceSum / (1 + product.getTax());

            System.out.println(amount + "x\t" + product.getName() + "\t" + product.getPrice() + "\t"
                    + priceSum);
        }

        System.out.println();
        System.out.println("Netto:\t" + f.format(netto));
        System.out.println("Mwst.:\t" + f.format(sum - netto));
        System.out.println("SUMME:\t" + f.format(sum));
    }

    protected static void addToReceipt(Product product, int amount) {
        if (!receipt.containsKey(product)) {
            receipt.put(product, 0);
        }
        receipt.put(product, receipt.get(product) + amount);
    }

    private static Map<Product, Integer> receipt = new LinkedHashMap<Product, Integer>();

    protected static List<Product> initProducts() {
        List<Product> list = new ArrayList<Product>();
        list.add(new Product("Gummibärchen", 0.05, 0.07));
        list.add(new Product("Playstation", 199));
        list.add(new Product("Lakritzstangen", 0.30, 0.07));
        return Collections.unmodifiableList(list);
    }

    public static final List<Product> PRODUCTS = initProducts();

    public static class Product {
        private String name;
        private double price;
        private double tax;

        public Product(String name, double price) {
            this(name, price, 0.19); // 19% Steuern als Standard
        }

        public Product(String name, double price, double tax) {
            this.name = name;
            this.price = price;
            this.tax = tax;
        }

        public String getName() {
            return name;
        }

        public double getPrice() {
            return price;
        }

        public double getTax() {
            return tax;
        }
    }
}
So funktionierts:
Code:
Was hätte sie denn gerne?
Für x Mal die Nummer y geben Sie bitte "x y" ein.

1. Gummibärchen
2. Playstation
3. Lakritzstangen

7 7
Ungültiges Produkt, bitte erneut versuchen
7 -1
Falsches Format, bitte erneut versuchen
0 1
Ungültige Anzahl, bitte erneut versuchen
7 1
1 2
20 3
6 1

13x	Gummibärchen	0.05	0.65
1x	Playstation	199.0	199.0
20x	Lakritzstangen	0.3	6.0

Netto:	173.44
Mwst.:	32.21
SUMME:	205.65
Ist halt immer noch alles static und in einer [c]main()[/c]-Methode... Dafür haben wir oben 6x und 7x Gummibärchen eingegeben, und es erscheint nur ein Mal auf dem Kassenbon 🙂
 
Finde die Lösung auch bübsch aber der Prof der die Klausur stellt ( habe die Aufgabe selbst bei diesem Prof geschrieben ) verlangt explizit das mann sich an die Basics in seinem Kurs hält also nur Array keine ArrayList usw... und auch keien Generics. Aber schön ist die Lösung 🙂
 
Das letzte Beispiel ist der knaller. Nur ist es für mich zu kompliziert im moment. Kenne viele Befehle noch nicht was dort angewendet wurde. Aber Hashmaps sieht sehr vielversprechend aus. Es würde sich lohnen wenn man sich damit beschäftigen würde.
 
Ja man sollte sich bei diesem Prof an seine Kurse halten. Da haste recht. Jedoch wollte ich es einfach wissen was ich noch so alles machen kann mit meinem wissen. Zu meinem wissen ist jetzt ja im moment die ArrayList dazugekommen. Was sich sehr nützlich erwiesen hat...
 
Auf jedenfall hast du jetzt eine gute Übersicht wie
es mit den Basics klappt, die bei euch abverlangt werden, als auch
wie es mit anderweitigen Mitteln klappt, also würde ich sagen ^^


"Mina"(jap.), gut gemacht 😉
 

Zurück
Oben