Strukturen, struct, Felder, c++



  • Aufgabe:
    Gegeben sei eine Struktur person
    struct person
    {
    char name[40];
    char vorname[20];
    char beruf[40];

    float gehalt;
    int personalnummer;
    };
    Aus dieser Struktur wird ein Feld aufgebaut:
    const int MITARBEITER[100];
    person personal[MITARBEITER];
    welches zunachst mit Daten aus einer Datei gefullt werden soll. Die Verwendung der
    Bibliotheken fstream und cstring ist erlaubt. Der Name der Datei wird vom Nutzer
    eingegeben (maximal 50 Zeichen). Der erste Wert der Datei enthalt die Anzahl der
    Datensatze, gefolgt von den Personaldaten. Ein Beispiel zum Dateiaufbau:

    5
    Meier Emil Tischler 4000.00 2
    Lehmann Paul Klempner 3899.65 5
    Schulze Max Dachdecker 4111.55 7
    Muller Otto Baggerfahrer 2865.44 8
    Hofmann Hardy Tischler 3000.11 10

    Schreiben Sie ein C++-Programm, das die Daten wie oben beschrieben einliest und
    die Datensatzkomponente personalnummer des ersten freien Feldelementes mit
    dem Wert -1 belegt. Danach soll das durchschnittliche Gehalt aller Beschaftigten
    berechnet und ausgegeben werden. Zum Schluss soll das kleinste Gehalt der
    Mitarbeiter mit einem bestimmten Beruf ermittelt und ausgegeben werden. Der
    Beruf ist vom Nutzer einzugeben.

    Mein Programm:

    
    
    #include <iostream>
    #include <fstream>
    #include <cstring>
    using namespace std;
    
    struct person
    {
        char name[40];
        char vorname[20];
        char beruf[40];
        float gehalt;
        int personalnummer;
    };
    
    int main()
    {
        char dateiname[50];
    
        ifstream datei;
        /*do
        {
            cout << "Dateiname: " << endl;
            cin >> dateiname;
            datei.open(dateiname);
        
            if(datei.is_open()==false)
            {
                cout <<"Datei konnte nicht eingelesen werden" << endl;
            }
        }
        while(!datei);*/
        datei.open("personal.txt");
        
        if(datei.is_open()==false)
        {
            cout <<"Datei konnte nicht eingelesen werden" << endl;
        }
        
        int x;
        datei >> x;
        
        const int mitarbeiter=100;
        person personal[mitarbeiter];
        
        if(x<100)
        {
            personal[x].personalnummer = -1;
        }
        
        for(int i=0; i<x; i++)
        {
            datei >> personal[i].name;
            datei >> personal[i].vorname;
            datei >> personal[i].beruf;
            datei >> personal[i].gehalt;
            datei >> personal[i].personalnummer;
        }
        datei.close();
        
        float sum=0;
        
        for(int i=0; i<x && personal[i].personalnummer != -1; i++)
        {
            sum += personal[i].gehalt;
        }
        cout << "Durchschnittliches Gehalt: " << sum/x << endl;
        
        char berufe[40];
        
        cout << "Geben sie den Beruf ein: " << endl;
        cin >> berufe;
        
        bool gefunden=false;
        float min;
        int b;
        
        for(int i=0; i<x && personal[i].personalnummer != -1; i++)
        {
            min=personal[i].gehalt;
             
              if(strcmp(personal[i].beruf, berufe)==0 && personal[i].gehalt <= min)
              {
                  gefunden=true;
                  min=personal[i].gehalt;
                  b=i;
              }
        }
        cout << "Kleinestes Gehalt fuer diesen Beruf: " << personal[b].gehalt << endl;
        return 0;
    }
    ```cpp
    
    

    Bei dem const int MITARBEITER[100] habe ich es durch const int MITARBEITER=100 ersetzt, da ich sowas noch nie gesehen habe und mein Programm es als falsch anzeigt.

    Zu meinem eigentlichen Problem:
    Könnt ihr mir bei der Berechnung bzw. bei der Ausgabe des kleinsten Gehaltes helfen. Das will nicht so wirklich Funktionieren.


  • Mod

    Womit lernst du? Das ist kein echtes C++, sondern C wo printf mit cout ersetzt wurde. Das ist Mist und lohnt sich nicht zu verbessern. Mach entweder C oder C++, aber nicht gemischt!

    PS: Dass der Vorgabecode einen Fehler wie das mit dem const int MITARBEITER[100] enthielt, sagt auch viel über die Qualität des Lehrers…



  • Initialisier´ den Vergleichswert außerhalb der Schleife. So setzt du den immer auf den Wert des aktuellen Eintrags, so findest du den Wert nicht. Außerdem ist ja der Minimalwert der Berufsgruppe gesucht, also musst du das auch noch berücksichtigen. Da bietet es sich an, den ersten Index für eine Berufsgruppe zu suchen und ab da den Vergleich durchzuführen.
    PS:
    Wieder ein Beispiel für planlose Lehrer/Dozenten.



  • @DocShoe und wie würde es denn aussehen😅



    1. das, was @SeppJ gesagt hat.

    2. ...und was machst du, wenn der Baggerfahrer "Hans Otto Müller von und zu Lüdenscheid" heißt? Doppelnamen scheinen nicht vorgesehen zu sein.

    In ordentlichem C++ würdest du NICHT <cstring> verwenden, sondern <string>, d.h.

    struct Person {
       std::string name;
       std::string vorname;
       ...
    };
    

    Mal ganz abgesehen davon, dass die Aufteilung in Vorname und Nachname nicht immer sinnvoll ist.

    Und anstelle von

        const int mitarbeiter=100;
        person personal[mitarbeiter];
    

    würdest du schreiben:

       std::vector<Person> personal;
    

    Hier gibt es dann auch keine Einschränkung auf 100 Mitarbeiter oder 50 Zeichen im Namen.

    Ich hoffe mal, dass std::string und std::vector möglichst bald eingeführt werden.


  • Mod

    @wob sagte in Strukturen, struct, Felder, c++:

    Ich hoffe mal, dass std::string und std::vector möglichst bald eingeführt werden.

    Oh, du Optimist…



  • @ShuraiyaKudo könnte jmd es vllt für mich schreiben in c sprache?



  • @ShuraiyaKudo
    Du hast gefragt...

    #include <string>
    #include <vector>
    #include <iostream>
    #include <fstream>
    #include <algorithm>
    
    
    struct Person
    {
       int         PersonalNummer = 0;
       std::string Vorname;
       std::string Nachname;
       std::string Beruf;
       float       Gehalt = 0.0f;
    };
    
    std::istream& operator>>( std::istream& is,
                              Person& person )
    {
       is >> person.Nachname
          >> person.Vorname
          >> person.Beruf
          >> person.Gehalt
          >> person.PersonalNummer;
       return is;
    }
    
    
    std::vector<Person> read_personnel()
    {
       std::ifstream ifs( "d:/personal.txt" );
    
       // Zeile mit Anzahl der Einträge kann ignoriert werden
       std::string dummy;
       std::getline( ifs, dummy );
    
       std::vector<Person> retval;
    
       Person current;
       while( ifs >> current )
       {
          retval.push_back( current );
       }
       return retval;
    }
    
    
    int main()
    {
       // Personaldaten einlesen
       std::vector<Person> const personal = read_personnel();
    
       // gesuchte Berufsgruppe ist "Tischler"
       std::string const beruf = "Tischler";
    
       // ersten Eintrag der gesuchten Berufsgruppe suchen
       auto first = std::find_if( personal.begin(), personal.end(), [&]( Person const& p ) { return p.Beruf == beruf; } );
       if( first != personal.end() )
       {
          // es gibt einen Treffer, ab dem ersten Treffer das Minimum suchen
          auto comparison = [&]( Person const& current, Person const& minimum_so_far )
          {
             // Person muss der gesuchten Berufsgruppe angehören und ein niedrigeres Gehalt haben
             return current.Beruf == beruf && current.Gehalt < minimum_so_far.Gehalt;
          };
          auto pos = std::min_element( first, personal.end(), comparison );
          std::cout << "Kleinstes Gehalt mit " << pos->Gehalt << " als " << pos->Beruf << " hat "
                           << pos->Vorname << " " << pos->Nachname << std::endl;
       }
    }
    

    Wer mag kann jetzt noch die deutschen Bezeichner durch die englischen ersetzen. Bonuspunkte gibt´s für die Gleichbehandlung von "tischler", "Tischler" und "TISCHLER".

    Edit:
    Ist C++, kein C. Warum in C std::string und std::vector nachprogrammieren, wenn´s die in C++ schon fertig gibt?


  • Mod

    Das ist jetzt aber C++, nicht C.



  • @SeppJ sagte in Strukturen, struct, Felder, c++:

    Das ist jetzt aber C++, nicht C.

    Hab den Beitrag nicht aktualisiert und direkt gepostet.



  • @DocShoe Danke dir aber ich bräuchte es in c da wir das andere zeug noch nicht behandelt haben



  • @ShuraiyaKudo sagte in Strukturen, struct, Felder, c++:

    @DocShoe Danke dir aber ich bräuchte es in c da wir das andere zeug noch nicht behandelt haben

    Aufgabenstellung:

    Schreiben Sie ein C++-Programm, das ...

    => Du brauchst es nicht in C, sondern in C++. Du brauchst es vielleicht in schlechtem C++, weil ihr das gute Zeug noch nicht behandelt habt. Aber nicht in C.



  • @ShuraiyaKudo sagte in Strukturen, struct, Felder, c++:

    struct person
    {
    char name[40];
    char vorname[20];
    char beruf[40];
    float gehalt;
    int personalnummer;
    };
    

    Verstehe bitte folgendes Problem. Wenn du ein solches Programm veröffentlichst, dauert es nur wenige Tage bis ein Herr

    Adolph Blaine Charles David Earl Frederick Gerald Hubert Irvin John Kenneth Lloyd Martin Nero Oliver Paul Quincy Randolph Sherman Thomas Uncas Victor William Xerxes Yancy Zeus Wolfeschlegel­steinhausen­bergerdorff­welche­vor­altern­waren­gewissenhaft­schafers­wessen­schafe­waren­wohl­gepflege­und­sorgfaltigkeit­beschutzen­vor­angreifen­durch­ihr­raubgierig­feinde­welche­vor­altern­zwolfhundert­tausend­jahres­voran­die­erscheinen­von­der­erste­erdemensch­der­raumschiff­genacht­mit­tungstein­und­sieben­iridium­elektrisch­motors­gebrauch­licht­als­sein­ursprung­von­kraft­gestart­sein­lange­fahrt­hinzwischen­sternartig­raum­auf­der­suchen­nachbarschaft­der­stern­welche­gehabt­bewohnbar­planeten­kreise­drehen­sich­und­wohin­der­neue­rasse­von­verstandig­menschlichkeit­konnte­fortpflanzen­und­sich­erfreuen­an­lebenslanglich­freude­und­ruhe­mit­nicht­ein­furcht­vor­angreifen­vor­anderer­intelligent­geschopfs­von­hinzwischen­sternartig­raum Sr.

    in Kurzform Hubert Blaine Wolfeschlegelsteinhausenbergerdorff Sr. kommt, von Beruf Eisenbahner im Betriebsdienst Fachrichtung Lokführer und Transport in Teilzeit ist und sich darüber beschwert dass dein Programm abstürzt.

    Nimm std::string! Dann kann dir die Länge eines Namens egal sein!

    PS:
    Den Namen gibt es wirklich: https://en.wikipedia.org/wiki/Hubert_Blaine_Wolfeschlegelsteinhausenbergerdorff_Sr.



  • @ShuraiyaKudo sagte in Strukturen, struct, Felder, c++:

    @DocShoe Danke dir aber ich bräuchte es in c da wir das andere zeug noch nicht behandelt haben

    Du hast doch jetzt genügend Anhaltspunkte für Recherche in Eigeninitiative. Hier noch ein paar Stichworte:

    • Iteratoren
    • std::string
    • std::vector
    • std::find_if
    • std::min_element
    • Lambda

    Wenn du zu den einzelnen Punkten Fragen hast werden sie dir hier gern beantwortet sofern du Anstrengungen machst, dich da selbst zu informieren. Also eher sowas wie: "Ich habe nicht ganz verstanden, wie der Comparison Parameter in std::find_if funktioniert" statt "Kann mir jemand erklären, wie find_if funktioniert?".





  • This post is deleted!



  • Mod

    @Bashar sagte in Strukturen, struct, Felder, c++:

    @ShuraiyaKudo sagte in Strukturen, struct, Felder, c++:

    @DocShoe Danke dir aber ich bräuchte es in c da wir das andere zeug noch nicht behandelt haben

    Aufgabenstellung:

    Schreiben Sie ein C++-Programm, das ...

    => Du brauchst es nicht in C, sondern in C++. Du brauchst es vielleicht in schlechtem C++, weil ihr das gute Zeug noch nicht behandelt habt. Aber nicht in C.

    Weiterhin sähe es in "richtigem" C (und nicht der Möchtegern C/C++-Mischung) nochmals anders aus, und du würdest auch nichts davon verstehen. Das ist das Problem, vor dem ich dich warnen wollte: Du lernst gerade weder das eine noch das andere, und wirst am Ende gar nichts können!


Log in to reply