Programm zur Wörtersuche in verschiedenen Texten



  • Würde sowas machen

    typedef struct {
      char wort[64];
      char datei_name[128];
      int zeile;
    } Daten;
    
    ...
    
    Daten index[1028];
    

    Und dann schreibst du die Daten dort rein. Und wenn du ne abfrage machst, musst du halt das komplette Feld absuchen. Das ganze würde mit Binären-Suchbäumen schneller gehen, aber danach ist ja nicht gefragt. So ists einfacher.



  • ProgChild schrieb:

    Und dann schreibst du die Daten dort rein. Und wenn du ne abfrage machst, musst du halt das komplette Feld absuchen. Das ganze würde mit Binären-Suchbäumen schneller gehen, aber danach ist ja nicht gefragt. So ists einfacher.

    OK das mit der Suche scheine ich auch zu verstehen.

    Aber ich verstehe immer noch nicht wie so der Text dann indexiert wird.
    Was für Daten reinschreiben?
    Ich habe gedacht das Funktioniert so:
    Ich sage mit fopen wo der Text zu finden ist und das Programm liest ihn komplett ein.
    Dann Suche ich auf in diesem Index die Wörter die ich will.

    Kannst du mir das bitte irgendwie verständlich erklären?



  • ink schrieb:

    Aber ich verstehe immer noch nicht wie so der Text dann indexiert wird.
    Was für Daten reinschreiben?
    Ich habe gedacht das Funktioniert so:
    Ich sage mit fopen wo der Text zu finden ist und das Programm liest ihn komplett ein.
    Dann Suche ich auf in diesem Index die Wörter die ich will.

    Du liest dir als erstes ein C-Tutorial durch, wo steht, wie du fopen benutzt.

    Dann liest du die Dateien Zeile für Zeile ein und suchst mir der Funktion strstr nach dem Auftreten von den bestimmten Worten. Wenn du eins findest, trägst du es in dem Array in die Strukur ein und speicherst in welcher Zeile du welches Wort und in welcher Datei du es gefunden hast.



  • Ich habe leider die Aufgabenstellung wohl etwas falsch verstanden.

    Es soll so ablaufen:

    Der Text wird eingelesen und die Stoppwortliste auch.
    Die 2 Dokumente müssen quasi zwischengespeichert werden.

    Dann soll jedes Wort, Wort für Wort mit der Stoppwortliste verglichen werden und wenn es da nicht vorhanden ist wird es in den Index gepackt an welcher Stelle des Textes es gefunden wird.

    Das kann man sich dann ca. so vorstellen.

    ------------------------------------------------------------------------------------
    ___________________________Dateiname______________________________________
    Wort im Index Test.txt Wolfsburg.txt Weihnachten.txt

    Bestellung 1
    Markt 2
    Winter 12 5 8

    Leider bekomme ich hier keine Tabelle hin. Ich hoffe es ist klar was ich meine.
    Geht das dann genauso wie du es mir erklärt hast?
    Danke



  • Ja. Das geht. Deine Tabelle bekommst du, wenn du die Struktur in ein Array packst.



  • Ja ok aber wie packe ich das da rein?

    Sorry aber das check ich nicht richtig.



  • ink schrieb:

    Ja ok aber wie packe ich das da rein?

    Sorry aber das check ich nicht richtig.

    Wo ist denn das Problem? Weist du nicht, wie man mit Stukturen und Feldern arbeitet?



  • ProgChild schrieb:

    ink schrieb:

    Ja ok aber wie packe ich das da rein?

    Sorry aber das check ich nicht richtig.

    Wo ist denn das Problem? Weist du nicht, wie man mit Stukturen und Feldern arbeitet?

    Nein das verstehe ich noch nicht richtig.

    Werde das nochmal in diesem Openbook nachlese.

    Aber für einen Wink mit dem Zaunpfahl wäre ich auch dankbar.



  • ink schrieb:

    Nein das verstehe ich noch nicht richtig.

    Werde das nochmal in diesem Openbook nachlese.

    Aber für einen Wink mit dem Zaunpfahl wäre ich auch dankbar.

    Weis net, wie ich noch winken soll 😉

    typedef struct {
      char wort[64];
      char datei_name[128];
      int zeile;
    } Daten;
    
    ...
    // z.b. in main Funktion
    Daten index[1028];
    
    int n; // n-ter treffer
    
    // jetzt beim durchsuchen
    char* gefundenes_wort;
    int gefundene_zeil;
    
    // eintragen
    strcpy(index[n].wort, gefundenes_wort);
    strcpy(index[n].datei_name, aktuelle_datei);
    index[n].zeile = gefundene_zeile;
    
    n=n+1;
    // nächstes Wort suchen...
    

    So könnte es gehen. Ist zwar zum durchsuchen schlechter, aber du kannst es ja auch anders machen.



  • Super Danke

    Wie würde das denn dann bei einem Array aussehen und was wäre denn für die Aufgabe die ich beschrieben habe vorteilhafter? Ein Bekannter meinte das das nicht richtig mit einem Struct geht
    hat er da recht.

    Noch was: gibt es eine Funktion oder einen Ausdruck in C der die eingelesenen Wörter alle klein schreibt?



  • ink schrieb:

    Wie würde das denn dann bei einem Array aussehen

    Ich Benutze doch oben ein Array.

    ink schrieb:

    und was wäre denn für die Aufgabe die ich beschrieben habe vorteilhafter?

    Wenn du es richtig machst, schreibst du die Wörter einen AVL-Baum/Red-Black-Tree, der als Schlüssel die Wörter nimmt, und als Daten eine Doppeltverkettete Liste mit den Dateinamen hat, aber das wirst du noch nicht umsetzen können.

    ink schrieb:

    Ein Bekannter meinte das das nicht richtig mit einem Struct geht
    hat er da recht.

    Wie gesagt. In gewissem maße kannst du es garnicht vernünftig machen, weil du dafür noch viel mehr wissen müsstest.

    ink schrieb:

    Noch was: gibt es eine Funktion oder einen Ausdruck in C der die eingelesenen Wörter alle klein schreibt?

    Nein. Nur einzelne Zeichen. Die Funktion heißt tolower.



  • ProgChild schrieb:

    ink schrieb:

    Ein Bekannter meinte das das nicht richtig mit einem Struct geht
    hat er da recht.

    Wie gesagt. In gewissem maße kannst du es garnicht vernünftig machen, weil du dafür noch viel mehr wissen müsstest.

    Das stimmt leider.
    Ich bin langsam echt am verzweifeln und glaube das ich das nie schaffe.
    Das Ding muss bis zum 1.3 fertig sein.



  • ink schrieb:

    Das stimmt leider.
    Ich bin langsam echt am verzweifeln und glaube das ich das nie schaffe.
    Das Ding muss bis zum 1.3 fertig sein.

    Lass dich nicht entmutigen. Du hast ja noch genügend Zeit und du sollst nicht die beste Lösung der Welt erstellen, sondern "nur" eine Lösung. Schau dir genau die Informationen über Arrays und Strukturen an, die du hast, dann überleg dir, wie man daraus zusammen eine Tabelle bauen kann. Und wenn du speziellere Fragen hast, kannst du sie ja hier stellen.



  • Ok mal sehen ob ich es richtig verstanden habe.

    Ich öffne durch fopen die Datei deren Wörter ich indexieren will.
    Dann lese ich jedes Wort zeichenweise durch die Funktion getc/fgetc ein. Das muss ja dann bis eof gehen oder**?**

    Und durch deine Codestück wird das dann in ein array eingetragen.
    Versteh ich das soweit richtig?

    Meine Frage:
    Man muss ja die Datei mit einer Stoppwortliste die in einer anderen Datei ist vergleichen.
    Nur die Wörter die nicht in der Stoppwortliste sind werden dann eingetragen.
    Wie und Wann vergleiche ich diese beiden Dokumente am besten**?**



  • ink schrieb:

    Ok mal sehen ob ich es richtig verstanden habe.

    Ich öffne durch fopen die Datei deren Wörter ich indexieren will.
    Dann lese ich jedes Wort zeichenweise durch die Funktion getc/fgetc ein. Das muss ja dann bis eof gehen oder**?**

    Das sollte gehen.

    ink schrieb:

    Und durch deine Codestück wird das dann in ein array eingetragen.
    Versteh ich das soweit richtig?

    Ja, wird es.

    ink schrieb:

    Meine Frage:
    Man muss ja die Datei mit einer Stoppwortliste die in einer anderen Datei ist vergleichen.
    Nur die Wörter die nicht in der Stoppwortliste sind werden dann eingetragen.
    Wie und Wann vergleiche ich diese beiden Dokumente am besten**?**

    Lies jedes Wort aus der Stoppwortliste in ein Array ein. Und vergleich es dann mit den Zeilen aus den Dateien.



  • Muss die Datei denn dann immer mit fclose geschlossen werden oder kann man das wegfallen lassen?



  • ink schrieb:

    Muss die Datei denn dann immer mit fclose geschlossen werden oder kann man das wegfallen lassen?

    Ja muss sie.



  • Ich öffne ne Datei mit fopen, dann lese ich Sie irgendwie Zeilenweise aus mit fgets, das wird dann mit strtok nach Leerzeichen zerlegt und dann mit fclose das wieder geschlossen.

    Wie würde das denn dann circa aussehen?
    Ich kann mir das noch nicht richtig vorstellen

    Danke



  • Kann mir da denn keiner helfen?



  • ink schrieb:

    Kann mir da denn keiner helfen?

    Deine Frage ist ziemlich ungenau. Du hast doch schon beschrieben, wie es ungefähr aussehen soll.


Anmelden zum Antworten