Programm rechnet mit Werten und nicht mit Variablen



  • Hallo allerseits,

    ich bin relativ neu bei C++ und bin gerade dabei mein erstes C++-Programm zu schreiben. Dafür brauche ich eine Summenfunktion, wie sie in der Mathematik verwendet wird, mit unterer Grenze, oberer Grenze, dem Ausdruck der addiert wird und einen Index. Ich habe versucht die Funktion so zu lösen:

    #include <iostream>
    using namespace std;
    int i;
    float sum(float a,int n_0,int n)
    {
       i=n_0;
       float b=0;
       while (i<=n){
       	b=b+a;
       	i++;
       	cout<<b<<endl;
       }
       return b;
    }
    
    int main()
    {	
       float q=sum(i,0,10);
       cout<< q << endl;
    
       cin.get();
    }
    

    Das Problem ist, dass das Programm hier für a den Wert nimmt, den i zum Zeitpunkt der Abfrage hat und a sich nicht mit i mitverändert. Es soll in dem Fall also die Summe von 1+2+3+4+... +n berechnet werden. Es funktioniert, wenn ich in der sum-Funktion schreibe, dass a=i, aber dann kann ich damit nur 1+2+3+...n berechnen und die Funktion nicht für andere Ausdrücke wie zum Beispiel i^2 verwenden. Am Ende sollte das Programm die Summe aus allen Ausdrücken berechnen können, die von irgendwie von i abhängig sind.

    Falls es Fragen zum Problem gibt, kann ich es gerne weiter ausführen.

    LG


  • Mod

    Ja, so ist das halt. Das sind die Regeln der Sprache, dass alles komplett ausgerechnet wird, wenn die Ausführung an dem entsprechenden Punkt ist. Ist bei den meisten Programmiersprachen so. Du denkst an ein Computeralgebrasystem zur Manipulation von formellen Ausdrücken. Du wirst dein Programm umschreiben müssen, so dass es mit diesem Konzept zurecht kommt. Vielleicht möchtest du, dass deine Summenfunktion eine andere Funktion aufruft (die du ihr übergeben kannst)?

    Und lass unbedingt globale Variablen sein! Die sind absolutes Gift für jede Wartbarkeit und fast immer (auch hier) komplett unnötig. Die Summenfunktion hängt ab von dem was summiert werden soll und den Grenzen, nicht von irgendwelchen externen Faktoren. Ist in der Mathematik schließlich auch so.



  • Danke für die schnelle Antwort. Ich werde das einmal probieren. Zu den globalen Variablen: Die hab ich eingefügt, als ich den Fehler gesucht hab und dann nicht mehr geändert. Aber danke für die Info, ich werde sie wieder entfernen.

    Edit: Kennst du vielleicht eine Sprache, die besser für meine Zwecke geeignet ist?

    LG



  • Wie @SeppJ schon sagte: du kannst auch Funktionen übergeben.

    Zum Beispiel so (ich habe jetzt mal alle Funktionen von double->double gemacht):

    #include <iostream>
    
    double sum(double (*fn)(double), int n_0, int n) {
        // hier wurde mit "fn" eine Funktion von double -> double übergeben, die dann an den 
        // Stellen n_0 bis n evaluiert und aufaddiert wird
        double result = 0;
        for (int i = n_0; i <= n; ++i) {
            result += fn(i);
        }
        return result;
    }
    
    double identity(double x) {
        return x;
    }
    
    double half(double x) {
        return x / 2.0;
    }
    
    int main() {
        // Du kannst die Funktionen inline als Lambda definieren...
        auto summe_von_1_bis_10_lambda = sum([](double x) { return x; }, 0, 10);
        // ...oder direkt eine benannte Funktion übergeben
        auto summe_von_1_bis_10_func = sum(identity, 0, 10);
    
        auto summe_quadrate = sum([](double x) { return x * x; }, 0, 10);
        auto summe_halbe = sum(half, 0, 10);
    
        std::cout << summe_von_1_bis_10_lambda << '\n';
        std::cout << summe_von_1_bis_10_func << '\n';
        std::cout << summe_quadrate << '\n';
        std::cout << summe_halbe << '\n';
    
        std::cin.get();
    }
    

    Wenn du z.B. <cmath> includest, könntest du auch sum(sin, 0, 5) berechnen. Das wäre dann x=05sinx\sum_{x=0}^{5} \sin x und recht sinnlos, aber möglich...


  • Mod

    https://en.wikipedia.org/wiki/List_of_computer_algebra_systems

    Für die Summe(n) von n=i bis n=j ist das aber natürlich total übertrieben.

    Ein bisschen exotischer:
    https://en.wikipedia.org/wiki/Functional_programming



  • Ok, danke für alle Antworten. Ihr habt mir auf jeden Fall viel weitergeholfen.

    LG


Log in to reply