计算单词中的字符和子字符串

Amb*_*er 3 delphi

当输入"last"一词时,我必须阅读未知数量的单词并终止程序.我必须:

  • 显示以"S"开头的名称数.
  • 显示以"d"结尾的名称数量.
  • 显示以"anne"结尾的名称数.

问题:我遇到的唯一问题是显示以"anne"结尾的名称数量.它显示0,除非我只输入单词"anne",否则它显示1.

注意:

  • 我们还没有开始使用数组.
  • 这是我在编写测试之前正在练习的工作,这不是应该交给我的作业.

我的代码:

unit Ess_U;

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 wrd : string;
    Scount, dcount, Namecount : integer;
begin
redOut.clear;
   Scount := 0;
   dcount := 0;
   Namecount := 0;


   repeat
    wrd := inputbox ('Input words', 'Enter any word', '');

    if (Pos('S',wrd) > 0) AND (wrd[1] = 'S') then
     begin
     inc(Scount);
     end

    else if (Pos('d',wrd) > 0) AND (wrd[length(wrd)] = 'd') then
     begin
     inc(dcount);
     end

    else if copy(wrd, length(wrd)-4,4) = 'anne' then
     begin
     inc(Namecount);
     end;

    until (wrd = 'last');

    redOut.Lines.Add ('The number of names that begin with the letter "S" is ' + inttostr(Scount));
    redOut.Lines.Add ('The number of names that end with the letter "d"  is ' + inttostr(dcount));
    redOut.Lines.Add ('The number of names that begin with "anne" is ' + inttostr(Namecount));
end;

end.

enter code here
Run Code Online (Sandbox Code Playgroud)

Mar*_*ynA 6

您已经有了一个答案,向您展示了使用库函数执行您尝试的操作的另一种方法.这很好(假设你的Delphi版本有它们),但是你的问题有一个未解决的方面.

你说"问题:我唯一的问题是显示以"anne"结尾的名字数量.它显示0,除非我只输入单词"anne",否则显示1."

现在,编码的关键部分是学习调试,其中一个关键部分是准确观察并知道构建可重现的测试用例.

试试这个:

repeat循环的第一行更改为:

wrd := 'xanne'; //inputbox ('Input words', 'Enter any word', '');
Run Code Online (Sandbox Code Playgroud)

并将'anne'的测试更改为read

else begin
  wrd := copy(wrd, length(wrd)-4,4);
  Caption := wrd;
  if wrd = 'anne' then
    begin
     inc(Namecount);
    end;
end;
Run Code Online (Sandbox Code Playgroud)

然后,在线上放一个断点

  wrd := copy(wrd, length(wrd)-4,4);
Run Code Online (Sandbox Code Playgroud)

然后按F9编译并运行您的程序.

当调试器在断点处停止时,继续按下F8(单步执行代码.

你很快就会发现什么是错的

 copy(wrd, length(wrd)-4,4)
Run Code Online (Sandbox Code Playgroud)

当wrd以"xanne"开始时,它不等于'anne'.我会告诉你为什么不这样做,因为我觉得你会发现这比找到一个新的库函数更有启发性.

顺便说一句,当您尝试通过反复输入输入来测试程序时,会出现这种情况.这就是为什么我说要暂时修改你的代码,这样你就可以从一个已知的输入开始,而不是一个你可能输入错误的输入(或者甚至误操作CapsLock并且没有注意到).