Wie kann ich dieses Zustandsdiagramm am besten Umsetzen? (Java)?

DerEinsiedler  05.02.2021, 11:09

Pack mal den ganzen Code in einen Code-Block. Im Editor mit dem Symbol </>, sonst kann das ja keine Sau lesen.

Clemens43 
Fragesteller
 05.02.2021, 11:12

Ok ich habe sie soeben Korrigieren lassen...das könnte aber etwas dauern


3 Antworten

Naja, du speicherst in einer Variable, wie viel jeweils gezahlt werden muss und startest dann eine while-Schleife, die so oft läuft, bis nichts mehr gezahlt werden muss. Wenn am Ende in der Variable ein negativer Wert drin steht, ist das das Rückgeld, was der Automat wieder ausspucken muss.

Ich hab das mal so zusammengebastelt, wie ich es machen würde. Es wird allerdings nicht geprüft, ob es die jeweiligen Münzen wirklich gibt, also du kannst z.B. auch mit 95 Cent Münzen oder mit -5€ Münzen zahlen. Aber so als Inspiration kannst du ja vielleicht was davon nehmen.

import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;


public class Automat {
	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		
		// Map mit Getränken anlegen
		Map<Integer, Getraenk> getraenke = new HashMap<>();
		getraenke.put(1, new Getraenk("Apfelshorle", 150));
		getraenke.put(11, new Getraenk("Cola", 200));
		getraenke.put(21, new Getraenk("Spezi", 170));
		getraenke.put(31, new Getraenk("Wasser", 100));
		
		while (true) {  // Endlosschleife starten
			Getraenk gewaehltesGetraenk = null;
			
			while (gewaehltesGetraenk == null) { // So lange eine unbekannte Nummer eingegeben wird, soll immer wieder nach dem Getränk gefragt werden.
				System.out.println("Bitte Getränk wählen:");
				getraenke.forEach((nr, getraenk) -> System.out.printf("%02d: %s - %.2f€%n", nr, getraenk.getBezeichnung(), getraenk.getPreis() / 100.0));
				int auswahl = in.nextInt();
				if (getraenke.containsKey(auswahl)) {
					gewaehltesGetraenk = getraenke.get(auswahl);
				} else {
					System.out.println("Ein Getränk mit der Nummer " + auswahl + " ist nicht vorhanden.");
				}
			}
			
			// Einmal anzeigen, was ausgewählt wurde
			System.out.printf("Sie haben %s ausgewählt. Bitte zahlen Sie %.2f€%n", gewaehltesGetraenk.getBezeichnung(), gewaehltesGetraenk.getPreis() / 100.0);
			int nochZuZahlen = gewaehltesGetraenk.getPreis();
			
			// Und so lange Geld einfordern, bis alles bezahlt ist
			while (nochZuZahlen > 0) {
				double eingeworfeneMuenze = in.nextDouble();
				
				nochZuZahlen -= eingeworfeneMuenze * 100;
				
				if (nochZuZahlen > 0) {
					System.out.printf("Noch zu zahlen: %.2f€%n", nochZuZahlen / 100.0);
				} else {
					System.out.println("Vielen Dank!");
					System.out.println("*" + gewaehltesGetraenk.getBezeichnung() + " fällt in die Ausgabe*");
					if (nochZuZahlen < 0) {
						System.out.println("Bitte entnehmen Sie ihr Rückgeld.");
						System.out.printf("*%.2f€ fallen in die Ausgabe*%n%n", nochZuZahlen / -100.0);
					}
				}
			}
		}
	}
}


// Da Java objektorientiert ist, legen wir natürlich eine Klasse für die Getränke an
class Getraenk {
	private String bezeichnung;
	private int preis; // in Cent, um Rundungsfehler zu vermeiden
	
	public Getraenk(String bezeichnung, int preis) {
		this.bezeichnung = bezeichnung;
		this.preis = preis;
	}


	// Nachdem ein Getränk erstellt wurde, sollen Bezeichnung und Preis nicht mehr änderbar sein, deshalb erstellen wir nur die Getter.
	public String getBezeichnung() {
		return bezeichnung;
	}


	public int getPreis() {
		return preis;
	}
}
Clemens43 
Fragesteller
 05.02.2021, 14:12

Vielen dank, hilft mir extrem Weiter

0

Einfach eine neue Variable, in der du die Einzahlung(en) speicherst.

Sobald Einzahlung > Preis ist alles ok und Getränk + ggf. Restgeld kann ausgegeben werden

Clemens43 
Fragesteller
 05.02.2021, 11:17

Ok, ich habe mir schon gedacht dass es mit Einzahlungen Speichern am meisten sinn macht. Jedoch weiß ich nicht wie das geht. Also wie kann ich diese Speichern?

0

Mit deinen ganzen Getränken: schau dir mal das switch-Statement an.

Mit den Zuständen:

Der ganze Automat sollte in einer Schleife laufen ca. so:

zustand = "WähleGetränk"
while ( zustand != "Ende" )
{
    
    if ( zustand == "WähleGetränk" )
    {
        ...
        zustand = "Bezahlen"; 
    }
    if ( zustand == "Bezahlen" )
    {
        ...
    }
    if ( ...genugGezahlt...)
    {
         zustand = "Ende";
    }    
}
Clemens43 
Fragesteller
 05.02.2021, 11:18

Ah okay ich werde dann also alles in die Schleife packen!

0