类似编译原理的词法分析的过程,遇到非字母的字符,就截取该字符前的字符串,这是我用前几天做的词法分析程序帮你修改的. 我做的这个只计算单词的数量,不计算数字或标点等. //定义全局变量 var s: string; //读取Memo中的字符串 p: PChar; //字符扫描的指针 iWord: Integer;//读字符 function GetNextChar: Char; begin if p^ = #0 then //字符串结束标志 begin Result := #0; end else begin Result := p^; Inc(p); end; end;procedure TForm1.Button1Click(Sender: TObject); var NextChar: Char; NewString: string; //截获的字符串 begin if Memo1.Text<> '' then s := Memo1.Text; else Exit; p := @s[1]; iWord:= 0; NewString:= ''; NextChar := GetNextChar; while NextChar <> #0 do begin case NextChar of ' ', #10,#13: begin if Trim(NewString)<>'' then Inc(iWord); NewString:= ''; end; 'a'..'z', 'A'..'Z': begin if NewString='' then NewString:= NextChar else begin if NewString[1] in ['a'..'z', 'A'..'Z'] then NewString := NewString + NextChar else NewString:= NextChar; end; end; else begin if NewString<>'' then NewString:= ''; end; end; NextChar := GetNextChar; end; if NewString<>'' then begin if NewString[1] in ['a'..'z', 'A'..'Z'] then Inc(iWord); end; showmessage(IntToStr(iWord)); end;给分了!!!!!
上面的Button1Click有点问题,这是修正后的。procedure TForm1.Button1Click(Sender: TObject); var NextChar: Char; NewString: string; begin if Memo1.Text<> '' then s := Memo1.Text else Exit; p := @s[1]; iWord:= 0; NewString:= ''; NextChar := GetNextChar; while NextChar <> #0 do begin case NextChar of ' ', #10,#13: begin if Trim(NewString)<>'' then Inc(iWord); NewString:= ''; end; 'a'..'z', 'A'..'Z': begin if NewString='' then NewString:= NextChar else begin if NewString[1] in ['a'..'z', 'A'..'Z'] then NewString := NewString + NextChar else NewString:= NextChar; end; end; end; NextChar := GetNextChar; end; if NewString<>'' then begin if NewString[1] in ['a'..'z', 'A'..'Z'] then Inc(iWord); end; showmessage(IntToStr(iWord)); end;
to crossbow(La Vida Es Amor): 那么就请你把你的算法给大家共享一下,大家共同学习研究一下。 先谢了!!!!
function PosStrCase(const FindStr, SourceStr: string; StartPos: integer): integer; {Case sensitive} asm PUSH ESI PUSH EDI PUSH EBX PUSH EDX TEST EAX,EAX JE @@qt TEST EDX,EDX JE @@qt0 MOV ESI,EAX MOV EDI,EDX MOV EAX,[EAX-4] MOV EDX,[EDX-4] DEC EAX SUB EDX,EAX DEC ECX SUB EDX,ECX JNG @@qt0 XCHG EAX,EDX ADD EDI,ECX MOV ECX,EAX JMP @@nx @@fr: INC EDI DEC ECX JE @@qt0 @@nx: MOV EBX,EDX MOV AL,BYTE PTR [ESI] @@lp1: CMP AL,BYTE PTR [EDI] JE @@uu INC EDI DEC ECX JE @@qt0 CMP AL,BYTE PTR [EDI] JE @@uu INC EDI DEC ECX JE @@qt0 CMP AL,BYTE PTR [EDI] JE @@uu INC EDI DEC ECX JE @@qt0 CMP AL,BYTE PTR [EDI] JE @@uu INC EDI DEC ECX JNE @@lp1 @@qt0: XOR EAX,EAX @@qt: POP ECX POP EBX POP EDI POP ESI RET @@uu: TEST EDX,EDX JE @@fd @@lp2: MOV AL,BYTE PTR [ESI+EBX] CMP AL,BYTE PTR [EDI+EBX] JNE @@fr DEC EBX JE @@fd MOV AL,BYTE PTR [ESI+EBX] CMP AL,BYTE PTR [EDI+EBX] JNE @@fr DEC EBX JE @@fd MOV AL,BYTE PTR [ESI+EBX] CMP AL,BYTE PTR [EDI+EBX] JNE @@fr DEC EBX JE @@fd MOV AL,BYTE PTR [ESI+EBX] CMP AL,BYTE PTR [EDI+EBX] JNE @@fr DEC EBX JNE @@lp2 @@fd: LEA EAX,[EDI+1] SUB EAX,[ESP] POP ECX POP EBX POP EDI POP ESI end;QString中的这个函数定位速度奇快,搜索字典很好....在字典中查找 Word + #13#10字典一行一个词还需要一个快速的替换函数,避免数组的频繁移动。否则10万字的文章会要一个小时!!!没人捧场?买个关子... :)
拼写检查在 你的文本控件中的onpress 每输入一个空格就检查词库中是否有这个单词
具体函数 :
readline//读一行
strpos(str,str1)//检查 字符串str是否包含的字串str1
我做的这个只计算单词的数量,不计算数字或标点等.
//定义全局变量
var
s: string; //读取Memo中的字符串
p: PChar; //字符扫描的指针
iWord: Integer;//读字符
function GetNextChar: Char; begin
if p^ = #0 then //字符串结束标志
begin
Result := #0;
end else
begin
Result := p^;
Inc(p);
end;
end;procedure TForm1.Button1Click(Sender: TObject);
var
NextChar: Char;
NewString: string; //截获的字符串
begin
if Memo1.Text<> '' then s := Memo1.Text;
else Exit;
p := @s[1];
iWord:= 0;
NewString:= ''; NextChar := GetNextChar;
while NextChar <> #0 do
begin
case NextChar of
' ', #10,#13:
begin
if Trim(NewString)<>'' then
Inc(iWord);
NewString:= '';
end; 'a'..'z', 'A'..'Z':
begin
if NewString='' then NewString:= NextChar
else
begin
if NewString[1] in ['a'..'z', 'A'..'Z'] then
NewString := NewString + NextChar
else NewString:= NextChar;
end;
end; else
begin
if NewString<>'' then
NewString:= '';
end;
end; NextChar := GetNextChar;
end;
if NewString<>'' then
begin
if NewString[1] in ['a'..'z', 'A'..'Z'] then
Inc(iWord);
end;
showmessage(IntToStr(iWord));
end;给分了!!!!!
var
NextChar: Char;
NewString: string;
begin
if Memo1.Text<> '' then s := Memo1.Text
else Exit;
p := @s[1];
iWord:= 0;
NewString:= ''; NextChar := GetNextChar;
while NextChar <> #0 do
begin
case NextChar of
' ', #10,#13:
begin
if Trim(NewString)<>'' then
Inc(iWord);
NewString:= '';
end; 'a'..'z', 'A'..'Z':
begin
if NewString='' then NewString:= NextChar
else
begin
if NewString[1] in ['a'..'z', 'A'..'Z'] then
NewString := NewString + NextChar
else NewString:= NextChar;
end;
end;
end; NextChar := GetNextChar;
end;
if NewString<>'' then
begin
if NewString[1] in ['a'..'z', 'A'..'Z'] then
Inc(iWord);
end;
showmessage(IntToStr(iWord));
end;
先谢了!!!!
asm
PUSH ESI
PUSH EDI
PUSH EBX
PUSH EDX
TEST EAX,EAX
JE @@qt
TEST EDX,EDX
JE @@qt0
MOV ESI,EAX
MOV EDI,EDX
MOV EAX,[EAX-4]
MOV EDX,[EDX-4]
DEC EAX
SUB EDX,EAX
DEC ECX
SUB EDX,ECX
JNG @@qt0
XCHG EAX,EDX
ADD EDI,ECX
MOV ECX,EAX
JMP @@nx
@@fr: INC EDI
DEC ECX
JE @@qt0
@@nx: MOV EBX,EDX
MOV AL,BYTE PTR [ESI]
@@lp1: CMP AL,BYTE PTR [EDI]
JE @@uu
INC EDI
DEC ECX
JE @@qt0
CMP AL,BYTE PTR [EDI]
JE @@uu
INC EDI
DEC ECX
JE @@qt0
CMP AL,BYTE PTR [EDI]
JE @@uu
INC EDI
DEC ECX
JE @@qt0
CMP AL,BYTE PTR [EDI]
JE @@uu
INC EDI
DEC ECX
JNE @@lp1
@@qt0: XOR EAX,EAX
@@qt: POP ECX
POP EBX
POP EDI
POP ESI
RET
@@uu: TEST EDX,EDX
JE @@fd
@@lp2: MOV AL,BYTE PTR [ESI+EBX]
CMP AL,BYTE PTR [EDI+EBX]
JNE @@fr
DEC EBX
JE @@fd
MOV AL,BYTE PTR [ESI+EBX]
CMP AL,BYTE PTR [EDI+EBX]
JNE @@fr
DEC EBX
JE @@fd
MOV AL,BYTE PTR [ESI+EBX]
CMP AL,BYTE PTR [EDI+EBX]
JNE @@fr
DEC EBX
JE @@fd
MOV AL,BYTE PTR [ESI+EBX]
CMP AL,BYTE PTR [EDI+EBX]
JNE @@fr
DEC EBX
JNE @@lp2
@@fd: LEA EAX,[EDI+1]
SUB EAX,[ESP]
POP ECX
POP EBX
POP EDI
POP ESI
end;QString中的这个函数定位速度奇快,搜索字典很好....在字典中查找 Word + #13#10字典一行一个词还需要一个快速的替换函数,避免数组的频繁移动。否则10万字的文章会要一个小时!!!没人捧场?买个关子... :)