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



  • 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 ...



  • Tschuldigung, hab Windows xp.

    Und auf dem Windows 7 Rechner mache ich Rechtsklick auf Taskleiste.



  • Nathan schrieb:

    Tschuldigung, hab Windows xp.

    Und auf dem Windows 7 Rechner mache ich Rechtsklick auf Taskleiste.

    Brauchst Dich doch nicht entschuldigen ... bei mir hat es geklappt.

    Ich habe alles, was mit meinem Compiler zu tun gehabt hat, beendet.

    Nun meckert mein Compiler an einer neuen Stelle rum:

    Nämlich mosert er an, dass Einzahlungen_gesamt nicht initialisiert ist, obwohl ich es ausgebessert habe...

    Edit:

    Außerdem überspringt mein Compiler die Eingabeoption Dividenden aus Aktienpaketen

    Edit²:

    Ich werde später den Code, um den es mir geht, posten. Nur muss ich jetzt was erledigen, das wahrscheinlich bis 18 Uhr dauert. Also bis später.



  • Nachdem Du bis 18 Uhr Dein Ding erledigt hast, erledige zuerst noch folgendes:

    Wenn dein Compiler Dir vorwirft, dass du deine Variable nicht initialisiert hast, dann ist das auch so. Und wenn du auf die Warnung doppelklicken würdest, zeigt der Dir auch direkt die Stelle im Code.
    Also was tun? Die Variable mit Standardwert füllen.

    Das mit den übersprungenen Eingaben kuck ich mir jetzt direkt mal an.
    *zurückblätter*



  • In Zeile 174 benutzt du getline() und für den Rest std::cin.
    Buffer leeren.

    Genaueres dazu kann Dir jemand anderes sagen, ich kenn mich mit IO nicht so doll aus. Auf jeden Fall wenn du std::cin/getline()/std::cin.get() und den ganzen Mist mischst, weiß ich aus Erfahrung, dass Du den Buffer leeren solltest.

    Folgendes hab ich z.b. grad getestet:

    int main(){
        std::string str;
        getline(std::cin, str);
        std::cin >> str;
        getline(std::cin, str);
        std::cin >> str;
        getline(std::cin, str);
        std::cin >> str;
    
        return 0;
    }
    

    Resultat waren bloß 4 Eingaben, keine 6 - warum genau muss Dir wie gesagt ein anderer verraten.

    Auf jeden Fall Buffer löschen machste mit std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');

    Have a nice day.
    *mit Küsschen um sich werf*



  • Hallo liebe Gemeinde.
    Ich habe mir einmal ein paar Gedanken gemacht, wie ich den Code ein bisschen verbessern könnte.
    Dabei habe ich mir gedacht, dass ich – wie es von einigen hier im Thread vorgeschlagen – ein paar Funktionen schreibe. Bloß bin ich mir bzgl. den Rückgabewerten unsicher…
    Also hier einmal meine Vorschläge bzw. Gedanken:
    Folgenden Code würde ich in eine Funktion namens Einzahlungen schreiben:

    string Antwort;
    		cout << "Gab es im vergangenen Jahr Einzahlungen?\n";
    		cin  >> Antwort;
    		if (Antwort=="Ja")
    		{
    
    			int number = 9;
    			cout << "Welche Art von Einzahlungen gab es im vergangenen Jahr?\n";
    			cout << "(1) Mieteinnahmen\n";
    			cout << "(2) Vermoegenswirksame Leistungen\n";
    			cout << "(3) Bareinzahlungen\n";
    			cout << "(0) Exit\n";
    			cin  >> number;
    			switch(number)
    			{
    				case 1:
    
    						cout << "Wie hoch waren die Mieteinnahmen?\n";
    						cin  >> Mieteinnahmen;
    
    				case 2:
    
    						cout << "Wie hoch waren die Vermögenswirksamen Leistungen?\n";
    						cin  >> Vermögenswirksamen_Leistungen;
    
    				case 3:
    
    						cout << "Wie hoch waren die Bareinzahlungen?\n";
    						cin  >> Bareinzahlungen;
    						break;
    
    				case 0:
    
    						cout << "Exit!";
    						break;
    
    			}
    
    			Einzahlungen_gesamt = Einzahlungen_gesamt = Mieteinnahmen + Vermögenswirksamen_Leistungen + Bareinzahlungen;
    
    		}
    		else 
    			{
    				cout << "Im vergangenenen Jahr gab es keine Einnahmen!\n";
    			}
    

    Bloß bin ich mir hier unsicher, welche Übergabeparameter und welchen Rückgabewert ich hier verwenden soll bzw. muss. Weil ich muss ja einerseits Einzahlungen_gesamt und andererseits Antwort zurückgeben.

    Folgenden Code würde ich nun in die Funktion namens Auszahlung schreiben:

    if(Antwort_2=="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";
    				cin  >> Kredittilgung;
    
    				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";
    				cin  >> Barauszahlungen;
    			}
    		case 3:
    			{
    				cout << "Wie hoch ist die Kontofuehrungsgebuehr?\n";
    				cin  >> Kontoführungsgebühr;
    			}
    		case 0:
    			{
    				cout << "Exit!\n";
    				break;
    			}
    		}
    	}
    	else
    		cout << "Es gibt keine Auszahlungen!\n";
    

    Hier würde ich sowohl als Übergabeparameter als auch Rückgabewert als string annehmen, da ich ja nach der Antwort_2 suche.

    Folgenden Code würde ich in eine Funktion namens Kontostand_1 schreiben:

    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";
    	}
    

    Sowohl als Übergabeparameter als auch Rückgabewert würde ich als double annehmen.
    Folgenden Code würde ich in eine Funktion namens Kontostand_2 schreiben:

    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";
    	}
    

    Sowohl als Übergabeparameter als auch Rückgabewert würde ich als double annehmen.

    Folgenden Code würde ich in eine Funktion namens Kontostand_3 schreiben:

    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";
    	}
    

    Sowohl als Übergabeparameter als auch Rückgabewert würde ich als double annehmen.

    Hättet ihr vielleicht Tipps, Ratschläge und/oder Verbesserungsvorschläge?

    Für die Antworten bedanke ich mich im Voraus.

    Gruß

    Max



  • Trenne die Ein-/Ausgabe von der Mathematik!
    Deine Funktionen bräuchten so keinen Rückgabewert, da ja das wichtige auf dem Bildschirm ankommt.
    Richtung in Funktionen aufgeteilt sähe das so aus:

    // Einlesen der Optionen
    auto result = calc_zins(gesamteinnahmenoderwasauchimmerduhierbrauchst);
    // Verarbeiten
    


  • switch(number)
                {
                    case 1:
                       
                            cout << "Wie hoch waren die Mieteinnahmen?\n";
                            cin  >> Mieteinnahmen;
                       
                       
                    case 2:
                       
                            cout << "Wie hoch waren die Vermögenswirksamen Leistungen?\n";
                            cin  >> Vermögenswirksamen_Leistungen;
                       
                    case 3:
                       
                            cout << "Wie hoch waren die Bareinzahlungen?\n";
                            cin  >> Bareinzahlungen;
                            break;
                       
                    case 0:
                       
                            cout << "Exit!";
                            break;
                       
                }
    

    silent_max: Hiermit wirst Du ein paar Probleme haben. Nur ein einziges break ist an der richtigen Stelle. break verwendest Du, um das switch -Statement zu verlassen und wenn Du es weglässt, wird der nächste case -Block ausgeführt. Beim letzten case -Block (oder default ) brauchst Du es jedoch nicht, weil Du da sowieso am Ende des switch -Statements gelandet bist.


Anmelden zum Antworten