Einsteigerproblem: Textverarbeitung


  • Mod

    Einfach umsetzbarer Vorschlag in Pseudocode:

    - Daten in Vector data lesen
    - Einen neuen, leeren Vector shuffled gleicher Größe erstellen
    - Einen Vector map_random mit Zahlen erstellen, jede Zahl steht für einen Index in shuffled.
    - Zählschleife mit i von 0 bis data.size():
    {
    - Zufallszahl ran aus [0,map.random.size()) ziehen
    - Daten aus data[i] nach shuffled[map_random[ran]] kopieren
    - map_random[ran] löschen
    }
    - shuffled ist nun der gewünschte zufällig angeordnete Container

    Ist ganz sicher nicht der effizienteste Algorithmus aber recht einfach zu verstehen und umzusetzen.



  • Vielen Dank für die Antworten. Da werd ich das doch gleich mal ausprobieren 🙂



  • Hallo,

    ich möchte nun die daten aus data[i] nach shuffled[map_random[ran]] kopieren und suche gerade nach einer anweisung also nach dem geeigneten befehl.

    meine frage dazu ist, ob es richtig ist die daten mit v.push_back() zu kopieren und wenn ja möchte ich wissen wie ich ihm sage welchen datensatz er kopieren soll.

    vielen dank im voraus


  • Mod

    Das macht man mit =. Also hier shuffled[map_random[ran]] = data[i]

    edit: Stell aber sicher, dass shuffled[map_random[ran]] auch vorhanden ist! Die Größe eines Vectors kann man mit resize() ändern.



  • Hallo,

    ich habe jetzt das Programm soweit ich es geschafft habe geschrieben, allerdings scheint es an mehreren Stellen fehlerhaft zu sein.

    int main(void)
    {  
    // Daten im Vektor teilnehmer lesen
       ifstream teilnehmer;
        teilnehmer.open("teilnehmer.txt");
    
        if(teilnehmer.is_open()){
    
          vector<char> person;
           char line[max_length_of_line]; 
     while( file_in.good() && !file_in.eof() )    
        {
            file_in.getline(line, max_length_of_line);
            person.push_back(char(line)); 
    };
    // Einen neuen, leeren Vector shuffled gleicher Größe erstellen 
    Vector<char> shuffled;
    // Einen Vector map_random mit Zahlen erstellen, jede Zahl steht für einen Index in shuffled. 
    Vector<int> map_random;
    for(int i=0;i>=person.size();++i){
    shuffled.push_back(i);
    ++v[i];
    }
    // Zählschleife mit i von 0 bis data.size():
    for(i=0; i>=person.size();++i)
    {
    // Zufallszahl ran aus [0,map.random.size()) ziehen
    int ran = rand(0,map.random.size());
    // Daten aus data[i] nach shuffled[map_random[ran]] kopieren
     shuffled[map_random[ran]] = data[i];
    // map_random[ran] löschen
    map_random[ran]=0;
    }
    } teilnehmer.close();
    ;
    else cout<<"Datei konnte nicht geöffnet werden!";
    //shuffled ist nun der gewünschte zufällig angeordnete Container 
    cout<< shuffled;
    return 0;
    }
    

    Ich hoffe das mir jemand sagen kann welche prinzipiellen syntaktischen Fehler ich habe oder wo sich sonst noch fehler eingeschlichen haben.

    PS: ich würde mich ja lieber selber in nochmal in ruhe damit befassen aber leider muss ich das programm noch heute per mail abgeben, darum wäre ich hilfe sehr verbunden 😞

    vielen dank im voraus



  • Elessarric91 schrieb:

    PS: ich würde mich ja lieber selber in nochmal in ruhe damit befassen aber leider muss ich das programm noch heute per mail abgeben, darum wäre ich hilfe sehr verbunden 😞

    1. Code ordentlich einrücken, so ist das total unübersichtlich
    2. Da sind richtig gravierende Fehler drin, wenn du Compiler Fehlermeldungen nicht verstehst poste sie hier
    3. Hier macht normal niemand Hausaufgaben
    4. Ich behaupte einfach mal du hast dir nichts zu den verwendeten Klassen durchgelesen, sonst kann ich mir kaum solche Sachen wie "Vector" erklären


  • 1. Da fehlt #include <fstream> und using namespace std.
    Zeile 9: char ist ein einzelnes Zeichen, du suchst string.
    Zeile 10: Wo kommt max_length_of_line her? Zeile durch string line; ersetzen.
    Zeile 11: Wo kommet file_in her?
    Zeile 13: getline(teilnehmer,line);
    Zeile 14: char-Cast gehört weg.
    Zeile 17: Wieso auf einmal Vector, wenn du es davor schon richtig geschrieben hast?!
    Zeile 20: In die Mitte kommt die Bedingung, unter der der Schleifenrumpf ausgeführt wird. Das muss demnach < anstatt >= sein.
    Zeile 22: ...?

    Was du beim Mischvorgang machst, verstehe ich ohnehin nicht.
    In jedem Fall eine bessere Variante: durch den vector gehen und jedes Element mit einem zufälligen Index tauschen (mit swap).



    1. ... wenn du Compiler Fehlermeldungen nicht verstehst poste sie hier

    expected ";" before "else"

    das heißt doch das ein semikolon vorm else erwartet wird oder? das versteh ich nicht weil vorm else ja bereits eins steht 😞



  • Das Semikolon muss da weg. Und teilnehmer.close(); auch.
    Nach dem if-Block muss sofort else folgen.


  • Mod

    Mit dem Programm wirst du durchfallen. Und zwar mit Krachen! Es enthält kaum vorstellbar viele Fehler.

    Ich habe mal eine etwas verbesserte Version gemacht, die ich nicht getestet habe. Sie sollte aber funktionieren. Zumindest compiliert sie, was besser ist als dein Programm und außerdem habe ich über den Algorithmus nachgedacht, du nicht. Es fehlt eine Ausgabe des Ergebnisses. Deine Ausgabe war völlig falsch und hätte nicht funktioniert. Ich habe die Ausgabe nicht korrigiert, weil ich nicht alle deine Hausaufgaben machen will.

    #include <fstream> // Fehlte
    #include <vector>  // Fehlte
    #include <cstdlib> // Fehlte
    #include <iostream>// Fehlte
    #include <string>  // Fehlte nicht, brauche ich aber zum Verbessern deiner Fehler
    
    using namespace std;  // Fehlte
    
    // const unsigned int max_length_of_line = 1000;  // Fehlte. Schlechter Stil. Dynamische Strukturen benutzen. Daher wird dies in der verbesserten Verison nicht benutzt.
    
    int main()    // main(void) ist zwar nicht falsch, aber ungewöhnlicher Stil
    {  
       ifstream teilnehmer;
        teilnehmer.open("teilnehmer.txt");
    
        if(teilnehmer.is_open()){
    
          //      vector<char> person;                 // SCHWERER FEHLER! char ist nur ein Zeichen! Außerdem: Schlecht gewählter Name
          vector<string> personen;                     // Das hier ist besser.
          // char line[max_length_of_line];            // Schlechter Stil. Dynamische Strukturen benutzen.
          string line;                                 // Das hier ist besser
    
          // Das Einlesen vorher war FEHLERHAFT, da nach fehlerhaftem Einlesen (Dateiende!) nicht abgebrochen wurde.
          // Außerdem SCHWERER FEHLER: file_in gibt es nicht. Das heißt teilnehmer!
          // SCHWERER FEHLER: Völliges Missverstehen von C-Strings!
          while( getline(teilnehmer, line))            // So passt der Programmablauf. Außerdem: Abbruchbedingung eleganter geschrieben, Lesen funktioniert
            personen.push_back(line);
    
          // Vector<char> shuffled;                    // Siehe oben. Außerdem: vector falsch geschrieben!
          vector <string> shuffled(personen.size());   // Außerdem. Soll shuffled wie unten benutzt werden, müssen vorher Elemente angelegt werden! Siehe unten.
          vector<int> map_random;                      // vector falsch geschrieben
    
          for(unsigned i=0;i<personen.size();++i)      // FEHLER: Abbruchbedingung falsch
            {
              // shuffled.push_back(i);                // SCHWERER FEHLER: Algorithmus falsch! 
              map_random.push_back(i);                 // So ist es richtig
              // ++v[i];                               // FEHLER: Was ist v? Warum v[i] erhöhen?
            }
    
          for(unsigned i=0; i<personen.size();++i)     // FEHLER: Abbruchbedingung falsch
            {
              //  int ran = rand(0,map.random.size()); // map_random falsch geschrieben. SCHWERER FEHLER: rand() nimmt keine Argumente!
              int ran = rand() % map_random.size();    // So ist es besser
              // shuffled[map_random[ran]] = data[i];  // SCHWERER FEHLER: shuffled hat noch gar keine Elemente. Siehe oben! FEHLER: Was ist data?
              shuffled[map_random[ran]] = personen[i]; // So ist es besser
    
              // map_random[ran]=0;                    // SCHWERER FEHLER! Inwiefern sollte Nullsetzen gleich Löschen sein?
              map_random.erase(map_random.begin()+ran);// So ist es besser
            }
          // teilnehmer.close();                       // Falsch positioniert. Ohnehin unnötig
        }
        // ;                                           // SCHWERER FEHLER: Syntax der if Abfrage nochmal lernen!
        else cout<<"Datei konnte nicht geöffnet werden!";
    
        // cout<< shuffled;                            // SCHWERER FEHLER: So gibt man keinen vector aus! SCHWERER FEHLER: shuffled existiert hier nicht. ALGORITHMUS FEHLER: Was wenn die Datei nicht geöffnet werden konnte?
    
        return 0;
    }
    

    ⚠ Merke: Wenn ich schreibe "SCHWERER FEHLER", dann ist dies keine Übertreibung. Du hast an diesen Stellen schwerwiegende Mängel im grundlegenden Sprachverständis gezeigt.



  • EDIT: ich bitte vielmals um entschuldigung die forenregeln missachtet zu haben und gehofft zu haben das mir hier jemand die hausaufgabe berichtigt aber die angst vor der 6 war etwas zu groß

    vielen dank für die hilfe, jetzt sollte es funktionieren


Anmelden zum Antworten