Programm bricht einfach so ab



  • Habe soeben ein C-Testprogramm geschrieben, mit dem man ausrechnen kann, wann man mit einem Kapital k einem Jahreszinssatz n einen bestimmten Betrag erreicht hat - der Code ist auch soweit fertig, aber immer, wenn ich die .exe ausführen will, kommt eine Fehlermeldung "Zinsberechnung.exe funktioniert nicht mehr".

    Der Quellcode ist folgender:

    /* Dieses Programm berechnet zu einem Anfangskapital
       und jährlichem Zinssatz, wie viele Jahre benötigt
       werden, damit das Kapital = Zielsumme ist */
    
    #include <stdio.h>
    
    float bitte_eingeben(char *);
    
    int main(void)
    {
    	int jahre_bis_zielsumme_erreicht = 0;
    
    	float kapital   = bitte_eingeben("das Kapital");
    	float zielsumme = bitte_eingeben("die Zielsumme");
    	float zinssatz  = bitte_eingeben("den Zinssatz in Prozent");
    
    	while (kapital <= zielsumme)
    	{
    		kapital += kapital * (1 / zinssatz); //Rechnet Prozente drauf
    		jahre_bis_zielsumme_erreicht++;
    	}
    
    	printf("\nEs wuerde %d Jahre dauern.", jahre_bis_zielsumme_erreicht);
    }
    
    float bitte_eingeben(char *was)
    {
    	float eingabe = 0;
    
    	if (was != "")
    	{
    		printf("\nBitte geben Sie %s ein: ", *was);
    		scanf("%f", &eingabe);
    	}
    
    	return eingabe;
    }
    

    Woran kann das liegen?

    PS: Bin für alle Verbesserungen offen 🙂



  • Dieses C++-Programm passt vielleicht als check-up dazu:

    #include <iostream>
    #include <cmath>
    
    using namespace std;
    
    int main()
    {
      double g, k, n, z;
    
      cout << "Grundkapital: ";  
      cin  >> g; 
    
      cout << "Zins (%): ";      
      cin  >> z; 
    
      cout << "Jahre: ";         
      cin  >> n;     
    
      k = g * pow( 1.0 + z/100.0, n );    
    
      cout << endl << "Ein Kapital von " << g << " Euro, angelegt zu " << z << " Prozent," 
           << endl << "ergibt nach einer Laufzeit von " << n << " Jahren" 
           << endl << "ein Endkapital von " << k << " Euro." 
           << endl;      
    }
    


  • /*Rechnet Prozente drauf*/
    

    anstelle C++-Kommentar!

    Ansonsten Pointer-Problem! So ist es lauffähig:

    printf("\nBitte geben Sie %s ein: ", was);
    

    Ergebnisse sind leicht falsch. Problem: Prozenteingabe beim Zins! Ich muss 1 für 100% eingeben.

    Bitte geben Sie das Kapital ein: 1000

    Bitte geben Sie die Zielsumme ein: 2000

    Bitte geben Sie den Zinssatz in Prozent ein: 1

    Es wuerde 2 Jahre dauern.

    Bei 100% habe ich das doch schon nach einem Jahr erreicht! Ergebnis 2 ist also falsch.



  • C-reator schrieb:

    float bitte_eingeben(char *was)
    {
    	float eingabe = 0;
    
    	// so kann man in C keine Strings vergleichen. Was du bräuchtest wäre strcmp(),
    	// aber was willst du hier eigentlich erreichen?
    	if (was != "")
    	{
    		// Die Variable "was" ist vom Typ char* und zeigt auf einen String.
    		// Durch das Sternchen davor dereferenzierst du den Zeiger, und erhälst ein
    		// einzelnes Zeichen, was aber natürlich dann nicht zu "%s" paßt. Gibt dir
    		// dein Compiler hierbei keine Warnung aus?
    		printf("\nBitte geben Sie %s ein: ", *was);
    		scanf("%f", &eingabe);
    	}
    	
    	return eingabe;
    }
    

    Davon mal abgesehen ist dein Programm natürlich in C geschrieben, und damit hier im falschen Forum...



  • @ Erhard Henkes:
    Er hat halt ins falsche Forum gepostet...

    @ C-reator:
    Hier muss das * weg, du willst schliesslich nicht einen einzelnen char , sondern einen C-String, also char* ausgeben.

    printf("\nBitte geben Sie %s ein: ", *was);
    


  • Er hat halt ins falsche Forum gepostet...

    C ist vollständig in C++ enthalten. 😉



  • Ah, dankeschön für die Hilfe, sorry, dass ich ins falsche Forum gepostet habe - ich dachte, ein C++-Programm wäre auch ein C-Programm ... da sich z.B. .cpp-Dateien ausführen lassen, obwohl in ihnen nur C-Code ist.

    Macht es dasher wirklich einen Unterschied, ob ich einen C++-Kommentar mache? Oder ist es schlecht, wenn man C und C++ mixt?

    Bei der if-Abfrage hätte ich natürlich

    if (*was != '\0')
    

    schreiben sollen; ich wollte damit erreichen, dass erst geprüft wird, ob man wirklich einen String übregeben hat, denn sonst könnte "Bitte geben Sie ein:" herauskommen.

    PS: Ich habe mich bei der Formel vertan, richtig wäre natürlich

    kapital += kapital * zinssatz / 100;
    

    .



  • C-reator schrieb:

    ich dachte, ein C++-Programm wäre auch ein C-Programm

    Umgekehrt. 😉

    C-reator schrieb:

    Macht es dasher wirklich einen Unterschied, ob ich einen C++-Kommentar mache? Oder ist es schlecht, wenn man C und C++ mixt?

    Nicht grundsätzlich schlecht, besonders bei Kommentaren nicht. Aber ich würde einheitlich bleiben.

    Wenn ich allerdings die Möglichkeit habe, C++ zu nutzen, würde ich das auch tun. Beispielsweise wäre dieser Fehler hier in C++ gar nicht aufgetreten, da std::cout im Gegensatz zu printf() typsicher ist.

    Und ist die Abfrage auf '\0' sinnvoll? Du übergibst ja kaum leere Stringliterale, erst recht nicht aus Versehen, oder?


Anmelden zum Antworten