Wörter aus Textdatei zählen und Anzahl mit jeweiliger Wortlänge angeben

domaessle

Grünschnabel
Edit: Handelt sich um ein C Programm
Hallo!
Vorab: Ich bin absoluter Programmier Newbie und habe mich nun die letzten 3 Tage etwas mit C beschäftigt.
Es geht um folgen Übung:
Textdatei auslesen
- Buchstabenanzahl (einmal absolut und einmal relativ in %; der relative wert soll pro 1% ein "+" bekommen; zB 4% : ++++ um das anschaulich zu machen)
- Wortanzahl
- Wortlänge -> zB 1 Zeichen, 5 Zeichen, 8 Zeichen.... bis 10 Zeichen
Das alles in einer Datei als Ergebnis ausgeben.

Natürlich habe ich schon angefangen.
Die Datei wurde schon eingelesen anhand eines Pointers. Die Buchstabenanzahl habe ich mit dem Zähler gesamt bekommen, die einzelnen Buchstaben durch die if Schleifen. Da habe ich im Endeffekt 52 if Schleifen ;) für groß und Kleinschreibung. Geht das auch eleganter?

while ( (c = fgetc(fp) ) !=EOF)
{ gesamt++;
if (c == 'A') // Hier wird die Variable c mit 'A' definiert
{
zaehlerA ++; // für jedes 'A' wird der zaehler um 1 erhöt
}
if (c == 'a') // Hier wird die Variable c mit 'a' definiert
{
zaehlera ++; // für jedes 'a' wird der zaehler um 1 erhöt
}

Die relative Anzahl eines Buchstabens habe ich auch schon. Jetzt weiss ich nicht, wie ich die "+" als Index anzeigen lasse

Soweit bin ich nun; ich kann auch alles schön in einer Datei ausgeben lassen, bis auf die "+" eben.

Beim Wörterzählen hänge ich nun.
Jedes einzelne Wort ist durch ein Whitespace getrennt. Ansich würde ich das wieder mit der "if" Anweisung

if (c == ' ')
{
wortanzahl ++;
}


machen, aber dann zählt er ja alle leerzeichen, auch 2 hintereinander?!

Und wie ich die Wortlänge "rausfiltern" kann, versteh ich nicht.

Ich such mir sowohl im Internet wie auch in meinem Super c Buch den Ast ab, aber finde nix :/
Die Suche hier hab ich auch bemüht...

Ich hoffe, mir kann da jemand helfen :)

Danke schonmal
 
Zuletzt bearbeitet:
Bitte Code-Tags benutzen.
Also, das Wörter zählen kannst du zum Beispiel so lösen:
C++:
bool b = false;
//...

if(c == ' ' && b == false)
{
    b = true;
    wortanzahl++;
}
else if(c != ' ') b = false;

Ich habe es jetzt nicht getestet, aber müsste so gehen. Übrigens ist deine Art der Speicherung sehr undynamisch und zeilenaufwendig. Stattdessen kannst du auch ein Array definieren und folgendes machen:
C++:
unsigned short woerter[255];
while ( (c = fgetc(fp) ) !=EOF)
{ 
     gesamt++;
     woerter[ c]++;      //vgl. ASCII-Tabelle!
}


mfg kickerxy
ps: habe jetzt erst gelesen, dass du auch bemerkt hast, dass deine Art der Speicherung nicht die eleganteste ist ;)
 
danke, werde ich gleich probieren...
aber da wird dann ein array mit nur 256 zeichen erstellt oder?
und so ein text hat doch schnell mehr oder ;)

oder verstehe ich noch nicht ganz, was ein array ist
 
Hi.
C++:
unsigned short woerter[255];
while ( (c = fgetc(fp) ) !=EOF)
{ 
     gesamt++;
     woerter[ c]++;      //vgl. ASCII-Tabelle!
}
Der (erweiterte) ASCII Zeichensatz hat aber 256 Zeichen, also mußt du auch ein Array von 256 Zeichen anlegen.

Außerdem sollte das Array mit 0 initialisiert werden:
C:
unsigned short woerter[256] = { };
danke, werde ich gleich probieren...
aber da wird dann ein array mit nur 256 zeichen erstellt oder?
und so ein text hat doch schnell mehr oder ;)

oder verstehe ich noch nicht ganz, was ein array ist
Du verstehst nicht wozu das Array verwendet wird. In dem Array werden die Zeichen gezählt.

Wenn dort im eingegebenen Text ein 'a' steht, dann wird der Wert in woerter['a'] hochgezählt usw.

Nach Durchlaufen der Schleife stehen in dem Array die Häufigkeiten für jeden einzelnen Buchstaben (bzw. für jedes ASCII Zeichen). Also woerter['3'] die Anzahl aller '3', woerter['z'] die Anzahl der 'z' im Text usw.

Gruß
 
Zuletzt bearbeitet:
Danke, das mit dem Array habe ich jetzt verstanden und es hat auch geklappt :)
Allerdings hat das mit den Woertern noch nicht geklappt, er zählt zuviel.
Ich glaube, dass es daran liegt, dass zwischen manchen Worten mehr als 1 Leerzeichen ist und die Funktion das als neues Wort zählt.
Einzelne Satzzeichen ("bla : "-> 2 Wörter) sollen auch als Worte gezählt werden.

Zusammenfassend: Es kann sein, dass mehr als ein Leerzeichen oder ein Zeilenumbruch oder ein TAB zwischen den Wörtern ist... und die soll es ja nur 1 mal zaehlen!
Wie bekomme ich das hin?

Danke für die Hilfe :)
 
Danke, das mit dem Array habe ich jetzt verstanden und es hat auch geklappt :)
Allerdings hat das mit den Woertern noch nicht geklappt, er zählt zuviel.
Ich glaube, dass es daran liegt, dass zwischen manchen Worten mehr als 1 Leerzeichen ist und die Funktion das als neues Wort zählt.
Einzelne Satzzeichen ("bla : "-> 2 Wörter) sollen auch als Worte gezählt werden.

Zusammenfassend: Es kann sein, dass mehr als ein Leerzeichen oder ein Zeilenumbruch oder ein TAB zwischen den Wörtern ist... und die soll es ja nur 1 mal zaehlen!
Wie bekomme ich das hin?
Du könntest z.B. nur alle Wortanfänge zählen. Überleg dir mal wie du einen Wortanfang erkennen kannst und wie das dann evtl. in C/C++ realisiert werden könnte.

Gruß
 
Naja, also nen WOrtanfang würde ich so defninieren, dass ein '" '" und dann irgendein Zeichen ausser "' '" kommt.

Heisst, ich brauche eine Schleife, der ich die 2 Bedingungen mitteilen kann.

Dann noch einen Zähler, der die Worte zählt, oder?
 
Naja, also nen WOrtanfang würde ich so defninieren, dass ein '" '" und dann irgendein Zeichen ausser "' '" kommt.
Nur " "? Was ist mit \n \r \t ? Es gibt eine Standardfunktion namens isspace(). :google:
Heisst, ich brauche eine Schleife, der ich die 2 Bedingungen mitteilen kann.
Nein. Benutze doch einfach die Schleife die du schon hast. Du mußt doch nur prüfen können ob das vorige Zeichen (falls es eins gab!) ein Freiraumzeichen war und ob das aktuelle Zeichen kein Freiraumzeichen ist.
Dann noch einen Zähler, der die Worte zählt, oder?
Ja, natürlich mußt du die Worte auch irgendwo zählen ;)

Gruß
 
ok, hab das nun folgendermaßen in meine schleife gebaut:

"if ( isspace(c)) wortanzahl++;"

so gibt er mir alle whitespaces aus, also wieder zuviele...

wie kann ich schauen, ob das vorige zeichen ein ws war?
wieder mit einem if? bedingung, dass das letzte c ein ws war und dann die wortanzahl++?
wie kann ich machen, dass er das letzte c überprüft, obwohl er schon beim nächsten ist?

sorry, ich steh da echt aufm schlauch :(
 
ok, hab das nun folgendermaßen in meine schleife gebaut:

"if ( isspace(c)) wortanzahl++;"

so gibt er mir alle whitespaces aus, also wieder zuviele...

wie kann ich schauen, ob das vorige zeichen ein ws war?
wieder mit einem if? bedingung, dass das letzte c ein ws war und dann die wortanzahl++?
wie kann ich machen, dass er das letzte c überprüft, obwohl er schon beim nächsten ist?

sorry, ich steh da echt aufm schlauch :(
Warum speicherst du denn nicht einfach immer das letzte Zeichen?

Und bitte halte dich an die Netiquette, insbesondere Groß-/Kleinschreibung. Danke!

Gruß
 

Neue Beiträge

Zurück