Logischer Fehler im Code / Funktionen



  • Hallo,

    mein Visual Studio zeigt hier keinen Fehler mehr an, also muss es sich lediglich um einen logischen Fehler handeln. Leider sehe ich das nicht und komme deshalb nicht weiter:

    ]#include <iostream>
    using namespace std;
    
    double zinsen_berechnen(double zinssatz, double kapital);
    double zinsatz_berechnen(double kapital, double zinsen);
    double kapital_berechnen(double zinsen, double zinssatz);
    int auswahl_eingeben();
    
    int main()
    {	
    	int eingabe = auswahl_eingeben();
    	switch(eingabe)
    	{
    		case 1: double zinsen_berechnen(double zinssatz, double kapital); break;
    		case 2: double zinsatz_berechnen(double kapital, double zinsen); break; 
    		case 3: double kapital_berechnen(double zinsen, double zinssatz); break;
    	}
    return 0;
    }
    
    int auswahl_eingeben()
    {
    	int eingabe; 
    	cout<<"1 Zinsen berechnen "<<endl;
    	cout<<"2 Zinssatz berechnen "<<endl;
    	cout<<"3 Kapital berechnen "<<endl;
    	cout<<"4 Ende "<<endl;
    
    	cout<<"Ihre Auswahl: ";
    	cin>>eingabe;
    	return eingabe;
    
    }
    double zinsen_berechnen(double zinssatz, double kapital)
    {
    	cout<<"Bitte geben Sie das gewünschte Kapital ein: ";
    	cin>>kapital;
    	cout<<"Bitte geben Sie den Zinssatz an: ";
    	cin>>zinssatz;
    
    	double zinsen = (kapital*zinssatz)/100;
    	cout<<"Sie erhalten "<<zinsen<<" EUR"; 
    
    	return zinsen; 
    }
    
    double zinsatz_berechnen(double kapital, double zinsen)
    {
    	cout<<"Bitte geben Sie das Kapital: ";
    	cin>>kapital;
    	cout<<"Bitte Zinsen eingeben: ";
    	cin>>zinsen;
    
    	double zinssatz = (zinsen*100)/kapital;
    
    	return zinssatz;
    }
    double kapital_berechnen(double zinsen, double zinssatz)
    {
    	cout<<"Bitte geben Sie die Zinsen ein: ";
    	cin>>zinsen;
    
    	cout<<"Bitte geben Sie den Zinssatz ein: ";
    	cin>>zinssatz;
    
    	double kapital = (zinsen*100)/zinssatz;
    
    	cout<<"Das Kapital beträgt: "<<kapital<<" EUR"<<endl; 
    
    	return kapital;
    }
    

    Ich denke, das ganze liegt wahrscheinlich an den Argumenten für die Funktionen:

    int main()
    {	
    	int eingabe = auswahl_eingeben();
    	switch(eingabe)
    	{
    		case 1: double zinsen_berechnen(double zinssatz, double kapital); break;
    		case 2: double zinsatz_berechnen(double kapital, double zinsen); break; 
    		case 3: double kapital_berechnen(double zinsen, double zinssatz); break;
    	}
    return 0;
    }
    

    Wäre toll, wenn Ihr mir sagen könnt, was ich da falsch gemacht habe..

    Gruß



  • Kommentare im Quelltext

    #include <iostream>
    using namespace std;
    
    double zinsen_berechnen(double zinssatz, double kapital);
    double zinsatz_berechnen(double kapital, double zinsen);
    double kapital_berechnen(double zinsen, double zinssatz);
    int auswahl_eingeben();
    
    int main()
    {   
        int eingabe = auswahl_eingeben();
        switch(eingabe)
        {
            case 1: double zinsen_berechnen(double zinssatz, double kapital); break;  // warum hier double zinsen?
            case 2: double zinsatz_berechnen(double kapital, double zinsen); break;
            case 3: double kapital_berechnen(double zinsen, double zinssatz); break;
            // ergänze hier noch etwas 
        }
    return 0;
    }
    
    int auswahl_eingeben()
    {
        int eingabe;  // praktisch machbar - übersichtlicher, wenn du statt eingabe ...
        cout<<"1 Zinsen berechnen "<<endl;
        cout<<"2 Zinssatz berechnen "<<endl;
        cout<<"3 Kapital berechnen "<<endl;
        cout<<"4 Ende "<<endl;
    
        cout<<"Ihre Auswahl: ";
        cin>>eingabe;
        return eingabe;
    
    }
    double zinsen_berechnen(double zinssatz, double kapital)  // du übergibst hier weder Zinssatz noch Kapital
    {
        cout<<"Bitte geben Sie das gewünschte Kapital ein: ";  
        cin>>kapital;  // Und, wenn du es übergeben hättest, warum überschreiben ?
        cout<<"Bitte geben Sie den Zinssatz an: ";
        cin>>zinssatz;
    
        double zinsen = (kapital*zinssatz)/100;
        cout<<"Sie erhalten "<<zinsen<<" EUR";
    
        return zinsen;  // Warum die Rückgabe? Ist die Aufgabe noch umfangreicher - also benötigst du da noch den wert?
    }
    

    Es kann sein das das aufwendiger werden soll - aber nur um das Gezeigte zu lösen wähle möglichst eine einfache Lösung.

    MfG f.-th.



  • In dem switch-Statement, wo du Probleme hast, stehen keine Funktionsaufrufe, sondern lediglich (lokale) Funktions-Deklarationen. Beim Aufruf mußt/darfst du die Datentypen nicht mit angeben.

    PS: Und wenn du dabei bist, dich über Funktionsaufrufe zu informieren, schau dir auch an, was Parameter machen.



  • so, erstmal danke für die Feedbacks.

    #include <iostream> 
    using namespace std; 
    
    double zinsen_berechnen(double zinssatz, double kapital); 
    double zinsatz_berechnen(double kapital, double zinsen); 
    double kapital_berechnen(double zinsen, double zinssatz); 
    int auswahl_eingeben(); 
    
    int main() 
    {   
        int eingabe = auswahl_eingeben(); 
        switch(eingabe) 
        { 
            case 1: double zinsen_berechnen(double zinssatz, double kapital); break;  // warum hier double zinsen?   - da der Benutzer doch etwa, 
    1000,40 € Kapital, und 0.40 Zinssatz eingeben kann. Und da ist
    der Double Typ besser als der Integer.
    
            case 2: double zinsatz_berechnen(double kapital, double zinsen); break; 
            case 3: double kapital_berechnen(double zinsen, double zinssatz); break; 
            // ergänze hier noch etwas - so etwas wie default ?
        } 
    return 0; 
    } 
    
    int auswahl_eingeben() 
    { 
        int eingabe;  // praktisch machbar - übersichtlicher, wenn du statt eingabe 
    ...   - was eingibst ?  - ich kann es auch mit einer if anweisung schreiben, 
    wenn's einfacher dadurch wird. 
    
        cout<<"1 Zinsen berechnen "<<endl; 
        cout<<"2 Zinssatz berechnen "<<endl; 
        cout<<"3 Kapital berechnen "<<endl; 
        cout<<"4 Ende "<<endl; 
    
        cout<<"Ihre Auswahl: "; 
        cin>>eingabe; 
        return eingabe; 
    
    } 
    double zinsen_berechnen(double zinssatz, double kapital)  // du übergibst hier weder Zinssatz noch Kapital   - warum nicht?  -die Werte werden doch unten eingegeben.. ?!
    { 
        cout<<"Bitte geben Sie das gewünschte Kapital ein: ";   
        cin>>kapital;  // Und, wenn du es übergeben hättest, warum überschreiben ? 
        cout<<"Bitte geben Sie den Zinssatz an: "; 
        cin>>zinssatz; 
    
        double zinsen = (kapital*zinssatz)/100; 
        cout<<"Sie erhalten "<<zinsen<<" EUR"; 
    
        return zinsen;  // Warum die Rückgabe? Ist die Aufgabe noch umfangreicher 
    - 
    also benötigst du da noch den wert?   -
    eigentlich nicht, soll bloß ein kleines Programm werden. 
    Danke für den Hinweis   :) 
    }
    

    Sorry, wenn ich euch damit nerve 😃



  • Wir haben dich beide darauf hingewiesen.
    Beratungsresistent? 😃

    #include <iostream>
    using namespace std;
    
    double zinsen_berechnen(double kapital, double zinssatz);
    double zinsatz_berechnen(double kapital, double zinsen);
    double kapital_berechnen(double zinsen, double zinssatz);
    int auswahl_eingeben();
    
    int main()
    {
        int eingabe = auswahl_eingeben();
        cout << "eingabe fertig";
        switch(eingabe)
        {
            case 1: zinsen_berechnen(1000, 0.4); 
    	    break;
            case 2: double zinsatz_berechnen(double kapital, double zinsen); 
    	    break;
            case 3: double kapital_berechnen(double zinsen, double zinssatz); 
    	    break;
            default: ;
        }
    return 0;
    }
    
    int auswahl_eingeben()
    {
        int wahl;
        cout<<"1 Zinsen berechnen "<<endl;
        cout<<"2 Zinssatz berechnen "<<endl;
        cout<<"3 Kapital berechnen "<<endl;
        cout<<"4 Ende "<<endl;
    
        cout<<"Ihre Auswahl: ";
        cin>>wahl;
        return wahl;
    
    }
    double zinsen_berechnen(double kapit, double zinss)
    {
        cout<<"Bitte geben Sie das gewünschte Kapital ein: "; // du  überschreibst hier die Eingabe !!
        cin>>kapit;
        cout<<"Bitte geben Sie den Zinssatz an: ";  // hier auch
        cin>>zinss;
    
        double zinsen = (kapit*zinss)/100;
        cout<<"Sie erhalten "<<zinsen<<" EUR";
    
        return zinsen;
    }
    

    MfG f.-th.



  • Zeile 18 und 20 sollten auch noch entsprechend geändert werden.



  • super, funktioniert. Vielen Dank für die Hilfe 🙂

    nochmal zum allgemeinen verständnis:

    die oben genannten werte:
    [cpp]

    int eingabe = auswahl_eingeben();

    switch(eingabe)
    {
    case 1: zinsen_berechnen(1000, 0.4);
    break;
    case 2: zinssatz_berechnen(1000, 0.4);
    break;
    case 3: kapital_berechnen(1000, 0.4);
    break;
    }

    [/cpp]

    können x-beliebige sein, da der Wert ja unten bei der Abfrage ja wieder überschrieben wird ?

    gruß



  • So ist es.
    Aber soll das so sein? Das ist meist nicht der gesuchte Weg.

    Teste mal:

    double zinsen_berechnen(double kapit, double zinss)
    {
        double zinsen = (kapit*zinss)/100;
        cout<<"Sie erhalten "<<zinsen<<" EUR";
    
        return zinsen;
    }
    

    MfG f.-th.



  • "Das ist meist nicht der gesuchte Weg" ?! - es funktioniert doch.. 😃

    Wenn ich den Code (implementiere ?!) rechnet er gleich alles aus, ohne mich zu fragen. (in diesen Fall nimmt er die Daten von der Switch anweisung her..(

    switch(eingabe) 
        { 
            case 1: zinsen_berechnen(1000, 0.4); 
            break; 
            case 2: zinssatz_berechnen(1000, 0.4); 
            break; 
            case 3: kapital_berechnen(1000, 0.4); 
            break;
    


  • Dann solltest du dir die Frage stellen, wieso du den Funktionen überhaupt Parameter übergibst, wenn du diese dann doch nicht verwenden willst. Entweder du schreibst eine zentrale Funktion, um die Werte einzugeben und übergibst deren Rückgaben an die Rechen-Funktionen oder du verwendest lokale Variablen.



  • Es kommt immer auf die Zusammenhänge an 😉

    Dann teste mal so was:

    #include <iostream>
    using namespace std;
    
    double zinsen_berechnen();
    double zinsatz_berechnen(double kapital, double zinsen);
    double kapital_berechnen(double zinsen, double zinssatz);
    int auswahl_eingeben();
    
    int main()
    {
        int eingabe = auswahl_eingeben();
    
        switch(eingabe)
        {
            case 1: cout << "Sie erhalten " << zinsen_berechnen() << " EUR" << " Zinsen" << endl; 
    	    break;
            case 2: double zinsatz_berechnen(double kapital, double zinsen); 
    	    break;
            case 3: double kapital_berechnen(double zinsen, double zinssatz); 
    	    break;
            default: ;
        }
    return 0;
    }
    
    int auswahl_eingeben()
    {
        int wahl;
        cout<<"1 Zinsen berechnen "<<endl;
        cout<<"2 Zinssatz berechnen "<<endl;
        cout<<"3 Kapital berechnen "<<endl;
        cout<<"4 Ende "<<endl;
    
        cout<<"Ihre Auswahl: ";
        cin>>wahl;
        return wahl;
    
    }
    double zinsen_berechnen()
    {
    	double kapit;
    	double zinss;
        cout<<"Bitte geben Sie das gewünschte Kapital ein: ";hier die Eingabe !!
        cin>>kapit;
        cout<<"Bitte geben Sie den Zinssatz an: ";
        cin>>zinss;
    
        double zinsen = (kapit*zinss)/100;
    
        return zinsen;
    }
    

    Da geht noch einiges eleganter 😃

    MfG f.-th.



  • Das Missgeschick meinerseits solltest du in den Griff kriegen.

    MfG f.-th.


Log in to reply