warum warnung, dass median nicht inizialisiert ist?
-
Hallo Leute,
ich muss mittelwert, median und standardabweichung berechnen. hier ist mein Code und ich bekomme warnung dass median nicht inizialisiert ist und summeStandardabweichung kann uninzialisiert sein?
Natürlich kann ich alle als 0 inizialisieren, aber frage ich mich warum ich diese meldung bekomme, wo ich bei mittelwert nicht bekomme. Vieleicht bleibt diese wissen im kopf und weiß für zukunft mehr#include<iostream> #include<cmath> using namespace std; int main(){ int const max = 50; int zahle[max]; // array_groesse zeigt wie groess array wird, dabei wird unten ueberprueft, damit es 50 nicht überschreitet int array_groesse = 0; // mit neu wird die zahle in array eingegeben int neu; int sum = 0; int mittelwert; int median; double summeStandardabweichung; do{ cin >> neu; if(neu != 0 && array_groesse < max ){ zahle[array_groesse] = neu; array_groesse +=1; sum += neu; } }while(neu != 0); mittelwert = sum/(array_groesse); cout << "----------------------------------" <<endl ; cout << "Mittelwert ist - " << mittelwert << endl; cout << "----------------------------------" <<endl ; if(array_groesse%2 == 0){ median += (zahle[array_groesse/2-1] + zahle[array_groesse/2])/2; cout <<"Median ist : " << median << endl; }else{ median += zahle[(array_groesse - 1)/2]; cout << "Median ist : " << median << endl; } cout << "----------------------------------" <<endl ; for(int i = 0; i < array_groesse; i++) summeStandardabweichung += pow(double (zahle[i]-median),2); cout << "Standardabweichung ist : " << sqrt(summeStandardabweichung/(array_groesse - 1)) << endl; return 0; }danke nochmals
-
Mittelwert wird in Zeile 31 initialisiert. median wird in Zeile 38 gelesen, ohne vorher initialisiert worden zu sein.
-
mittelwert wird vor jeder anderen Verwendung einmal etwas zugewiesen:
mittelwert = sum/(array_groesse);Der Compiler erkennt, dass der Wert von mittelwert vorher keine Rolle spielt und warnt deshalb nicht, dass mittelwert vorher uninitialisiert ist. median wird erstmals so verwendet:
median += (zahle[array_groesse/2-1] + zahle[array_groesse/2])/2;...wodurch der neue Wert von median vom alten Wert abhängt, der vorher unspezifiziert ist, weil median uninitialisiert ist. Der Compiler erkennt dies und warnt dich davor, weil das mit ziemlicher Wahrscheinlichkeit Unfug ist.
-
Mal so am Rande:
Der Median wird natürlich auch falsch berechnet, wenn er nicht an der erwarteten Position der Eingabe steht. Um sicherzustellen, dass dem so ist, kannst du vorher std::nth_element aus dem <algorithm>-Header verwenden. Dabei werden die Elemente im Array allerdings ein bisschen umsortiert.
-
Danke für eure tolle Hilfe
In der angabe steht, dass es aufsteigend oder absteigend geordnet ist
danke nochmals
-
EDIT: was folgt ist vermutlich Unsinn, siehe folgende Beiträge. /EDIT
Die übliche Definition des Median ist dass es exakt der Wert des mittleren Elements ist.
Nach der Definition brauchst du keine Fallunterscheidung zwischen gerade Anzahl vs. ungerade Anzahl. Bzw. du brauchst sie nicht nur nicht, dein "gerade Anzahl" Code ist sogar falsch.
(Mit dieser Definition ist der Median dann nämlich auch für Mengen definiert deren Elemente man zwar sortieren kann, aber nicht mitteln. Wie z.B. Strings.)Falls natürlich in der Voragbe steht dass du im Fall "gerade Anzahl" die beiden mittleren Elemente mitteln sollst, bzw. ihr es in der Vorlesung/im Unterricht/... so gelernt habt, dann solltest du es natürlich auch so machen. D.h. in dem Fall wäre dieser Teil deines Codes dann OK.
-
Die übliche Definition des Median ist dass es exakt der Wert des mittleren Elements ist.
Nach der Definition brauchst du keine Fallunterscheidung zwischen gerade Anzahl vs. ungerade Anzahl. Bzw. du brauchst sie nicht nur nicht, dein "gerade Anzahl" Code ist sogar falsch.Was ist den der Median von {1,3}? Was ist das mittlere Element?
-
Definitionssache.
Entweder 1 oder 3.ps: Wikipedia teilt meine Auffassung des Begriffs Median NICHT. Dort steht auch dass im Falle einer geraden Element-Anzahl gemittelt wird. Mitteln scheint also doch eher üblich zu sein (sofern möglich).
-
ja mitteln wurde uns auch in mathe beigebracht.
ich persönlich würde auch eher den mittelsten wert +0 oder +1 nehmen... ist intuitiver