0

パスカルに問題があります : 次のシーケンスで最初の n 個の数字を生成します: 1,1,2,2,2,3,3,3,3,4,4,4,4,4,...これらのコードですが、問題は、私が望むように機能しないことです。

var
s,c: string;
n,i,j: integer;
begin
 s:='';
 readln(n);
 begin
  for i := 1 to n do
   begin
    if ( length(s)/2 -1 >= n) then
    begin
     Break;
    end;
    for j := 1 to i + 1 do
    begin
     str(i,c);
     s:= s + c+',';
    end;

 end;
end; 
4

4 に答える 4

2

これはより短いバージョンであり、最後に余分なコンマも削除されています。これは完全なコンソールプログラムです(要素数のプロンプトを追加します)。

program Project2;

{$APPTYPE CONSOLE}

uses
  SysUtils;

var
  i, j: Integer;
  s: string;
  nItems: Integer;
begin
  s := '';
  Write('Enter # of elements: ');
  ReadLn(nItems);
  for i := 1 to nItems do
    for j := 1 to i + 1 do
    begin
      s := s + IntToStr(i) + ',';
    end;
  System.Delete(s, Length(s), 1); { Remove final comma )
  WriteLn(s);
  ReadLn;
end.
于 2012-09-17T21:45:19.373 に答える
0

私は私の質問を解決しました、ここに正しいコードがあります、あなたがそれを改善することができればそれは素晴らしいでしょう。

var
s,c: string;
n,i,j: integer;
begin
 s:='';
 readln(n);
 begin
  for i := 1 to n do
   begin

    for j := 1 to i + 1 do
    begin
     if ( length(s) > n*2  ) then
    begin
     Break;
    end;
     str(i,c);
     s:= s + c+',';
    end;

   end;
  end;
 Delete(s,length(s)-2,length(s));
 write(s);
 readln;
 end.
于 2012-09-17T11:30:03.613 に答える
0

あなたはあなたの内側のループを変えることができます:

    for j := 1 to i + 1 do
    begin
     if ( length(s) > n*2  ) then
    begin
     Break;
    end;
     str(i,c);
     s:= s + c+',';
    end;

まず、わかりやすくするために常にインデントすることをお勧めします。

    for j := 1 to i + 1 do
    begin
     if ( length(s) > n*2  ) then
       begin
        Break;
       end;
     str(i,c);
     s:= s + c+',';
    end;

第二に、必要なのは複数のステートメントを1つのステートメントに変換することだけです。したがって、そこにしか入っていないので、begin冗長です。直接breakを使用してください。endbreak

    for j := 1 to i + 1 do
    begin
     if ( length(s) > n*2  ) then Break;
     str(i,c);
     s:= s + c+',';
    end;

c次に、そのひどいロットを再計算していることに注意してください。

    str(i,c);
    suffix = c + ',';
    for j := 1 to i + 1 do
    begin
     if ( length(s) > n*2  ) then Break;
     s:= s + suffix;
    end;

後藤のように不審に感じるので、私はブレークの使用にそれほど熱心ではありません。したがって、これをrepeat ... untilブロックに変更することができます。

    str(i,c);
    suffix = c + ',';
    j := 1;
    repeat 
      s := s + suffix;
      j := j + 1;
    until (j > i+1) or (length (s) > n*2);

(それに注意してrepeatください。until暗黙的beginend入力する必要がないので、入力する必要はありません。)
ループが増加するだけであることがわかりにくくすることで、わかりやすくしたと主張するかもしれませんj。この場合、私はあなたが好むものは何でも強く感じませんが、あなたが休憩をたくさん使っているなら、あなたにとって良いかどうかを考えてくださいwhilerepeat

あなたの条件はlength (s) > n*2私を困惑させます(そして他の誰もあなたのコードの彼らのバージョンにそれを入れていません)。どういうわけか短くしたいようです。本気ですか?私は違います。以下は、制限なしで取得する出力の表であり、次に出力の最初のn * 2項目、および文字列の最初のn * 2文字であるため、確認できます。何をするbreakように設計されたステートメントでしたか?

n:      1
output: 1,1
length: 2
n*2:    2
first n*2 numbers:    1,1
first n*2 characters: 1,

n:      2
output: 1,1,2,2,2
length: 5
n*2:    4
first n*2 numbers:    1,1,2,2
first n*2 characters: 1,1,

n:      3
output: 1,1,2,2,2,3,3,3,3
length: 9
n*2:    6
first n*2 numbers:    1,1,2,2,2,3
first n*2 characters: 1,1,2,

n:      4
output: 1,1,2,2,2,3,3,3,3,4,4,4,4,4
length: 14
n*2:    8
first n*2 numbers:    1,1,2,2,2,3,3,3
first n*2 characters: 1,1,2,2,

n:      5
output: 1,1,2,2,2,3,3,3,3,4,4,4,4,4,5,5,5,5,5,5
length: 20
n*2:    10
first n*2 numbers:    1,1,2,2,2,3,3,3,3,4
first n*2 characters: 1,1,2,2,2,

n:      6
output: 1,1,2,2,2,3,3,3,3,4,4,4,4,4,5,5,5,5,5,5,6,6,6,6,6,6,6
length: 27
n*2:    12
first n*2 numbers:    1,1,2,2,2,3,3,3,3,4,4,4
first n*2 characters: 1,1,2,2,2,3,
于 2012-09-17T23:25:31.087 に答える
0

外側のループの動作方法を変更して、現在の位置を示し、現在の要素を表すi2 番目の数値を導入します。element次にelement、内側のループがそのコースを実行するたびにインクリメントします。

s:='';
readln(n);
element:=1;
begin
  for i := 1 to n do
  begin
    for j := 1 to i + 1 do
    begin
     str(element,c);
     s:= s + c+',';
    end;
    element:=element+1;
  end;
end;
于 2012-09-17T12:02:50.210 に答える