3

私はCで取り組んでいる短い割り当てに少し問題があります。私は次のような2次元配列を持っています:

0 5 5 5
0 0 5 5
0 0 0 5
0 0 0 0

対角線に5を反映させたいので、次のようになります。

0 0 0 0
5 0 0 0
5 5 0 0
5 5 5 0

これは私が持っているものです:

//reflect the 5's
for(i = 0; i < arraySize; i++) {
    for (j = 0; j < arraySize; j++) {
        int temp = array[i][j];
        array[i][j] = array[j][i];
        array[j][i] = temp;
    }
}

これは 5 を反映していません。これが発生した後に配列を印刷すると、初期化された配列と同じように見えます。これが私がやるべきことだと思うのですが、これは間違っていますか?助けに感謝します。

4

4 に答える 4

2

値を交換するときは、ループの途中で停止する必要があります。そうしないと、開始した場所に戻ってしまいます。

于 2013-04-24T01:53:32.440 に答える
2

コメントで述べたように、マトリックス全体を反復しているため、実際には反射していますが、対角線を下回ると、5s が元の位置に反射されます。内側のループは で開始する必要がi+1あり、これにより対角線より上に維持されます。

for (j = i+1; j < arraySize; j++) {
         ^^^
于 2013-04-24T01:55:10.420 に答える
1

コメンターが指摘しているように、対角線の下で反復すると、今行ったスワップを元に戻すときに反映されます。

配列は常に正方形ですか? もしそうなら、これはあなたのために働くはずです:

for(i = 0; i < arraySize; i++) {
    for (j = i+1; j < arraySize; j++) {

これiは、対角線に沿って開始する必要がある距離も示しているため、機能します。+1対角線の中間値を交換する必要がないため、を追加します。

于 2013-04-24T01:54:27.447 に答える
0

一般的に: swap(a[i][j], a[j][i]) for j=i+1..arrSize

//reflect the 5's
for(i = 0; i < arraySize; i++) {
    for (j = i+1; j < arraySize; j++) {
        int temp = array[i][j];
        array[i][j] = array[j][i];
        array[j][i] = temp;
    }
}
于 2013-04-24T01:53:47.713 に答える