Probleme mit Euro-Aufteiler :(
-
Moin moin...
ich bin noch ganz neu und unerfahren was C++ angeht..
deshalb brauche ich Hilfe.Ich möchte ne progi schreiben, wo eine geldsumme möglichst logisch aufgeteilt wird, d.h. 122,22€ = 12-10€ | 0-5€ | 1-2€ | 0-1€ | 0-0,50€ .. und so weiter..
lieder habe ich das problem das er zwar die 10er 5er, und 2er richtig berechnet aber dann alles andere nicht mehr!
Hier mein programm text:
void __fastcall TForm1::Button1Click(TObject *Sender) { zahl = StrToFloat (Edit1->Text); zahl = zahl*100; zehner = floor(zahl/1000); Label15 -> Caption = FloatToStrF (zehner,ffNumber,8,0); zahl = zahl-(zehner*1000); fuenfer = zahl/500; Label16 -> Caption = FloatToStrF (fuenfer,ffNumber,8,0); if (fuenfer>1) zahl = zahl-(fuenfer*1000); zweier = zahl/200; Label17 -> Caption = FloatToStrF (zweier,ffNumber,8,0); if (zweier>1) zahl = zahl-(zweier*1000); einer = zahl/100; Label18 -> Caption = FloatToStrF (einer,ffNumber,8,0); if (einer>1) zahl = zahl-(einer*1000); fuenfziger = zahl/50; Label19 -> Caption = FloatToStrF (fuenfziger,ffNumber,8,0); if (fuenfziger>1) zahl = zahl-(fuenfziger*1000); zwanziger = zahl/20; Label20 -> Caption = FloatToStrF (zwanziger,ffNumber,8,0); if (zwanziger>1) zahl = zahl-(zwanziger*1000); zehner1 = zahl/10; Label21 -> Caption = FloatToStrF (zehner1,ffNumber,8,0); }
Vielen dank schonmal für die Hilfe!
AChja vielleuicht nochmal memine logik die dahinter steckt:
122,22 *100 = 12222
12222/1000 = 12,...
12 * 1000 = 12000
12222 - 12000 = 222
222/500 = 0,...
0 * 222 = 0
222 - 0 = 222
222/200 = 1,...
und so weiter
-
benutze bitte codetags, dann helf ich dir
-
Meinst du so..
void __fastcall TForm1::Button1Click(TObject *Sender) { zahl = StrToFloat (Edit1->Text); zahl = zahl*100; zehner = floor(zahl/1000); Label15 -> Caption = FloatToStrF (zehner,ffNumber,8,0); zahl = zahl-(zehner*1000); fuenfer = zahl/500; Label16 -> Caption = FloatToStrF (fuenfer,ffNumber,8,0); if (fuenfer>1) zahl = zahl-(fuenfer*1000); zweier = zahl/200; Label17 -> Caption = FloatToStrF (zweier,ffNumber,8,0); if (zweier>1) zahl = zahl-(zweier*1000); einer = zahl/100; Label18 -> Caption = FloatToStrF (einer,ffNumber,8,0); if (einer>1) zahl = zahl-(einer*1000); fuenfziger = zahl/50; Label19 -> Caption = FloatToStrF (fuenfziger,ffNumber,8,0); if (fuenfziger>1) zahl = zahl-(fuenfziger*1000); zwanziger = zahl/20; Label20 -> Caption = FloatToStrF (zwanziger,ffNumber,8,0); if (zwanziger>1) zahl = zahl-(zwanziger*1000); zehner1 = zahl/10; Label21 -> Caption = FloatToStrF (zehner1,ffNumber,8,0); }
-
was heißt denn nicht richtig berechnet?
Du solltest deinen code bisschen sinnvoll einrücken, damit man ihn besser lesen kann!
-
Galeoness schrieb:
lieder habe ich das problem das er zwar die 10er 5er, und 2er richtig berechnet aber dann alles andere nicht mehr!
Ich glaube, dass das Programm nur die Zehner richtig berechnet. Denn nur dort benutzt du floor und vermutlich ist auch nur dort 1000 der richtige Faktor.
-
Hier nochmal ein überarbeiteter Code;
jetzt kommen schon besser Ergebnisse (keine - 277 für 20Cent) aber noch immer nicht die richtigen!
void __fastcall TForm1::Button1Click(TObject *Sender) { zahl = StrToFloat (Edit1->Text); zahl = zahl*100; zehner = floor(zahl/1000); Label15 -> Caption = FloatToStrF (zehner,ffNumber,8,0); zahl = zahl-(zehner*1000); fuenfer = floor (zahl/500); Label16 -> Caption = FloatToStrF (fuenfer,ffNumber,8,0); if (fuenfer>1) zahl = zahl-(fuenfer*500); zweier = floor (zahl/200); Label17 -> Caption = FloatToStrF (zweier,ffNumber,8,0); if (zweier>1) zahl = zahl-(zweier*200); einer = floor (zahl/100); Label18 -> Caption = FloatToStrF (einer,ffNumber,8,0); if (einer>1) zahl = zahl-(einer*100); fuenfziger = floor (zahl/50); Label19 -> Caption = FloatToStrF (fuenfziger,ffNumber,8,0); if (fuenfziger>1) zahl = zahl-(fuenfziger*50); zwanziger = floor (zahl/20); Label20 -> Caption = FloatToStrF (zwanziger,ffNumber,8,0); if (zwanziger>1) zahl = zahl-(zwanziger*20); zehner1 = floor (zahl/10); Label21 -> Caption = FloatToStrF (zehner1,ffNumber,8,0); if (zehner1>1) zahl = zahl-(zehner*10); fuenfer1 = floor (zahl/5); Label4 -> Caption = FloatToStrF (fuenfer1,ffNumber,8,0); if (fuenfer1>1) zahl = zahl-(fuenfer1*5); zweier1 = floor (zahl/2); Label5 -> Caption = FloatToStrF (zweier1,ffNumber,8,0); if (zweier1>1) zahl = zahl-(zweier1*2); einer1 = floor (zahl/1); Label6 -> Caption = FloatToStrF (einer1,ffNumber,8,0); if (einer1>1) zahl = zahl-(einer1*1); }
hier mal ein beispiel für die zahl 122,22 kommt raus ---> sollte rauskommen
10 = 12 ---> 10 = 12
5 = 0 ---> 5 = 0
2 = 1 ---> 2 = 2
1 = 2 ---> 1 = 0
0,50 = 0 ---> 0,50 = 0
0,20 = 0 ---> 0,20 = 1
0,10 = 0 ---> 0,10 = 0
0,05 = 0 ---> 0,05 = 0
0,02 = 0 ---> 0,02 = 1
0,01 = 0 ---> 0,01 = 0Danke
-
Die Abfragen "if(... > 1)" sind überflüssig...
und wenn, dann richtig: "if(... > 0)"
-
Galeoness schrieb:
hier mal ein beispiel für die zahl 122,22 kommt raus ---> sollte rauskommen
10 = 12 ---> 10 = 12
5 = 0 ---> 5 = 0
2 = 1 ---> 2 = 2
1 = 2 ---> 1 = 0
0,50 = 0 ---> 0,50 = 0
0,20 = 0 ---> 0,20 = 1
0,10 = 0 ---> 0,10 = 0
0,05 = 0 ---> 0,05 = 0
0,02 = 0 ---> 0,02 = 1
0,01 = 0 ---> 0,01 = 0stimmt so auch nich, weil dann kommst du auf 124,22 ... müsste so aussehen:
10 = 12
5 = 0
2 = 1
1 = 0
0,50 = 0
0,20 = 1
0,10 = 0
0,05 = 0
0,02 = 1
0,01 = 0Das einfachste könnt ich mir vorstellen ist in dem Fall ne Restwertberechnung...
-
Ich würde mich von dem bisherigen Lösungsansatz komplett trennen.
Mach Dir eine Array mit den möglichen Werten (10,5, ... 0,01) und mit zwei Schleifen, oder einer rekursiven Funktion bist dann mit deutlich weniger Aufwand am Ziel.
-
hey erstmal danke,
jo Joe_M. kannst du mir das array erklären oder ne lösungscode zeigen,
weiß noch nicht was ein array istdank
-
-
Pack Dir mal ein TMemo und einen TButton auf eine Form und schreib das hier in die ButtonClick-Methode;
Memo1->Lines->Clear(); // zum Rechnen verwende ich lieber Integer, deswegen alle Werte in Cents int iWerte[10] = {1000, 500, 200, 100, 50, 20, 10, 5, 2, 1}; int iAktuell; // aktuell ausgewählter Wert aus dem Array int iSchleife = 0; // Schleifenzählvariable für Zugriff auf Array int iZaehler; // Zähler für Anzahl der Werteinheiten (Scheine und Münzen int iBetrag = 12422; // hier käme dann der Wert aus dem Edit hin Memo1->Lines->Add("Aufzuteilender Betrag; " + AnsiString(((double) iBetrag / 100))); while (iBetrag > 0) { iZaehler = 0; // muss für jeden Neudurchlauf auf 0 gesetzt werden iAktuell = iWerte[iSchleife]; // im ersten durchlauf wird hier 1000 bei iAktuell gesetzt while (iBetrag >= iAktuell) // solange der Gesamtbetrag größer als die aktuelle Werteinheit ist { ++iZaehler; // Zähler für Werteinheit erhöhen iBetrag -= iAktuell; // aktuellen Wert vom Gesamtbetrag abziehen } if (iZaehler) Memo1->Lines->Add(AnsiString(iZaehler) + " x " + AnsiString(((double) iAktuell / 100))); // Ausgabe ++iSchleife; // Schleifenzähler für Zugriff auf Array erhöhen }
Das sollte als Beispiel genügen.