Delphi 尝试删除短语中的所有元音

Delphi 尝试删除短语中的所有元音,delphi,delphi-xe,Delphi,Delphi Xe,我正在尝试制作一个程序来删除一个句子或短语中的所有元音。我没有发现语法错误,但当我添加一个像“Cool”这样的词或任何两个以上元音相邻的词时,并不是所有元音都被删除。为什么会这样? 这是我的密码: procedure TForm1.btnProcessClick(Sender: TObject); Var Sentence: string; K : integer; Begin Sentence :=uppercase(edtSentence.text); For k := 1 to leng

我正在尝试制作一个程序来删除一个句子或短语中的所有元音。我没有发现语法错误,但当我添加一个像“Cool”这样的词或任何两个以上元音相邻的词时,并不是所有元音都被删除。为什么会这样? 这是我的密码:

procedure TForm1.btnProcessClick(Sender: TObject);

Var Sentence: string;
K : integer;
Begin
Sentence :=uppercase(edtSentence.text);
For k := 1 to length(sentence) do
 If (sentence[k] in ['A', 'E', 'I', 'O', 'U']) then
begin
Delete(sentence,k,1);
Lbloutput.caption := sentence;
end;

删除时,您正在向上计数,而不是向下计数

您的循环应为:-


对于K:=Length(句子.Text)down到1 Do

删除时,您正在向上计数,而不是向下计数

您的循环应为:-


对于K:=Length(句子.Text)down到1 Do

删除时,您正在向上计数,而不是向下计数

您的循环应为:-


对于K:=Length(句子.Text)down到1 Do

删除时,您正在向上计数,而不是向下计数

您的循环应为:-


对于K:=Length(句子.Text)到1do

您可以循环遍历所有字符并以这种方式删除它们,也可以使用StringReplace。唯一的缺点是你必须对每个元音单独使用它,就像这样

procedure TForm1.btnProcessClick(Sender: TObject);
Var Sentence: string;
Begin
Sentence:=edtSentence.text; //No need to capitalize the string
Sentence:=StringReplace(Sentence, 'a', '', [rfReplaceAll, rfIgnoreCase]);
Sentence:=StringReplace(Sentence, 'e', '', [rfReplaceAll, rfIgnoreCase]);
Sentence:=StringReplace(Sentence, 'i', '', [rfReplaceAll, rfIgnoreCase]);
Sentence:=StringReplace(Sentence, 'o', '', [rfReplaceAll, rfIgnoreCase]);
Sentence:=StringReplace(Sentence, 'u', '', [rfReplaceAll, rfIgnoreCase]);
end;

可以循环遍历所有字符并以这种方式删除它们,也可以使用StringReplace。唯一的缺点是你必须对每个元音单独使用它,就像这样

procedure TForm1.btnProcessClick(Sender: TObject);
Var Sentence: string;
Begin
Sentence:=edtSentence.text; //No need to capitalize the string
Sentence:=StringReplace(Sentence, 'a', '', [rfReplaceAll, rfIgnoreCase]);
Sentence:=StringReplace(Sentence, 'e', '', [rfReplaceAll, rfIgnoreCase]);
Sentence:=StringReplace(Sentence, 'i', '', [rfReplaceAll, rfIgnoreCase]);
Sentence:=StringReplace(Sentence, 'o', '', [rfReplaceAll, rfIgnoreCase]);
Sentence:=StringReplace(Sentence, 'u', '', [rfReplaceAll, rfIgnoreCase]);
end;

可以循环遍历所有字符并以这种方式删除它们,也可以使用StringReplace。唯一的缺点是你必须对每个元音单独使用它,就像这样

procedure TForm1.btnProcessClick(Sender: TObject);
Var Sentence: string;
Begin
Sentence:=edtSentence.text; //No need to capitalize the string
Sentence:=StringReplace(Sentence, 'a', '', [rfReplaceAll, rfIgnoreCase]);
Sentence:=StringReplace(Sentence, 'e', '', [rfReplaceAll, rfIgnoreCase]);
Sentence:=StringReplace(Sentence, 'i', '', [rfReplaceAll, rfIgnoreCase]);
Sentence:=StringReplace(Sentence, 'o', '', [rfReplaceAll, rfIgnoreCase]);
Sentence:=StringReplace(Sentence, 'u', '', [rfReplaceAll, rfIgnoreCase]);
end;

可以循环遍历所有字符并以这种方式删除它们,也可以使用StringReplace。唯一的缺点是你必须对每个元音单独使用它,就像这样

procedure TForm1.btnProcessClick(Sender: TObject);
Var Sentence: string;
Begin
Sentence:=edtSentence.text; //No need to capitalize the string
Sentence:=StringReplace(Sentence, 'a', '', [rfReplaceAll, rfIgnoreCase]);
Sentence:=StringReplace(Sentence, 'e', '', [rfReplaceAll, rfIgnoreCase]);
Sentence:=StringReplace(Sentence, 'i', '', [rfReplaceAll, rfIgnoreCase]);
Sentence:=StringReplace(Sentence, 'o', '', [rfReplaceAll, rfIgnoreCase]);
Sentence:=StringReplace(Sentence, 'u', '', [rfReplaceAll, rfIgnoreCase]);
end;

其他答案是正确的替代解决方案。然而,你的部分问题是“为什么会这样?”

这基本上是因为“for K:=[…]”假设句子的长度在“for”循环的持续时间内是固定的,但在其中执行的操作,调用Delete()会更改句子的长度,因此,这样做,你就是在自食其果

我更喜欢用机场登记排队的方式来思考这个编码问题

  • 您计算队列中的人数(“…到长度(句子)”;请注意,“for…”只会在循环开始之前发生一次)

  • 从前面开始按顺序扫描队列(“对于K:=1[…]”)

  • 当你找到可疑的人时,你会把他们从队列中拉出来(“删除([…])

  • 被拉人后面的每个人都向前移动一个位置(删除角色时,句子也是如此)

  • 但你(错误地)继续扫描队列中的下一个位置,即在被拉出的位置之外的位置,而不是在他/她之后的下一个位置。因此,你错过了队列中的下一个恐怖分子

  • 不仅如此,在开始扫描之前,您还决定了要扫描多少人(“[…]到长度(句子)”),但队列随着您撤出的人数而缩短,因此最终您将处理不再占用的位置。如果您观看句子[K]在“监视”窗口中,您将看到它在大于到目前为止删除的字符数的位置计算为#0


因此,每当循环内处理可能会更改正在处理的内容的长度时,请在每次更改后重新检查长度,并检查是否在正确的点恢复处理。顺便说一句,这是进行循环时要做的事情之一。

其他答案都是正确的替代解决方案。但是,您的问题的一部分是错误的“这是为什么?”

这基本上是因为“for K:=[…]”假设句子的长度在“for”循环的持续时间内是固定的,但在其中执行的操作,调用Delete()会更改句子的长度,因此,这样做,你就是在自食其果

我更喜欢用机场登记排队的方式来思考这个编码问题

  • 您计算队列中的人数(“…到长度(句子)”;请注意,“for…”只会在循环开始之前发生一次)

  • 从前面开始按顺序扫描队列(“对于K:=1[…]”)

  • 当你找到可疑的人时,你会把他们从队列中拉出来(“删除([…])

  • 被拉人后面的每个人都向前移动一个位置(删除角色时,句子也是如此)

  • 但你(错误地)继续扫描队列中的下一个位置,即在被拉出的位置之外的位置,而不是在他/她之后的下一个位置。因此,你错过了队列中的下一个恐怖分子

  • 不仅如此,在开始扫描之前,您还决定了要扫描多少人(“[…]到长度(句子)”),但队列随着您撤出的人数而缩短,因此最终您将处理不再占用的位置。如果您观看句子[K]在“监视”窗口中,您将看到它在大于到目前为止删除的字符数的位置计算为#0


因此,每当循环内处理可能会更改正在处理的内容的长度时,请在每次更改后重新检查长度,并检查是否在正确的点恢复处理。顺便说一句,这是进行循环时要做的事情之一。

其他答案都是正确的替代解决方案。但是,您的问题的一部分是错误的“这是为什么?”

这基本上是因为“for K:=[…]”假设句子的长度在“for”循环的持续时间内是固定的,但在其中执行的操作,调用Delete()会更改句子的长度,因此,这样做,你就是在自食其果

我更喜欢用这种方式来思考这个问题