Funktion zum Berechnen des Medianwertes
-
hallo,
wie schon im titel steht, suche ich eine funktion die den medianwert berechnen kann.ich habe es natuerlich schon selber probiert, aber es scheint nicht zu funktionieren.double medwert(vector<double> &v) { sort(v.begin(), v.end()); int i = v.size() / 2; if(v.size() % 2 == 0) return (v[i - 1] + v[i]) / 2.0; else return v[i]; };
es kommt bei mir immer 0 raus.
ich hoffe ihr koennt mir helfen.
-
Für mich sieht das eigentlich korrekt aus, bist Du sicher, daß der Fehler nicht woanders liegt?
Was mir allerdings nicht gefällt, ist daß
medwert(myvector);
myvector sortiert. Da steckt kein Hinweis im Funktionsnamen.
MfG Jester
-
@Jester: du scheinst recht zu haben.hab die funktion in einer extrem simplen anwendung probiert und da laeuft es anstaendig.also bleibt mir nichts anderes uebrig als den ganzen code zu posten.vielleicht faellt dem einen oder anderem auf, dass es eine uebung vom bjarne ist
#include <iostream> #include <string> #include <map> #include <vector> using namespace std; void readitems(map<string, double>& m) { string str; double dbl = 0; while(true) { cin >> str; if(str == "Quit") break; cin >> dbl; m[str] += dbl; }; }; double medwert(vector<double> &v) { sort(v.begin(), v.end()); int i = v.size() / 2; if(v.size() % 2 == 0) return (v[i - 1] + v[i]) / 2.0; else return v[i]; }; int main() { map<string, double> tbl; double sum = 0; readitems(tbl); cout << "\n\n\n\n"; typedef map<string, double>::const_iterator MCI; for(MCI p = tbl.begin(); p != tbl.end(); ++p) { cout << p->first << '\t' << p->second << endl; sum += p->second; } if(tbl.size() > 0) { cout << "\n---------------------------------------\n"; cout << "Summe: " << '\t' << sum << endl; cout << "Durchschnitt: " << '\t' << sum / tbl.size() << endl; vector<double> vec(tbl.size()); for(MCI p = tbl.begin(); p != tbl.end(); ++p) { vec.push_back(p->second); } cout << "Medianwert: " << '\t' << medwert(vec) << endl; } else cout << "Mindestens einen Wert eingeben." << endl; cin.clear(); cin.ignore(cin.rdbuf()->in_avail()); cin.get(); cin.clear(); cin.ignore(cin.rdbuf()->in_avail()); cin.get(); return 0; }
hoffe, dass sich einer ranwagt und den fehler entdecken kann.
-
unregistred schrieb:
vector<double> vec(tbl.size()); for(MCI p = tbl.begin(); p != tbl.end(); ++p) { vec.push_back(p->second); } cout << "Medianwert: " << '\t' << medwert(vec) << endl;
Hier erstellst Du erst einen vector<double> mit tbl.size() Elementen und, die sind alle Default-Initialisiert, also mit 0.0.
Du willst ja nur den passenden Speicher bereitstellen, nicht die Elemente anlegen. Das geht mit reserve.MfG Jester
-
@Jester:vielen dank fuer den hinweis
es funktioniert jetzt alles bestens.