C# Problem

Bjenn

Newbie
Registriert
Feb. 2009
Beiträge
2
Hallo,

Ich soll für die Schule ein Programm schreiben, bei dem man den Preis für ein bestimmtes Produkt eingibt und dann mit wieviel man bezahlt. Nun soll das Programm zurückgeben in welchen Scheinen und Münzen man sein Wechselgeld bekommt.

Bsp: Der Preis lautet 82€, ich bezahle mit 100€.
Nun sollte das Programm 1x 10er, 1x 5er, 1x 2er, 1x 1er zurückgeben.

Mein Programm tut das in vielen Fällen auch richtig aber z.B. bei Preis = 23,75 und gegeben = 100 gibt es mir statt einem 5 Cent Stück, zwei 2 Cent Stücke, wodurch ein Cent fehlt.

Ich hoffe Ihr versteht was ich meine ^^

Quelltext:

Console.WriteLine("Preis?");

double Preis = Convert.ToDouble(Console.ReadLine());

Console.WriteLine("Gegeben?");

double gegeben = Convert.ToDouble(Console.ReadLine());
double wechselgeld = gegeben - Preis;
double[] wbetraege = new double[14] { 0.01, 0.02, 0.05, 0.1, 0.2, 0.5, 1, 2, 5, 10, 20, 50, 100, 200 };

int[] anzahl = new int[14] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };

for (int i = 13; i >= 0; i--)
{

if (wechselgeld >= wbetraege)
{
Console.WriteLine(wechselgeld.ToString());
wechselgeld = wechselgeld - wbetraege;

anzahl++;
i++;

}
}

for (int i = 13; i >= 0; i--)
{
if(anzahl != 0)
Console.WriteLine(anzahl.ToString() + "x " + wbetraege.ToString() + " Euro");

}

Console.ReadLine();


[/IMG][http://imageshack.us/photo/my-images/688/desktopxym.png[/IMG]
 
Zuletzt bearbeitet:
Ich dachte zuerst an den Modulooperator, als ich deine Aufgabe gelesen habe. Als ich dann in in deinen Quelltext gelunzt habe, habe ich ihn nicht entdeckt.

Ich kenne mich mit C# zwar nicht aus, aber damit könnte man das doch sicherlich mal versuchen, oder?

Wenn nicht, killt mich bitte nicht :D
 
Ich habe zwar keine Ahnung von C# aber in fast jeder Sprache musst du nicht die Länge eines Arrays angeben, wenn du es explizit füllst.

Das ist schlechter Stil, weil du es zusätzlich warten musst.

Allgemein ist das ganze echt blöd zu lesen, Code Blocks?

Zu deinem Problem:
Wird an den Gleitkommazahlen liegen (vergleiche damit gehören sich nicht in dieser Form!). Implementiere das lieber mit Cent und Ganzzahlen, meiner Meinung nach die sauberste Möglichkeit.
 
orioon schrieb:
Zu deinem Problem:
Wird an den Gleitkommazahlen liegen (vergleiche damit gehören sich nicht in dieser Form!). Implementiere das lieber mit Cent und Ganzzahlen, meiner Meinung nach die sauberste Möglichkeit.

So oder du verwendest z.B. decimal anstatt double.
 
Wie hier vermutet wurde liegt es an rundungsfehlern ^^
Der hat irgendwann 0,0499999999 anstatt 0,5 und darum geht es nicht.

Das ganze mit Int und Centwerten zu basteln macht auch am meisten sinn, das sieht dann so aus:

Console.WriteLine("Preis?");

int Preis = Convert.ToInt32(Convert.ToDouble(Console.ReadLine())*100);

Console.WriteLine("Gegeben?");

int gegeben = Convert.ToInt32(Convert.ToDouble(Console.ReadLine()) * 100);
int wechselgeld = gegeben - Preis;
int[] wbetraege = new int[14] { 1, 2, 5, 10, 20, 50, 100, 200, 500, 1000, 2000, 5000, 10000, 20000 };

int[] anzahl = new int[14] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };

for (int i = 13; i >= 0; i--)
{

if (wechselgeld >= wbetraege)
{
Console.WriteLine(wechselgeld.ToString());
wechselgeld = wechselgeld - wbetraege;

anzahl++;
i++;

}
}

for (int i = 13; i >= 0; i--)
{
if (anzahl != 0)
Console.WriteLine(anzahl.ToString() + "x " + (Convert.ToDouble(wbetraege)/100).ToString() + " Euro");

}

Console.ReadLine();


Ehm, und brauchst du keinen 500€ schein? ^^
 
Es liegt definitiv an den Doubles.

Ich hab den Code bei mir so verändert:
Code:
Console.WriteLine(wechselgeld.ToString());
wechselgeld = wechselgeld - wbetraege[i];
wird zu
Code:
wechselgeld = wechselgeld - wbetraege[i];
Console.WriteLine("Abgezogen: " + wbetraege[i].ToString() + "  Rest: " + wechselgeld.ToString());

Dann erkennt man den Grund. Der Datentyp ist ungeeignet.

Btw, ich hätte es wahrscheinlich auch mit Modulo gemacht. Erspart ein paar Schleifendurchläufe.


Edit: Ihr seid aber auch wieder schnell. O.o
 

Anhänge

  • Unbenannt.png
    Unbenannt.png
    43,8 KB · Aufrufe: 343
Code:
wechselgeld = wechselgeld - wbetraege[i]
Code:
wechselgeld = Math.Round(wechselgeld - wbetraege[i],2);

einfach das Math.Round(...,2) rein, und es funktioniert.
 
Danke für die viele Antworten =)

Ich wollte nun versuchen das mit dem Modulo zu lösen, worauf ich vorher nicht gekommen bin.

Wenn ich jetzt auf das Wechselgeld den Modulo mit Scheinen und Münzen anwende, gibt es da eine Möglichkeit dirket rauszubekommen wie oft mit dem Modulo geteilt wurde ?
Oder muss ich dann einfach selber teilen und abrunden ?
 
Selber teilen und abrunden.
 
Zurück
Oben