String 删除Pascal字符串中的短单词
我需要删除以点结尾的字符串中的短单词(短于三个符号)。然后显示不带这些单词的字符串 所以我们需要一个用户的字符串作为输入,比如:“这是一个人键入的简单字符串。”在这个字符串中,程序应该删除每个短于三个符号的单词。在我们的字符串中,这些是:“is,a,a”。所以输出应该是“这个简单的字符串类型” 这是我编程课程的Pascal/Delphi任务 我已经思考这个简单的问题好几天了,显然已经没有办法解决这个问题并寻求你的帮助。我尝试了不同的循环,主要部分是在空间之间找到少于三个符号的序列。我尝试调试它有相当一段时间,但没有结果 我使用1.6.2、FPC 3.0和MacOSX v10.11(El Capitan)。我的代码如下:String 删除Pascal字符串中的短单词,string,delphi,pascal,lazarus,freepascal,String,Delphi,Pascal,Lazarus,Freepascal,我需要删除以点结尾的字符串中的短单词(短于三个符号)。然后显示不带这些单词的字符串 所以我们需要一个用户的字符串作为输入,比如:“这是一个人键入的简单字符串。”在这个字符串中,程序应该删除每个短于三个符号的单词。在我们的字符串中,这些是:“is,a,a”。所以输出应该是“这个简单的字符串类型” 这是我编程课程的Pascal/Delphi任务 我已经思考这个简单的问题好几天了,显然已经没有办法解决这个问题并寻求你的帮助。我尝试了不同的循环,主要部分是在空间之间找到少于三个符号的序列。我尝试调试它有
VAR
UserString: string;
i, n: byte; // Counters for the symbols in the string. 'i' counts every symbol.
again: boolean; // In case we need to repeat the program again
UserAnswerRepeat: char;
label repeat_again;
BEGIN
again:=false;
repeat_again: // Label to repeat the program
Writeln('Enter your string (ended by a dot):');
Readln(UserString);
// MAIN LOOP:
n:=1; // 'n' counts symbols in the words
for i:=1 to length(UserString) do
begin
while (UserString[i] <> ' ') do inc(n); // Here I have Range Check Error. Don't know how to get rid of it.
if (UserString[n] <> ' ') and (n<3) then
begin
delete(UserString, i-n, n);
n:=1
end;
end;
Writeln('The result is: ', UserString);
Writeln('Do you want to repeat the program? (Y/N)');
Readln(UserAnswerRepeat);
if (UserAnswerRepeat = 'Y') or (UserAnswerRepeat = 'y') then
again:=true;
if (again = true) then
goto repeat_again;
END.
VAR
UserString:string;
i、 n:字节;//字符串中符号的计数器。'我数每一个符号。
再次说明:布尔;//以防我们需要再次重复该程序
UserAnswerRepeat:char;
再次贴上标签;
开始
再次:=假;
再次重复\//Label以重复程序
Writeln('输入字符串(以点结尾):');
Readln(用户字符串);
//主回路:
n:=1;//'n'计算单词中的符号
对于i:=1到长度(UserString)do
开始
while(UserString[i]“”)do inc(n);//这里有一个范围检查错误。我不知道如何摆脱它。
if(UserString[n]'')和(nAfor
控制变量的循环开始值和结束值只计算一次。您将结束值设置为字符串的长度。但是,在循环过程中,您从字符串中删除了部分,因此结束值超过了字符串的结束值。请尝试使用while
循环或重复..直到
循环
错误的实际原因在下面的行中
while (UserString[i] <> ' ') do inc(n);
while(UserString[i]“”)do inc(n);
循环会持续多久?循环的终点是什么
您还需要重新考虑如何使用n
Afor
循环计算字符。控制变量的起始值和结束值只计算一次。您将结束值设置为字符串的长度。但是,在循环过程中,您从字符串中删除了部分,因此结束值超过了字符串的结束值。尝试使用while
循环或重复..直到循环
错误的实际原因在下面的行中
while (UserString[i] <> ' ') do inc(n);
while(UserString[i]“”)do inc(n);
循环会持续多久?循环的终点是什么
您还需要重新考虑如何使用n
计算字符。在这种情况下,请查找单词分隔符。在您的情况下,它是“空格”。此外,计算点之前的最后一个单词,因为它后面没有“空格”
编写主循环的一种方法是:
var
LastPos, I: Integer;
Tmp, UserString: String;
begin
LastPos := 1;
Tmp := '';
for I := 1 to Length(UserString) do
begin
if (UserString[I] = ' ') or (I = Length(UserString)) then
begin
if (I - LastPos >= 3) then Tmp := Tmp + Copy(UserString, LastPos, I - LastPos + 1);
LastPos := I + 1;
end;
end;
UserString: = Tmp;
end;
在这种情况下,请查找单词分隔符。在您的情况下,它是“空格”。此外,计算点之前的最后一个单词,因为它后面没有“空格”
编写主循环的一种方法是:
var
LastPos, I: Integer;
Tmp, UserString: String;
begin
LastPos := 1;
Tmp := '';
for I := 1 to Length(UserString) do
begin
if (UserString[I] = ' ') or (I = Length(UserString)) then
begin
if (I - LastPos >= 3) then Tmp := Tmp + Copy(UserString, LastPos, I - LastPos + 1);
LastPos := I + 1;
end;
end;
UserString: = Tmp;
end;
再次感谢大家指出了正确的方向。我终于想出了我最初想要的解决方案,因此程序实际上删除了短单词(少于3个符号)。下面是我得到的:
VAR
UserString: string; //должна быть строка на 40 символов и точку в конце
i, n: byte;
BEGIN
Writeln('Enter the string:');
Readln(UserString);
i:=0;
n:=1;
repeat //MAIN LOOP:
inc(i);
if (UserString[i] = ' ') or (UserString[i] = '.') then
begin
if (i-n<3)then
begin
delete(UserString, n, i-n+1);
i:=n-1;
end;
n:=i+1
end
until (UserString[i] = '.') or (i>length(UserString));
Writeln('Result String: ', UserString);
END.
VAR
UserString:string;//
i、 n:字节;
开始
Writeln('输入字符串:');
Readln(用户字符串);
i:=0;
n:=1;
重复//主循环:
公司(一);
如果是(UserString[i]=''或(UserString[i]='.'),则
开始
if(i-nlength(UserString));
Writeln('Result String:',UserString);
终止
欢迎任何建议!还有一个关于让程序在控制台模式下重复的开放性问题。标签是最好的方法吗(请参阅问题部分的第一个代码)?再次感谢大家指出了正确的方向。我终于想出了我最初想要的解决方案,因此程序实际上删除了短单词(少于3个符号)。下面是我得到的:
VAR
UserString: string; //должна быть строка на 40 символов и точку в конце
i, n: byte;
BEGIN
Writeln('Enter the string:');
Readln(UserString);
i:=0;
n:=1;
repeat //MAIN LOOP:
inc(i);
if (UserString[i] = ' ') or (UserString[i] = '.') then
begin
if (i-n<3)then
begin
delete(UserString, n, i-n+1);
i:=n-1;
end;
n:=i+1
end
until (UserString[i] = '.') or (i>length(UserString));
Writeln('Result String: ', UserString);
END.
VAR
UserString:string;//
i、 n:字节;
开始
Writeln('输入字符串:');
Readln(用户字符串);
i:=0;
n:=1;
重复//主循环:
公司(一);
如果是(UserString[i]=''或(UserString[i]='.'),则
开始
if(i-nlength(UserString));
Writeln('Result String:',UserString);
终止
欢迎任何建议!还有一个关于在控制台模式下重复程序的开放性问题。标签是最好的方法吗(请参阅问题部分的第一个代码)?另一种方法:
uses classes;
var v : TStringlist;
i : integer;
begin
v :=TStringlist.create;
v.strictdelimiter:=true;
v.delimiter:=' ';
v.delimitedtext:='This is a simple string a man types';
for i:=v.count-1 downto 0 do
if length(v[i])<3 then
v.delete(i);
writeln(v.delimitedtext);
v.free;
end.
使用类;
var v:TStringlist;
i:整数;
开始
v:=TStringlist.create;
v、 strictdelimiter:=true;
v、 分隔符:='';
v、 delimitedtext:=“这是一个男人键入的简单字符串”;
对于i:=v.count-1到0 do
如果长度(v[i])采用不同的方法:
uses classes;
var v : TStringlist;
i : integer;
begin
v :=TStringlist.create;
v.strictdelimiter:=true;
v.delimiter:=' ';
v.delimitedtext:='This is a simple string a man types';
for i:=v.count-1 downto 0 do
if length(v[i])<3 then
v.delete(i);
writeln(v.delimitedtext);
v.free;
end.
使用类;
var v:TStringlist;
i:整数;
开始
v:=TStringlist.create;
v、 strictdelimiter:=true;
v、 分隔符:='';
v、 delimitedtext:=“这是一个男人键入的简单字符串”;
对于i:=v.count-1到0 do
如果长度(v[i]),可能只有我一个人,但你问的不太清楚。你能发布一些示例输入和预期输出,以及你得到的错误吗?当然。所以我们需要一个用户的字符串作为输入,如下所示:“这是一个男人键入的简单字符串。”在这个字符串中,程序应该删除每个短于3个符号的单词。在我们的字符串中,这些是:“is,a,a”。因此输出应该是“this simple string man types”。while(UserString[i]“”)do inc(n);
是一个无止境的循环。[i]因此,“永不改变”是毫无意义的,
!是的,就在几个小时前。它很有效,非常感谢,@Nasreddi