Summe rekursiv bestimmen



  • Hallo, ich will in diesem Thread die Summe rekursiv in einer Funktion bestimmen.
    Leider fehlt mit hier der Ansatz.

    case '+':
                       int MatrikelStudent;
                       int Anzahl;
                       cout<<"Bitte geben Sie die Anzahl der Studenten ein"<<endl;
                       cin>>Anzahl;
                       for (int i=0; i<Anzahl; i++)
                       {
                       cout<<"Bitte Matrikelnummer eingeben"<<endl;
                       cin>>ErgebnisMatrikelnummer;
                       cout<<"Bitte geben Sie die Punktezahl ein"<<endl;
                       cin>>ErgebnisPunktzahl;
                       summand=hinzufuegen(ErgebnisMatrikelnummer, ErgebnisPunktzahl);
                       }
                       cout<<summand;
    
    int hinzufuegen(int ErgebnisMatrikelnummer, int ErgebnisPunktzahl)
             {   
                 int summe;
                 summe=summe+ErgebnisPunktzahl;
                 return summe;
             }
    

    Über eure Hilfe wäre ich dankbar. 🙂



  • Und die Frage ist?


  • Mod

    1. Häh?
    2. Was?
    Nach Klärung dieser Fragen:
    3. Warum?
    Und meinst du vielleicht einfach in Zeile 12

    summand += ErgebnisPunktzahl;
    

    ?



  • ja ich meine summand+=ErgebnisPunktzahl;

    Aber ich will eine Funktion schreiben der dieser die ErgebnisPunktzahl übergibt.
    Die Punktzahl speichert. Die Funktion wieder aufruft und die neue Punktzahl zur alten hinzu addiert.


  • Mod

    Reeko25 schrieb:

    Die Punktzahl speichert. Die Funktion wieder aufruft und die neue Punktzahl zur alten hinzu addiert.

    Du suchst keine Funktion, sondern ein Klassenobjekt, das einen Status speichern kann.

    class Punktespeicher
    {
      int gesamtpunkte = 0;
    public:
      void hinzufuegen(int punkte) { gesamtpunkte += punkte; }
      int abfragen() const { return gesamtpunkte; }
    };
    
    ...
    Punktespeicher gesamtpunkte;
    ...
    gesamtpunkte.hinzufuegen(ErgebnisPunktzahl);
    

    Aber die Bezeichner sind noch doof gewählt. Statt hinzufuegen, nennen wir die Funktion doch einfach clever per Operatorüberladung so wie den += Operator selbst, denn die Funktion verhält sich schließlich genau so wie ein +=. Also

    void operator+=(int punkte) { gesamtpunkte += punkte; }
    

    So kann man später gesamtpunkte += ErgebnisPunktzahl; schreiben. Schick, oder? Und auch das Abfragen der Punkte können wir schicker gestalten. Man will ja eigentlich immer die Punkte abfragen, wenn man das Objekt in einem Kontext benutzt, der eine Zahl erwartet. Wir können daher automatisch zu int konvertieren, indem wir aus der Abfragefunktion einen entsprechenden Konvertierungsoperator machen:

    operator int() const { return gesamtpunkte; }
    

    Weiterhin geht an keiner Stelle ein, dass das irgendwie Punkte sind, das ganze Objekt verhält sich eigentlich so wie eine Ganzzahl. Das sollte sich auch im Namen widerspiegeln:

    class Int
    {
      int gesamtpunkte = 0;
    public:
      void operator+=(int punkte) { gesamtpunkte += punkte; }
      operator int() const { return gesamtpunkte; }
    };
    

    Und nun erkennen wir, dass wir den Datentyp int nachprogrammiert haben, sparen und den ganzen Quatsch und nehmen stattdessen int, so wie es schon von Anfang an war.

    Oder wir stellen vernünftige Fragen. Das heißt mit Kontext und Motivation. Dann verstehen Leute auch was man möchte und Antworten nicht absichtlich mit mehreren langen Absätzen voller Quatsch, der zu nichts führt und die Sinnlosigkeit der schlecht gestellten Frage unterstreicht.



  • oder wir könnten deutsch lesen und würden verstehen das ich eine funktion will und nicht eine sinnlose Klasse und außedem kann man sich solche frechheiten sparen. Muss ja nicht jeder mit 10-20 Jahre programmier erfahrung im buckel hier ne frage stellen...



  • Dann noch viel Spass beim Programmieren ...



  • Reeko25 schrieb:

    oder wir könnten deutsch lesen und würden verstehen das ich eine funktion will und nicht eine sinnlose Klasse und außedem kann man sich solche frechheiten sparen. Muss ja nicht jeder mit 10-20 Jahre programmier erfahrung im buckel hier ne frage stellen...

    Mit einer solchen Antwort wirst du hier kaum noch Hilfe finden, aber ich versuchs trotzdem mal:

    unsigned int summand = 0;
    
    for (int i=0; i<Anzahl; i++)
    {
      cout<<"Bitte Matrikelnummer eingeben"<<endl;
      cin>>ErgebnisMatrikelnummer;
      cout<<"Bitte geben Sie die Punktezahl ein"<<endl;
      cin>>ErgebnisPunktzahl;
      summand += ErgebnisPunktzahl;
    }
    
    cout<<"Summe: " << summand;
    

    In Zukunft erhöhst du die Wahrscheinlichkeit auf gute Antworten ungemein, indem du
    * kompilierfähigen Code hier einstellst
    * dein Problem beschreibst (Warum willst du eine einfache Summe rekursiv berechnen? Warum soll es eine Funktion sein?)
    * höflich bleibst (SeppJ hat dir eine sehr gute Lösung für dein Problem gegeben - bzw. zumindest dafür, was er für dein Problem hält, dein Text lässt da ja viel Spielraum. Es gibt hier zwar ein paar Helden, die einem blutigen Anfänger gleich komplizierte Template-Metaprogrammierung vor die Füße werfen, aber das ist hier absolut nicht der Fall.)



  • Vielleicht sollte man sich erstmal anschauen was eine rekursive Funktion ist, davon habe ich bisher nichts gesehen. Eine rekursive Funktion ruft sich selber auf.

    Grobe Idee:

    #define COUNT 10;
    unsigned int numbers[COUNT];
    
    int sum (int index)
    {
      if (index == COUNT)
      {
         return 0;
      }
     else
      {
         return (numbers[index] + sum(index+1));
      }
    }
    
    int main ()
    {
      // Hier Nummern einlesen und ins Array an Stelle 0 bis COUNT-1 schreiben
    
      int summand = sum(0);
    
      cout<<"Summe: " << summand;
      return 0;
    }
    

    Geht natürlich eleganter als das Array.
    P.S. Statt einem 0-Element im Array hätte man natürlich auch einfach auf count prüfen können ...
    P.P.S mal umgebaut


Log in to reply