如何在文本字符串中查找和计算单词?

时间:2016-02-21 19:04:29

标签: delphi

用户需要输入一个句子,其中代码应显示单词“in”出现在句子中的次数。它应该只计算“in”这个词,而不是包含“in”的词。

问题:我的代码只会出现一次“in”字样,即使它出现的时间超过一次。

注意:*我们尚未开始使用数组。       *此代码是delphi,请不要将其标识为涉及其他编程语言的问题的副本。 *这是作业,但它不应该交付,只有我会看到它(我参加在线课程)。

我尝试了什么:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    redOut: TRichEdit;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var sentence : string;
    WordCount : integer;
begin
    WordCount := 0;
    sentence := Inputbox ('Sentence input', 'Input a sentence (The word "in" will be counted','');
    if Pos('in',sentence) > 0 then

    WordCount := WordCount + 1;

    RedOut.Lines.Add('The number of times "in" appears in the sentence is ' + inttostr(WordCount) + ' time(s)');


end;

end.

2 个答案:

答案 0 :(得分:3)

计算一个字符串在另一个字符串中出现的次数的一种方法如下所示。稍微棘手的是当它是另一个字符串的子串时,避免计数'in'。嵌套的NextWord函数可以解决这个问题。

我并不是说这是最有效的方法,但它确实说明了使用Object Pascal进行字符串操作的几点。

如果它的工作原理并不明显,请在调试器下跟踪它。

顺便说一下,如果你“尚未完成阵列”,我相信你能够抵制任何把它作为你的作业的诱惑,万一你被要求解释它:=)

顺便说一句,代码是针对D7的,这是我所知道的,很多学生都在这里使用。如果您使用的是D2009或更高版本,则应通过致电CH in ['a'..'z', 'A'..'Z']来替换CharInSet,您可能需要在在线帮助中查找该内容。

function WordCount(Target, Input : String; IgnoreCase : Boolean) : Integer;
var
  SP : Integer;
  TempStr : String;

  function IsLetter(CH : Char) : Boolean;
  begin
    Result := CH in ['a'..'z', 'A'..'Z'];
  end;

  function NextWord : String;
  begin
    Result := '';
    while (SP <= Length(Input)) and not (IsLetter(Input[SP])) do
      Inc(SP);

    while (SP <= Length(Input)) and IsLetter(Input[SP]) do begin
      Result := Result + Input[SP];
      Inc(SP);
    end;
  end;

begin
  Result := 0;
  if IgnoreCase then begin
    Target := LowerCase(Target);
    Input  := LowerCase(Input);
  end;

  SP := 1;
  repeat
    TempStr := NextWord;
    if TempStr = Target then
      inc(Result);
  until TempStr = '';
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  Target : String;
  Input : String;
begin
  Target := 'In';
  Input := 'in outing in ';
  ShowMessageFmt('%s contains %d occurrences of %s', [Input, WordCount(Target, Input, True), Target]);

  Input := 'a';
  ShowMessageFmt('%s contains %d occurrences of %s', [Input, WordCount(Target, Input, True), Target]);
end;

答案 1 :(得分:3)

您当前的代码只计算一次出现,因为您只检查一次该单词的存在。

不要破坏你的作业,我不会为你编写代码,但这里有一些值得思考的东西:

您需要选择一个有用的循环语句,在其中重复检查并在找到单​​词时递增计数器。 Delphi有三个不同的循环语句:For counter := x to y do <statement block>while condition=true do <statement block>repeat <statement block> until condition=true。文档描述了这些。

您还需要避免多次计算同一位置。 Pos()始终从字符串的开头搜索。 PosEx()允许您指定搜索位置的偏移量。

你需要考虑一个单独的单词&#34;在&#34;和那些字符是 ed中的区别。你怎么能排除那些包含在计数中的东西?

定义一组用于测试程序的字符串。我想到的可能的测试字符串是:&#34; In&#34;,&#34;包含在&#34;,&#34;最低兴趣中?&#34;