Verwalten von Konten mit hilfe eines Arrays



  • Hallo Leute,
    Zu erst möchte ich den Mitglieder der c-plusplus.net loben für die Hilfe.....

    Ich habe folgendes Problem: Ich möchte Konten-Klassen mit einem Array verwalten.
    soll (zB Konto *bank[6];). Ich weiss, dass das mit Polymorphismus zulösen ist aber kenne mich damit überhaupt nicht aus und kann des halb damit nicht viel anfangen. Es wäre super nett, wenn jemand mir dafür Tipps und Hilfestellung leisten könnte. Wenn einem nicht zu viel Arbeit macht, bitte einen Beispiel..
    vilene Dank in Vorraus....

    /*Kontoverwaltungsprogramm*/
    #include <iostream>
    #include <string>
    #include <vector> 
    
    using namespace std;
    
    class Konto
    {
    protected:
       float kontostand;
    
    public:
       Konto()
       {
          kontostand=0;
       };
       void einzahlen(float einzahlung)
       {
          kontostand+=einzahlung;
       };
       virtual bool darfAuszahlen(float betrag)=0;
       void auszahlen(float auszahlung)
       {
          if(darfAuszahlen(auszahlung))
             kontostand-=auszahlung;
          else
             cout<<"Auszahlung nicht moeglich!\n";
       };
       virtual void anzeigen()
       {
          cout<<"Kontostand: "<<kontostand<<endl;
       };
       virtual void jahresabschluss()=0;
    };
    class Girokonto:public Konto
    {
    private:
       float ueberziehungsrahmen;
       static const float zinssatz;
    public:
       Girokonto()
       {
          ueberziehungsrahmen=1000;
       };
       bool darfAuszahlen(float betrag)//virtual in Konto
       {
          return betrag<=kontostand+ueberziehungsrahmen;
       };
       void anzeigen()//virtual in Konto
       {
          Konto::anzeigen();
          cout<<"Ueberziehungsrahmen: "<<ueberziehungsrahmen<<endl;
          cout<<"Zinssatz: "<<zinssatz*100<<"%";//<<endl;
       };
       void jahresabschluss()
       {
          kontostand-=30;
       };
       void inhaberUndKontoAnzeigen(string inhaber,Konto *pKto)
       {
       cout<<"Inhaber: "<<inhaber<<endl;
       pKto->anzeigen();
       cout<<endl;
        };
    };
    
    class Sparkonto:public Konto
    {
    private:
        static const float zinssatz;
    public:
       void anzeigen()//virtual in Konto
       {
          Konto::anzeigen();
          cout<<"Zinssatz: "<<zinssatz*100<<"%";
       };
       bool darfAuszahlen(float betrag)//virtual in Konto
       {
          return betrag<=kontostand;
       };
       void jahresabschluss()
       {
          kontostand+=kontostand*zinssatz;;
       };   
       void inhaberUndKontoAnzeigen(string inhaber,Konto *pKto)
       {
       cout<<"Inhaber: "<<inhaber<<endl;
       pKto->anzeigen();
       cout<<endl;
       };
    };
    
    const float Sparkonto::zinssatz = 0.1;
    const float Girokonto::zinssatz = 0.1;
    
    int main()
    {
        // static hier nicht mehr angeben
       cout<<"Willkommen bei der GELD-Bank!"<<endl<<endl;
       cout<<"Ihr Girokonto:"<<endl;
       Girokonto g;
       g.inhaberUndKontoAnzeigen("Karl",&g);
       g.einzahlen(10);                               //Kontostand +10                         
       g.auszahlen(1500);                             //eine Auszahlung von 1500 würde den Ueberziehungsrahmen sprengen
       g.auszahlen(100);                              //100 dagegen sind machbar Kontostand: -120
       g.jahresabschluss();                           //Jahresabschluss: -30 Kontostand: -20
       g.anzeigen();
    
       cout<<endl;
    
       cout<<"\nIhr Sparkonto:"<<endl;
       Sparkonto s;
       s.inhaberUndKontoAnzeigen("TomTom",&s);
       s.einzahlen(100);
       s.auszahlen(1500);
       s.auszahlen(10);
       s.jahresabschluss();
       s.anzeigen();
       system("pause");
       return 0;
    };
    


  • ligel schrieb:

    Hallo Leute,
    Zu erst möchte ich den Mitglieder der c-plusplus.net loben für die Hilfe.....

    Ich habe folgendes Problem: Ich möchte Konten-Klassen mit einem Array verwalten.
    soll (zB Konto bank[6];). Ich weiss, dass das mit Polymorphismus zulösen ist aber kenne mich damit überhaupt nicht aus und kann des halb damit nicht viel anfangen. Es wäre super nett, wenn jemand mir dafür Tipps und Hilfestellung leisten könnte. Wenn einem nicht zu viel Arbeit macht, bitte einen Beispiel..
    vilene Dank in v
    *****....

    //<Wall of Code>
    

    Viel Code, der zuerstmal unerheblich ist, weil du scheinbar eine grundlegende Frage hast, die du aber nicht stellst. Was ist dein Problem/deine Frage? Grundlagen zum Thema Polymorphismus findest du in jedem besseren Tutorial, falls es darum geht.



  • Wie pumuckl bereits sagte; Stell eine Frage 🙂

    Ansonsten:
    -Nutze Header- und Cpp-Dateien um Code anschaulicher zu machen
    -Namensräume möglichst nicht auflösen, damit keine Konflikte entstehen
    -Nutze Initialisierungslisten (def- und ctor)
    -Member fncs brauchen kein Semikolon nach der Klammer "}" nach dem Funktionsrumpf Ende wie public fncs
    -Mache Variablen const wenn du sie nicht veränderst
    😉



  • Kóyaánasqatsi schrieb:

    -Member fncs brauchen kein Semikolon nach der Klammer "}" nach dem Funktionsrumpf Ende wie public fncs

    Seit wann muss man das bei (ich nehme mal an, dass du mit public freie Funktionen meinst) freien Funktionen tun?



  • drakon schrieb:

    Seit wann muss man das bei (ich nehme mal an, dass du mit public freie Funktionen meinst) freien Funktionen tun?

    Ah, klar 😮 Sorry für den Fehler, bei Klassen natürlich. Man, OOP färbt ab 😃



  • 1. Polymorphe Basisklassen sollten mit einem virtuellen Destruktor ausgerüstet sein.

    virtual Konto::~Konto()
    {
    }
    

    2. Die Funktion inhaberUndKontoAnzeigen() sollte kein Member der Klasse, sondern global sein. Sie ist nämlich nicht virtuell und benötigt keinen Zugriff auf private Variablen. Benutze ausserdem Const-Referenzen zur Übergabe grösserer Objekte wie std::string und verzichte soweit möglich auf using namespace std; (Begründung siehe hier, SeppJs und folgende Beiträge).

    void inhaberUndKontoAnzeigen(const std::string& inhaber, Konto *pKto)
    {
       std::cout << "Inhaber: " << inhaber << std::endl;
       pKto->anzeigen();
       std::cout << std::endl;
    };
    

    3. Du vermeidest Codeduplizierung, in dem du für gleiche Aufgaben eine Funktion schreibst:

    void testeKonto(Konto& s, const std::string& inhaber)
    {
       inhaberUndKontoAnzeigen(inhaber, &s);
       s.einzahlen(100);
       s.auszahlen(1500);
       s.auszahlen(10);
       s.jahresabschluss();
       s.anzeigen();
    }
    


  • Und wie packt man nun die einzelnen konten in ein aarray?das ist mir auch noch nicht ganz klar geworden?zur verwaltung lediglich...



  • struct foo
    {
     int a_;
     int b_;
    };
    
    int main ()
    {
     foo a[2];
    
     foo f;
     f.a_ = 5;
     f.b_ = 2;
    
     a[0] = f;
     a[1] = f;
    }
    

    Alternativ kannst du auch gleich auf die Instanzen in dem Array zugreifen, anstatt das zu kopieren.
    Aber ich würde eh einen Container empfehlen. Siehe dazu bei den Artikeln des Forums (z.B std::vector, std::list o.ä. )



  • Ehm deine Klasse Konto, ist doch eine abstrakte Basisklasse. Man darf aber doch gar kein Objekt eines ADT`s erzeugen oder nicht?
    Wär also auch ein Fehler.



  • Mein Problem bei dem hier ist, dass ich beim erstellen eines neuen Kontos den namen mit übergeben möchte und dann mit der virtual void ausgabe() funktion ausgeben möchte.
    wo muss diese variable name hin?
    in die basisklasse konto? Wenn ich einen der Konstruktoren anpasse mit const char* name dann läuft das nicht.

    Gruß



  • fr33g schrieb:

    Ehm deine Klasse Konto, ist doch eine abstrakte Basisklasse. Man darf aber doch gar kein Objekt eines ADT`s erzeugen oder nicht?
    Wär also auch ein Fehler.

    Tut auch niemand. Also auch kein Fehler.

    carl88 schrieb:

    Mein Problem bei dem hier ist, dass ich beim erstellen eines neuen Kontos den namen mit übergeben möchte und dann mit der virtual void ausgabe() funktion ausgeben möchte.

    Was fürn Name? Was die Polymorphie/Array-Sache angeh: am deine verschiedene Konten in einem Array zu halten musst du sie dynamisch erzeugen und die Pointer im Array halten:

    const static std::size_t nKonten = 2;
    
    int main()
    {
      Konto* konten[nKonten];
    
      Konto* pk = new Girokonto();
      //tu was mit dem Konto
      konten[0] = pk;
    
      pk = new Sparkonto();
      //tu was mit dem Konto
      konten[1] = pk;
    }
    


  • Jap stimmt, sorry habe heut morgen bevor ich losmusste das ganze nur kurz überflogen und dachte hätte das gesehen dass ein Konto Objekt erzeugt wird.
    Aber ist ja nicht der Fall also sorry nomal.
    Nächstes mal les ich erst mal genauer bevor ich poste;-)



  • also meine main sieht gerade so aus:

    int main(void)
    {
    
       Girokonto hans;
       hans.neu_name("HANS");
       hans.anzeigen();
       hans.einzahlen(100);
       hans.anzeigen();
       hans.auszahlen(1300);
       hans.anzeigen();
       hans.auszahlen(100);
       hans.anzeigen();
       hans.einzahlen(100);
       hans.anzeigen();
       hans.jahresabschluss();
       hans.anzeigen();
       hans.trennen();
    
       Sparkonto siegfried;
       siegfried.neu_name("Siegfried");
       siegfried.anzeigen();
       siegfried.einzahlen(200);
       siegfried.auszahlen(1000);
       siegfried.auszahlen(100);
       siegfried.jahresabschluss();
       siegfried.anzeigen();
    

    ich hab ein paar andere funktionen aber als der Themenstarter.
    Um nun noch glücklich zu werden sollen zum beispiel siegfried und hans in einem array verwaltet werden.

    Also Pumuckl zufolge soll das dann etwa so aussehen:

    const static std::size_t nKonten = 2;
    
    int main(void)
    {
      Konto* bank[nKonten];
    
      Konto* pk = Girokonto hans;
      //Die ein/auszahlerei
      bank[0] = pk;
    
      pk = Sparkonto siegfried;
      //tu was mit dem Konto
      bank[1] = pk;
    }
    

    Und so weiter....

    Also muss ich um auf ein jeweiliges Konto zugreifen zu können nur

    pk=bank[1];
    //funktionen
    

    machen...?

    Ich versehen den Sinn der Sache, bzw aufgabenstellung so nicht. Vielleicht wenn man über die main noch Eingabe und Ausgabe hat, aber wenn man in der main das so direkt eingibt, ergibt es doch wenig Sinn?

    Auch vielen Dank meinerseits zu den Hilfestellungen!



  • Teil der Aufgabenstellung:
    in main():

    Erzeugen Sie ein Paar Konten und Girokonten und zahlen Sie Geld auf alle Konten ein (Konto*bank[6];)

    Hoffe das Hilft



  • Hier findet man die gesamte Aufgabenstellung 😉

    http://www.c-plusplus.net/forum/viewtopic-var-t-is-258990.html


Anmelden zum Antworten