Wie Funktion auslagern??



  • Ich weiß nicht, welchen Rückgabewert ich schreiben soll, da ich zwei Variablen(i und j in zwei for-Schleifen) und eine if-Anweisung habe, die mir "Der Median betraegt " ausgibt.

    Ich habe schon ausprobiert, mit void zu arbeiten, bloß dann wird der Median in der Ausgabe nicht ausgegeben. Wenn ich die Funktion außerhalb der Main mit double deklariere, muss ich aus i und j eine Variable machen.

    Oder habe ich einen Denkfehler??

    Gruß

    Max



  • silent_max schrieb:

    Ich weiß nicht, welchen Rückgabewert ich schreiben soll, da ich zwei Variablen(i und j in zwei for-Schleifen) und eine if-Anweisung habe, die mir "Der Median betraegt " ausgibt.

    Wenn du nur den Median berechnen willst, sollte dein Rückgabewert vom Typ "double" sein.

    Wenn du den Median dort auch gleich ausgeben willst, brauchst du keinen Rückgabewert.

    Und mit den Schleifen hat der Rückgabewert nun wirklich nichts zu tun.



  • Bloß was gebe ich zurück??

    i und j oder "Der Median betraegt "??

    Da happert es bei mir in meiner Denkweise...

    Edit:

    Halt Moment... i und j sind ja meine Zählvariablen... muss ich nicht Elemente_größer und Elemente_kleiner zurückgeben?? Die müssten ja dann auch in meiner Parameterliste sein oder nicht??



  • das kommt drauf an, wie du die Funktion verwenden willst. Sinnvoll wäre für mich

    double CalculateMedian(...)
    {
      double median = 0;
      // berechnung
      return median;
    }
    

    Dann wäre die Berechnung vernünftig gekapselt und du kannst mit dem Rückgabewert machen, was du willst. Ausgeben, speichern, für eine andere Berechnung verwenden...



  • silent_max schrieb:

    Bloß was gebe ich zurück??

    Schau mal nach, welche der Werte du nach der Schleife/Funktion noch brauchst...



  • Das wären die Variablen Elemente_größer und Elemente_kleiner würde ich jetzt sagen(siehe Code), bloß wie mache ich aus den beiden Variablen eine Variable??

    Gruß



  • Auweia!

    Vorschlag:

    #include <cassert>
    #include <cmath>
    #include <algorithm>
    #include <iostream>
    #include <utility>
    
    using std::vector;
    
    vector<double> einlesen()
    {
      :::
    }
    
    void ausgabe(vector<double> const& werte)
    {
      :::
    }
    
    double mittelwert(vector<double> const& werte)
    {
      :::
    }
    
    double standardabweichung(vector<double> const& werte)
    {
      :::
    }
    
    double median(vector<double> werte) // <-- pass-by-value ist Absicht
    {
      const auto size = werte.size();
      assert(size>0);
      const auto center = werte.begin() + size/2;
      std::nth_element(werte.begin(),center,werte.end());
      if (size%2==0) {
        const auto max_left_elem = std::max_element(werte.begin(),center);
        return 0.5 * (*max_left_elem + *center);
      } else {
        return *center;
      }
    }
    
    :::
    

    (ungetestet)

    So nebenbei: Lern doch mal anständig C++. Das kann man ja nicht mit ansehen, was du da so fabrizierst. Da fehlt ne ganze Menge an Grundlagen. Für sowas gibt's schlaue Bücher.



  • Sorry aber Deinen Code verstehe ich nicht ganz...



  • Und das wird wohl auch so bleiben, wenn du keine konkrete Fragen dazu stellst.

    Falls du dich auf die Funktion median beziehst: Die C++ Standardbibliothek bietet extrem praktische, auf Sequenzen arbeitende Algorithmen, die man benutzen kann, nachdem man den entsprechenden Header <algorithm> einbindet. Ein gescheites C++ Buch sollte dich u.a. darüber aufklären, dass es sowas gibt, was da alles bei ist und wie der Kram zu benutzen ist. Von einem guten C++ Buch erwarte ich, dass es relativ früh (und nicht erst ganz zum Schluss) die wichtigen Dinge der Standardbibliothek erklärt. Das sind u.a. Container, Iteratoren, Algorithmen und deren Zusammenhang. nth_element ist ein Algorithmus (bzw Funktions-Template). Was das Ding macht, kannst du hier nachlesen. Die median-Implementierung über nth_element hat nur einen amortisierten, zeitlichen Aufwand von O(n) wohingegen dein Verfahren mit den zwei verschachtelten Schleifen quadratischen Aufwand in der Elementzahl n hat, also O(n^2).



  • in meine IDE kopieren, es laufen lasssen. gucken was passiert, per debugger drüber schauen, was wie wo passiert.

    und nachschlagen was da genutzt wird



  • krümelkacker schrieb:

    Und das wird wohl auch so bleiben, wenn du keine konkrete Fragen dazu stellst.

    Hm ... Dann stelle ich mal eine Frage:

    Wie sinnvoll ist ist, Kandidat als Rückgabewert zu deklarieren?



  • > Wie sinnvoll ist ist, Kandidat als Rückgabewert zu deklarieren?

    Was man deklariert ist der Rückgabetyp. Und der ist hier double.

    Wenn du eine Funktion "median" nennst, dann soll sie wahrscheinlich den Median zurück geben, nehme ich mal an. Der Median einer Sequenz von double-Zahlen ist eine double-Zahl, daher der Rückgabetyp double. Falls die Anzahl der Elemente gerade ist, taucht der Median nicht unbedingt in der Sequenz auf. Der Median der Sequenz {1,2,3,1729} ist beispielsweise 2.5.



  • Diese Frage gehört zu den Grundaufgaben jeder Programmierung, also zum Entwurf eines Programmes (Design). Programmblöcke 'lagert' man dann in Funktionen aus, wenn diese im Programm häufiger gebraucht werden oder die Übersichtlichkeit (Lesbarkeit) erhöhen. Ansonsten haben Funktionen eine Rückgabe und Parameter wie z.B.

    double AddiereZweiDoublezahlen(double Zahl1, double Zahl2)
    {
       double Ergebnis;
       Ergebnis = Zahl1 + Zahl2:
       return Ergebnis;
    }
    

    Mit mehr oder sehr viel weiteren Möglichkeiten zur Auslagerung in Funktionen von C++ sollst du nicht gleich erschreckt werden.

    Hast du schon mal darüber nachgedacht, ein Buch zu lesen? Könnte hilfreich sein! 🕶


Anmelden zum Antworten