Wie kann ich dieses Zustandsdiagramm am besten Umsetzen? (Java)?
Hey ich muss folgendes Zustandsdiagramm umsetzen:
Folgenden Code habe ich bereits für die Wahl des Getränks geschrieben:
import java.util.Scanner;
public class Getraenkeautomat
{
public static void main(String[] args)
{
boolean automatBereit = true;
int Apfelschorle = 01;
int Cola = 11;
int Spezi = 21;
int Wasser = 31;
int gewaehltesGetraenk;
String Getraenk;
Scanner s = new Scanner(System.in);
System.out.println("BESCHREIBUNG:");
System.out.println("Zuerst Getraenkwaehlen:");
System.out.println("Apfelschorle = 01; Cola = 11; Spezi = 21; Wasser = 31");
System.out.println("Dann entsprechenden Betrag mit folgenden Muenzen bezahlen:");
System.out.println("1 = 1€; 0.5 = 50ct; 0.2 = 20ct");
Getraenk = s.next();
gewaehltesGetraenk = Integer.parseInt(Getraenk);
if (gewaehltesGetraenk == Apfelschorle){
System.out.println("gewaehltes Getraenk: Apfelschorle");
System.out.println("Bitte zahlen sie 1.50€");
}
else{
if(gewaehltesGetraenk == Cola){
System.out.println("gewaehltes Getraenk: Cola");
System.out.println("Bitte zahlen sie 2.00€");
}
else{
if(gewaehltesGetraenk == Spezi){
System.out.println("gewaehltes Getraenk: Spezi");
System.out.println("Bitte zahlen sie 1.70€");
}
else{
if(gewaehltesGetraenk == Wasser){
System.out.println("gewaehltes Getraenk: Wasser");
System.out.println("Bitte zahlen sie 1.00€");
}
}
}
}
}
}
Nur habe ich das Problem, dass ich keine Ahnung habe wie ich am besten die Münzeingabe umsetzen soll. Wie ihr evtl schon dem Code entnehmen konntet kann der Anwendern 1Euro, 50ct und 20 ct Münzen einwerfen. Wenn zuviel eingeworfen wird soll entsprechend das Getränk mit Rückgeld ausgegeben werden, wenn zu wenig eingeworfen wird soll der noch zu bezahlende betrag ausgegeben werden. Ich habe es mit einer Do while schleife probiert bin jedoch auf kein schlüssiges ergebnis gekommen weshalb ich euch diese erspare. Könntet ihr mir dazu einen Ansatz bzw Lösungsvorschlag sagen wie ich den Münzeinwurf umsetzen soll?
Pack mal den ganzen Code in einen Code-Block. Im Editor mit dem Symbol </>, sonst kann das ja keine Sau lesen.
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;
}
}
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
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?
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";
}
}
Ah okay ich werde dann also alles in die Schleife packen!