Objekte zu einer Klasse durch Einlesen hinzufügen



  • Hey, ich bin derzeit bei den Klassen(Konstruktoren, Methoden usw.) angekommen und nun hänge ich fest. Ich habe eine Aufgabe vor mir wo ich einen Bankkonto programmieren soll, ein ganz simples. Und zwar soll es aus einer set und get Methode bestehen, Dispo bis zu -1000 Euro und 2 Methoden um Geld einzuzahlen und abzuheben. Beim Ein und Auszahlen hänge ich gerade fest.

    #include <iostream>
    
    using namespace std;
    
    class BankAccount{
    private:
        float z;
    public:
        
        float getBalance(){
            return z;
        }
        void setBalance(float zx){
            if(z<=-1000){
                z = zx;
            }
            else{
                cout << "Du bist zu weit im Dispo!" << endl;
            }
        }
        BankAccount();
        BankAccount(float);
        
        float erhoehen(float z){
            float y;
            cout << "Wie viel Geld moechten sie einzahlen?" << endl;
            cin >> y;
            return (z+y);
        }
        float abheben(float z){
                float y;
                cout << "Wie viel Geld moechten sie abheben?" << endl;
                cin >> y;
                return (z-y);
        }
        void info(float z){
            cout << "Kontostand: " << z << endl;
        }
        
    };
    
    BankAccount::BankAccount() : z(0)
    { }
    BankAccount::BankAccount(float zx) : z(zx)
    { }
    
    
    
    int main(){
        
        int x, y, z;
        BankAccount konto;
        
        cout << "Wie viel Geld haben sie auf der Bank?" << endl;
        cin >> z;
        
        cout << "Um Geld einzuzahlen, druecken sie die 1." << endl;
        cout << "Um Geld abzuheben, druecken sie die 2." << endl;
        cout << "Um den Kontostand abzufragen druecken sie die 3." << endl;
        cin >> x;
        
        switch(x){
            case 1: z = konto.erhoehen(z); break;
            case 2: z = konto.abheben(z); break;
            case 3: konto.info(z); break;
        }
        if(x==1 || x==2){
            cout << "Kontostand: " << z << endl;
        }
        else{
            return 0;
        }
        return 0;
    }
    

    So weit bin ich nun gekommen, nur weiß ich nicht wie ich das Einlesen mit der set und get Methode verknüpfen soll. Kann mir da jemand auf die Sprünge helfen? Hab auch schon viel gegooglt, aber nicht wirklich was gefunden. Wie man übrigens auch sehen kann bin ich noch nicht so richtig fit was Konstruktoren angeht, also seid nicht so hart zu mir 🙂



  • Hi,

    erstmal ein paar Anmerkungen:

    1. Gib deinen Variablen gescheide Namen, x, y, z sind Misst.

    2. Es ist unklug, für Geldbeträge Fließkommazahlen zu verwenden. Nutze den genausten Datentyp, nämlich int! Logischerweise hantierst du dann nicht mit Euro-Beträgen, sondern mit Cent-Beträgen. Fließkommazahlen nimmst du nur für Ausgaben für den Nutzer (zur Darstellung von Euro-Beträgen), aber auf keinen Fall intern.

    3. Wo setzt du den Startbetrag?

    4. if(z<=-1000) --> Die Bedingung ist wohl falsch.

    5. Das Einzahlen kannst du z.B. so machen:

        void einzahlen()
        {
            
            cout << "Wie viel Geld moechten sie einzahlen?" << endl;
            int y;
            cin >> y;
            setBalance( z + y );
        }
    


  • @out Erstmal danke für die Antwort.
    Es sollen aber Fließkommazahlen sein, aber ist ja erstmal egal. Den Startbetrag frage ich ja am Anfang ab in der main funktion drin.

    Zu der 4.: Was genau ist denn an der Bedingung falsch? Hatte es mir so gedacht, dass er jeden Betrag checkt der reinkommt und wenn der Kontostand kleiner als -1000 ist dann soll er mir einen Fehler anzeigen.

    Und zum Lösungsansatz, könntest du dann noch etwas mehr darauf eingehen? Also die Funktion gibt ja nichts zurück, also was genau macht dann der letzte Befehl da und muss ich dafür den rest vom Code umschreiben?



  • @xlogiaa sagte in Objekte zu einer Klasse durch Einlesen hinzufügen:

    Zu der 4.: Was genau ist denn an der Bedingung falsch? Hatte es mir so gedacht, dass er jeden Betrag checkt der reinkommt und wenn der Kontostand kleiner als -1000 ist dann soll er mir einen Fehler anzeigen.

    Joa, sehe ich auch so. Aber deine if gibt eine Fehlermeldung aus, wenn der Betrag größer als -1000 ist.

    Und zum Lösungsansatz, könntest du dann noch etwas mehr darauf eingehen? Also die Funktion gibt ja nichts zurück, also was genau macht dann der letzte Befehl da und muss ich dafür den rest vom Code umschreiben?

    Ich dachte, du willst mit setBalance den neuen Kontostand setzen. Und alter Kontostand + Einzahlung ergibt ja den neuen Kontostand. Wieso sollte die einzahlen-Funktion etwas zurückgeben? Wenn sie etwas zurückgibt, dann ob das Einzahlen erfolgreich war, sprich true/false.



  • @out Ah hast recht, muss umgekehrt sein, danke^^
    Und ich glaube ich habe ein paar Denkfehler eingebaut, schreibe gerade an einem neuen Code, kann ich dich dann hier markieren wenn ich soweit bin?



  • @out So hab es jetzt denke ich. Habe von vorne angefangen und auf deinem Lösungsansatz aufgebaut und es hat geklappt, vielen vielen Dank 😃

    #include <iostream>
    using namespace std;
    
    class BankAccount{
    private:
        float balance;
    public:
        float getBalance(){
            return balance;
        }
        void setBalance(float xbalance){
            if(balance>=-1000){
                cout << "Limit ueberzogen!" << endl;
                return;
            }
            else{
                balance = xbalance;
                
            }
        }
        BankAccount();
        BankAccount(float);
        void einzahlen()
        {
            cout << "Wie viel Geld moechten sie einzahlen?" << endl;
            int einzahlen;
            cin >> einzahlen;
            setBalance( balance + einzahlen );
        }
        void auszahlen()
        {
            cout << "Wie viel Geld moechten sie auszahlen?" << endl;
            int auszahlen;
            cin >> auszahlen;
            setBalance( balance - auszahlen );
        }
        
    };
    //------------------------------------------------------------
    BankAccount::BankAccount() : balance(100)
    { }
    BankAccount::BankAccount(float xbalance) : balance(xbalance)
    { }
    //--------------------------------------------------------------
    int main(){
        int x;
        BankAccount konto;
        cout << "Einzahlen(1) Auszahlen(2): ";
        cin >> x;
        switch(x){
            case 1: konto.einzahlen(); break;
            case 2: konto.auszahlen(); break;
        }
        
        
        
        return 0;
    }
    


  • Bezieht sich auf alten Code: Warum verändern die Methoden erhoehen() und abheben() nicht den Kontostand (BankAccount::z). Wieso gibt info() nicht den Kontostand (BankAccount::z) aus sondern irgendeinen der Funktion übergebenen Wert, der zufällig auch z heißt?

    @xlogiaa sagte in Objekte zu einer Klasse durch Einlesen hinzufügen:

        if(balance>=-1000){
            cout << "Limit ueberzogen!" << endl;
    

    Da stimmt immer noch was nicht.



  • @swordfish Ja das stimmt, aber habe jetzt alles mögliche rumprobiert und verstehe nicht was genau daran falsch ist.



  • Überlege mal welchen Wert du überprüfen möchtest, wenn du einen neuen Kontostand setzt.



  • @schlangenmensch @Swordfish Muss es "xbalance" statt "balance" sein?



  • @xlogiaa Das wäre ein guter Anfang aber noch nicht genug.



  • @swordfish Okay jetzt kann ich dir leider nicht mehr folgen 😃 Das Programm funktioniert jetzt so wie es soll. Könntest du einfach sagen was du meinst? Muss noch mit Vererbung weiter machen



  • void setBalance(float xbalance)
    {
        if(xbalance < -1000){
            cout << "Limit ueberzogen!\n";
            return; // dadurch wird das else überflüssig
        }
    
        balance = xbalance;
    }
    

    @xlogiaa sagte in Objekte zu einer Klasse durch Einlesen hinzufügen:

    Muss noch mit Vererbung weiter machen

    😲



  • @xlogiaa sagte in Objekte zu einer Klasse durch Einlesen hinzufügen:

    Okay jetzt kann ich dir leider nicht mehr folgen Das Programm funktioniert jetzt so wie es soll.

    Da würde ich nicht drauf wetten.

    Wie findest du das?

        void setBalance( float xbalance )
        {
            if( xbalance < -1000 )
            {
                cout << "Limit ueberzogen!" << endl;
                return;
            }
            balance = xbalance;
        }
    


  • @out @Swordfish Aber falsch war es dann ja nicht wirklich, oder? Einfach nur überflüssig. Und doch das Programm hat genau so funktioniert wie jetzt nachdem ich es angepasst habe.



  • @xlogiaa sagte in Objekte zu einer Klasse durch Einlesen hinzufügen:

    @out @Swordfish Aber falsch war es dann ja nicht wirklich, oder? Einfach nur überflüssig. Und doch das Programm hat genau so funktioniert wie jetzt nachdem ich es angepasst habe.

    Na doch, du hast das Gegenteil programmiert von dem, was du wolltest. Wie testest du denn dein Programm?



  • Vergleiche mal

    if(balance >= -1000) // mit oder ohne 'x' davor ... ziemlich egal
    

    mit

    if( xbalance < -1000 )
    


  • @out @Swordfish Okay das war jetzt mein Fehler, als ich mit xbalance herumprobiert hatte habe ich das Zeichen auch umgedreht, also war wirklich schon richtig nur hatte ich das nicht erwähnt, sorry! :smiling_face_with_open_mouth_cold_sweat:



  • Was soll denn eine "xBalance" sein?



  • @tggc Das macht man ja so mit get und set Methoden.