Arrays, Hashing, Fehlermeldung wegen Datentyp
-
Hallo,
ich hoffe, ihr könnt mir wieder helfen. Ich soll als Aufgabe eine Zahlenkette (max. 50 Zahlen, Abschluß mit Wert 0) einlesen und dann als Ausgabe bestimmte Berechnungen anzeigen lassen (also Mittelwert, Median & Standardabweichung).
Wir hatten in der Vorlesung besprochen was Felder/Arrays sind, und Hashing, was ich allerdings nicht wirklich verstanden habe *schäm* Zumindest nicht, wie ich in den Beispielen Verwendung dafür haben würde.
Also Mittelwert berechnen ist klar. Median ist die Ausgabe der mittleren Zahl. D.h. wenn die Anzahl der Zahlenreihe ungerade ist, eben die mittlere Zahl, wenn gerade, dann der Mittelwert der beiden mittleren Zahlen. Hoffe, ich hab das mit der If-Funktion halbwegs getroffen. Weiß nicht genau, wie ich auf die einzelnen Zahlen(werte) zugreifen soll.
Standardabweichung ist die Wurzel von der Varianz. Die Varianz bekommt man, indem man von ALLEN eingebenen Zahlen einzeln den Mittelwert abzieht, und das Ergebnis dann zum Quadrat nimmt. Die Gesamtsumme dann durch die Anzahl.
Also angenommen die Eingaben sind 1 2 3
Der Mittelwert ist 2
Varianz = ( (1-2)² + (2-2)² + (3-2)² ) / 3
Varianz = 1 + 0 + 1 = 2
Standardabweichung = sqrt (Varianz) = Wurzel von 2 = 1,41Hmm.. vielleicht als Hilfe um meinen konfusen Code zu verstehen.
Mein Code mittlerweile:
editiert
Er keift beim Kompilieren jedoch wegen der Zeilen rum:
median = double(zahlen[zentral1]+zahlen[zentral2])/2;
und
median = double(zahlen[zentral3]);bsp1.C:32: invalid types
int[50][double]' for array subscript bsp1.C:35: invalid types
int[50][double]' for array subscriptWie kann ich das anpassen? Hatte versucht das Array zahlen in double zu ändern, aber da kommt die Meldung:
bsp1.C:32: invalid typesdouble[50][double]' for array subscript bsp1.C:35: invalid types
double[50][double]' for array subscriptWas kann ich sonst noch tun?
Noch was: er gibt mir die 0 auch als eigenen Wert an. Also als ichs nur mit dem Code für Anzahl und Mittelwert ausgeben versucht hab. Dabei sollte das nur dazu dienen, um das Einlesen zu beenden. Wie krieg ich das weg?
lg, Angie alias N-Ice
-
#include <iostream> //es heißt _nicht_ iostream.h #include <cmath> //dito using namespace std; //nimms so hin int main() { int eingabe, counter = 0; int anzahl,i; int zahlen[50]; cout<< "Bitte geben Sie eine Zahlenreihe in aufsteigender Reihenfolge ein."<<endl; cout<< "Zwischen den Zahlen einen Abstand von einer Leerzeile einhalten. Mit der Eingabe der Ziffer 0 beenden Sie diese Reihe."<<endl; do { cin>>eingabe; zahlen[counter++] = eingabe; } while(eingabe != 0 && counter < 50); cout << "anzahl: " << counter << endl; int mittelwert = 0; for(int i=0; i < counter; i++) mittelwert+=zahlen[i]; mittelwert = mittelwert / counter; cout<<"Mittelwert: "<< mittelwert <<endl; double zentral, abweich, zentral1, zentral2, zentral3, median; zentral = counter/2; if (counter%2 == 0) { zentral1 = zentral; zentral2 = zentral+1; //median = double(zahlen[zentral1]+zahlen[zentral2])/2; //Hä? //meintest du: (double)(... //-> c++-casts verwenden median = (static_cast<double>(zahlen[zentral1])+zahlen[zentral2])/2 } else { zentral3 = zentral+0.5; //median = double(zahlen[zentral3]); median = zahlen[zentral3]; } cout<<"Median: "<<median<<endl; double varianz, zwischensumme; for(int i=0; i < counter; i++) zwischensumme += (zahlen[i]-mittelwert)*(zahlen[i]-mittelwert); varianz = zwischensumme/counter; abweich = sqrt(varianz); cout<<"Standardabweichung: "<<abweich<<endl; return 0; }
Nicht getestet, ich hoffe meine änderungen sind verständlich. Bin mir nicht sicher, ob der cast sein muss...
-
hi du,
danke für deine Antwort!
Bezüglich:
#include <iostream> //es heißt _nicht_ iostream.h #include <cmath> //dito using namespace std; //nimms so hin
nehmen wir in den Übungen noch die älteren Codes her. Arbeiten auch nicht mit der aktuellsten Version der Entwicklungsumgebung.
static_cast hatten wir bisher noch nicht. Wenn wir etwas umgewandelt haben, dann so - z.B.:
double n, f, x; x = int(f);
Hat auch gefunkt, auch ohne static_cast, nur irgendwie will er da was nicht so wirklich
lg,
Angie