Simulation eines Bankautomaten
-
Hallo!
Ich versuche jetzt die 2. Aufgabe von http://www.highscore.de/cpp/einfuehrung/uebungen.html#uebungen_aufgaben
zu machen.Das ist wozu ich gekommen bin, leider lässt das nicht compilen.Ich verstehe nicht, wo das Problem ist.
Vielen Dank im Voraus.
er sagt mir:~"Bankkonto.exe": "C:\Windows\SysWOW64\ntdll.dll" geladen, Cannot find or open the PDB file
"Bankkonto.exe": "C:\Windows\SysWOW64\kernel32.dll" geladen, Cannot find or open the PDB file
"Bankkonto.exe": "C:\Windows\SysWOW64\KernelBase.dll" geladen, Cannot find or open the PDB file
"Bankkonto.exe": "C:\Windows\SysWOW64\msvcp100d.dll" geladen, Symbole wurden geladen.
"Bankkonto.exe": "C:\Windows\SysWOW64\msvcr100d.dll" geladen, Symbole wurden geladen.
Eine Ausnahme (erste Chance) bei 0x5b77cac8 (msvcr100d.dll) in Bankkonto.exe: 0xC0000005: Zugriffsverletzung beim Schreiben an Position 0xcccccccc.
Unbehandelte Ausnahme bei 0x5b77cac8 (msvcr100d.dll) in Bankkonto.exe: 0xC0000005: Zugriffsverletzung beim Schreiben an Position 0xcccccccc.
Eine Ausnahme (erste Chance) bei 0x5b77cac8 (msvcr100d.dll) in Bankkonto.exe: 0xC0000005: Zugriffsverletzung beim Schreiben an Position 0xcccccccc.
Unbehandelte Ausnahme bei 0x5b77cac8 (msvcr100d.dll) in Bankkonto.exe: 0xC0000005: Zugriffsverletzung beim Schreiben an Position 0xcccccccc.~#include<string> #include<iostream> using namespace std; struct bankkonto{ string Person; int pin; int stand; }; bool isValid(string &name, int &pin,bankkonto v[]){ bool zulassen=false; if(name==v[0].Person && pin==v[0].pin){ zulassen==true;} else if(name==v[1].Person && pin==v[1].pin){ zulassen==true;} else if(name==v[2].Person && pin==v[2].pin){ zulassen==true;} return zulassen;} bool enoughMoney(int &stand, int &betrag){ bool zulassen=false; if(stand>betrag){ zulassen=true;} return zulassen; } int main(){ string Klient; int Pin; string eingabe; int Betrag; struct bankkonto bankkonto1[2]; bankkonto1[0].Person="Avgust"; bankkonto1[0].pin=1234; bankkonto1[0].stand=12; bankkonto1[1].Person="Olga"; bankkonto1[1].pin=2345; bankkonto1[1].stand=13; bankkonto1[2].Person="Karl"; bankkonto1[2].pin=3456; bankkonto1[2].stand=14; cout<<"Geben Sie Ihre name ein"; cin>>Klient; cout<<"Ihre Pin bitte"; cin>>Pin; if (isValid(Klient,Pin,bankkonto1)){ if(Klient==bankkonto1[0].Person){ cout<<"Kontostand"<<bankkonto1[0].stand<<endl; cout<<"Wollen Sie geld abziehen?"; cin>>eingabe; if(eingabe=="ja"){ cout<<"Wie viel?"; cin>>Betrag; if(enoughMoney(bankkonto1[0].stand,Betrag)){ bankkonto1[0].stand=bankkonto1[0].stand-Betrag; cout<<"Kontostand:"<<bankkonto1[0].stand;}}} } else if (Klient==bankkonto1[1].Person){ cout<<"Kontostand"<<bankkonto1[1].stand; cout<<"Kontostand"<<bankkonto1[1].stand<<endl; cout<<"Wollen Sie geld abziehen?"; cin>>eingabe; if(eingabe=="ja"){ cout<<"Wie viel?"; cin>>Betrag; if(enoughMoney(bankkonto1[1].stand,Betrag)){ bankkonto1[1].stand=bankkonto1[1].stand-Betrag; cout<<"Kontostand:"<<bankkonto1[1].stand;}}} else if(Klient==bankkonto1[2].Person){ cout<<"Kontostand"<<bankkonto1[2].stand; cout<<"Kontostand"<<bankkonto1[2].stand<<endl; cout<<"Wollen Sie geld abziehen?"; cin>>eingabe; if(eingabe=="ja"){ cout<<"Wie viel?"; cin>>Betrag; if(enoughMoney(bankkonto1[2].stand,Betrag)){ bankkonto1[2].stand=bankkonto1[2].stand-Betrag; cout<<"Kontostand:"<<bankkonto1[2].stand;}}}}
-
Erstens: Wenn du so weit gekommen bist, dann lies sich das compilieren, ist aber direkt danach beim Ausführen abgestürzt.
Zweitens: Die "Cannot find or open the PDB file" sind harmlos, dein Problem sind die Zugriffsverletzungen - und die kommen höchstwahrscheinlich daher, daß du auf nicht existierende Array-Elemente zugreifst (
bankkontohat zwei Elementebankkonto[0]undbankkonto[1], "bankkonto[2]" ist illegal).Drittens: Besonders flexibel ist dein Programm nicht - überleg mal was du alles ändern müsstest, um die Anzahl der verwalteten Konten zu ändern (oder gar um zur Laufzeit neue Konten anzulegen oder vorhandene aufzulösen).
PS: Alle Variablen am Funktionsanfang zu definieren war in C++ nie nötig - die legt man normalerweise genau dort an, wo sie gebraucht werden.
-
Zweitens: Die "Cannot find or open the PDB file" sind harmlos, dein Problem sind die Zugriffsverletzungen - und die kommen höchstwahrscheinlich daher, daß du auf nicht existierende Array-Elemente zugreifst (bankkonto hat zwei Elemente bankkonto[0] und bankkonto[1], "bankkonto[2]" ist illegal).
yep. das habe ich umgeschrieben.
Aber die methode funktioniert irgenwie nicht. wenn name und pin richtig eingetippt sind, gibt diese methode trotzdem false zurück.
bool isValid(string &name, int &pin,bankkonto v[]){ bool zulassen=false; if(name==v[0].Person && pin==v[0].pin){ zulassen==true;} else if(name==v[1].Person && pin==v[1].pin){ zulassen==true;} else if(name==v[2].Person && pin==v[2].pin){ zulassen==true;} return zulassen;}Drittens: Besonders flexibel ist dein Programm nicht - überleg mal was du alles ändern müsstest, um die Anzahl der verwalteten Konten zu ändern (oder gar um zur Laufzeit neue Konten anzulegen oder vorhandene aufzulösen).
Das mache ich gleich.
PS: Alle Variablen am Funktionsanfang zu definieren war in C++ nie nötig - die legt man normalerweise genau dort an, wo sie gebraucht werden.
Meinst du die hier unter dem main?
int main(){ string Klient; int Pin; string eingabe; int Betrag; struct bankkonto bankkonto1[3]; bankkonto1[0].Person="Avgust"; bankkonto1[0].pin=1234; bankkonto1[0].stand=12; bankkonto1[1].Person="Olga"; bankkonto1[1].pin=2345; bankkonto1[1].stand=13; bankkonto1[2].Person="Karl"; bankkonto1[2].pin=3456; bankkonto1[2].stand=14;
-
Na, siehst du den Fehler hier:
zulassen==true;?
(aktiviere mal die Warnungen bei deinem Projekt bzw. beachte sie beim Compilieren...)
-
Na, siehst du den Fehler hier:
Ich sehe da keinen Fehler.
bei initializiren wird zulassen auf false gesetz, wenn aber die Bedienung name==v[0].Person && pin==v[0].pin erfüllt ist, wird zulassen auf true gesetzt.
bool isValid(string &name, int &pin,bankkonto v[]){ bool zulassen=false; if(name==v[0].Person && pin==v[0].pin){ zulassen==true;}
-
akvarel schrieb:
wird zulassen auf true gesetzt.
Wird es eben nicht
Kennst du den unterschied zwischen dem Operator == und dem Operator = ?
-
== ist ein Vergleich, = ist die Zuweisung!
-
akvarel schrieb:
PS: Alle Variablen am Funktionsanfang zu definieren war in C++ nie nötig - die legt man normalerweise genau dort an, wo sie gebraucht werden.
Meinst du die hier unter dem main?
int main(){ string Klient; int Pin; string eingabe; int Betrag; struct bankkonto bankkonto1[3]; bankkonto1[0].Person="Avgust"; bankkonto1[0].pin=1234; bankkonto1[0].stand=12; bankkonto1[1].Person="Olga"; bankkonto1[1].pin=2345; bankkonto1[1].stand=13; bankkonto1[2].Person="Karl"; bankkonto1[2].pin=3456; bankkonto1[2].stand=14;Das und auch die Konstruktion am Anfang der isValid-Funktion (dort wäre die Hilfsvariable überhaupt nicht nötig, stattdessen könntest du auch jeweils direkt einen Wert zurückgeben).
PS: Schonmal darüber nachgedacht, wie du dieses Programm für eine variable (d.h. beim Compilieren unbekannte) Konten-Anzahl erweitern müsstest?
-
Das und auch die Konstruktion am Anfang der isValid-Funktion (dort wäre die Hilfsvariable überhaupt nicht nötig, stattdessen könntest du auch jeweils direkt einen Wert zurückgeben).
Meinst du das die isValid-Funktion zB. den Stand des Kontos zurückgeben kann?
PS: Schonmal darüber nachgedacht, wie du dieses Programm für eine variable (d.h. beim Compilieren unbekannte) Konten-Anzahl erweitern müsstest?
Ich vermute, ich muss die class benutzer und bank schreiben.
die variablen von benutzer wäre dann der Name und Pin und methoden set(name,pin)(also, pin und name angeben) und den betrag wählenVariablen von bank: name,pin,kontostand , und das alles mit pin und name von kunden vergleichen und geld ausgeben.
-
akvarel schrieb:
Das und auch die Konstruktion am Anfang der isValid-Funktion (dort wäre die Hilfsvariable überhaupt nicht nötig, stattdessen könntest du auch jeweils direkt einen Wert zurückgeben).
Meinst du das die isValid-Funktion zB. den Stand des Kontos zurückgeben kann?
Nein, ein boolean ist schon OK (Kontostand zurückgeben hat wohl nichts mit der Gültigkeitsproüfung zu tun), aber den extra noch in einer Hilfsvariablen zwischenzulagern ist imho unnötig. Wobei, im Hinblick auf die Erweiterbarkeit würde ich den Index des erkannten Kontos zurückgeben (und die Funktion umbenennen).
PS: Schonmal darüber nachgedacht, wie du dieses Programm für eine variable (d.h. beim Compilieren unbekannte) Konten-Anzahl erweitern müsstest?
Ich vermute, ich muss die class benutzer und bank schreiben.
die variablen von benutzer wäre dann der Name und Pin und methoden set(name,pin)(also, pin und name angeben) und den betrag wählenVor allem mußt du deine if-else-Kaskaden in der isValid() und main() entrümpeln und zusammenfassen (Stichwort: Schleife) und das Array durch etwas dynamisch erwaiterbares (z.B. std::vector) ersetzen.
-
Wobei, im Hinblick auf die Erweiterbarkeit würde ich den Index des erkannten Kontos zurückgeben (und die Funktion umbenennen).
Also, jetzt habe ich sowas:
int klientnummer = (isKlient(Klient,Pin,bankkonto1)); cout<<"Kontostand"<<bankkonto1[klientnummer].stand<<endl; cout<<"Wollen Sie geld abziehen?"; cin>>eingabe; if(eingabe=="ja"){ cout<<"Wie viel?"; cin>>Betrag; if(enoughMoney(bankkonto1[klientnummer].stand,Betrag)){ bankkonto1[0].stand=bankkonto1[klientnummer].stand-Betrag; cout<<"Kontostand:"<<bankkonto1[klientnummer].stand;Vor allem mußt du deine if-else-Kaskaden in der isValid() und main() entrümpeln und zusammenfassen (Stichwort: Schleife) und das Array durch etwas dynamisch erwaiterbares (z.B. std::vector) ersetzen.
int isKlient(string name, int pin,bankkonto v[]){ for(int i=0;i<sizeof(v);i++){ if(name==v[i].Person && pin==v[i].pin){ return i; } }}Er gibt mir aber die Warnung, und läuft nicht weiter. Also ich muss nich mal debugging, damit er mir den Kontostand schreibt.
-
Bei der isKlient()-Funktion hast du keinen Rückgabewert, wenn die angegebene Konto/Pin-Kombination ungültig ist - und die sizeof()-Konstruktion dort ist auch nicht anwendbar (trotz der Definition ist v nur ein Zeiger mit der festen Größe 4). Dazu kommt, daß du im Hauptprogramm die Möglichkeit nicht abfängst, daß das Konto nicht gefunden wurde.
Wie schon gesagt, nimm keine Arrays, sondern schau dich in der STL um - std::vector<> und std::find() (eventuell std::find_if()) würden dir die Aufgabe wesentlich erleichtern.PS: Und für Hilfestellungen ist es auch hilfreich, wenn du die Meldungen des Compilers mitlieferst

-
- std::vector<> und std::find() (eventuell std::find_if()) würden dir die Aufgabe wesentlich erleichtern.meinst du so was?
und dann muss ich alle funktionen ändern.vector<bankkonto> bank; bankkonto a; a.Person="August"; a.pin=1234; bank.push_back(a); bankkonto b; b.Person="Opel"; b.pin=2345; bank.push_back(b);
-
Ja, sowas habe ich gemeint (Anmerkung: wenn du der Kontoklasse noch einen passenden Konstruktor spendierst, sparst du dir die Schreibarbeit - aber das können wir klären, wenn der Rest läuft).
-
Ok...
Ich verstehe jetzt aber nicht mit find_ifvector<bankkonto> bank; vector<int>::iterator it; bankkonto a; a.Person="August"; a.pin=1234; bank.push_back(a); bankkonto b; b.Person="Opel"; b.pin=2345; bank.push_back(b); cout<<"Geben Sie Ihre name ein"; cin>>Klient; cout<<"Ihre Pin bitte"; cin>>Pin;it = find_if(bank.begin(),bank.end(),isKlient(Klient,Pin));
und dann muss die Funktion isKlient überprüfen,den string und den pin zurückgeben,damit find_if checkt von bank.begin bis bank.end ob diese string und pind da gespeicher sind.
-
ich habe jetzt so was:
beicout<< *itsagt er mir, dass die Operator nicht kompartibel *it ist.
Aber was ist dann ein *it? Das ist die Referenzen auf person in vector bank, bei der die Bedienung (khs.Person==name && khs.pin==pin) true zurückgibt.Kann ich irgenwie von *it aus auf Kontostand in *it gespeichertrn Person zugreifen?
Vielen dank
bool isKlient(const bankkonto& khs,const string& name, const int& pin){ return (khs.Person==name && khs.pin==pin); } int main(){ string Klient; int Pin; string eingabe; int Betrag; vector<bankkonto> bank; vector<bankkonto>::iterator it; bankkonto a; a.Person="August"; a.pin=1234; a.stand=145; bank.push_back(a); bankkonto b; b.Person="Opel"; b.pin=2345; b.stand=88; cout<<"Geben Sie Ihre name ein"; cin>>Klient; cout<<"Ihre Pin bitte"; cin>>Pin; it = find_if(bank.begin(),bank.end(),(isKlient,Klient,Pin)); cout<< *it
-
Gibt es für deine Bankkonto-Klasse denn einen überladenen << Stream-Operator?
ostream& operator << (ostream& os, const bankkonto& bk) { // ... }