c++ geldwechsel klasse



  • Hallo allerseits,
    ich suche mal wieder nach Rat 🙂

    und zwar bin ich grade dabei eine klasse zu schreiben die dazu dient einen betrag in möglichst wenige scheine, bzw. münzen zu wechseln
    also bei 420 soll der 4x100 und 1x20 ausrechnen.

    nun hab ich daran schon einiges geändert und hänge an folgendem:
    ich habe zwei funktionen eingebaut die 1. den restbetrag nach der ersten rechnung ausgibt und 2. die berechnet wie viel der aktuellen scheinart vorhanden sind
    die erste gibt mir den restbetrag genau richtig zurück und die zweite auch die scheine, jedoch kann ich die scheine ausrechnen wenn ich beide nacheinander aufrufe.. es kommt immer 0 raus

    meine vermutung: da ja bereits ein restbetrag ausgerechnet wurde und dann ja mit dem rest weitergerechnet wird

    meine frage ist wie ich der sache aus dem weg gehen kann und ich komme nicht drauf weil ich ein wenig aus der übung bin 😕

    vielen dank schonmal im voraus
    greetz isi

    das ist mein source so wie er momentan aussieht:

    #include <iostream>
    #include <iomanip.h>
    
    using namespace std;
    
    class GeldWechselRechner
    {
        private:
        int restbetrag;
        public:
    
        int scheinmu[6];
        int scheine;
    
       GeldWechselRechner()
       {
    
           scheinmu[0]=100;
           scheinmu[1]=50;
           scheinmu[2]=20;
           scheinmu[3]=10;
           scheinmu[4]=5;
           scheinmu[5]=2;
           scheinmu[6]=1;
       }
    
       int restberechnen(int zaehler)
       {
            restbetrag=restbetrag%scheinmu[zaehler];
            return restbetrag;
       }
    
        int scheineausgeben(int zaehler)
        {
            scheine=restbetrag/scheinmu[zaehler];
            setprecision(2);
            return scheine;
        }
    
        void wechseln()
        {
                int zaehler=0;
    
                if(restbetrag>0)
                {
                cout<<restberechnen(zaehler)<<endl;
                cout<<scheineausgeben(zaehler);
                    zaehler+=1;
                }
    
        }
    
        int eingeben(int value)
        {
        restbetrag=value;
        }
    };
    
    int main()
    {
        int eingabe;
        GeldWechselRechner gwr;
        cout<<"Zu wechselnder Betrag: ";
        cin>>eingabe;
        gwr.eingeben(eingabe);
        gwr.wechseln();
    
        return 0;
    }
    


  • Was mir als erstes aufgefallen ist ist, dass Scheinmu[7] sein muss, nicht 6. Korrigier den Quelltext - tritt der Fehler immer noch auf?



  • Es muss auch void eingabe sein und #include <iomanip> ohne ".h".



  • ja is noch gleich geblieben.. der arbeitet ja bis jetzt noch nicht bis zum 7. wert



  • Muss das nicht irgendwie so gehen

    statt:

    if(restbetrag>0)
                {
                cout<<restberechnen(zaehler)<<endl;
                cout<<scheineausgeben(zaehler);
                    zaehler+=1;
                }
    

    nicht sowas stehen wie:

    while(restbetrag>0)
    {
    restbetrag = restberechnen(zahler);
    cout << "xxx";
    //Scheineausgeben
    zaehler++;
    }
    

    (Code aus dem Kopf geschrieben)
    Mir fehlt das durch alle Zaehler gehen total oder hab ich das übersehen?



  • also das mit der while schleife is schon richtig aber dass hab ich alles noch net eingebaut weil ich erstma die funktionalität sicher gestellt haben wollte
    befor das mir alles nur verwirrender wird hab ich das so gelassen

    danke für die vielen antworten schonmal



  • Du brauchst eigentlich nur 3 variablen und 3 Funktionen mit einem Konstruktor.

    Die Funktionen sind: Eingabe/Ausgabe/Wechseln
    Die Variablen sind: scheine[7], anzahl[7] (oder mehrdimensionales array), betrag

    In Ausgeben wird nichts weiter gemacht als durch scheine und Anzahl zu iterieren und diese werte auszugeben z.B. so:

    void Ausgeben()
    {
    	for(int i = 0; i < 7; ++i)
    		cout << "\nSchein: " << scheine[i] << "\n Anzahl: " << anzahl[i] << "\n";
    }
    

    "Eingeben" hast du schon richtig.

    Beim Konstruktor müsst man den Anzahl-Array noch auf 0 setzen bzw. man sollte direkt einen Betrag mitgeben können.

    GeldWechselRechner(int betrag): betrag(betrag)
    { 
        scheine[0]=100; 
        scheine[1]=50; 
        scheine[2]=20; 
        scheine[3]=10; 
        scheine[4]=5; 
        scheine[5]=2; 
        scheine[6]=1;
    
        for(int i = 0; i < 7; ++i)
           anzahl[i] = 0;
    }
    

    Das wechseln ist wohl für dich der schwierigste Teil. Dafür brauchst du eine while- und eine for-schleife. Du musst für jeden schein den restbetrag solange verringern, bis dieser nichtmehr verringerbar ist. Bei jedem while-durchlauf wird dann das Ergebnis in anzahl[] hochgezählt. Das könnte dann so aussehen:

    void Wechseln() 
    { 
    	int restbetrag = betrag;
    
    	for(int i = 0; i < 7; ++i)
    	{
    		while(restbetrag >= scheine[i])
    		{
    			restbetrag -= scheine[i];
    			++anzahl[i];
    		}
    	}
    }
    

    Setzt du das alles zusammen hast du deine Klasse schon 😉
    Mit dem neuen Konstruktor verwendest du die Klasse dann wie folgt:

    GeldWechselRechner gwr(eingabe);
    gwr.Wechseln();
    gwr.Ausgeben();
    

    Viel spaß!



  • Ich würd die Klasse anders schreiben:

    void Wechseln()
    {
        int restbetrag = betrag;
    
        for(int i = 0; i < 7; ++i)
        {
            while(restbetrag >= scheine[i])
            {
                restbetrag -= scheine[i];
                ++anzahl[i];
            }
        }
    }
    

    in

    void Wechseln()
    {
    int restbetrag = betrag;
    
    for(int i=0;(restbetrag > 0);i++)
    {
    anzahl[i} = restbetrag/scheine[i];
    restbetrag = restbetrag%scheine[i];
    }
    }
    

    Könnte aufgrund der Division zwar langsamer sein, find ich aber leichter zu verstehen und "schöner"



  • Zenker schrieb:

    Könnte aufgrund der Division zwar langsamer sein, find ich aber leichter zu verstehen und "schöner"

    Finde ich nicht ;), aber da sieht man wieder, dass mehrere Wege nach Rom führen.



  • wow vielen dank dafür an alle
    werde mich gleich dransetzen

    greetz isi



  • Ich persönlich würde für Eingabe und Ausgabe die Stream-Operatoren überladen. Ist wohl Geschmackssache.



  • Ich auch aber, das hilft dem TA wenig.


Anmelden zum Antworten