1

パスカルのプロシージャを使用して、フレーズ(%や$などの特殊文字を含む)を単語に分割するプログラムを作成する必要があります。

だから私が入ると:

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

提供されたコードの問題はわかりませんが(指定された文字列に数字が含まれていると失敗しますが)、非効率的であることがわかります。すべての文字列を連結する必要はありません。私は問題を処理する他の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;

2番目のアプローチ:検索、印刷、続行

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 に答える