Betrag in Münzwerte stückeln

Status
Nicht offen für weitere Antworten.
H

HoaX

Gast
Bin ganz neu in Java, deshalb kenn ich viele der Grundlagen noch nichmal - also jeden Fehler erklären, der drin is plz.

Ich will ein Programm schreiben, dass erst einen Zufallswert zwischen 0.01 und 25.01 errechnet und dann diesen Betrag in die einzelnen Münzwerte aufstückelt und diese Aufstückelung dann ausgibt.
Es sollen die Münzwerte 10, 2, 1, 0.50, 0.20, 0.10, 0.05, 0.02 und 0.01 berücksichtigt werden.

Beispiel:
Zufallszahl: 14,53xxx
Ausgabe: 1x 10, 2x2, 0x1, 1x0.50, 0x0.20, 0x0.10, 0x0.05, 1x0.02, 1x0.01


Das hier hab ich bisher zusammengeschrieben, hoffentlich macht das wenigstens Ansatzweise, was ich beabsichtige :)




Code:
import java.lang.Math;

public class Wechselgeld {
	public static void main(String[]args) {
		byte bb, cc, muenze;
		double[]a={10, 2, 1, 0.5, 0.2, 0.1, 0.05, 0.02, 0.01};
		double betrag;
		betrag = Math.random ()*25+0.01;
		System.out.println("Betrag: " + betrag);
}
public static [u]float[/u] ermittleStueckelung(double betrag, byte muenze, double[]a, byte bb, byte cc){
		while (betrag > 0.01){
			[b]cc=a[i][[/i]bb];[/b]
			muenze=0;
			if (betrag > cc) muenze++;
			if (betrag > cc) betrag=betrag-cc;
			else System.out.println(a + "Euro/Cent Muenzen: " + muenze);
			[b]cc=a[i][[/i]bb+1];[/b]
			}
	}
}



Beim Kompiliern gibt er mir 2 Fehler aus, und zwar in den Zeilen die ich fett geschrieben hab - er zeigt auf die kursive Klammer und sagt "possible loss of precision - found: double, required: byte" - warum :(? Wie geht das weg?

Noch ne Frage - wofür is das float, das ich unterstrichen hab, gut? Hab da einfach irgendwas hingeschrieben, weil der Compiler das so wollte,...


Vielen Dank für alle Antworten!
 
G

Guest

Gast
Zu deinem Quellcode

Code:
import java.lang.Math; 

public class Wechselgeld
{ 
	public static void main(String[]args) 
	{ 
		byte bb, cc, muenze; 
		double [] a={10, 2, 1, 0.5, 0.2, 0.1, 0.05, 0.02, 0.01}; 
		double betrag; 
		betrag = Math.random ()*25+0.01; 
		System.out.println("Betrag: " + betrag); 
		// ermittleStueckelung() müsstest du auch irgendwo in der Main-Methode aufrufen
	} 
	public static float ermittleStueckelung(double betrag, byte muenze, double[]a, byte bb, byte cc)
	{ 
		while (betrag > 0.01)
		{ 
			// Ich weiss nicht was cc bei dir bedeuten soll
			// Aber den Fehler den dir der Compiler ausgibt ist: possible loss of precision
			// weil du einem 'byte' eine 'double'-Wert zuweisen willst. Das geht nicht, da du 
			// dadurch die Nachkommastellen verlieren würdest (im besten Fall).
			// Wenn der double-Wert größer ist als ein byte-Wert aufnehmen kann, würde es
			// zu noch ganz anderen wunderbaren Effekten kommen. Deswegen erlaubt das der 
			// Java-Compiler nicht - ganz im Gegensatz zu C oder C++.
			cc=a[bb]; 
			muenze=0; 
			
			// Hier sind zwei if´s mit der selben Bedingung
			// if (betrag > cc){ muenze++; betrag=betrag-cc; } wäre besser
			if (betrag > cc) muenze++; 
			if (betrag > cc) betrag=betrag-cc; 	
			else System.out.println(a + "Euro/Cent Muenzen: " + muenze); 
			cc=a[bb+1]; 
		} 
		// hier fehlt ein return. Die Methode soll float zurückgeben (wie du oben geschrieben hast)
		// float zurückgeben würde dir aber auch nicht weiterhelfen.
		// Du müsstest einen Array von int-Werten zurückgeben, der die Werte enthält.
		// Oder noch besser einen Array von 2-Tupeln
		// 1. Anzahl der Münzen (int) 2. Wert der Münzen (double)
	} 
}

Um ehrlich zu sein.... ich glaube du bist noch ziehmlich weit von der richtigen Lösung entfernt.
Aber nicht dadurch entmutigen lassen, einfach weiter ausprobieren.
Wenn ich morgen etwas Zeit hab, kann ich dir mal ein Bsp.Programm dazu schreiben.

Grüsse
Andres
 
H

HoaX

Gast
Schonma vielen Dank für die Antwort, so konnt ich wenigstens mal die Fehler die der Compiler gemeldet hat beseitigen, auch wenn das Programm wie zu erwarten leider noch nich läuft!

Habs n bissl anders geschrieben jetz (aber immernoch ganz falsch):


Code:
import java.lang.Math;

public class Wechselgeld {
	public static void main(String[]args) {
		byte b, muenze;
		double[]a={10, 2, 1, 0.5, 0.2, 0.1, 0.05, 0.02, 0.01};
		double betrag;
		betrag = Math.random ()*25+0.01;
		System.out.println("Betrag: " + betrag);
}
public static byte ermittleStueckelung(double betrag, byte muenze, double[]a, byte b){
		while (betrag > 0.01){        //solang ein stückelbarer Betrag da ist mache:
			muenze=0;                  //Münzanzahl gleich 0 setzen
			if (betrag > a[b]){ muenze++; betrag=betrag-a[b]; }       //wenn der Betrag grösser ist als der momentane
                                                                   //Wert von a, ziehe a ab und erhöhe Münzzahl
			else {System.out.println(a[b] + "Euro/Cent Muenzen: " + muenze); b++; }
             //ansonsten gib den momentanen Wert von a und die Münzzahl aus
             //und erhöhe b=>geh zum nächsten (kleineren) Betrag in a
			}
		return 0;
	}
}


So sieht das jetz aus, ich hab jetz mal dazugeschrieben, wie ich mir das gedacht hab, ehrlich gesagt versteh ich noch nich genau, warum das nich geht :(
Und ich weiss eigentlich nich, was genau das "return" macht - da hab ich einfach mal 0 hinter geschrieben, damit der Compiler nich nervt, aber so is das wohl nich gedacht :)
 
H

HoaX

Gast
Kann man Beiträge hier nich editieren? Oder hab ichs nich gefunden?

Was mir grad aufgefallen is: Kanns sein, dass ich statt dem "if" noch n "while" brauch? Also statt

Code:
if (betrag > a[b]){ muenze++; betrag=betrag-a[b]; }
else {System.out.println(a[b] + "Euro/Cent Muenzen: " + muenze); b++; }

so

Code:
while (betrag > a[b]){ muenze++; betrag=betrag-a[b]; }
System.out.println(a[b] + "Euro/Cent Muenzen: " + muenze); 
b++;

?
Weil n "if" wird doch nur einmal durchlaufen, oder täusch ich mich da? Nich das das Problem lösen würde, aber is mir grad aufgefallen
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben