Aufgabe:Bankautomat Gelöst



  • Versuche gerade eine Aufgabe zu lösen:
    Entwickeln Sie eine C++-Anwendung zur Simulation eines Bankautomaten. Der Anwender soll einen Benutzernamen (der die EC-Karte repräsentiert) und eine dazugehörige PIN eingeben, um Zugriff auf sein Konto zu erhalten. Insgesamt soll die Beispiel-Anwendung drei Konten mit unterschiedlichen Benutzernamen und PINs unterstützen. Ist das Einloggen erfolgreich, kann der Anwender zwischen Kontostandanzeige und Auszahlung eines Betrags wählen. Das Programm soll in einer Endlosschleife laufen, um mehrmaliges Einloggen in den Bankautomaten zu ermöglichen. Setzen Sie die drei Konten auf beliebige Werte, um das Programm zu testen, und loggen Sie sich mehrmals mit jedem Benutzer ein, um den Kontostand anzuzeigen und Geld abzuheben.

    Mein Lösungswegbegin:

    #include <iostream>
    #include <string>
    using namespace std;
    
    struct Member
    {   string benutzername;
        string passwort;
        int kontostand;
        string pwtest;
    
    };
    
    int main()
    {    string pwtest;
        int wahl;
        int abbuchen;
        bool Einlogtest;
    
         Member MemberGustav;
     MemberGustav.benutzername = "Gustav";
     MemberGustav.passwort = "Auto";
     MemberGustav.kontostand = 1000;
    
     Member MemberPaul;
     MemberPaul.benutzername = "Paul";
     MemberPaul.passwort = "Schiff";
     MemberPaul.kontostand = 100000;
    
     Member MemberKlaus;
     MemberKlaus.benutzername = "Klaus";
     MemberKlaus.passwort="Zug";
     MemberKlaus.kontostand=500;
    
    int Member[2];
    Member[0]= MemberGustav;
    Member[1]= MemberPaul;
    Member[2]= MemberKlaus;
    

    Nun zeigt es mir schon einen Fehler bei dem Array an und ich weiß noch nicht wie ich ein Hauptmenü (Bankautomat) erstelle, ohne es für jeden Benutzer zu spezifizieren.



  • silent12 schrieb:

    int Member[2]; // Array mit 2 Feldern
    Member[0]= MemberGustav; // Zugriff auf erstes Feld
    Member[1]= MemberPaul; // Zugriff auf zweites Feld
    Member[2]= MemberKlaus; // Ein drittes gibt's nur leider nicht. :)
    // Abgesehen davon ist das ein Feld von zwei int's. Wie soll da bitte eine Variable vom Typ "Member" rein passen?
    

    Nun zeigt es mir schon einen Fehler bei dem Array an und ich weiß noch nicht wie ich ein Hauptmenü (Bankautomat) erstelle, ohne es für jeden Benutzer zu spezifizieren.

    Guck dir am besten mal Klassen an. Dann erstellst du eine Klasse "Konto", mit den privaten Variablen "std::string besitzer", "int kontostand" und "int pin". Dann erstellst du noch Memberfunktionen für den Zugriff. z.B. "einloggen" etc. Dann melde dich wieder. 🙂



  • Danke für die Tipps, aber ich würde es gerne ohne Klassen lösen, da in dem Tutorial diese Aufgabe eine der 3 Abschlussaufgaben der Einführung ist und Klassen erst im Aufbau erklärt werden. Deshalb vermute ich, dass man die Aufgabe eig. OHNE Klassen lösen soll.



  • Hm.. ist mir unverständlich, die Aufgabe schreit eigentlich schon nach Klassen. Ansonsten ist der Ansatz mit dem struct schon mal gut. Nur "string pwtest;" erschließt sich mir nicht, das würde ich raus werfen. Dann deklarierst du direkt ein Member Array. (std::vector wäre natürlich schöner, aber das willst du vermutlich auch nicht.)

    struct Konto
    {   string benutzername;
        string passwort;
        int kontostand;
        // string pwtest; <- weg
    };
    
    int main()
    {
      const int anzahl_konten = 3;
      Konto konten[anzahl_konten]; // ein Array mit 3(!) Konten. Der höchste Index ist also konten[2]
      // hier füllst du die konten mit Daten, könnte man auch gleich mit der Deklaration machen
    
      while (1)
      {
        string name;
        cout << "Bitte Namen eingeben: "
        cin >> name;
        for (int i = 0; i < anzahl_konten; ++i)
          ...
      }
    }
    

    Ist das genug Ansatz für dich?



  • Ah danke. Ich baue das mal ein und melde mich danach nochmal



  • Ah wie fülle ich die Daten INNERHALB des Arrays ein (hinter konten[0]....) ?



  • silent12 schrieb:

    Ah wie fülle ich die Daten INNERHALB des Arrays ein (hinter konten[0]....) ?

    konten[0].passwort = "wie immer";


  • Mod

    Man kann natürlich auch wunderbar Klassen emulieren, indem man ein struct Konto definiert und lauter freie Funktionen schreibt, die als einen Parameter eine Konto& nehmen. Nennen wir diese Referenz mal my_this 😃 .

    So kann man dem Lehrer ein Schnippchen schlagen und bei dieser Aufgabe die förmlich nach Objektorientierung schreit diese Denkweise auch ohne Klassenmethoden benutzen. 🕶



  • Ja aber ich wollte sie eig. ohne Klassen lösen. Danke trotzdem.
    So mein Code sieht bis jetzt so aus.

    #include <iostream>
    #include <string>
    using namespace std;
    
    struct Konto
    {   string benutzername;
        string passwort;
        int kontostand;
    
    };
    
    int main()
    {    
         const int anzahl_konten = 3;
         Konto konten [anzahl_konten];
         konten[0].passwort ="Haus";
         konten[0].benutzername="Hans";
         konten[0].kontostand=1000;
         konten[1].passwort="Zug";
         konten[1].benutzername="Klaus";
         konten[1].kontostand=10000;
         konten[2].passwort="Auto";
         konten[2].benutzername="Gustav";
         konten[2].kontostand=500;
    
    }
    

    Nun geht's weiter. Den Ansatz verstehe ich nicht ganz. Würde es nicht gut funktionieren die "for"-schleife um die "while"-Schleife zu setzen und bei while in die Klammer ein "i" ?



  • silent12 schrieb:

    Nun geht's weiter. Den Ansatz verstehe ich nicht ganz. Würde es nicht gut funktionieren die "for"-schleife um die "while"-Schleife zu setzen und bei while in die Klammer ein "i" ?

    Ne. Die while-Schleife hat nur eine Funktion: Wenn das Programm am Ende ist wieder von Vorne anfangen. Wie in der Aufgabe gefordert, halt eine Endlosschleife.
    Hast du denn gar keine Idee, wozu die for-Schleife da steht? Sie soll dynamisch alle Einträge in konten[] durchsuchen und testen, ob irgendwo ein Konto mit dem eingegebenen Namen existiert. So klarer?



  • while (1)
      {
        string eingbenutzername;
        string eingpasswort;
    
        cout << "Bitte Benutzernamen eingeben:" << endl;
        cin >> eingbenutzername;
    
        cout <<"Bitte Passwort eingegebn:" <<endl;
        cin >> eingpasswort;
    
        for (int i = 0; i < anzahl_konten; ++i)
          {konten[i].passwort = eingpasswort;
           konten[i].benutzername = eingbenutzername;
                 }
                 }
    

    ok so jetzt müsste doch getestet werden ob das Passwort stimmt oder ?



  • Du machst da eine Zuweisung! Das ist aber nicht das, was du willst. Du möchtest einen Vergleich machen. (Zudem solltest du dir einen angenehmeren Einrückungsstil angewöhnen.)



  • Ach dann muss ich ein == verwenden oder ?



  • silent12 schrieb:

    Ach dann muss ich ein == verwenden oder ?

    Und ein if. Wenn dir das alles nicht schon klar ist, solltest du dir wirklich noch einmal die Grundlagen anschauen.



  • Ach jetzt :). Ohne if würde das Programm auch bei falscher eingabe einfach weiter laufen. Ok habe schon ein bisschen weiterprogrammiert, nur das if kriege ich irgendwie nicht rein 😞

    #include <iostream>
    #include <string>
    using namespace std;
    
    struct Konto
    {   string benutzername;
        string passwort;
        int kontostand;
    
    };
    
    int main()
    {    int abbuchbetrag;
         int Menueauswahl;
        int i;
    
         const int anzahl_konten = 3;
         Konto konten [anzahl_konten];
         konten[0].passwort ="Haus";
         konten[0].benutzername="Hans";
         konten[0].kontostand=1000;
         konten[1].passwort="Zug";
         konten[1].benutzername="Klaus";
         konten[1].kontostand=10000;
         konten[2].passwort="Auto";
         konten[2].benutzername="Gustav";
         konten[2].kontostand=500;
    
       while(1)
       {
        string eingbenutzername;
        string eingpasswort;
    
        cout << "Bitte Benutzernamen eingeben:" << endl;
        cin >> eingbenutzername;
    
        cout <<"Bitte Passwort eingegebn:" <<endl;
        cin >> eingpasswort;
    
        for (int i = 0; i < anzahl_konten; ++i)
          {konten[i].passwort == eingpasswort;
           konten[i].benutzername == eingbenutzername;)
           }
    
    cout <<"Kontostand anzeigen(Druecke1) Betrag abbuchen(Druecke2) Verlassen(Druecke3)" << endl;
    cin >>Menueauswahl;
    
    if(Menueauswahl=1)
    {cout <<"Kontostand:" << konten[i].kontostand << endl;
                      }
    
    if (Menueauswahl=2)
    { cout <<"Wieviel moechten sie abbuchen ?" << endl;
     cin >> abbuchbetrag;
     konten[i].kontostand = konten[i].kontostand - abbuchbetrag;
         }
    
    else
    {return 0;
        }
    
    }           
    
    system("Pause");         
    
      }
    


  • Du solltest dir dringend die Grundlagen noch mal angucken, insbesondere if/else, Schleifen, Arrays. Und dann einen vernünftigen Einrückungsstil angewöhnen, deine Klammern fliegen da irgendwo in der Gegend rum, der Ganze Code sieht aus wie Kraut und Rüben. Nicht böse gemeint, aber da kann man ja nicht mehr durchblicken, kein Wunder, dass du nicht weißt wie du weitermachen sollst.

    struct Konto
    {   string benutzername;
        string passwort;
        int kontostand;
        // string pwtest; <- weg
    };
    
    int main()
    {
      const int anzahl_konten = 3;
      Konto konten[anzahl_konten]; // ein Array mit 3(!) Konten. Der höchste Index ist also konten[2]
      // hier füllst du die konten mit Daten, könnte man auch gleich mit der Deklaration machen
    
      while (1)
      {
        string name;
        cout << "Bitte Namen eingeben: "
        cin >> name;
        for (int i = 0; i < anzahl_konten; ++i)
        {
           if (konten[i].benutzername == name)
           {
             cout << "Bitte Passwort eingeben: ";
             std::string passwort;
             cin >> passwort;
             if (konten[i].passwort == passwort)
             {
               // erfolgreich eingeloggt
             }
             else
             {
               cout << "Das Passwort " << passwort << " ist falsch.\n";
             }
             break; // wenn das richtige Konto bereits gefunden wurde, kann die for-Schleife abgebrochen werden.
           }
        }
      }
    }
    


  • So vom Einrückungsstil besser ?
    Ja habe ich gemerkt und jetzt gerade eben mal gemacht.
    So nun funktioniert alles, bis auf, dass ich noch einstellen muss, dass der Abbuchbetrag nicht größer als der Kontobetrag sein darf.

    #include <iostream>
    #include <string>
    using namespace std;
    
       struct Konto
       {   string benutzername;
           string passwort;
           int kontostand;
    
       };
    
    int main()
    {    int abbuchbetrag;
         int Menueauswahl;
        int i;   
    
         const int anzahl_konten = 3;
         Konto konten [anzahl_konten];
         konten[0].passwort ="Haus";
         konten[0].benutzername="Hans";
         konten[0].kontostand=1000;
         konten[1].passwort="Zug";
         konten[1].benutzername="Klaus";
         konten[1].kontostand=10000;
         konten[2].passwort="Auto";
         konten[2].benutzername="Gustav";
         konten[2].kontostand=500;
    
         while(1)
         {
           string eingbenutzername;
           string eingpasswort;
    
           cout << "Bitte Benutzernamen eingeben:" << endl;
           cin >> eingbenutzername;
    
              for (int i = 0; i < anzahl_konten; ++i)
              {
    
                       if(konten[i].benutzername == eingbenutzername)
                       { cout <<"Bitte Passwort eingegebn:" <<endl;
                       cin >> eingpasswort;
    
                              if (konten[i].passwort == eingpasswort)
                              { cout <<"Sie haben sich erfolgreich eingeloggt." << endl;
                              cout <<"Kontostand anzeigen(Druecke1) Betrag abbuchen(Druecke2) Verlassen(Druecke3)" << endl;
                              cin >>Menueauswahl;
    
                                  if(Menueauswahl=1)
                                  {cout <<"Kontostand:" << konten[i].kontostand << endl;
                                  }
    
                                  if (Menueauswahl=2)
                                  { cout <<"Wieviel moechten sie abbuchen ?" << endl;
                                  cin >> abbuchbetrag;
                                  konten[i].kontostand = konten[i].kontostand - abbuchbetrag; 
                                  }
    
                                  else
                                  {return 0;
                                  }
    
                             }
    
                             else
                             { cout <<"Falsches Passwort." << endl;
                             } 
                    break;
                   }         
              }
         }  
    system("Pause");         
      }
    


  • Ok habe nach cin>>abbuchbetrag; dies hier eingefügt

    if(abbuchbetrag>konten[i].kontostand)
    {cout <<"Sie koennen ihr Konto nicht ueberziehen!" << endl;
     break;
    }
    

    und damit funktioniert alles. Würdest du mir trotzdem noch mal empfehlen mir spezielle Grundlagen noch einmal anzuschauen ?



  • silent12 schrieb:

    So vom Einrückungsstil besser ?

    Besser, ja. Nicht unbedingt gut. Ein paar simple Grundregeln sollte man beachten.

    struct x // noch keine geschweifte Klammer geöffnet, also ganz am Rand.
    { // <- In dieser Zeile steht nur die Klammer!
      int y, z; // eingerückt
    }; // schließende Klammer auf gleicher höher mit der zugehörigen öffnenden Klammer
    
    int main() // wieder ganz am Rand, noch keine Klammer geöffnet.
    { // wieder leer
      for (int i = 0; i < 5; ++i) // eingerückt
      { // öffnende Klammer, wieder leere Zeile
        std::cout << i << "\n"; // zwei mal eingerückt.
      } // schließende Klammer auf gleicher höher mit der zugehörigen öffnenden Klammer
    } // schließende Klammer auf gleicher höher mit der zugehörigen öffnenden Klammer
    

    Man könnte es auch so machen:

    struct x {
      int y, z;
    };
    
    int main() {
      for (int i = 0; i < 5; ++i) {
        std::cout << i << std::endl;
      }
    }
    

    Das ist Geschmackssache. Das erste hat meiner Meinung nach mehr Vorteile.

    silent12 schrieb:

    Würdest du mir trotzdem noch mal empfehlen mir spezielle Grundlagen noch einmal anzuschauen ?

    Es schadet nicht. Diese Aufgabe wurde dir ja jetzt auf dem Silbertablett serviert. Dir sollten die Einsatzgebiete von if/else, Schleifen, Arrays, wie man auf sie zugreift etc. geläufig sein, sonst fällt es sehr schwer neue Dinge zu lernen, die darauf basieren.


Anmelden zum Antworten