Wie Funktion auslagern??
-
Hallo liebe Gemeinde.
Folgenden Programmcode habe ich aufgesetzt:
Edit:#include <iostream> #include <math.h> //Messreihe #define MAX_ANZAHL 3 double d_Wert[MAX_ANZAHL]; void Einlesen() { double Messwert; for (int i = 0; i<MAX_ANZAHL;) { cin >> Messwert; if((Messwert>2)&&(Messwert<12)) { d_Werte[i]=Messwert; } } } void Kontrollausgabe() { for (int i=0; i<MAX_ANZAHL; i++) { cout << i+1 << ": \t " << d_Werte[i] << endl; } } double berechneMittelwert() { double sum = 0.0; for (int i=0; i < MAX_ANZAHL; i++) { double aktel = d_Werte[i]; sum = sum + aktel; } double x_quer = sum /MAX_ANZAHL; return x_quer; } int berechneNächster(double x_quer) { double Min_Diff = 9999999999999.99; int Min_Index; for(int i=0; i<MAX_ANZAHL; i++) { double aktEl =d_Werte[i]; double h =aktEl - xquer; double Diff = fabs(h); if (Diff<Min_Diff) { Min_Index = i; Min_Diff = Diff; } } return (Min_Index); } double berechneStandardabweichung(double x_quer) { double diff, diff_2; double sum=0.0; double S; for (int i=0; i<MAX_ANZAHL; i++) { double aktEl = d_Werte[i]; diff = aktEl - x_quer; diff_2 = diff*diff; sum = sum + diff_2; } double radikant =sum/(MAX_ANZAHL - 1); S = sqrt(radikant); } int main() { cout << " Messreihe! " << endl; cout << "Geben Sie bitte 3 Werte ein!" << endl; //einlesen Einlesen; //Kontrollausgabe Kontrollausgabe; //Mittelwert berechnen double x_quer; x_quer = berechneMittelwert(); cout << "Der Mittelwert der Messwerte betraegt: " << x_quer << endl; //Standardabweichung double S = berechneStandardabweichung(x_quer); cout << "Standardabweichung: " << S << endl; //Median for(int i = 0; i<MAX_ANZAHL; i++) { double Kandidat = d_Werte[i]; int Elemente_größer=0, Elemente_kleiner=0; for(int j=0; j < MAX_ANZAHL; j++) { double Vergleichselement = d_Werte[i]; if (Vergleichselement > Kandidat) { Elemente_größer; } if (Vergleichselement < Kandidat) { Element_kleiner++; } } if (Elemente_größer==Elemente_kleiner) { cout << "Der Median der Messreihe ist: " << Kandidat << endl; break; } } return 0; }Ich möchte nun die for-Schleife beim Berechnen des Median in eine Funktion auslagern, bloß ich weiß nicht wie... Ich habe schon alles mir denkliche ausprobiert, bloß ich komme auf keine gescheite Lösung.
Hat jemand von euch einen Tipp, Trick oder Hinweis?
Danke für die Antworten im Voraus.
Gruß
Max
-
silent_max schrieb:
Folgenden Programmcode habe ich aufgesetzt:
Der compiliert bei mir so nicht (siehe Link in meiner Signatur...)
Ich möchte nun die for-Schleife beim Berechnen des Median in eine Funktion auslagern, bloß ich weiß nicht wie...
Funktion erstellen, for-Schleife rein, ggf. benötigte Parameter überlegen, und Funktion an Stelle der for-schleife in main aufrufen, wo hakts denn?
Ich habe schon alles mir denkliche ausprobiert,
Nur mit Probieren kommmt man auch nie auf eine Lösung. Ein gutes Einsteigerbuch sollte dir das nötige Wissen vermitteln. Ein wenig Übung und Grips tun dann ihr übriges, um das Wissen auf neue Probleme anwenden zu können.
-
Ich kann mir schon vorstellen, warum der Code bei Dir nicht compeliert.
Ich habe auch die Fnktionen, die ich geschafft habe, auszulagern, nicht mit rein zuschreiben, da ich dachte, dass man den Code so klein wie möglich schreiben und nur die Problemstellen schreiben soll.
Dann editier ich eben meinen Beitrag.
-
silent_max schrieb:
Ich habe auch die Fnktionen, die ich geschafft habe, auszulagern, nicht mit rein zuschreiben, da ich dachte, dass man den Code so klein wie möglich schreiben und nur die Problemstellen schreiben soll.
Ja, aber noch so dass er compiliert. Wie gesagt, siehe Link in meiner Signatur...
Wie auch immer, wo ist denn dein Problem beim 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!
