用户需要输入一个句子,其中代码应显示单词“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.
答案 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;