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,41

    Hmm.. 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 typesint[50][double]' for array subscript

    Wie kann ich das anpassen? Hatte versucht das Array zahlen in double zu ändern, aber da kommt die Meldung:
    bsp1.C:32: invalid types double[50][double]' for array subscript bsp1.C:35: invalid typesdouble[50][double]' for array subscript

    Was 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


Anmelden zum Antworten