Zwei Arrays in deren Länge und Buchstaben vergleichen.



  • Also: Ich will eine Art unscrambler programmieren der mir 2 .txt Files vergleicht. (Ich bin noch sehr ungeübt und habe gerade einmal die Basics gelernt also nicht meckern. 😉 ) Ich habe das Programm schon so weit das ich die 2 Text-Files einlese und jetzt möcht ich sie, wie im Titel angegeben in deren Länge und Buchstaben vergleichen um so sagen zu können welches "gescrambelte" Wort zu dem dazugehörigen "ungescrambelten" Wort gehört.
    Hier mein "Code":

    /* Firespy's Unscrambler!
    It takes words from a Wordlist called wordlist.txt 
    and compares it with the scrambled ones
    from scrambled.txt with the ones vom wordlist.txt 
    (how many charakters and which letters)
     and then prints out the solution.
     */
    #include <stdio.h>
    #include <iostream.h>
    #include <string>
    using namespace std;
    
    int main ()
    
    {
    //declaring variables
    	string uscr_w [1274],scr_w [10],res_w[10];
    
    // saving the file wordlist.txt to the uscr_w array
    FILE * str;
    str = fopen ("wordlist.txt","r");
    fscanf (str, "%s", &uscr_w);
    // saving the file with the scrambled words to scr_w array
    FILE * swstr;
    swstr = fopen ("scrambled.txt","r");
    fscanf (swstr, "%s", &scr_w);
    return 0;
    }
    

    Und noch eine zusätzliche Frage:
    Wie kann ich in Visual c++ (6) die (Code)Zeilen anzeigen?



  • Das heißt, die Wörter sollen die selben Buchstaben enthalten, aber womöglich in anderer Reihenfolge, richtig? Wenn ja: beide Wörter sortieren und danach vergleichen.

    PS: Und da wir schon im C++ Board sind, solltest du auch die C++ Möglichkeiten wie fstream und string verwenden 😉



  • Ja, die Annahme ist völlig richtig. Aber wie kann ich das gescrambelte Wort so sortieren, dass es zum Normalen (ungescrambleten) passt? Ich meine meine Wordliste hat mehr als 1000 Wörter und die Wörter die ich unscrambln muss sind nur 10.



  • brute force, sind doch nur 10.000 vergleiche 😉



  • Das ganze soll aber unter 30 Sekunden geschehen sein. 🙂



  • das war kein scherz. 10k vergleiche sind sozusagen nicht der rede wert.



  • Das war auch kein Scherz mit den 30 Sekunden. 😛



  • wenn ich sage "nicht der rede wert", dann rede ich über zeitabschnitte, die unter ner halben sekunde liegen 😉



  • Ok, von mir aus, aber ich würde es trotzdem gerne auf die Methode probieren die in der topic steht. *nerv*



  • Die beste Lösung ist es, die Vergleichswörter doppelt sortiert abzulegen (erstens direkt beim Einlesen die Buchstaben des gescrambelten Wortes sortieren und zweitens die einzelnen Vergleichswörter in einer sortierten Datenstruktur lagern (z.B. set<> oder map<>*)) - dann reduziert sich das auf ca. 10 Vergleiche pro Eingabe.

    *hier würde ich sogar die map<> vorziehen:

    //sortiert die Zeichen eines Strings alphabetisch
    string sortstring(string data)
    {
      sort(data.begin(),data.end());
      return data;
    }
    
    map<string,string> wortliste;
    
    //einlesen
    string wort;
    fin>>wort;
    wortliste.insert(make_pair(sortstring(wort),wort)));
    
    //suchen
    string suchwort;
    cin>>suchwort;
    map<string,string>::iterator pos=wortliste.find(sortstring(suchwort));
    if(pos!=wortliste.end())
      cout<<"Wort gefunden: "<<pos->second;
    


  • Firespy schrieb:

    Und noch eine zusätzliche Frage:
    Wie kann ich in Visual c++ (6) die (Code)Zeilen anzeigen?

    Ich hab VC++ 2003 und dort ist es "Tools->Options->Text Editor->C/C++->Display Line Numbers"


Anmelden zum Antworten