Hilfe bei Klasse mit Vektor



  • Th69 schrieb:

    Du willst doch sicherlich (in der Klasse ControlChart)

    vector<Sample> samples;
    

    oder?

    Ja stimmt! 🙂 Hätten wir schon mal einen Übeltäter.

    Th69 schrieb:

    Und die Main-Funktion solltest du auch noch so abändern, daß du nur noch ControlChart für das Einlesen und Schreiben benötigst.

    Ich will in ControlChart mit dem Durchschnittswert und Standardabweichung weiterarbeiten, die von Sample berechnet werden.
    Aber ich könnte die berechneten Werte wieder in eine Datei schreiben und davon auslesen stimmt.

    Th69 schrieb:

    PS: Sehe gerade noch, daß du in deinem Text immer von "Klasse Simple" anstatt "Sample" sprichst 😉

    Uuppsi 😉

    Danke dir schon mal.
    Bei weiteren Problemen schreibe ich wieder hier. 🙂



  • Furble Wurble schrieb:

    Hat jedes Sample 5 Elemente? Oder solltest Du nicht schon in Sample einen Vektor verwenden?

    Gut aufgepasst. Ich finde es auch komisch, aber in den Anforderungen steht, dass jeder Sample 5 Elemente hat. Wozu die Anzahl dann trotzdem noch vor den Messwerten steht weiß ich nicht.



  • Hab mal noch eine Frage.
    In einer Sample steht ja jetzt die komplette Stichprobe (ca. 10 Werte).
    Wie stelle ich es denn am geschicktesten an wenn ich aus jedem Sample den Wert an Stelle 4 haben möchte? 🙂
    Will nämlich den Durchschnittswert von x berechnen.

    EDIT: Vermutlich muss Sample auch schon ein vector sein, damit es ein vector in einem vector wird und ich somit auf die einzelnen Elemente zugreifen kann oder? -.-



  • Schnuffel91 schrieb:

    In einer Sample steht ja jetzt die komplette Stichprobe (ca. 10 Werte).
    Wie stelle ich es denn am geschicktesten an wenn ich aus jedem Sample den Wert an Stelle 4 haben möchte? 🙂
    Will nämlich den Durchschnittswert von x berechnen.

    EDIT: Vermutlich muss Sample auch schon ein vector sein, damit es ein vector in einem vector wird und ich somit auf die einzelnen Elemente zugreifen kann oder? -.-

    Ich kann Dir nicht folgen - was hat der Wert an Stelle 4 mit dem Durchschnitt zu tun?
    Wer ist x?
    Und wieso hat Sample jetzt 10 Werte? Ich dachte in der Aufgabe stünde fünf Werte pro Stichprobe?

    Wie dem auch sei: Sample einen std::vector<float> für die Daten zu spendieren hielte ich für eine gute Idee - aber das ist mit Sicherheit kein Muss.



  • Furble Wurble schrieb:

    Ich kann Dir nicht folgen - was hat der Wert an Stelle 4 mit dem Durchschnitt zu tun?
    Wer ist x?
    Und wieso hat Sample jetzt 10 Werte? Ich dachte in der Aufgabe stünde fünf Werte pro Stichprobe?

    Das Sample besteht aus Datum, Uhrzeit, Durchschnittswert, Standardabweichung, Messwert1, Messerwert2, Messwert3, Messwert4, Messwert5
    Die Durschnittswerte (in Sample berechnet) aus jedem Sample soll ich wieder verrechnen zu einem Gesamtdurchschnitt (in Controlchart berechnet).

    Furble Wurble schrieb:

    Wie dem auch sei: Sample einen std::vector<float> für die Daten zu spendieren hielte ich für eine gute Idee - aber das ist mit Sicherheit kein Muss.

    Wenn ich das Datum und Uhrzeit auch drin haben muss brauche ich einen vector<string> oder?



  • Schnuffel91 schrieb:

    Das Sample besteht aus Datum, Uhrzeit, Durchschnittswert, Standardabweichung, Messwert1, Messerwert2, Messwert3, Messwert4, Messwert5
    Die Durschnittswerte (in Sample berechnet) aus jedem Sample soll ich wieder verrechnen zu einem Gesamtdurchschnitt (in Controlchart berechnet).

    Furble Wurble schrieb:

    Wie dem auch sei: Sample einen std::vector<float> für die Daten zu spendieren hielte ich für eine gute Idee - aber das ist mit Sicherheit kein Muss.

    Wenn ich das Datum und Uhrzeit auch drin haben muss brauche ich einen vector<string> oder?

    Nein.
    Dein erster Ansatz gefällt mir besser. Ich dachte an einen Vektor nur für die Messwerte.

    Trotzdem stellt sich mir immer noch die Frage, warum der Wert an der vierten Stelle so wichtig ist? Ich sehe in Deinem Beispiel steht da der Durchschnitt. Ist das immer so?
    Ich dachte das Format stünde einfach für

    Datum Zeit N Messung1 Messung2 ... MessungN
    


  • Furble Wurble schrieb:

    Trotzdem stellt sich mir immer noch die Frage, warum der Wert an der vierten Stelle so wichtig ist? Ich sehe in Deinem Beispiel steht da der Durchschnitt. Ist das immer so?
    Ich dachte das Format stünde einfach für

    Datum Zeit N Messung1 Messung2 ... MessungN
    

    So ist das Format beim einlesen von Sample. Sample schnappt sich die Messungswerte und berechnet den Durchschnitt und die Standardabweichung.
    Das wird wieder in eine Datei geschrieben, aus der ControlChart lesen soll, denn dieser braucht den Durchschnitt und die Standardabweichung jedes Samples um weitere Berechnungen durchzuführen.
    An die Vieten Stelle habe ich in meinem Beispiel den Durchschnittswert gesetzt.

    Wie stelle ich das am besten an mit dem vector in Sample?
    Soll ich direkt beim einlesen der Datei die Werte in den vector schreiben? (Bei der Methode brauche ich dann auch meine ganzen Attribute nicht mehr, stimmts?)



  • Schnuffel91 schrieb:

    Wie stelle ich das am besten an mit dem vector in Sample?
    Soll ich direkt beim einlesen der Datei die Werte in den vector schreiben? (Bei der Methode brauche ich dann auch meine ganzen Attribute nicht mehr, stimmts?)

    Das mit dem vector ist kein Allheilmittel. Und hilft Dir auch gar nicht bei Deinem Problem, jedenfalls sehe ich nicht wie - letztlich scheint ja sample zu funktionieren und ControlChart macht Dir Probleme.

    Ich würde das Pferd von hinten aufzäumen.
    Was Du machen willst:
    - Aus einer Datei eine Reihe von Samples auslesen.
    - Diese speichern - in einer Klasse ControlChart.
    - ControlChart ausgeben.

    Richtig?

    int main(){
      ControlChart cc;
      {
        std::ifstream in("daten");
        Sample s;
        while(in>>s)
          cc.push_back(s);
      }
      std::ofstream out("datenaus");
      out << cc;
    }
    


  • Furble Wurble schrieb:

    Ich würde das Pferd von hinten aufzäumen.
    Was Du machen willst:
    - Aus einer Datei eine Reihe von Samples auslesen.
    - Diese speichern - in einer Klasse ControlChart.
    - ControlChart ausgeben.

    Richtig?

    - Aus einer Datei eine Reihe von Samples auslesen. Korrekt
    - Durchschnitt der 5 Messungen zu den Messungen dazu schreiben.
    - Diese speichern - in einer Klasse ControlChart. Korrekt
    - Den Durchschnitt für jedes Sample auslesen und daraus den Gesamtdurchschnitt bestimmen.

    Problem:
    Wenn ein Sample aus der kompletten Zeichenkette aller Messwerte besteht (wie jetzt), dann kann ich damit ja nicht rechnen.


    Damit ich z.B. Rechnen kann

    Gesamtdurchschnitt = 0;
    for(int i = 0; i< y; i++)
    {
       Gesamtdurchschnitt += samples[i][4]; //An [i][4] steht bei jedem Sample der Messwertedurchschnitt des Samples
    }
    Gesamtdurchschnitt /= i;
    

    Der Gesamtdurchschnitt soll auch in den vector.
    Anschließend sollen die Samplereihen (inkl. Gesamtdurchschnitt) in eine Datei geschrieben werden.



  • Schnuffel91 schrieb:

    Problem:
    Wenn ein Sample aus der kompletten Zeichenkette aller Messwerte besteht (wie jetzt), dann kann ich damit ja nicht rechnen.


    Damit ich z.B. Rechnen kann

    Gesamtdurchschnitt = 0;
    for(int i = 0; i< y; i++)
    {
       Gesamtdurchschnitt += samples[i][4]; //An [i][4] steht bei jedem Sample der Messwertedurchschnitt des Samples
    }
    Gesamtdurchschnitt /= i;
    

    Der Gesamtdurchschnitt soll auch in den vector.
    Anschließend sollen die Samplereihen (inkl. Gesamtdurchschnitt) in eine Datei geschrieben werden.

    Verstehe ich nicht.

    Ich wuerde auch die Messwerte und die Durchschnitte getrennt halten.

    Vielleicht hilft folgendes:

    #include <vector>
    #include <iostream>
    
    struct sample{
      using container = std::vector<float>;
      container data;
    };
    
    struct controlchart{
      using container = std::vector<sample>;
      void push_back(const sample&s){
        samples.push_back(s);
      }
      // gibt den 4. Wert eines jeden Samples aus
      void print_4th() const {
        for(auto i=0u; i<samples.size(); ++i)
          if(3<samples[i].data.size())
    	std::cout << samples[i].data[3] << '\n';
      }
    private:
      container samples;
    };
    
    int main(){
      sample samples[] = {
        { {0.f, 1.f, 2.f, 33.f} },
        { {1.f, 2.f, 3.f, 44.f} },
        { {2.f, 3.f, 4.f, 55.f} }
      };
      controlchart cc;
      for(const auto& s : samples)
        cc.push_back(s);
      cc.print_4th();
    }
    

    Das Beispiel hat keinen tieferen Sinn - aber in Z. 18 greife ich über zwei Indizes in zwei verschiedenen Vektoren auf einen Wert zu.
    Ungefähr das, womit Du Probleme zu haben scheinst.
    Der Code benutzt hier und da C++11. Achte also darauf, dass Dein Compiler das unterstüzt (Z. 18 ist allerdings nicht speziell C++11).

    Hoffentlich hilft es.
    Wobei ich - wie schon gesagt - mit einigem, dass Du vorhast arge Bauchschmerzen habe... 🙂


Anmelden zum Antworten