0

2次元配列を逆にしようとしていますが、コンパイラは正常に動作しますが、配列は最初と同じままです..

逆関数を呼び出す前と後に配列を出力しますが、変更が行われていないようです..
なぜですか?

コードは次のとおりです。

#include<stdio.h>

void reverse(int table[ ][5]){
    int a,b,c,d;
    int temp = 0;
    for(a=0,c=3;a<=3;a++,c--){
        for(b=0,d=4;b<=4;b++,d--){
            temp = table[a][b];
            table[a][b]= table[c][d];
            table[c][d]= temp;      
        }
      }

    }

int main(int argc,char *argv[]){
    int i,j;
    int table[4][5];

    for(i=0;i<=3;i++){
       for(j=0;j<=4;j++){
          scanf("%d",&table[i][j]);
       }
    }

    for(i=0;i<=3;i++){
        for(j=0;j<=4;j++){
            printf(" %d",table[i][j]);
        }
    }
    printf("\n");

    reverse (table);


    for(i=0;i<=3;i++){
       for(j=0;j<=4;j++){
           printf("%d ",table[i][j]);
       }
    }

    return 0; 
    }

逆関数で問題を見つけることができますか??

4

2 に答える 2

3

問題は、要素を交換してから元に戻すことです。

于 2012-08-19T17:31:16.357 に答える
1

逆関数では、マトリックスを交換しています。ループが途中まで到達すると、2 次元配列は完全に交換されます。しかし、途中から完全に繰り返すと、再びスワップされ、元と同じになります。

ループを次のように更新する必要があります

for(a=0,c=3;a<=(3/2)+1;a++,c--){
    for(b=0,d=4;b<=4/2;b++,d--){
-------------------^

注:奇数の長さには適切に注意する3/2必要1があり2ます.

于 2012-08-19T17:41:42.457 に答える