CKonto - Funktioniert nicht wie ich mir das vorstelle: Entweder 0 Ausgabe oder Run time Error



  • Hallo und guten Abend liebe Gemeinde.

    Ich habe mir gedacht, einmal ein Programm zu schreiben, das mir alle wichtigen Daten über ein Sparbuch liefert.

    Sprich Name des Inhabers, Kontonummer, Bankleitzahl, Kontostand zum 01.01., usw. usw. Danach sollen Einzahlungen und Auszahlungen übers Jahr gesehen bis hin zum 31.12. geführt werden. Am Ende soll es mir den Kontostand samt Zins anzeigen.

    Folgenden Programmcode habe ich aufgesetzt:

    In den Header-Dateien habe ich folgendes geschrieben:

    #pragma once
    #include "Stand.h"
    class Auszahlungen:public Stand
    {
    private:
    	double Kredittilgung;
    	double Barauszahlung;
    	double Kontoführungsgebühr;
    
    public:
    	Auszahlungen(void);
    	~Auszahlungen(void);
    
    	double getKredittilgung();
    	double getBarauszahlung();
    	double getKontoführungsgebühr();
    
    	void setKredittilgung(double);
    	void setBarauszahlung(double);
    	void setKontoführungsgebühr(double);
    };
    
    #pragma once
    #include "Stand.h"
    
    class Einzahlungen : public Stand
    {
    private:
    	double Mieteinnahmen;
    	double Vermögenswirksame_Leistungen;
    	double Bareinzahlungen;
    	double Dividenden_aus_Aktienpakete;
    
    public:
    	Einzahlungen(void);
    	~Einzahlungen(void);
    
    	double getMieteinnahmen();
    	double getVermögenswirksame_Leistungen();
    	double getBareinzahlungen();
    	double getDividenden_aus_Aktienpakete();
    
    	void setMieteinnahmen(double);
    	void setVermögenswirksame_Leistungen(double);
    	void setBareinzahlungen(double);
    	void setDividenden_aus_Aktienpakete(double);
    };
    
    #pragma once
    #include <string>
    #include <iostream>
    using namespace std;
    
    class KontoAllgemein
    {
    private:
    	string Inhaber;
    	int Kontonummer;
    	int Bankleitzahl;
    
    public:
    	KontoAllgemein(void);
    	~KontoAllgemein(void);
    
    	string getInhaber();
    	int getKontonummer();
    	int getBankleitzahl();
    
    	void setInhaber(string);
    	void setKontonummer(int);
    	void setBankleitzahl(int);
    };
    
    #pragma once
    #include "KontoAllgemein.h"
    using namespace std;
    
    class Stand : public KontoAllgemein
    {
    private:
    	double Kontostand;
    public:
    	Stand(void);
    	~Stand(void);
    
    	double getKontostand();
    	void setKontostand();
    };
    

    In den .cpp - Dateien habe ich folgendes geschrieben:

    #include "Auszahlungen.h"
    
    Auszahlungen::Auszahlungen(void)
    {
    }
    
    Auszahlungen::~Auszahlungen(void)
    {
    }
    
    double Auszahlungen::getKredittilgung()
    {
    	return Kredittilgung;
    }
    
    double Auszahlungen::getBarauszahlung()
    {
    	return Barauszahlung;
    }
    
    double Auszahlungen::getKontoführungsgebühr()
    {
    	return Kontoführungsgebühr;
    }
    
    void Auszahlungen::setKredittilgung(double credit)
    {
    	Kredittilgung = credit;
    }
    
    void Auszahlungen::setBarauszahlung(double payment)
    {
    	Barauszahlung = payment;
    }
    
    void Auszahlungen::setKontoführungsgebühr(double account_charge)
    {
    	Kontoführungsgebühr = account_charge;
    }
    
    #include "Einzahlungen.h"
    
    Einzahlungen::Einzahlungen(void)
    {
    }
    
    Einzahlungen::~Einzahlungen(void)
    {
    }
    
    double Einzahlungen::getMieteinnahmen()
    {
    	return Mieteinnahmen;
    }
    
    double Einzahlungen::getVermögenswirksame_Leistungen()
    {
    	return Vermögenswirksame_Leistungen;
    }
    
    double Einzahlungen::getBareinzahlungen()
    {
    	return Bareinzahlungen;
    }
    
    double Einzahlungen::getDividenden_aus_Aktienpakete()
    {
    	return Dividenden_aus_Aktienpakete;
    }
    
    void Einzahlungen::setMieteinnahmen(double rent_receipts)
    {
    	Mieteinnahmen = rent_receipts;
    }
    
    void Einzahlungen::setVermögenswirksame_Leistungen(double VWL)
    {
    	Vermögenswirksame_Leistungen = VWL;
    }
    
    void Einzahlungen::setBareinzahlungen(double BE)
    {
    	Bareinzahlungen = BE;
    }
    
    void Einzahlungen::setDividenden_aus_Aktienpakete(double DAA)
    {
    	Dividenden_aus_Aktienpakete = DAA;
    }
    
    #include "KontoAllgemein.h"
    #include <string>
    #include <iostream>
    using namespace std;
    
    KontoAllgemein::KontoAllgemein(void)
    {
    }
    
    KontoAllgemein::~KontoAllgemein(void)
    {
    }
    
    string KontoAllgemein::getInhaber()
    {
    	return Inhaber;
    }
    
    int KontoAllgemein::getKontonummer()
    {
    	return Kontonummer;
    }
    
    int KontoAllgemein::getBankleitzahl()
    {
    	return Bankleitzahl;
    }
    
    void KontoAllgemein::setInhaber(string account_owner)
    {
    	Inhaber = account_owner;
    }
    
    void KontoAllgemein::setKontonummer(int account_number)
    {
    	Kontonummer = account_number;
    }
    
    void KontoAllgemein::setBankleitzahl(int bank_number)
    {
    	Bankleitzahl = bank_number;
    }
    
    #include "Stand.h"
    #include "KontoAllgemein.h"
    using namespace std;
    
    Stand::Stand(void)
    {
    }
    
    Stand::~Stand(void)
    {
    }
    
    double Stand::getKontostand()
    {
    	return Kontostand;
    }
    
    #include <iostream>
    #include <string>
    #include "KontoAllgemein.h"
    #include "Stand.h"
    #include "Einzahlungen.h"
    #include "Auszahlungen.h"
    using namespace std;
    
    int main()
    {
    	cout << "\tKonto APP!\n";
    
    	KontoAllgemein *p_objKonto = new KontoAllgemein;
    
    	cout << "Geben Sie den Namen des Kontoinhabers ein!\n";
    	string Inhaber;
    	getline(cin, Inhaber);
    
    	cout << "Geben Sie die Kontonummer ein!\n";
    	int Kontonummer;
    	cin  >> Kontonummer;
    
    	cout << "Geben Sie die Bankleitzahl ein!\n";
    	int Bankleitzahl;
    	cin  >> Bankleitzahl;
    
    	Stand *p_objStand = new Stand;
    	cout << "Geben Sie den Kontostand zum 01.01. ein!\n";
    	double Kontostand;
    	cin  >> Kontostand;
    
    	cout << "\n";
    	cout << "Das haben Sie eingegeben: \n";
    	cout << "\n";
    	cout << "Kontoinhaber: " << Inhaber << "\n";
    	cout << "Kontonummer : " << Kontonummer << "\n";
    	cout << "Bankleitzahl: " << Bankleitzahl << "\n";
    	cout << "Kontostand  : " << Kontostand << "\n";
    	cout << "\n";
    
    	Einzahlungen *p_objEinzahlungen = new Einzahlungen;
    
    		string Antwort;
    		cout << "Gab es im vergangenen Jahr Einzahlungen?\n";
    		cin  >> Antwort;
    		if ("Ja")
    		{
    			int number = 9;
    			cout << "Welche Art von Einzahlungen gab es im vergangenen Jahr?\n";
    			cout << "(1) Mieteinnahmen\n";
    			cout << "(2) Vermögenswirksame Leistungen\n";
    			cout << "(3) Bareinzahlungen\n";
    			cout << "(4) Dividenden aus Aktienpakete\n";
    			cout << "(0) Exit\n";
    			cin  >> number;
    			switch(number)
    			{
    				case 1:
    					{
    						cout << "Wie hoch waren die Mieteinnahmen?\n";
    						double Mieteinnahmen;
    						cin  >> Mieteinnahmen;
    					}
    
    				case 2:
    					{
    						cout << "Wie hoch waren die Vermögenswirksamen Leistungen?\n";
    						double Vermögenswirksamen_Leistungen;
    						cin  >> Vermögenswirksamen_Leistungen;
    					}
    				case 3:
    
    						cout << "Wie hoch waren die Bareinzahlungen?\n";
    						double Bareinzahlungen;
    						cin  >> Bareinzahlungen;
    						break;
    
    				case 4:
    					{
    						cout << "Wie hoch waren die Dividenden aus den Aktienpaketen?\n";
    						double Dividenden_aus_Aktienpakete;
    						cin  >> Dividenden_aus_Aktienpakete;
    					}
    				case 0:
    					{
    						cout << "Exit!";
    						break;
    					}
    			}
    
    		}
    		else 
    			cout << "Im vergangenenen Jahr gab es keine Einnahmen!\n";
    
    	double Mieteinnahmen=0.0;
    	double Vermögenswirksamen_Leistungen=0.0;
    	double Bareinzahlungen=0.0;
    	double Dividenden_aus_Aktienpakete=0.0;
    
    	double Einzahlungen_gesamt = Mieteinnahmen + Vermögenswirksamen_Leistungen + Bareinzahlungen + Dividenden_aus_Aktienpakete;
    
    	cout << "Folgende Beträge wurden eingegeben:\n";
    	cout << "Mieteinnahmen:                       " << Mieteinnahmen << "\n";
    	cout << "Vermoegenswirksame Leistungen:       " << Vermögenswirksamen_Leistungen << "\n";
    	cout << "Bareinzahlungen:                     " << Bareinzahlungen << "\n";
    	cout << "Dividenden aus Aktienpakete:         " << Dividenden_aus_Aktienpakete << "\n";
    	cout << "\n";
    	cout << "Daraus ergibt sich folgender Betrag: " << Einzahlungen_gesamt << "\n";
    	cout << "\n";
    	cout << "\n";
    
    	Auszahlungen *p_objAuszahlungen = new Auszahlungen;
    
    	cout << "Gibt es Auszahlungen?\n";
    	string Antwort_2;
    	cin  >> Antwort_2;
    
    	if(Antwort=="Ja")
    	{
    		int number = 9;
    		cout << "Welche Auszahlungen gibt es?\n";
    		cout << "(1) Kredittilgung\n";
    		cout << "(2) Barauszahlung\n";
    		cout << "(3) Kontofuehrungsgebuehr\n";
    		cin  >> number;
    
    		switch(number)
    		{
    		case 1:
    			{
    				cout << "Wie hoch ist die monatliche Kredittilgung?\n";
    				double Kredittilgung;
    				cin  >> Kredittilgung;
    
    				double Kredittilgung_im_Jahr = Kredittilgung * 12;
    
    				cout << "Das macht einen Jahresbetrag von " << Kredittilgung_im_Jahr << "\n";
    			}
    		case 2:
    			{
    				cout << "Wie hoch ist der Betrag der Barauszahlungen?\n";
    				double Barauszahlungen;
    				cin  >> Barauszahlungen;
    			}
    		case 3:
    			{
    				cout << "Wie hoch ist die Kontoführungsgebühr?\n";
    				double Kontoführungsgebühr;
    				cin  >> Kontoführungsgebühr;
    			}
    		case 0:
    			{
    				cout << "Exit!\n";
    				break;
    			}
    		}
    	}
    	else
    		cout << "Es gibt keine Auszahlungen!\n";
    
    	double Kredittilgung_im_Jahr=0.0;
    	double Barauszahlungen=0.0;
    	double Kontoführungsgebühr=0.0;
    
    	double Auszahlungen_gesamt = Kredittilgung_im_Jahr + Barauszahlungen + Kontoführungsgebühr;
    
    	cout << "Folgende Beträge wurden eingegeben:\n";
    	cout << "Kredittilgung:       " << Kredittilgung_im_Jahr << "\n";
    	cout << "Barauszahlungen:     " << Barauszahlungen << "\n";
    	cout << "Kontoführungsgebühr: " << Kontoführungsgebühr << "\n";
    	cout << "Das macht einen Gesamtbetrag von " << Auszahlungen_gesamt << "\n";
    
    	double Kontostand_zum_Jahresende = Kontostand + Einzahlungen_gesamt - Auszahlungen_gesamt;
    	cout << Kontostand << " + " << Einzahlungen_gesamt << " - " << Auszahlungen_gesamt << " ergibt " << Kontostand_zum_Jahresende << "\n";
    
    	if (Kontostand_zum_Jahresende<10000)
    	{
    		cout << "Bei einem Vermögen von " << Kontostand_zum_Jahresende << " gibt es einen Zins von 1.25% \n";
    
    		double Zins = Kontostand_zum_Jahresende * 0.0125;
    
    		cout << "Das macht einen Betrag von " << Zins << " aus!\n";
    
    		double Kontostand_neu = Kontostand_zum_Jahresende + Zins;
    
    		cout << "Das Gesamtvermögen ist somit " << Kontostand_neu << "\n";
    	}
    	if ((Kontostand>10000)&&(Kontostand<1000000))
    	{
    		cout << "Bei einem Vermögen von " << Kontostand_zum_Jahresende << " gibt es einen Zins von 2.50% \n";
    
    		double Zins = Kontostand_zum_Jahresende * 0.025;
    
    		cout << "Das macht einen Betrag von " << Zins << " aus!\n";
    
    		double Kontostand_neu = Kontostand_zum_Jahresende + Zins;
    
    		cout << "Das Gesamtvermögen ist somit " << Kontostand_neu << "\n";
    	}
    	if(Kontostand>1000000)
    	{
    		cout << "Bei einem Vermögen von " << Kontostand_zum_Jahresende << " gibt es einen Zins von 5.00% \n";
    
    		double Zins = Kontostand_zum_Jahresende * 0.05;
    
    		cout << "Das macht einen Betrag von " << Zins << " aus!\n";
    
    		double Kontostand_neu = Kontostand_zum_Jahresende + Zins;
    
    		cout << "Das Gesamtvermögen ist somit " << Kontostand_neu << "\n";
    	}
    
    	return 0;
    }
    

    Wenn ich die Variablen Mieteinnahmen , Vermögenswirksame_Leistungen , Bareinzahlungen und Dividenden_aus_Aktienpakete in den Zeilen 253 bis 256 mit 0.0 vorinitialisiere, dann wird zumindest bei mir in der Ausgabe bei den Variablen auch 0 angezeigt. Wenn ich die Variablen nicht vorinitialisiere, dann kommt ein Run time Error.

    Wo liegt mein Denkfehler?

    Für die Antworten bedanke ich mich im Voraus.

    Gruß

    Max



  • Du bist doch schon was länger hier im Forum unterwegs, dann solltest du nämlich wissen, dass man Quelltext aufs Wesentliche kürzen sollte !!!

    @
    Ohne deinen Code angeschaut zu haben: Meldet dir deine IDE vllt sowas wie nicht initialisierte Variable verwendet.. bla bla wollen sie das wirklich? oder ist das ein richtiger Error?



  • Skym0sh0 schrieb:

    Du bist doch schon was länger hier im Forum unterwegs, dann solltest du nämlich wissen, dass man Quelltext aufs Wesentliche kürzen sollte !!!

    Sry, dachte mir halt, dass man dann vielleicht das Programm besser nachvollziehen kann.

    Skym0sh0 schrieb:

    @
    Ohne deinen Code angeschaut zu haben: Meldet dir deine IDE vllt sowas wie nicht initialisierte Variable verwendet.. bla bla wollen sie das wirklich? oder ist das ein richtiger Error?

    Mein Compiler haut halt Warnings raus, dass die Variablen nicht initialisiert sind.

    Edit:

    Wenn ich aber die Variablen mit 0.0 vorinitialisiere, dann wird mir in der Ausgabe auch 0 angezeigt...



  • 0+0+0+0=0
    Ich frag mich wo du ein Problem hast...



  • gnihihi schrieb:

    0+0+0+0=0
    Ich frag mich wo du ein Problem hast...

    Ich möchte ja die Werte per Tastatur einlesen und nicht per konstanten Wert im Quellcode einlesen....



  • Dann frag sie auch zuerst ab bevor du sie zusammenaddierst
    Oder versteh ich dein Problem nicht?



  • gnihihi schrieb:

    Dann frag sie auch zuerst ab bevor du sie zusammenaddierst
    Oder versteh ich dein Problem nicht?

    Wie meinst Du das mit abfragen?

    Kannst Du es vielleicht per Beispiel zeigen?

    Edit:

    Ich frage sie ja eigentlich schon ab...

    Schaue in den Zeilen 213 bis 248



  • Du erstellst 4 Variablen weist ihnen den Wert0 zu und addierst das ganze
    Bin Grad Net an meinem Rechner kann kein Beispiel machen

    Ps: Tastatur Grad unter allersau



  • class Auszahlungen:public Stand
    

    Auszahlungen erbt von Stand. Meinst du Kontostand?
    Wenn ja, was hat Auszahlungen damit zu tun?
    Irgendwie verstehe ich nicht, was du dir dabei gedacht hast...



  • Nathan schrieb:

    class Auszahlungen:public Stand
    

    Auszahlungen erbt von Stand. Meinst du Kontostand?

    Ja meinte ich...

    Nathan schrieb:

    Wenn ja, was hat Auszahlungen damit zu tun?
    Irgendwie verstehe ich nicht, was du dir dabei gedacht hast...

    Ich wollte, dass es den Kontostand, den ich per Tastatur eingelesen habe, erbt...



  • Äh, moment: Gehst du davon aus, dass sich alles auf das gleiche Objekt bezieht?!
    Sprich, wenn du ein Kontostand Objekt bearbeitest, dass dann alle, die davon geerbt haben, davon wissen?



  • soh, endlich an meinem heißgeliebten Rechner.

    case 1:
                        {
                            cout << "Wie hoch waren die Mieteinnahmen?\n";
                            double Mieteinnahmen;
                            cin  >> Mieteinnahmen;
                        }
    

    Was stellst du dir da vor?
    Ich glaube du machst nen großen Denkfehler.

    In der Bedingung erstellst du ne Variable vom Typ double, namens "Mieteinnahmen" wo du deinen heißgeliebten Wert eingibst (das gleiche gilt auch für die anderen Bedingungen). Was du hierzu wissen musst, ist, sobald der Block ( {} ) verlassen wird, ist deine angelegte Variable außerhalb seines Gültigkeitsbereich und somit kannst du nicht mehr darauf zugreifen.

    Ein paar Zeilen drunter erstellst du nochmal die Variable "Mieteinnahmen" (und drei weitere Variablen) die du auf 0.0 initialisierst und diese Variablen dann zusammenaddierst. Und nun nochmal: Was stellst du dir dabei vor? Glaubst du etwa, dass er wieder den alten (von vorhin eingegebenen Wert) enthält? Wenn du das wirklich denkst, dann tu dir ernsthaft selbst einen Gefallen, und lerne die Grundlagen nochmal vernünftig durch 🙂
    Wenn du willst, dass deine Variablen den eingegebenen Wert enthalten gehst du folgendermaßen vor:

    int main()
    {
    ....
    
     /*** knalle die variablen erstmals in den korrekten gültigkeitsbereich....***/
        double Mieteinnahmen=0.0;
        double Vermögenswirksamen_Leistungen=0.0;
        double Bareinzahlungen=0.0;
        double Dividenden_aus_Aktienpakete=0.0;
    
            if ("Ja")
            {
                ...
                switch(number)
                {
                    case 1:
                        {
                            cout << "Wie hoch waren die Mieteinnahmen?\n";
                            // double Mieteinnahmen;             <======== das hier lässt du komplett weg. die variablen wurden ja schließlich oben schon erstellt.
                            cin  >> Mieteinnahmen;               // <===== hier verpasst du deiner variable nun den heißgeliebten wert.
                        }
    
    ...
    /*** zum platzsparen hab ich die anderen bedingungen mal weggelassen, es ist aber das gleiche prinzip ***/
                }
    
            }
    ...
    
        /*** _NUN_ kannst du die eingegebenen werte zusammenaddieren ***/
    
        double Einzahlungen_gesamt = Mieteinnahmen + Vermögenswirksamen_Leistungen + Bareinzahlungen + Dividenden_aus_Aktienpakete;
    
    ....
     /*** und hier gehts dann weiter... ***/
        return 0;
    }
    

    Und noch ne kleine Abschweifung vom Thema: Deine main-Funktion (ich hab jetzt nur die main überflogen) ist eine Code-Suppe. Zur Verbesserung geb ich dir ein Stichwort mit auf den Weg: Funktionen. Vernachlässige sie nicht.

    have a nice day.
    ich bin müd.

    Gute Nacht! *mit Küsschen um sich werf*



  • gnihihihihi schrieb:

    have a nice day.
    ich bin müd.

    Um 03:10 Uhr nachts an einem Sonntag?



  • gnuhuhuhu schrieb:

    gnihihihihi schrieb:

    have a nice day.
    ich bin müd.

    Um 03:10 Uhr nachts an einem Sonntag?

    Ich glaub wir sind Montag 😃
    Bin immer noch müd 😛



  • @gnihihihihi:

    Wenn ich das so mache, wie Du vorgeschlagen hast, dann bekomme ich einen Linkerfehler...

    LINK: fatal error LNK1168: "...- Klasse Konto.exe" kann nicht zum Schreiben geöffnet werden.
    

    Gruß

    Max



  • Gehe mal in den Taskmgr und beende den Prozess deiner *.exe



  • Nathan schrieb:

    Gehe mal in den Taskmgr und beende den Prozess deiner *.exe

    Punkt 1:

    Warum denn??

    Punkt 2:

    Wie kommt man unter Windows 7 gleich wieder in den Taskmanger?



  • Weil der offenbar noch aktiv ist und dir Schreibrechte entzieht. Kenn ich.
    strg + alt + entf



  • Nathan schrieb:

    Weil der offenbar noch aktiv ist und dir Schreibrechte entzieht. Kenn ich.
    strg + alt + entf

    Direkt in den Task-Manager kommt man mit Strg+Shift+Esc 🙂



  • Strg + Shift + Esc 🙄 Herr Nathan ...


Log in to reply