Strukturen, Strings und Array/vectoren



  • Hallo an alle,

    das ist mein erster Post hier. Ich bin aktuell dabei C++ zu lernen, also noch nicht so sehr erfahren.

    Ich habe ein Buch über C++, welches mir beim Lernen sehr hilft. Nun zu meinem Problem. In dem besagten Buch befinden sich immer wieder Aufgaben, die man lösen soll, und zu denen es anschließend Musterlösungen gibt. Die aktuelle Aufgabe bezieht sich auf die im Titel genannten Themen. Um etwas genauer zu werden... Die Aufgabe lautet wie folgt:" Erstelle zur folgenden Struktur ein Programm, mit dem du beliebig viele Schuhe in deine Datenbank einlesen kannst. Am Ende gibst du alle Schuhe aus der Datenbank auf den Bildschirm aus. Nutze hierzu die folgende Struktur :

    struct schuhe {
    string marke;
    unsigned int EUgroesse;
    string verschluss;
    string farbe;
    };
    

    Tipp: Verwende hierzu einen Vektor mit der Struktur schuhe:

    vector<schuhe> vecSchuhe;
    

    Aktuell sind die folgenden Zeilen die Überreste meiner Versuche.

    #include <iostream>
    #include <string>
    #include <vector>
    
    using namespace std;
    
    
    
    struct schuhe
    {
    	string marke;
    	unsigned int EUgroesse;
    	string verschluss;
    	string farbe;
    }schuh; 
    
    int main() {
    	vector<schuhe> schuh;
    	cout << "Gib bitte die Schuhmarke ein.";
    	getline(cin, schuh.push_back);
    	
    	
    
    	
    	
    }
    
    

    Ich weiss, dass man damit nicht mehr viel machen kann. Allerdings muss ich zugeben, dass ich irgendwann über die noch nicht behandelte Vectorklasse etwas verärgert war, und dann wild rumprobiert habe. Ich habe zahlreiche Artikel dazu durchgelesen, doch meinem Verständnis hat das nicht geholfen. Ich habe keine Ahnung wie das funktionieren soll. Natürlich habe ich mir die Musterlösung auch angeschaut, die hat meinem Verständnis bei vectoren aber auch nicht geholfen. Ich würde mich sehr freuen wenn mir jemand die Vectorklasse erklären könnte, bzw. mir sagen könnte wie diese arbeitet und angewendet wird.

    MfG
    Mattes



  • @Mattes_meu

    Ich habe zahlreiche Artikel dazu durchgelesen,

    Und jetzt soll hier jemand mal eben den nächsten verfassen?

    Es spricht für das Buch, wenn es vector statt array verwendet. Wenn allerdings tatsächlich nichts erklärt wird, solltest du dir ein anderes besorgen.



  • @Mattes_meu :

    irgendwann über die noch nicht behandelte Vectorklasse etwas verärgert war, und dann wild rumprobiert habe. Ich habe zahlreiche Artikel dazu durchgelesen, doch meinem Verständnis hat das nicht geholfen.

    Kam in den zahlreichen Artikeln auch die in der Linkliste (ganz oben im Forum) erwähnte https://de.cppreference.com/w/ vor? Dort findest Du unter Container-Bibliothek direkt einen Link zu https://de.cppreference.com/w/cpp/container/vector.

    Schau Dir erst mal die Modifiers und den Elementzugriff genauer an. Die Iteratoren gehst Du an, sobald Du Dir selber mit Deinen eigenen Worten die Funktionen zum

    • Einfügen von schuh

    • Auslesen von schuh

    • Löschen von schuh

    erklären kannst.

    Für das getline in Zeile 20 findest Du dann sicher auch noch eine elegantere Möglichkeit, die sogar funktionieren könnte.



  • @daMicha sagte in Strukturen, Strings und Array/vectoren:

    @Mattes_meu :

    irgendwann über die noch nicht behandelte Vectorklasse etwas verärgert war, und dann wild rumprobiert habe. Ich habe zahlreiche Artikel dazu durchgelesen, doch meinem Verständnis hat das nicht geholfen.

    Kam in den zahlreichen Artikeln auch die in der Linkliste (ganz oben im Forum) erwähnte https://de.cppreference.com/w/ vor? Dort findest Du unter Container-Bibliothek direkt einen Link zu https://de.cppreference.com/w/cpp/container/vector.

    Schau Dir erst mal die Modifiers und den Elementzugriff genauer an. Die Iteratoren gehst Du an, sobald Du Dir selber mit Deinen eigenen Worten die Funktionen zum

    • Einfügen von schuh

    • Auslesen von schuh

    • Löschen von schuh

    erklären kannst.

    Für das getline in Zeile 20 findest Du dann sicher auch noch eine elegantere Möglichkeit, die sogar funktionieren könnte.

    OK, vielen Dank schonmal 😊



  • Ich weiß nicht, wie gut, bzw. sicher Du im Umgang mit struct bist. Wenn das auch noch Neuland für Dich ist, solltest Du Dich evtl. erst mal vom Schuh verabschieden und den Umgang mit vector mit einem einfachen Datentyp wie int lernen?



  • Und zu deinem eigenen Verständnis solltest du die Variablen besser benennen, d.h. die Struktur schuh und den vector schuhe. 😉



  • @Mattes_meu sagte in Strukturen, Strings und Array/vectoren:

    Ich würde mich sehr freuen wenn mir jemand die Vectorklasse erklären könnte, bzw. mir sagen könnte wie diese arbeitet und angewendet wird.

    std::vector.

    Wenn Du etwas besonderes wissen willst fehlt da eine Frage.



  • Hallo Mattes, fand das eine interessante Aufgabe um mich als C++ -Neuling auch mal an Vectoren zu versuchen meine funktionierende Lösung sieht so aus:

    #include <string>
    #include <iostream>
    #include <vector>](Link Adresse)
    using namespace std;

    int main(void)
    {
    struct schuh
    {
    int nummer;
    string marke;
    string farbe;
    float preis;
    };
    schuh sSchuh;
    vector<schuh> vecSchuhe;
    char strMarke[20], strFarbe[10]; float fPreis;
    for (int i = 0; i < 3; i++)
    {
    sSchuh.nummer = i+1;
    cout << "Gib die Marke ein: ";
    cin >> strMarke;
    sSchuh.marke = strMarke;
    cout << "Gib die Farbe ein: ";
    cin >> strFarbe;
    sSchuh.farbe = strFarbe;
    cout << "Gib den Preis ein: ";
    cin >> fPreis;
    sSchuh.preis = fPreis;
    vecSchuhe.push_back(sSchuh);
    }
    for (schuh s : vecSchuhe)
    {
    cout << s.nummer <<' ';
    cout << s.marke << ' ';
    cout << s.farbe << ' ';
    cout << s.preis << endl;
    }
    return 0;
    }

    Alles in die main zu packen ist wahrscheinlich schlechter Stil, funktioniert zum Üben aber erstmal. Die for-Schleife liest nicht beliebig viele, sondern zur Probe erstmal 3 Schuhe ein, aber das sollte sich ohen großen Aufwand auf "beliebig viele" umstellen lassen. Außerdem habe ich in meiner Struktur ein wenig andere Eigenschaften aber das ändert am Prinzip nichts. An deinem Codeschnipsel ist schonmal falsch, dass die Strukturvariable und die Vectorvariable beide "schuh" heißen. Die einzelnen Eigenschaften bei der Ein- und Ausgabe der Struktur muss man einzeln ansprechen. Lediglich das "anbacken" eines Schuhpaars (einer fertig gefüllten Schuh-Struktur) an den Vector kann mittels der Zeile "vecSchuhe.push_back(sSchuh)" in einem Rutsch für alle Eigenschaften der Struktur geschehen. Also du musst erstmal deine Strukturvariable mit Eigenschaften füllen, bevor du sie an den Vektor "andockst". Eine gute Idee ist es, den Variablenanfang wie den Datentyp zu benennen, also iVar für Integer, sSchuh für eine Struktur oder strKette für eine Zeichenkette. Habe ich vom OneLoneCoder javidx9 gelernt, dessen youtube-Videos ich nur wärmstens empfehlen kann!

    Gruß
    Guybrush55



  • @Guybrush55

    Eine gute Idee ist es, den Variablenanfang wie den Datentyp zu benennen

    Nein, das ist eine blöde Idee.

    char m[20]

    Warum? Benutze std::string, nicht char arrays. Außerdem kann man direkt in die Struktur einlesen.



  • Hallo Manni,
    ja habe gerade gemerkt, dass ich es selbst nicht konsequent so gemacht habe und deshalb nochmal editiert. Die Idee dahinter ist, dass man am Variablennamen erkennt, welchen Typ die Variable hat - finde ich nicht schlecht. Mit dem char-Array hast du recht, oje, diese alten C-Anhängsel die ich noch im Kopf habe. Für das direkt in die Struktur einlesen wäre ein Beispiel ganz hilfreich. Bin eben, wie gesagt, noch Neuling.
    MfG
    Guybrush55



  • @Guybrush55

    Die ungarische Notation ist mir durchaus bekannt. Aber es ist dennoch eine blöde Idee.

    Siehe auch Bjarne Stroustrup:

    No I don't recommend "Hungarian". I regard "Hungarian" (embedding an abbreviated version of a type in a variable name) a technique that can be useful in untyped languages, but is completely unsuitable for a language that supports generic programming and object-oriented programming - both of which emphasize selection of operations based on the type an arguments (known to the language or to the run-time support). In this case, "building the type of an object into names" simply complicates and minimizes abstraction. To various extent, I have similar problems with every scheme that embeds information about language-technical details (e.g., scope, storage class, syntactic category) into names. I agree that in some cases, building type hints into variable names can be helpful, but in general, and especially as software evolves, this becomes a maintenance hazard and a serious detriment to good code. Avoid it as the plague.



  • @manni66
    ok, wenn der Erfinder von C++ es sagt, will ich dem nicht widersprechen. Und das mit dem Beispiel für direktes Einlesen hat sich erledigt, hab's kapiert einfach "cin >> sSchuh.marke" anstatt umständlich über die - extra über der for-Schleife deklarierten - Variablen.
    Mfg
    Guybrush55


Anmelden zum Antworten