100分求教怎样统计英文单词数?怎样做一个拼写检查,我已经有一个字典,就是foxmail带的那个!

解决方案 »

  1.   

    读文件 制定规则:读一行检测 遇到空格 认为单词结束 遇到_不处理 继续读下一行
    拼写检查在 你的文本控件中的onpress 每输入一个空格就检查词库中是否有这个单词
    具体函数 :
     readline//读一行
    strpos(str,str1)//检查 字符串str是否包含的字串str1
      

  2.   

    调用WORD2000中的拼写,统计功能吧
      

  3.   

    类似编译原理的词法分析的过程,遇到非字母的字符,就截取该字符前的字符串,这是我用前几天做的词法分析程序帮你修改的.
        我做的这个只计算单词的数量,不计算数字或标点等.
    //定义全局变量
    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;给分了!!!!!
      

  4.   

    上面的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;
      

  5.   

    关键是自己写我觉得sunny518(灵犀) 已经将原理说明白了依赖性不好太大了,先自己做了
      

  6.   

    算法没有我的好,我的可以检查English, French, Spanish, German, Italian.....
      

  7.   

    Foxmail中的算法太烂,Don't 这个词它都认为是错的,我昏!词库的词条数太少,可个头却大呀!
      

  8.   

    to crossbow(La Vida Es Amor):    那么就请你把你的算法给大家共享一下,大家共同学习研究一下。
        先谢了!!!!
      

  9.   

    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万字的文章会要一个小时!!!没人捧场?买个关子... :)
      

  10.   

    crossbow(La Vida Es Amor) 用的是什么?汇编吗?难度太高,看不懂!