Programm zur Wörtersuche in verschiedenen Texten
-
Hallo
ich bin ganz neu hier und hoffe ihr könnt mir bei einen großen( vielleicht nicht für euch) Problem helfen.
Ich habe noch nicht lange C in der Schule aber die Aufgabe die ich jetzt machen soll ist der Hammer.Zur Aufgabe:
-------------------------------------------------------------------------------
Ich soll eine Programm in C erstellen das mehrere Texte von der Festplatte einliest und anschließend analysiert.
Das System soll den Text indexieren und Wörter in einem Index eintragen, so wie
den Verweis auf die entsprechende Datei. Die Indexierung berücksichtigt dabei Stoppwörter,
die in einer separaten Datei als Liste gespeichert sind.Über eine Suchfunktion hat der Benutzer dann die Möglichkeit nach einzelnen Wörtern im Index zu
suchen. Als Suchergebnis ist eine Liste der den Begriff enthaltenden Dateien vom Programm
auszugeben. Auf Anforderung des Nutzers sollen entweder die ersten zehn Zeilen der Datei
ausgegeben oder eine erweiterte Suche gestartet werden, die in einer ausgewählten Datei
zwei zusammenstehende Wörter sucht.--------------------------------------------------------------------------------
Das Programm soll über ein Menü gesteuert werden über das der Benutzer mindestens eine Suchfunktion auswählen kann, neue Texte erfassen und optional Textdokumente und deren Einträge auch wieder aus dem Index entfernen kann.Ok das habe ich noch geschafft. Da habe ich mit switch eben ein Menü erstellt.
Das ist doch ok so oder?Leider weiß ich jetzt echt nicht weiter.
Wie lese ich überhaupt Texte ein?
Wie mache ich den Index?
Ein Index stellt doch eigentlich eine Tabelle dar oder?Ich habe schon mal da oben die ganze Aufgabe geschrieben damit man den Zusammenhang versteht.
Ich hoffe ihr könnt mir da helfen
Hoffnungsvolle Grüße
-
ink schrieb:
Wie lese ich überhaupt Texte ein?
Mit den Befehlen fopen, fgets, fread, fscanf [1].
ink schrieb:
Wie mache ich den Index?
Ein Index stellt doch eigentlich eine Tabelle dar oder?Du kannst eine Tabelle nehmen. Also nimm eine Struktur, die die Daten speichert und pack sie in ein Array.
[1] http://www.galileocomputing.de/openbook/c_von_a_bis_z/c_018_004.htm#RxxobKap01800404002A1A1F03618C
-
ProgChild schrieb:
ink schrieb:
Wie mache ich den Index?
Ein Index stellt doch eigentlich eine Tabelle dar oder?Du kannst eine Tabelle nehmen. Also nimm eine Struktur, die die Daten speichert und pack sie in ein Array.
Ok der erste Teil ist dann klar danke.
Aber das mit dem Index verstehe ich immer noch nicht.
Was für eine Struktur und wie packe ich das da rein?
Wenn ich den Text dann indexiert habe wie berücksichtige ich dann diese Stoppwörter?Schonmal im Voraus danke
-
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.txtBestellung 1
Markt 2
Winter 12 5 8Leider 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.