Rueckgeld.Bug

Degget

Mitglied
Hallo,
entweder bin ich zu dumm, die Forensuche zu verwenden oder es gibt wirklich noch keinen passenden Thread. Ich soll einen Fahrkartenautomaten schreiben und natürlich gehört dazu auch eine Rueckgeldausgabe mit möglichst wenig Muenzen/Scheinen. Meine Methode dazu seht ihr unten. Es wird zwar der richtige Betrag zurückgegeben, aber besonders im unteren Bereich ist es buggy und ich weiß nicht warum.
Wenn zum Beispiel 29,5€ zurückgegeben werden sollen, gibt er:
1x20,1x5, 1x2, 1x1 und dann 2x0.50 (statt ein weiteres mal 1) und 5x0.1(statt einmal 0.50).
(Bei dem Automaten gibt es nur 50, 20, 10, 5, 2, 1, 0.5 und 0.1€)

Java:
  public void gebeRueckgeld(double zurueckzugebendesRueckgeld)
  {
    zurueckzugebendesRueckgeld *= -1;
	while(zurueckzugebendesRueckgeld > 0.1)
	{
	  if(zurueckzugebendesRueckgeld >= 50.0)
	    {
	      rueckgeldArray[0] += 1;
		  zurueckzugebendesRueckgeld -= 50.0;
	    }
	  if(zurueckzugebendesRueckgeld >= 20.0)
	    {
	      rueckgeldArray[1] += 1;
		  zurueckzugebendesRueckgeld -= 20.0;
	    }
	  if(zurueckzugebendesRueckgeld >= 10.0)
	    {
	      rueckgeldArray[2] += 1;
		  zurueckzugebendesRueckgeld -= 10.0;
	    }
	  if(zurueckzugebendesRueckgeld >= 5.0)
	    {
	      rueckgeldArray[3] += 1;
		  zurueckzugebendesRueckgeld -= 5.0;
	    }
	  if(zurueckzugebendesRueckgeld >= 2.0)
	    {
	      rueckgeldArray[4] += 1;
		  zurueckzugebendesRueckgeld -= 2.0;
	    }
	  if(zurueckzugebendesRueckgeld >= 1.0)
	    {
	      rueckgeldArray[5 ] += 1;
		  zurueckzugebendesRueckgeld -= 1.0;
	    }
	  if(zurueckzugebendesRueckgeld >= 0.50)
	    {
	      rueckgeldArray[6] += 1;
		  zurueckzugebendesRueckgeld -= 0.50;
	    }
	  if(zurueckzugebendesRueckgeld >= 0.10)
	    {
	      rueckgeldArray[7] += 1;
		  zurueckzugebendesRueckgeld -= 0.10;
	    }
	}

Vielen Dank für Hinweise :)
 
Zuletzt bearbeitet:
S

SlaterB

Gast
wieviel Festplattenplatz würdest du dadurch sparen, wenn du zurueckzugebendesRueckgeld in z umbenennst ;)

-----

double wird ungenau berechnet, schreibe

if (z > 49.99) {

} else if (z > 19.99) {
..

-----

verwende if/ else, sonst werden die Zahlungen kombiniert,

hast du 48 Euro, dann werden 20 abgezogen, es bleiben 28 übrig,
und nochmal 20 kommt erst im nächsten Durchlauf dran,
vorher wird aber schon im aktuellen Durchlauf 10 Euro usw. getestest
-> 10 wird abgezogen, obwohl mit noch einem 20er 10 gar nicht mehr drankäme
 

Ein Keks

Bekanntes Mitglied
ich fand die aufgabe grad lustig (bzw. mir is scheiß langweilig) und hab ne etwas elegantere lösung gebaut:

Java:
public class RueckgabeAutomat {

	private double[] werte = {50, 20, 10, 5, 2, 1, 0.5, 0.1};
	
	public static void main(String[] args) {
		new RueckgabeAutomat();
	}
	
	public RueckgabeAutomat(){
		int[] rueckgeld = gebeRueckgeld(237.43);
        System.out.println("Rueckgeld:");
		for(int i=0; i<werte.length; i++){
			System.out.println(werte[i]+"€ : "+rueckgeld [i]);
		}
	}
	
	public int[] gebeRueckgeld(double geld){
		int[] rueckgeld = new int[werte.length];
		for(int i=0; i<werte.length; i++){
			while(geld > werte[i]){
				geld -= werte[i];
				rueckgeld[i] += 1;
			}
		}
		return rueckgeld;
	}
}
 
Zuletzt bearbeitet:
S

SlaterB

Gast
ja, int ist besser, oder wenn double dann auch nicht 19.99 schreiben, das ist wirklich unschön,
dann lieber die Zahlen alle in ein Array wie bei Ein Keks und zur Sicherheit

while(geld > werte-0.0001)
oder so
 

Oben