Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » C-Programm " Worthäufigkeit bestimmen"

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
03.09.2004, 15:53 Uhr
~sugarboat
Gast


hallo zusammen,

muss für die uni ein c programm schreiben, welches eine Datei einliest und die Häufigkeit der einzelnen Wörter bestimmt die in dem Text vorkommen.
Das ganze soll alphabetisch ausgegeben werden.

Programmiere schon ne ganze Weile daran rum.

Möchte mit fscanf die Datei einlesen....weiss jemand wenn ich mit %s einlese ob dann hinter jedes eingelesene wort die \0 angehängt wird.
Wie lese ich am besten ein...fscanf,fgets?


Dann char *zeiger[] auf die einzelnen Wörter.

Um die Häufigkeit zu bestimmen hab ich mir gedacht vielleicht mit strcmp zu arbeiten?
Kann mir hierbei jemand helfen?


und sortieren mit quicksort.....läuft soweit.

Am Schluss soll das Programm diese Ausgabe haben:

Zigeuner (1 mal)
Tarzan (4 mal)
Beate ( 3 mal)


Wäre nett von euch wenn mir jemand weiter helfen kann.
Vielleicht weiss ja auch jemand einen link zu diesem Thema.

Vielen Dank

Sugarboat
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
03.09.2004, 16:10 Uhr
virtual
Sexiest Bit alive
(Operator)


Generell, wenn es C sein soll, ist fgets besser: fscanf hat zwar den brillianten Vorteil, nur wortweise einzulesen, dh ein fscanf(... "%s" ...) gibt dir stehts ein Wort, ggf mit Punkt, Ausrupfezeichen oder ähnlichem zurück (es interpretieren whitespace als Worttrenner), aber dagegen steht ein ziemlich gewaltiger nachteil: es ist nicht sicher.

Ganz toll stehst Du da, wenn du einfach C++ nimmst:
1. Datei komplett einlesen, in einen stringstream (über copy)
2. Alles was nicht alphanumerisch ist, in leerzeichen wandeln (über std::transform)
3. Alles in Wörter zerlegen (über std::copy und istream_iterator<std::string>
4. Die Häufgkeiten in einer Map ermerken
5. Die Map ausgeben, ist bereits sortiert.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
03.09.2004, 16:11 Uhr
Pablo
Supertux
(Operator)


Wo ist dein Ansatz? Wir helfen dir gerne, aber wir können keine Lösung geben (Kein Hausaufgaben-Service).

Um die einzelne Wörter zu bekommen, würde ich strtok mit den Tokens " ,.;:'\"" benutzen.


Bearbeitung von Supertux:

heute bin ich zu langsam.


--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!

Dieser Post wurde am 03.09.2004 um 16:12 Uhr von Pablo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
03.09.2004, 16:28 Uhr
~sugarboat
Gast


ja danke für euer posting :-)

virtual...hätte ne frage....hängt er mir die \0 an jedes eingelesene wort bei fscanf an?

oder müsst ich die ihm selber geben...dachte eigentlich wenn ich mit printf("%s\n", wort)
auslese, bekomme ich jedes wort in einer neuen zeile, dann müsste er mir die \0 angehängt haben oder?
Wenn ja kann ich ja mit strcpy den array in mein char *zeiger[max] kopieren.?

Hätte noch ne Frage. Kann ich zeigerwerter inkrementieren also z.B. das er mir die Anzahl wie oft das Wort vorkommt hochzählt...vielleicht sowas wie zeiger[i]++?

Danke

Ja will auch keine Lösung von euch haben....brauche nur jemanden mit dem ich ein bisschen ausfragen kann. Hab erst vor einer Woche mit C angefangen sorry :-)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
03.09.2004, 16:47 Uhr
Oliver
S2-Pixelgeneral


Ich würde es mit fread einlesen.

Erst den Dateizeiger ans Ende setzen, dann Lenge ermitteln und dann einlesen:


C++:
int len;
FILE*file;
char * buffer;
file=fopen("c:\\diedatei.txt","rb");

fseek(file,0,SEEK_END);
len=ftell(file);
buffer=new char[len+1];
rewind(file);
fread(buffer,len,1,file);
buffer[len]=0;

delete [] buffer;
fclose(file);


--
Demokratie ist die Diktatur der Mehrheit.

www.siedler25.org/ ( Siedler2 - Remake )
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
03.09.2004, 16:53 Uhr
Pablo
Supertux
(Operator)



Zitat von ~sugarboat:
ja danke für euer posting :-)

virtual...hätte ne frage....hängt er mir die \0 an jedes eingelesene wort bei fscanf an?



Ich bin zwar nicht virtual aber ja.


Zitat von man fgets:

fgets() reads in at most one less than size characters from stream and stores them into the buffer pointed to by
s. Reading stops after an EOF or a newline. If a newline is read, it is stored into the buffer. A '\0' is
stored after the last character in the buffer.




Zitat von ~sugarboat:

Wenn ja kann ich ja mit strcpy den array in mein char *zeiger[max] kopieren.?



Das ist möglich, aber so

C++:
char x[10][10];
strcpy(x[0], "Hallo");
strcpy(x[1], "Welt");
...




Zitat von ~sugarboat:

Hätte noch ne Frage. Kann ich zeigerwerter inkrementieren also z.B. das er mir die Anzahl wie oft das Wort vorkommt hochzählt...vielleicht sowas wie zeiger[i]++?



Das ist möglich.


C++:
zeiger[i]++;


inkrementiert aber den Inhalt an der i. Stelle von Zeiger um 1.
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
09.09.2004, 05:02 Uhr
~sugarboat
Gast


Hallo Zusammen,

hab den String jetzt drin....:-)
und zwar hab ich auf jedem Wort eine char *tokens[0-230] (also Zeiger).
Hab das ganze mit sort alphabetisch sortiert.

Die Liste sieht so aus:

Alten
Alten
Alten
Bernd
Bernd
Thomas
Zigeuner

möchte jetzt die Häufigkeiten der einzelnen bestimmen.
Hab den Code dafür geschrieben..er kompiliert richtig aber stürzt beim ausführen ab.


C++:
for (i=0;i<231;i++)
        {
            zaehler=1;
            akwort[i]=tokens[i];
            
            while (strcmp(akwort[i],tokens[i+1])==0)
                {
                    zaehler++;
                    i++;
                }
        }



akwort ist das aktuelle wort auf dem der zeiger steht.
tokens : zeiger auf die einzelnen token

Vielleicht hab ich hier ja einen Gedankenfehler.

Wäre echt nett wenn mir jemand weiterhelfen könnte. *bütte*

Vielen Dank

sugarboat
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
09.09.2004, 08:30 Uhr
ao

(Operator)



Zitat von ~sugarboat:
Hallo Zusammen,
Hab den Code dafür geschrieben..er kompiliert richtig aber stürzt beim ausführen ab.


C++:
for (i=0;i<231;i++)
            while (strcmp(akwort[i],tokens[i+1])==0)





Vielleicht Array-Grenzen überschritten. Die Schleife läuft von 0 bis 230 (inklusive). Dann greifst du am Ende auf tokens[231] zu, was es nicht gibt -> Zugriffsfehler.

Und wie ist akwort definiert?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
09.09.2004, 13:40 Uhr
~sugarboat
Gast


Hier die Definition:

char *akwort[231];

wie kann ich das Problem lösen?

Vielen Dank
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
09.09.2004, 16:06 Uhr
ao

(Operator)



Zitat von ~sugarboat:
wie kann ich das Problem lösen?



C++:
for (i = 0; i < 230; i++)


So besser?

Aber ich glaube, du müsstest einen eigenen Zähler für jedes Wort haben. So wie es jetzt aussieht, zählt der Zähler die Mehrfachvorkommen *aller* Wörter.

Kennst du schon struct?


C++:
struct stWortAnzahl
{
    char strWort [50]; // erst mal ein String fester Länge, mit dynamischem Speicher schlagen wir uns erst nächste Woche herum ;-)
    int nAnzahl;
};

struct stWortAnzahl WortAnzahlen [231];



Vorgehen: Die sortierte Tokens-Liste von oben bis unten abeiern, für jedes neue Wort ein neues stWortAnzahl-Objekt nehmen, das Wort in strWort eintragen und die Anzahl auf 1 setzen. Für jedes Wort, das du schon kennst, die Anzahl um 1 erhöhen.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: