1

我必须创建一个程序,使用 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.
4

2 回答 2

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;
于 2012-11-21T12:58:05.607 回答
2

循环遍历每个字符以获取字符串的长度,检查是否为空格,如果是,则打印前面的字符,如果不是,则添加到包含前面字符的变量中。

于 2012-11-21T02:01:34.657 回答