c++ aufgabe - wie anfangen???? :(



  • hey
    ich studiere maschbau und muss daher auch informatik/datenverarbeitung belegen. nun sollen wir folgende aufgabe lösen und ich weiß überhaupt nicht wie ich anfangen soll. habe schon rumprobiert aber komm einfach nicht mit dem fach auf einen nenner. könntet ihr mir vllt einen ansatz nennen? damit ich irgendwie anfangen kann? lg



  • Warum hast du zwei mal das Gleiche geschrieben? Wie auch immer, sieht für mich eher nach einer C als nach einer C++ Aufgabe aus. Bist du sicher, dass ihr das in C++ lösen sollt?
    Ansonsten mal der Ansatz für C:
    Mache dir eine Struktur "Mitarbeiter" die Variablen für alle entsprechenden Daten hält. Dann erstelle ein Array aus Mitarbeitern. (100 Einheiten groß)
    Eigentlich bist du jetzt schon fertig. Wahrscheinlich geht die Aufgabe noch weiter, aber mehr willst du uns ja nicht mitteilen.



  • Hallo hhjoni,

    willkommen im C++-Forum.

    Zu einer solchen Aufgabenstellung gehören die Angaben:
    - was ist die Eingabe für das Programm?
    - was soll das Programm tun?
    - was ist die Ausgabe des Programms?

    Hier mal ein Ansatz:

    #include <algorithm> // copy
    #include <iostream>
    #include <string>
    #include <iterator> // ostream_iterator
    #include <vector>
    
    class Person
    {
    public:
        int m_nr;
        std::string m_name;
        std::string m_vorname;
        char m_geschlecht;
        std::string m_kenntnisse;
        friend std::istream& operator>>( std::istream& in, Person& person );
        friend std::ostream& operator<<( std::ostream& out, const Person& person );
    };
    
    std::istream& operator>>( std::istream& in, Person& p )
    {
        char klammer;
        return getline( getline( getline( in >> p.m_nr >> std::ws, p.m_name, ',' ) >> std::ws, p.m_vorname, ';' ) >> p.m_geschlecht >> klammer, p.m_kenntnisse, ')');
    }
    std::ostream& operator<<( std::ostream& out, const Person& p )
    {
        return out << p.m_nr << " " << p.m_name << "," << p.m_vorname << "; " << p.m_geschlecht << " (" << p.m_kenntnisse << ")";
    }
    
    int main()
    {
        using namespace std;
        vector< Person > personen;
        cout << "Geben Sie bitte mehrere Personen in diesem Format ein:\n";
        cout << "<Personal#> Name, Vorname; <Geschlecht> (Kenntnisse ...)\n";
        cout << "Beispiel:\n";
        cout << "92 Merkel, Hans; m (politische Bildung, Radfahren)\n";
        cout << "Beenden Sie die Eingabe mit einem '#'-Zeichen\n";
        for( Person p; cout << "> ", cin >> p; )
            personen.push_back( p );
        cout << "Sie haben " << personen.size() << " Personen eingegeben" << endl;
        copy( personen.begin(), personen.end(), ostream_iterator< Person >( cout, "\n" ) );
        return 0;
    }
    

    Ergibt z.B. folgenden Dialog:

    Geben Sie bitte mehrere Personen in diesem Format ein:
    <Personal#> Name, Vorname; <Geschlecht> (Kenntnisse ...)
    Beispiel:
    92 Merkel, Hans; m (politische Bildung, Radfahren)
    Beenden Sie die Eingabe mit einem '#'-Zeichen
    > 182 Mueller-Luedenscheit, Jochen;m (-)
    > 26 Polansky, Susi; w(Abitur)
    > 24 Schmidt, Karl Heinz; m (Schlosser, Schreibmaschine)
    > #
    Sie haben 3 Personen eingegeben
    182 Mueller-Luedenscheit,Jochen; m (-)
    26 Polansky,Susi; w (Abitur)
    24 Schmidt,Karl Heinz; m (Schlosser, Schreibmaschine)
    

    :xmas2: Werner



  • @Werner: Also ich find dein Code ja super, aber würde diese Zeile nicht gegen eine der Prinzipien aus "Effective STL" von Scott Meyers verstoßen:

    return getline( getline( getline( in >> p.m_nr >> std::ws, p.m_name, ',' ) >> std::ws, p.m_vorname, ';' ) >> p.m_geschlecht >> klammer, p.m_kenntnisse, ')');
    

    Avoid writing "write-only" Code ?

    Ich interpretiere meine Fähigkeiten in C++ schon auf ziemlich gut, aber der Code braucht echt ne Weile um zu sacken :D:D



  • Meiner bescheidenen Meinung nach ist das ganz und gar kein write-only code.
    Eine Klasse (Person) und überladene Operatoren für Ein- und Ausgabe der Daten. Eigentlich ein Standardvorgehen.



  • Ja ein Standardvorgehen auf jedenfall. Mit write-only meinte ich auch eher das man diesen Code runterschreibt und es beim schreiben alles logisch ist, jedoch wird es beim nachträglichen lesen etwas umfangreicher herauszufinden was der Autor damit meinte. Vielleicht gehts mir nur so, ist nur ein persönliches empfinden.


  • Mod

    Ach, wenn man das ein paar mal gesehen hat, dann ist das eigentlich auch ganz gut zu lesen. Das einzige was man braucht um den Code zu verstehen, ist, dass die ganzen Leseaktionen auf die Streams den Stream selbst zurück geben. Und das nutzt man sowieso dauernd, auch wenn man es vielleicht nicht bemerkt.

    return getline( getline( getline( in >> p.m_nr >> std::ws, p.m_name, ',' ) >> std::ws, p.m_vorname, ';' ) >> p.m_geschlecht >> klammer, p.m_kenntnisse, ')');
    

    Das ist:

    in >> p.m_nr >> std::ws;
    getline(in, p.m_name, ',');
    in >> std::ws;
    getline(in, p.m_vorname, ';' );
    in >> p.m_geschlecht >> klammer;
    getline(in, p.m_kenntnisse, ')');
    return in;
    

    Ist das jetzt viel besser?
    Oder ganz streng genommen müsste man machen:

    in >> p.m_nr;
    in >> std::ws;
    getline(in, p.m_name, ',');
    in >> std::ws;
    getline(in, p.m_vorname, ';' );
    in >> p.m_geschlecht;
    in >> klammer;
    getline(in, p.m_kenntnisse, ')');
    return in;
    

    Jetzt hat man gar keine Aneinanderreihungen mehr.



  • Ist jetzt auf jedenfall schneller nachvollziehbarer 😉
    Aber das ist alles ja nur ne persönliche Einschätzung, ich weiß ja nicht wie das andere sehen.



  • SeppJ schrieb:

    in >> p.m_nr >> std::ws;
    getline(in, p.m_name, ',');
    in >> std::ws;
    getline(in, p.m_vorname, ';' );
    in >> p.m_geschlecht >> klammer;
    getline(in, p.m_kenntnisse, ')');
    return in;
    

    Ist das jetzt viel besser?

    Ja, ist es. Es geht auch nicht darum, den Rückgabewert der Einlesefunktionen nicht zu verwenden, sondern die Funktionsaufrufe zu schachteln bis niemand mehr durchblickt welche Klammer jetzt eigentlich wozu gehört. Von mir aus könnte man das operator >> noch in getline packen, aber die getline untereinander verschachteln? Lieber nicht.



  • Firefighter schrieb:

    @Werner: Also ich find dein Code ja super, aber würde diese Zeile nicht gegen eine der Prinzipien aus "Effective STL" von Scott Meyers verstoßen:

    return getline( getline( getline( in >> p.m_nr >> std::ws, p.m_name, ',' ) >> std::ws, p.m_vorname, ';' ) >> p.m_geschlecht >> klammer, p.m_kenntnisse, ')');
    

    Ja - Du hast Recht. Dieser Code verstößt gegen Item 47 "Avoid producing write-only code". Dort steht unter anderen

    Scott Meyers schrieb:

    Whether code is write-only depends on who's reading it.

    Unter diesem Aspekt (hhjoni liest ihn) ist das definitiv ein Verstoß gegen diese Regel.
    Die Variante von SeppJ ist in dieser Hinsicht besser; und für hhjoni bleiben ohnehin sicher genug Fragen offen.

    :xmas2: Werner



  • @ Werner: Touché 😃



  • .. was haltet Ihr denn von so was?

    // ---  Einlesen einer Person
        return getline( getline( getline(
            // Format:
            //    Pers.#             Name_______,                Vorname_______;       m/w               (________Kenntnisse_______)
            in >> p.m_nr >> std::ws, p.m_name, ',' ) >> std::ws, p.m_vorname, ';' ) >> p.m_geschlecht >> klammer, p.m_kenntnisse, ')');
    

    :xmas2:



  • :D:D Grad musst ich etwas lachen 🙂

    Schöne Lösung, aber sagt man nicht das Code so geschrieben werden soll das man ohne Kommentare arbeiten kann? Jeder Kommentar im Code deutet darauf hin das man hier etwas nicht ordentlich genug "codiert" hat 🙂

    Aber dennoch, gekonnte Umformulierung des Codes.



  • danke schon mal 😃 hab schon bisschen rumprobiert aber bin noch nicht zu einer lösung gekommen... schrecklich, aber ich probier weiter 🙂



  • Werner Salomon schrieb:

    .. was haltet Ihr denn von so was?

    In dem Fall musste ich alle Kommentare entfernen um zu verstehen, was die getlines da eigentlich machen. Jetzt ist zwar das Dateiformat etwas klarer, aber was der Code selbst bedeutet wurde noch weiter verdeckt.

    (ja, ich habe zuerst Seite 2, dann Seite 1 gelesen)

    Was den Code noch etwas schwieriger zu verstehen macht ist, dass getline meistens eingesetzt wird um (wie der Name bereits nahe legt) einzelne Zeilen der Datei auszulesen. Semantisch wird das hier ganz krumm. Natürlich geht es, aber der Code spricht nicht mehr wirklich.



  • ich raff das nicht


  • Mod

    hhjoni schrieb:

    ich raff das nicht

    Aber raffst du:

    in >> p.m_nr;
    in >> std::ws;
    getline(in, p.m_name, ',');
    in >> std::ws;
    getline(in, p.m_vorname, ';' );
    in >> p.m_geschlecht;
    in >> klammer;
    getline(in, p.m_kenntnisse, ')');
    return in;
    

    ?

    Oder verstehst du ganz allgemein nicht, was Werner da gemacht hat (also mit Klassen, Operatorüberladung, Iteratoren und Algorithmen)?



  • für mich ist es ganz schwer diese aufgaben zu lösen. ich kenn wohl einzelne funktionen aber das war es auch schon. das ist überhaupt nicht mein ding.... ich glaub ich brauch jemanden der mir das schritt für schritt erklärt

    ... habs nun 🙂


Anmelden zum Antworten