![]() |
Wörter zählen
Hallo Zusammen!
Ich wollte mein Programm Wörter zählen lassen. Nur leider weiß ich nicht, wie ich das anstellen soll. Ganz grob gedacht, muss er ja nach jedem Leerzeichen die Gesamtzahl mit 1 addieren, aber wie sieht das im Quelltext aus? Danke schon mal für die Hilfe :) |
AW: Wörter zählen
Welche Idee hast du denn schon dazu entwickelt?
|
AW: Wörter zählen
Delphi-Quellcode:
Das habe ich und für wenige Wörter funktioniert das!
procedure TForm1.Button2Click(Sender: TObject);
var i, woerter : integer; text : string; begin woerter:= 1; for i := 0 to length (text) do begin inc(woerter); continue; end; Edit3.Text:= inttostr(woerter); end; |
AW: Wörter zählen
Du hast ja auch noch eine zusätzliche, richtige Idee oben gezeigt. Du musst die Wortgrenzen finden. Das sind in der Regel Leerzeichen. Können aber auch Sonderzeichen wie CR / LF (Zeilenvorschub) oder Tab (Tabulator) sein. Ob du auch Kommata oder Semikolon oder Punkt als Trennzeichen akzeptieren willst, wenn ihnen kein Leerzeichen folgt, musst du dir auch noch überlegen.
Dann kannst du eine Prozedur schreiben, die diese Sonderzeichen findet. das wäre einmal der nächste Schritt. |
AW: Wörter zählen
Zitat:
Ich würde so vorgehen: zuerst einmal legst du fest, welche Zeichen als Worttrenner gelten sollen. Das macht man am besten mit einem Set:
Delphi-Quellcode:
Dann entwickelst du eine Function, die das gewünschte Ergebnis zurückliefert:
private { Private-Deklarationen }
Trenner = set of (' ', '?', ',', '.', ';', '!'); // ... und was dir sonst noch einfällt
Delphi-Quellcode:
Den Beispielcode hab ich nicht getestet, sondern einfach im Foreneditor getippt. Der Code ist natürlich nicht perfekt, zB reagiert er nicht darauf, wenn am Ende des Strings gar kein Trennzeichen mehr steht.
function Form1.GetWordCount(AText : String) : Integer; // "Text" sollte man nicht als Variable verwenden
var i, Zaehler, Laenge : Integer; begin Zaehler := 0; i := 1; Laenge := Length(AText); while i <= Laenge do begin if AText[i] in Trenner then // ein Trennzeichen wurde gefunden begin if (i < Laenge) and (AText[i] = ' ') then // wenn i nicht das letzte Zeichen ist, wird das nächste auf Space geprüft inc(Zaehler); if i = Laenge then // wenn i das letzte Zeichen ist, wird nicht das nächste auf Space geprüft inc(Zaehler); end; inc(i); // nicht vergessen, den Index des Strings zu erhöhen end; Result := Zaehler; end; |
AW: Wörter zählen
Danke für die Hilfe!
Ich schaue, was ich daraus machen kann :-D |
AW: Wörter zählen
Zitat:
Erstmal ist 0 bis Length Einer zuviel, dann zählt das die Zeichen und keine Wörter und zum Schluss sagt der Code immer "2", da Text leer ist. Continue ist zwar Nutzlos, da nachfolgend nichts mehr in der Schleife folgt, aber es verursacht hier wenigstens keinen Fehler. |
AW: Wörter zählen
Das ist eine einfache Aufgabe. Die folgenden Zeilen sollten dein Problem lösen.
Delphi-Quellcode:
Liebe Grüße aus dem Süden
function TokenCount(const cText: String): integer;
var s: string; nPos: integer; begin result:=0; s:=trimright(cText); nPos:=Pos(#32,s); if (nPos=0) and (length(s)>0) then inc(result); while nPos>0 do begin inc(Result); System.Delete(s,1,nPos); s:=trimleft(trimright(s)); nPos:=Pos(#32,s); end; end; |
AW: Wörter zählen
Mit TStringList, Delimiter und DelimitedText sollte das IMHO auch recht einfach zu machen sein.
|
AW: Wörter zählen
Zitat:
Delphi-Quellcode:
Length(SplitString(...))
![]() Im Prinzip braucht man nur irgendwas, das den String an den Wortgrenzen oder Trennzeichen "zerlegt" und zählt dann die Teile. "Schneller" wird der Code, wenn man nur die Trennstellen sucht und zählt und nicht wirklich zerlegt. (unnötige Speicheroperationen) Man kann sogar mit RegEx arbeiten, denn da gibt es nette Steuerzeichen, um "Wort"-Grenzen (Wortanfang/Wortende) zu suchen, wo dazwischen nur "Wort"-Zeichen sind, und zählt dann die Matches. Selbt eine For-Schleife funktioniert gut, wenn man sie richtig implementiert. z.B. alle Zeichen durchgehen, beim (ersten) "Wort"-Zeichen (Buchstaben) den Zähler erhöht und dann alle nachfolgenden "Wort"-Zeichen (Buchstaben, Bindestrich usw.) ignoriert, bis zum nächsten Nicht-Wort-Zeichen und beim nächsten Wort-Zeichen wieder zählen usw. Bzw. ganz billig: Man zählt Alles, wo man ein Wort-Zeichen findet, wo direkt davor ein Nicht-Wort-Zeichen liegt und zählt 1 dazu, wenn das allererste Zeichen auch ein Wort-Zeichen war. "Etwas" Aufwändiger wird es, wenn man mehrfache aufeinanderfolgende "Nicht-Wort-Zeihen" hat und die als "mehrere" Trennstellen zählt, obwohl keine Wörter dazwischen sind. Bei der StringList kann man da z.B. mit StrictDelimiter rumspielen. Dann kann man noch "Nicht-Wörter" ignorieren (z.B. Zahlen) und wenn man dann auch noch zusammengesetzte Wörter erkennen will wird es erst spaßig. Es geht also einfach oder aufwändiger ... jenachdem was man als "Wörter" definiert. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:31 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz