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



  • 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