2

さて、私は 2D 配列の塗りつぶしをかなりうまく取得しました...今度は、2D 配列にランダムに生成された同じ値を保持する必要がありますが、垂直の順序を逆にします (2 番目の for ループ)。したがって、基本的に 2 番目の for ループは同じ値を保持する必要がありますが、順序は逆になります。しかし、ネストされた for ループと rand() に入ると、すべての新しいランダムな文字が生成されるような気がします...

誰もこれを行う方法を知っていますか?? これは私がこれまでに持っているものです:

char array[20][20];

srand(time(NULL));

for(int i=0;i<20;i++)
 {
     for(int j=0;j<20;j++) {
         array[i][j]= ((rand() % 2) == 0) ? 'O' : 'X';
         cout << array[i][j];
     }
     cout << endl;

     for(int j=20-1; i>=0; i-- {
         array[i][j]= ((rand() % 2) == 0) ? 'O' : 'X';
         cout << array[j][i];
     }
     cout << endl;
 }

編集これを修正する方法に興味がある人のために、私はそれを理解しました!! コードは次のとおりです。

char array[20][20];

srand(time(NULL));

for(int i=0;i<20;i++) {
     for(int j=0;j<20;j++) {
         array[i][j]= ((rand() % 2) == 0) ? 'O' : 'X';
         cout << array[i][j];
     }
     cout << endl;
}

cout << endl;

for(int i=0;i<20;i++) {
    for(int j=19;j>=0;j--) {
        cout << array[i][j];
    }
    cout << endl;
}
4

2 に答える 2

0

この状態はよく見えません:

  `for(int j=20-1; i>=0; i-- {` 

ループ インデックス変数を に戻すと0、ループの実行が不定になります。

また、2番目のループ内で新しい値を割り当てる必要はないと思います(最初のループの値を保持したい)

代わりに、(現在のループの外側)のようにする必要があります。

  for(int i=19;i>=0;i--)
  {
    for(int j=0;j<20;j++) {
       //no need of line below as you want to print the old values
       //array[i][j]= ((rand() % 2) == 0) ? 'O' : 'X'; 
       cout << array[i][j];
     }
  }

このようにして、列を変更せずに一番下の行を最初に印刷します。

于 2012-11-08T01:25:05.390 に答える
0

ネストされた for ループで反転のすべての要素を交換する代わりに、次のように 1 つの for ループを実行できます。

  • array[0]と交換array[19]
  • array[1]と交換array[18]
  • ... 等々

擬似コード:

int i;
int size = 20;
int bound = size / 2;
for(i = 0; i < bound; i++) {
     swap(array[i], array[bound-i]);
}

その理由array[i]は、その特定の行へのポインターです。したがって、値に触れることなくポインタを交換することができます。

于 2012-11-08T01:25:34.910 に答える