我必须创建一个程序,使用pascal中的过程将短语(使用%和$等特殊字符)拆分为单词。
所以,如果我输入:
This is a valid word: 12$%ab
该计划必须归还我:
This
is
a
valid
word:
12$#ab
没有空格,一个在另一个之下。
我不能使用数组,“调用”过程的变量必须是字符串。
提前致谢!
这是我的代码:
program words;
uses crt;
var
phrase :string;
word:string;
letter :char;
x :integer;
begin
clrscr;
phrase:='';
word:='';
x:=1;
repeat
write('type a phrase: ');
readln(phrase);
until phrase<>'';
while x<=length(phrase) do
begin
letter:=phrase[x];
case letter of
'a'..'z','A'..'Z':
begin
word:=word+letter;
repeat
x:=x+1;
letter:=phrase[x];
word:=word+letter;
until (letter=' ') or (x=length(phrase));
writeln(word);
word:='';
end;
end;
x:=x+1;
end;
writeln;
readkey;
end.
答案 0 :(得分:2)
循环遍历每个字符的字符串长度,检查它是否是空格,如果是,则打印前面的字符,如果不是,则添加到包含先前字符的变量。
答案 1 :(得分:2)
我看不出提供的代码有什么问题(虽然如果给定字符串中有数字会失败),但我可以看到效率低下 - 不需要所有的字符串连接。我可以看到另外两种处理问题的方法 -
第一种方法 - 搜索,打印和删除
repeat
write ('type a phrase: ');
readln (phrase);
until phrase <>'';
while phrase <> '' do
begin
i:= pos (' ', phrase);
if i = 0 then
begin
writeln (phrase);
phrase:= ''
end
else
begin
writeln (copy (phrase, 1, i-1)); // no need to write the terminating space!
phrase:= copy (phrase, i + 1, length (phrase) - i)
end
end;
第二种方法:搜索,打印并继续
repeat
write ('type a phrase: ');
readln (phrase);
until phrase <>'';
j:= 1;
i:= 1;
len:= length (phrase);
repeat
while (phrase[i] <> ' ') and (i < len) do inc (i);
writeln (copy (phrase, j, i - 1));
j:= i;
inc (i)
until i > len;