Programm Beispiel



  • Hey,

    bin auf der Suche nach einer Musterlösung für mein Problem. Unser Prof hat zum ersten Mal eine Art Eingrenzung für die Klausur vorbereitet. Bei den Angaben ist mir aber nicht ganz schlüssig, wie diese Art von Programm aussehen soll. Habe schon in diversen Beiträgen und auch Foren versucht mich irgendwie dafür einzulesen, was so leider nicht viel gebracht hat. Hat denn vielleicht jemand eine Art Orientierung für das Programm.
    wir haben uns dieses Semester erstmalig überlegt den Inhalt einer der 5 Klausuraufgaben bereits jetzt bekannt zu geben, damit Sie sich besser darauf vorbereiten können.

    Die Aufgabe 5 wird folgenden Inhalt haben:

    Öffnen einer Textdatei zum Einlesen von Messwerten

    1. Wert in der Datei gibt die gesamt Anzahl der Messwerte in der Datei an. -> Erstellen eines passenden Datenbereiches über Calloc/Malloc
      Werte aus der Datei ins Array einlesen
      Array sortieren
      Besondere Arraywerte ermitteln (Z.B. Max-Wert)
      Ggf. Array am Bildschirm ausgeben
      Zu einem Unterprogramm ein PAP/Struktogramm erstellen.

    Vielen Dank im Voraus



  • @Peenut20

    Wieder so ein Prof, der C++ für C mit Klassen hält?
    Die C++ Lösung wird vermutlich komplett anders aussehen als die Musterlösung eures Profs:

    #include <numeric>
    #include <iostream>
    #include <fstream>
    #include <vector>
    #include <algorithm>
    
    std::vector<int> read_file(std::string const& filename)
    {
       std::ifstream ifs(filename);
       return std::vector<int>(std::istream_iterator<int>(ifs), std::istream_iterator<int>());
    }
    
    int main()
    {
       std::vector<int> data = read_file("c:/tmp/data.txt");
       if (!data.empty())
       {
          // 1. Sortieren
          std::sort(data.begin(), data.end(), std::less<int>());
    
          // 2. Minimum finden
          int const min_val = *std::min_element(data.begin(), data.end());
    
          // 3. Maximum finden
          int const max_val = *std::max_element(data.begin(), data.end());
    
          // 4. Summe bilden
          int const total = std::accumulate(data.begin(), data.end(), 0);
    
          // 5. Durchschnitt bilden
          double const avg = static_cast<double>(total) / data.size();
    
          // 6. Ausgabe nach std::cout
          std::copy(data.begin(), data.end(), std::ostream_iterator<int>(std::cout, " "));
          std::cout << std::endl;
       }
    }
    

  • Mod

    @DocShoe sagte in Programm Beispiel:

    @Peenut20

    Wieder so ein Prof, der C++ für C mit Klassen hält?

    Außer Peenut20s Forenwahl spricht alles dafür, dass es eigentlich um C geht. @Peenut20: Vielleicht im Forum vertan? Wir haben auch ein C-Forum, in das ich die Frage verschieben könnte. Du wärst nicht der erste C-Anfänger, der C mit C++ verwechselt. Was DocShoe da zeigt ist C++, wenn dir das gänzlich unbekannt vorkommt, machst du C.

    @Peenut20 sagte in Programm Beispiel:

    Zu einem Unterprogramm ein PAP/Struktogramm erstellen.

    Oh, wie süß. Das wird ernsthaft noch gelehrt, als würden die letzten 50 Jahre nicht existieren?



  • @SeppJ Oh, mein Fehler. Habe mich in der Sprache verwählt. Sollte natürlich C heißen und nicht C++ 😅 . Wäre sehr dankbar, wenn man den Beitrag in das entsprechende Forum verschieben könnte. Oder kann ich das sogar machen?


  • Mod

    Verschoben.



  • @DocShoe:
    Der erste Wert in der Datei gehört nicht in den Vektor/das Array.



  • @Belli sagte in Programm Beispiel:

    @DocShoe:
    Der erste Wert in der Datei gehört nicht in den Vektor/das Array.

    Sehr gut aufgepasst, hier ist dein Fleißkärtchen! Außerdem zu viel C++ für eine C-Lösung.



  • @Peenut20 sagte in Programm Beispiel:

    Bei den Angaben ist mir aber nicht ganz schlüssig, wie diese Art von Programm aussehen soll.

    Dazu brauchst du eigene Funktionen (Unterprogramme)

    Jeweils eine Funktion

    • zum Lesen der Daten.
    • sortieren
    • Besondere Werte (Max, Min, Mittelwert)
    • Array ausgeben

    Die einzelnen Funktionen kann man getrennt testen.

    Man kann auch ein kleines Array im Code bereitstellen, wenn man mit dem einlesen noch nicht soweit ist.


  • Mod

    @DirkB sagte in Programm Beispiel:

    @Peenut20 sagte in Programm Beispiel:

    • Besondere Werte (Max, Min, Mittelwert)

    Da ergibt sich eine interessante Designfrage. Diese Dinge (und mehr) kann man alle sehr effizient zusammen in einem einzigen Durchgang ermitteln. Das Durchgehen ist es, was die Zeit kostet, daher möchte man tunlichst unnötige Durchgänge vermeiden. Wenn ganz naiv die gute Leitregel "eine Funktion für eine Aufgabe" anwendet, würde man mehrere Funktionen nach dem Muster

    double max(const double * values, size_t size);
    double min(const double * values, size_t size);
    double mean(const double * values, size_t size);
    

    schreiben und dann ungünstigerweise 3x durchgehen. Schlecht. Also muss man schon etwas weiter denken und eher so etwas haben:

    void accumulate_max(double next_value, double *current_max);
    void accumulate_min(double next_value, double *current_min);
    void accumulate_mean(double next_value, MeanData *current_mean);  // Man beachte, dass hier kein einzelner double für den State reicht
    

    Dazu eine Funktion drumherum, die den State initialisiert und hält, einmal durch alle Werte durchgeht, und an die Akkumulatoren gibt, und am Ende gesammelt die Statistiken zurück gibt. Das sind eine Menge "und" in meiner Beschreibung, also sind es in der tatsächlichen Umsetzung wohl mehrere Funktionen.

    Aber auch das reicht noch nicht, denn bei manchen Akkumulatoren fallen andere Werte als Abfall nebenher ab. Beispielsweise fällt der Mittelwert automatisch mit ab, wenn man die Varianz berechnet. Also muss man noch clever sein und wissen, wenn man beides will, dann braucht man den Mittelwert nicht mit berechnen, aber ein Varianzakkumulator muss es dann ermöglichen, dass man dessen internen Mittelwert mit abgreifen kann.

    Wieder andere Statistiken, zum Beispiel Median, kann man gar nicht in einem Durchgang abgreifen. Und das Sortieren kommt drauf an, ob man es inplace haben möchte oder nicht. Und wenn man schon mehrmals durchgeht, kann man eventuell auch numerisch bessere Algorithmen für die obigen Ein-Durchgang-Statistiken benutzen.

    Alles in allem eigentlich recht interessant, juckt mit fast in den Fingern das mal so richtig krass durchzudesignen. Aber dann sitze ich da zwei Tage dran 🙂



  • @SeppJ Ich habe bewusst die drei Werte als einen Punkt aufgezählt und (für den Anfang) " und andere statistische Werte" in der Klammer weg gelassen.