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 = 0

    Danke



  • 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 = 0

    stimmt 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 = 0

    Das 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 ist 😞

    dank 🙂



  • Hallo

    Arrays gehören zu den C- Grundlagen.

    bis bald
    akari



  • 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.


Log in to reply