Problem mit C++ Programm



  • Nabend leute,

    schaut mal bitte über folgendes Programm welches ich größtenteils schon in C++ geschrieben habe:

    // Bankkontensystem_new.cpp : Definiert den Einsprungpunkt für die Konsolenanwendung.
    //
    
    #include <iostream>
    #include <string.h>
    #include <windows.h>
    #include <conio.h>
    #include <stdlib.h>
    
    using namespace std;
    
    class konto
    {
    public:
    	int KontoNr;
    	float kontostand;
    	char name[25];
    	char vorname[25];
    
    	konto(int KNr = 123456, float k = 0.0f)
    	{
    		KontoNr = KNr;
    		kontostand = k;
    	}		
    };
    
    int menu();
    void konto_anlegen(konto daten,konto daten2);
    void konto_anlegen2(konto daten,konto daten2);
    void kontstand_abrufen(konto daten,konto daten2);
    void ueberweisen(konto daten,konto daten2, float betrag);
    void einzahlen(konto daten,konto daten2, float betrag, float betrag2);
    void beenden();
    
    void main()
    {
    	int wahl;
    	float betrag=0;
    	float betrag2=0;
    
    	konto daten (479462, 0.00);
    	konto daten2 (2565432, 0.00);
    
    	do
    	{
    		wahl=menu();
    		switch(wahl)
    		{
    			case 1: konto_anlegen(daten,daten2);
    				break;
    			case 2: konto_anlegen2(daten,daten2);
    				break;
    			case 3: kontstand_abrufen(daten,daten2);
    				break;
    			case 4: ueberweisen(daten,daten2, betrag);
    				break;
    			case 5: einzahlen(daten,daten2,betrag, betrag2);
    				break;			
    		}
    	} while(wahl< 6);
    
    	beenden();
    }
    
    int menu()
    {	
    	int wahl;
    	cout << ">>> Bankkontosystem <<<";
    	cout << "\n\n\nHINWEIS: Wenn dies Ihr erster Aufruf ist, muessen Sie ein Konto anlegen.";
    	cout << "\n\nWas moechten Sie tun?";
    	cout << "\n\n1. Konto anlegen";
    	cout << "\n2. Ein weiteres Konto anlegen";
    	cout << "\n3. Kontostand abrufen";
    	cout << "\n4. Ueberweisung taetigen";
    	cout << "\n5. Geld einzahlen";
    	cout << "\n6. Beenden\n\n";
    	cout << "\n\n\n\tBitte treffen Sie Ihre Wahl: ";
    	cin  >> wahl;
    
    	return wahl;
    }
    
    void konto_anlegen(konto daten,konto daten2)
    {
    	system("CLS");
    	cout << "Konto Anlegen\n\n";
    	cout << "Bitte geben Sie Ihren Namen ein: ";
    	cin >> daten.vorname;
    	cin >> daten.name;
    	cout << "\n Kontoname\t: "<< daten.vorname <<" "<< daten.name <<"";		
    	cout << "\n Kontonummer\t: "<< daten.KontoNr <<"";
    	cout << "\n\nIhr Konto wurde erolfgreich erstellt...\n\n\n";
    	system("PAUSE");
    	system("CLS");
    }
    
    void konto_anlegen2(konto daten,konto daten2)
    {
    	system("CLS");
    	cout << "Konto Anlegen2\n\n";
    	cout << "Bitte geben Sie Ihren Vornamen ein: ";
    	cin >> daten2.vorname ;
    	cout << "Bitte geben Sie Ihren Nachnamen ein: ";
    	cin >> daten2.name;
    	cout << "\n Kontoname\t: "<< daten2.vorname <<" "<< daten2.name <<"";		
    	cout << "\n Kontonummer\t: "<< daten2.KontoNr <<"";
    	cout << "\n\nIhr Konto wurde erolfgreich erstellt...\n\n\n";
    	system("PAUSE");	
    	system("CLS");
    }
    
    void kontstand_abrufen(konto daten, konto daten2)
    {
    	int wahl;
    
    	system("CLS");
    	cout << "\t\t\tKontostand abrufen";
    	cout << "\n\n\nWelches Konto?";
    	cout << "\n\nKonto 1 (Besitzer: "<< daten.vorname <<")";
    	cout << "\nKonto 2 (Besitzer: "<< daten2.vorname <<" "<< daten2.name <<")";
    	cout << "\n\n\n\tBitte treffen Sie Ihre Wahl: ";
    	cin  >> wahl;
    	if(wahl == 1)
    	{
    		system("CLS");
    		cout << "Konto: "<< daten.vorname <<" "<< daten.name <<" (Kontonummer: "<< daten.KontoNr <<")\n\n";
    		cout << "______________";
    		cout << "\n\nIhr aktueller Kontostand betraegt: "<< daten.kontostand <<" EUR\n\n";
    		system("PAUSE");
    		system("CLS");
    	}
    	if(wahl == 2)
    	{
    		system("CLS");
    		cout << "Konto: "<< daten2.vorname <<" "<< daten2.name <<" (Kontonummer: "<< daten2.KontoNr <<")\n\n";
    		cout << "______________";
    		cout << "\n\nIhr aktueller Kontostand betraegt: "<< daten2.kontostand <<" EUR\n\n";
    		system("PAUSE");
    		system("CLS");
    	}
    }
    
    void ueberweisen(konto daten, konto daten2, float betrag)
    {
    	int wahl;
    
    	system("CLS");
    	cout << "\t\t\tGeld einzahlen\n\n";
    	cout << "\n\n\nWelches Konto?";
    	cout << "\n\n1. Konto 1 (Besitzer: "<< daten.vorname <<" "<< daten.name <<"";
    	cout << "\n2. Konto 2 (Besitzer: "<< daten2.vorname <<" "<< daten2.name <<"";
    	cout << "\n\n\n\tBitte treffen Sie Ihre Wahl: ";
    	cin >> wahl;
    
    	if(wahl == 1)
    	{
    		system("CLS");
    		cout << "\n\nIhr aktueller Kontostand betraegt: "<< daten.kontostand <<"";
    		cout << "\nWie viel Euro moechten Sie auf Ihr Konto einzahlen? \n";
    		cin >> betrag;
    		daten.kontostand=daten.kontostand+betrag;
    		cout << "Sie haben jetzt "<< betrag <<" Euro auf Ihrem Konto!\n\n\n";
    		system("PAUSE");
    		system("CLS");
    	}
    	if(wahl == 2)
    	{
    		system("CLS");
    		cout << "\n\nIhr aktueller Kontostand betraegt: "<< daten.kontostand <<"";
    		cout << "\nWie viel Euro moechten Sie auf Ihr Konto einzahlen? \n";
    		cin >> betrag;
    		daten.kontostand=daten.kontostand+betrag;
    		cout << "Sie haben jetzt "<< betrag <<" Euro auf Ihrem Konto!\n\n\n";
    		system("PAUSE");
    		system("CLS");
    	}
    
    }
    
    void einzahlen(konto daten, konto daten2, float betrag, float betrag2)
    {
    	int wahl;
    
    	system("CLS");
    	cout << "\t\t\tGeld einzahlen\n\n";
    	cout << "\n\n\nWelches Konto?";
    	cout << "\n\n1. Konto 1 (Besitzer: "<< daten.vorname <<" "<< daten.name <<"";
    	cout << "\n2. Konto 2 (Besitzer: "<< daten2.vorname <<" "<< daten2.name <<"";
    	cout << "\n\n\n\tBitte treffen Sie Ihre Wahl: ";
    	cin >> wahl;
    
    	if(wahl == 1)
    	{
    		system("CLS");
    		cout << "\n\nIhr aktueller Kontostand betraegt: "<< daten.kontostand <<"";
    		cout << "\nWie viel Euro moechten Sie auf Ihr Konto einzahlen? \n";
    		cin >> betrag;
    		daten.kontostand=daten.kontostand+betrag;
    		cout << "Sie haben jetzt "<< betrag <<" Euro auf Ihrem Konto!\n\n\n";
    		system("PAUSE");
    		system("CLS");
    	}
    	if(wahl == 2)
    	{
    		system("CLS");
    		cout << "\n\nIhr aktueller Kontostand betraegt: "<< daten.kontostand <<"";
    		cout << "\nWie viel Euro moechten Sie auf Ihr Konto einzahlen? \n";
    		cin >> betrag;
    		daten2.kontostand=daten2.kontostand+betrag2;
    		cout << "Sie haben jetzt "<< betrag <<" Euro auf Ihrem Konto!\n\n\n";
    		system("PAUSE");
    		system("CLS");
    	}
    
    }
    
    void beenden()
    {
    	system("CLS");
    	exit(1);
    }
    

    Ein paar funktionen fehlen noch 😉
    aber mein problem ist folgendes:

    wenn man ein konto anlegt und dann den kontostand abruft, übergibt er irgendwie den namen nicht richtig 😞

    Woran liegt das?

    Danke schon mal ..



  • wenn man ein konto anlegt und dann den kontostand abruft, übergibt er irgendwie den namen nicht richtig

    Bitte eine genaue Fehlerbeschreibung. Mit dem können wir nur sehr wenig anfangen.

    Aber ich sehe da schon ein paar Fehlerquellen.

    Du benutzt c-strings und übergibst die Daten per Kopie, was per se so schno mal gefärhlich ist.(wenn du keine tiefe Kopie selber machst) Entscheide dich lieber für C++ und benutze std::string. Dann hast du da schon einmal ein paar Fehlerquellen beseitigt.

    Und da du ja sagst, dass der Name nicht richtig übergeben wird, würde ich schon mal sagen, dass der Fehler an dem liegt.



  • void konto_anlegen(konto daten,konto daten2) 
    { 
        system("CLS"); 
        cout << "Konto Anlegen\n\n"; 
        cout << "Bitte geben Sie Ihren Namen ein: "; 
        cin >> daten.vorname; 
        cin >> daten.name; 
        cout << "\n Kontoname\t: "<< daten.vorname <<" "<< daten.name <<"";        
        cout << "\n Kontonummer\t: "<< daten.KontoNr <<""; 
        cout << "\n\nIhr Konto wurde erolfgreich erstellt...\n\n\n"; 
        system("PAUSE"); 
        system("CLS"); 
    }
    

    Hier arbeitest du innerhalb der Funktion mit einer lokalen Kopie, die Veränderungen, die du machst haben keine Auswirkungen auf dein daten-Konto.

    Arbeite mit Referenzen:

    void konto_anlegen(konto &daten) 
    { 
       ...
    }
    

    Wenn du in der Funktion daten2 nicht benutzt, musst du es auch nicht übergeben. D.h. du brauchst auch nicht zwei Funktionen

    void konto_anlegen(konto daten,konto daten2);
    void konto_anlegen2(konto daten,konto daten2);
    

    sondern nur eine Funktion

    void konto_anlegen(konto &daten);
    
    // aufrufen für beide Konten
    konto_anlegen(daten);
    konto_anlegen(daten2);
    


  • Danke erstmal für die Antwort uUuuUu ...
    Ein Problem noch mit dem einzahlen:

    void einzahlen(konto daten, konto daten2, float betrag, float betrag2)
    {
        int wahl;
    
        system("CLS");
        cout << "\t\t\tGeld einzahlen\n\n";
        cout << "\n\n\nWelches Konto?";
        cout << "\n\n1. Konto 1 (Besitzer: "<< daten.vorname <<" "<< daten.name <<"";
        cout << "\n2. Konto 2 (Besitzer: "<< daten2.vorname <<" "<< daten2.name <<"";
        cout << "\n\n\n\tBitte treffen Sie Ihre Wahl: ";
        cin >> wahl;
    
        if(wahl == 1)
        {
            system("CLS");
            cout << "\n\nIhr aktueller Kontostand betraegt: "<< daten.kontostand <<"";
            cout << "\nWie viel Euro moechten Sie auf Ihr Konto einzahlen? \n";
            cin >> betrag;
            daten.kontostand=daten.kontostand+betrag;
            cout << "Sie haben jetzt "<< betrag <<" Euro auf Ihrem Konto!\n\n\n";
            system("PAUSE");
            system("CLS");
        }
        if(wahl == 2)
        {
            system("CLS");
            cout << "\n\nIhr aktueller Kontostand betraegt: "<< daten.kontostand <<"";
            cout << "\nWie viel Euro moechten Sie auf Ihr Konto einzahlen? \n";
            cin >> betrag;
            daten2.kontostand=daten2.kontostand+betrag2;
            cout << "Sie haben jetzt "<< betrag <<" Euro auf Ihrem Konto!\n\n\n";
            system("PAUSE");
            system("CLS");
        }
    
    }
    

    genauer gesagt:

    daten.kontostand=daten.kontostand+betrag;
            cout << "Sie haben jetzt "<< betrag <<" Euro auf Ihrem Konto!\n\n\n";
    

    warum speichert der den wert nicht in daten.kontostand?
    ich müsste ja dann wenn ich den kontostand aburfen will über die funktion betrag gehen, nur wären mir das zu viele pointer.

    gehts nicht besser?
    weil wenn ich geld einzahle und dann den kontostand abrufe bleibts bei 0 euro.



  • hier mal ein tipp, ich weiss nicht wo du das her hast "void main()" und das es deine compiler überhaupt durchlässt, aber es heisst richtig "int main()" ...



  • void main() wird schon ne ganze weile durchgewunken, vc++ akzeptiert das auch schon solange ich mit C++ rumhantiere. Es wird auch so in einigen Tutorials verwendet.



  • @Sebastian08 das wird schon geändert. allerding nur in der lokalen kopie von "daten". c++ erzeugt von allen objekten eine kopie, wenn du sie mittels call-by-value übergibst. wenn du "daten" in deiner funktion ändern willst, musst du das objekt als referenz oder zeiger übergeben. also so:

    void einzahlen(konto& daten, konto& daten2, float betrag, float betrag2)
    

    oder so:

    void einzahlen(konto* daten, konto* daten2, float betrag, float betrag2)
    

    die erste variante hat den vorteil, dass du die objekte "normal" benutzen kannst, also in deinem fall den code nicht ändern musst und sie garantiert, dass daten und daten2 immer legale objekte sind. in der zweiten variante könnte man auch einen null-pointer übergebenm was auch vorteile haben kann. in deinem fall aber nicht.

    @Xebov hier gilt der klassische spruch: nur weil dein compiler es zulässt, ist das noch lange kein richtiges c++. zulässig nach dem c++-standard sind nur die beiden formen:

    int main();
    int main(int argc, char* argv[]);
    


  • Ok läuft jetzt einwandfrei.
    Das ich darauf nicht selber gekommen bin ..

    Man lernt 👍

    Danke für Eure Hilfe 🙂



  • Benutz bitte [cpp]- anstelle von [code]-Tags, da gibt es Syntaxhighlighting, was die Übersicht stark erhöht.

    #include <string.h> 
    #include <stdlib.h>
    

    Diese beiden Header sind C, die C++-Entsprechungen lauten <cstring> und <cstdlib>. C++-Standardheader haben nie eine Endung.


Anmelden zum Antworten