Methoden Hilfe bei Programmieren eines Geldautomat en

Joptionpane

Aktives Mitglied
hiho ich bins nochmals 🙂 (wusste nicht wie ich den Topic nennen sollte sorry)
Thema sieht man wohl schnell am Code, fragestellung recht simpel.

Wie krieg ich es hin , dass die Methode "gesamtbetrag" mir den Gesamtbetrag 🙂 ausgibt?
Habe in der Methode " nachfuellen " den neu aufgefuellten Betrag als "gesamt" markiert.
Jedoch weiß ich nicht wie ich die Beträge, die von der Klasse Geldautomattest eingetragen werden auf die Methode "gesamtbetrag" dazukriege.

Java:
public class Geldautomat {

	int fuenfer;
	int zwanziger;
	int fuenfziger;

	
	/*public Geldautomat (){
		
		this.fuenfer = fuenfer ;
		this.zwanziger = zwanziger;
		this.fuenfziger = fuenfziger;
		
		
	}
	*/
	public void nachfuellen(int neu5er, int neu20er, int neu50er) {
		int gesamt;
		int fuenfer = 0;
		int zwanziger = 0;
		int fuenfziger = 0;

		fuenfer += neu5er;
		zwanziger += neu20er;
		fuenfziger += neu50er;
		
		gesamt = (fuenfer*5)+ (zwanziger*20)+(fuenfziger*50);

	}

	public void auszahlen(int betrag) {

		if (betrag <= 0) {
			System.err.println("Negativer Betrag geht nicht");
		}

		if (betrag % 5 != 0) {
			System.err.println("Betrag kann nicht ausgegeben werden, da keine Münzen vorhanden sind");
		}

		if (gesamtbetrag() < betrag) {
			System.err.println(" Nicht genug Geldscheine im Automaten vorhanden");
		} else {
			System.out.println("Sie haben" + betrag + "€  als");
		}

	}

	public int gesamtbetrag() {
		int Inhalt= 0;
	//	Inhalt += fuenfer +zwanziger + fuenfziger;
		//.... -.- ....
		
		return Inhalt;

	}

	public void inhaltAusgeben(){
		System.out.println("Es sind " + fuenfer + " 5€-Scheine  vorhanden");
		System.out.println("Es sind " + zwanziger + " 20€-Scheine  vorhanden");
		System.out.println("Es sind " + fuenfziger + " 50€-Scheine  vorhanden");
		
	}
	
	
	
}


Java:
ublic class TestGeldautomat {
   
    
    public static void main(String[] args) {
        Geldautomat automat1 = new Geldautomat();
        Geldautomat automat2 = new Geldautomat();

        System.out.println("(1) Automat 1 nachfuellen: 5x5, 5x20, 5x50");
        automat1.nachfuellen(5,5,5);
        System.out.println("Gesamtinhalt Automat 1: "
                           + automat1.gesamtbetrag() + " EUR");
        automat1.inhaltAusgeben();
        System.out.println();
 
So, habs jetzt hingekriegt, dass er es dazuaddiert, wenn es aufgefüllt wird, aber beim abziehen hab ich noch so meine Probleme. (Außerdem ist glaub noch i.wo ein Fehler).

(Bitte nicht an meiner "schlechten" codierung rumhacken, alles erstsemestler können).


Java:
package Aufgabenblatt6;

public class Geldautomat {

	int fuenfer;
	int zwanziger;
	int fuenfziger;
	int gesamt;

	public Geldautomat() {

		this.fuenfer = fuenfer;
		this.zwanziger = zwanziger;
		this.fuenfziger = fuenfziger;
		this.gesamt = gesamt;

	}

	public void nachfuellen(int neu5er, int neu20er, int neu50er) {


		fuenfer += neu5er;
		zwanziger += neu20er;
		fuenfziger += neu50er;

		this.gesamt = (fuenfer * 5) + (zwanziger * 20) + (fuenfziger * 50);

	}

	public void auszahlen(int betrag) {

		if (betrag <= 0) {
			System.err.println("Negativer Betrag geht nicht");
		}

		if (betrag % 5 != 0) {
			System.err.println("Betrag kann nicht ausgegeben werden, da keine Münzen vorhanden sind");
		}

		if (gesamtbetrag() < betrag) {
			System.err.println(" Nicht genug Geldscheine im Automaten vorhanden");
		} else {
			System.out.println("Sie haben" + betrag + "€  als");
		}

	}

	public int gesamtbetrag() {
		int Inhalt= 0;

	//	if (nachfuellen(null,null,null)){
			Inhalt += gesamt;
		
		
	/*	if (auszahlen(null)){
			Inhalt = Inhalt- betrag;
		}
		*/
		return Inhalt;
		
	}

	public void inhaltAusgeben() {
		System.out.println("Es sind " + fuenfer + " 5€-Scheine  vorhanden");
		System.out.println("Es sind " + zwanziger + " 20€-Scheine  vorhanden");
		System.out.println("Es sind " + fuenfziger + " 50€-Scheine  vorhanden");

	}

}
 
Also..

das setzen von den Zählern auf 0 würd ich nicht in der Methode "nachfüllen" machen sondern im Konstruktur. Wenn ich in ein Glas, in dem sich noch 0,1l Wasser befindet, 0,3l Wasser hinzugebe, sind hinterher 0,4l drin. Bei Dir wären es aber nur 0,3.

Den Zähler "gesamt" ganz weglassen. Generell NIE redundante Informationen doppelt speichern. gesamt kann man jederzeit dynamisch aus den anderen Zählern ausrechnen.

Die Funktion zum Auszahlen ist ein bisschen kompliziert, weil man den Betrag ja aufteilen muss auf die noch zur Verfügung stehenden Geldscheine, und da gibts dann meist auch mehrere Varianten (100 sind z.B 2x50, 5x20, 10x10, 1x50+2x20+1x10 usw..). In dieser Funktion wird dann entschieden, wieviele Scheine welche Sorte ausgezahlt werden und damit auch, wieviele übrig bleiben.

Und die Funktion "gesamtbetrag gibt dann einfach nur die Summe der noch enthaltenen Scheine aus.
 
Zuletzt bearbeitet:
Also..

das setzen von den Zählern auf 0 würd ich nicht in der Methode "nachfüllen" machen sondern im Konstruktur. Wenn ich in ein Glas, in dem sich noch 0,1l Wasser befindet, 0,3l Wasser hinzugebe, sind hinterher 0,4l drin. Bei Dir wären es aber nur 0,3.

Den Zähler "gesamt" ganz weglassen. Generell NIE redundante Informationen doppelt speichern. gesamt kann man jederzeit dynamisch aus den anderen Zählern ausrechnen.

Die Funktion zum Auszahlen ist ein bisschen kompliziert, weil man den Betrag ja aufteilen muss auf die noch zur Verfügung stehenden Geldscheine, und da gibts dann meist auch mehrere Varianten (100 sind z.B 2x50, 5x20, 10x10, 1x50+2x20+1x10 usw..). In dieser Funktion wird dann entschieden, wieviele Scheine welche Sorte ausgezahlt werden und damit auch, wieviele übrig bleiben.

Und die Funktion "gesamtbetrag gibt dann einfach nur die Summe der noch enthaltenen Scheine aus.

Hast wohl dein Post geschrieben während ich meinen gepostet habe(den neuen) 🙂
War selbst auf die Idee mitm Konstruktor gekommen.
Das mit den Geldscheinen verteilen hast du recht, steht sogar in der Aufgabenstellung drin:
...
Der Automat versucht immer, möglichst große Scheine auszugeben.
...
Da hab ich aber nur ein kleinen Ansatz bisher, mit mehreren If-Verzweigungen wo ich aber hänge, würde i.wie so vorgehen:

Java:
if(betrag%fuenfziger = 0 ){
geb fuenfziger aus.

Dennoch fehlt es mir jetzt beträge abzuziehen, falls diese notwendig sind.
 
Der Algorithmus zum Aufteilen der Geldsumme auf die einzelnen Scheine erscheint mir viel zu komplex, in Anbetracht dessen dass es sich ja ansonsten offenbar um eine Anfänger-Aufgabenstellung handelt. Ich bezweifle also, dass er wirklich ausgefeilt sein muss. Ansonsten ist aber der Ansatz, immer die grösstmögliche Menge grosser scheine zu nehmen, auch nicht immer zielführend, also z.B. wenn jemand 110 EUR will und keine 10er mehr da sind. Dann würde der Algorithmus erstmal zwei 50er nehmen und dann bleiben 10 übrig. Richtig wäre da ein fünfziger und drei Zwanziger.

Mal abgesehen davon dass es sich dabei um einen rekursiven Algorithmus handelt. In etwa so: 110 EUR? Macht 2 50er, Rest 10 EUR, mit dem rufe ich die Funktion erneut auf. Klappt nicht? Ok. Also nur ein 50er, Rest 60 EUR. Damit rufe ich die Funktion erneut auf.

60 EUR? Nehme ich also 3 20er. Klappt, funktion wird beendet.

Also erfolgreich 1 50er + 3 20er ermittelt.
 
Habe eine andere Aufgabenstellung und ist nur zur Vorbereitung der Prüfung inzwischen, da wir in ca. 3Wochen schreiben:

Als Mitarbeiter der Firma KrösusTools AG haben Sie die Aufgabe, einen Geldautomaten zu programmieren, der Euro-Beträge in 5-, 20- und 50-Euro-Scheinen auszahlt. Erstellen Sie dazu eine Klasse Geldautomat, die die Anzahl der im Automat vorhandenen Geldscheine verwaltet und folgende öffentliche Methoden zur Verfügung stellt:

public void nachfuellen(int neu5er, int neu20er, int neu50er)
Der Vorrat an 5er-, 20er- und 50er-Scheinen wird um die angegebene Anzahl erhöht.


public void auszahlen(int betrag)
Der angegebene Betrag wird ausgezahlt, falls möglich. Es sind nur Beträge erlaubt, die positiv und Vielfache von 5€ sind. Der Automat versucht immer, möglichst große Scheine auszugeben. Kann der Betrag ausbezahlt werden, wird durch System.out.println() die Anzahl der Scheine angezeigt. Kann der Betrag nicht ausbezahlt werden, da ein unzulässiger Betrag eingegeben wurde oder die Scheine im Automat nicht reichen, wird eine möglichst aussagekräftige Fehlermeldung ausgegeben. Es werden keine Teilbeträge ausbezahlt!


public int gesamtbetrag()
Bestimmt den insgesamt noch im Automaten verfügbaren Geldbetrag.


public void inhaltAusgeben()
Gibt aus, wie viele 50€-, 20€- und 5€-Scheine noch verfügbar sind.


Fabrikneu enthält der Geldautomat keine Geldscheine.
Achten Sie bei der Implementierung auf das Geheimnisprinzip. Der Zugriff auf die Anzahl gespeicherter Geldscheine soll nur über die oben angegebenen Operationen möglich sein.

Zum Test finden Sie in Moodle die Datei TestGeldautomat.java, die die Klasse Geldautomat verwendet. Die erwarteten Ergebnisse sind in der Datei als Kommentar aufgeführt.

__

Komme immernoch nicht auf die Methode
public int gesamtbetrag()

bei mir sieht die grob so aus:
Java:
public int gesamtbetrag() {
		int Inhalt= 0;

		if (//Falls nachgefüllt){
			Inhalt += gesamt;
		
		}else{ //Wird abgezogen, da jemand ausbezahlt bekommt)
			Inhalt = Inhalt- gesamt;
			}
		return Inhalt;
		
	}
 
Du kannst die Logik der Amount- und CoinStack- Klassen trotzdem verwenden, da funktioniert getTotal();
Muttu halt so modifizieren, dass nur 5 10 und 20er CoinStacks (oder BillStacks..) angelegt werden...
Ist ansonsten dieselbe Aufgabenstellung, nur halt flexibel implementiert.
 
Du kannst die Logik der Amount- und CoinStack- Klassen trotzdem verwenden, da funktioniert getTotal();
Muttu halt so modifizieren, dass nur 5 10 und 20er CoinStacks (oder BillStacks..) angelegt werden...
Ist ansonsten dieselbe Aufgabenstellung, nur halt flexibel implementiert.



implementierungen hatten wir noch nicht in proggen, kommt erst mitte/ende zweiten semesters dranne.ebeneso comparable und 'that' .
Ansonsten erwartet der Prof keine so langen Codes.
Unser längster Code kam nichtmal ansatzweise an die 100 Zeilen.
Aber sonst kann ich mir dass mitm nach größe Auszahlen nicht erklären.
Dennoch würd ich gern wissen wie ich das mit der gesamtbetrag methode lösen kann. Hast du da ne Hilfe für mich?
 
:lol: "implementieren" ist so ziemlich dasselbe wie "programmieren"

Was sol "that" sein? Meinst wohl eher "this"...


ausm Code von der Seite die hier angegeben wurde(weiter oben in nem Post):

Java:
  public int compareTo( CoinStack that ) {
            return that.value - this.value;
        }

'that' hatten wir nicht.

und ich meinte einfach implements damit, gui hatten wir auch noch nicht mit implements actionslistener oder sonst was, darauf wollt ich hinaus.. nix desto trotz würd ich gern weiterkommen mit meinem Problem 🙁
 
Also zur Methode Gesamtbetrag:
Java:
public int gesamtbetrag() {
	return (fuenfer*5) + (zwanziger*20) + (fuenfziger*50);
}

Mehr brauchst du eigenltich gar nicht. Außerdem kannst du dann ruhig die Variable gesamt vom Typ Integer weglassen. Außerdem würde es Sinn machen, deine Variablen fuenfer, zwanziger und fuenfziger mit nen private Modifier zu versehen.

Wo liegt jetzt das Problem?
 
Also zur Methode Gesamtbetrag:
Java:
public int gesamtbetrag() {
	return (fuenfer*5) + (zwanziger*20) + (fuenfziger*50);
}

Mehr brauchst du eigenltich gar nicht. Außerdem kannst du dann ruhig die Variable gesamt vom Typ Integer weglassen. Außerdem würde es Sinn machen, deine Variablen fuenfer, zwanziger und fuenfziger mit nen private Modifier zu versehen.

Wo liegt jetzt das Problem?

Das Problem ist, dass auch abgebucht wird, wenn jemand bspw. 50€ abhebt sollte danach unter gesamtbetrag auch eine möglichkeit geben, dass dieser abgehoben wird.
Daher muss(meiner Meinung nach) eine If-Bedingung mit rein in die Methode.
 
Du verstehst da eas völlig falsch. Die einzige Funktion von der Methode ist:
public int gesamtbetrag()
Bestimmt den insgesamt noch im Automaten verfügbaren Geldbetrag.

Wenn abgehoben wird kann diese Methode zum Prüfen gebraucht werden. Sie selbst überprüft rein gar nichts.
 
Wenn abghoben wird, musst Du den Geldbestand reduzieren.
Irgendwoher musst Du ja wissen, wieviele 20er oder so du noch hast.
Nachdem Du einzelne Scheine ausgibst, musst Du den Bestand bei den einzelnen Scheinen reduzieren.

Gesamtbetrag darf nur einen "Schnappschuss" auf den jetzt gerade vorhandenen Bestand an Scheinen ausgeben.

"that" ist ein Parameter. Lies mal die Funktion durch.
compareTo hat die Aufgabe zu sagen, ob das übergebene Element (bei mir immer gerne "that") kleiner, gleich oder größer als this ist.
Wenn compareTo nicht vorhanden ist (siehe Comparable), dann kann Collections.sort die ArrayList nicht sortieren...

Naming Conventions beachten: Variablen und Methoden beginnen immer(!) mit Kleinbuchstaben, Klassen immer(!) mit Grossbuchstaben, (nur!) Konstanten werden gebrüllt (äääh ganz großgeschrieben, wie. z. b.
Code:
public static final int SPAAARTAAA = 300;
).
 
Zuletzt bearbeitet:

Zurück
Oben