2016-11-10 2 views
-1

ための2D配列内の要素を移動しますか?例えばは、だから私は例.FOR乱数で埋め2D配列を持つC

1 0 0 2  

0 3 4 0 

0 5 6 0 

7 0 0 8 

8 0 0 7 

0 6 5 0 

0 4 3 0 

2 0 0 1 

タスクは、しかし、私はこのためのサイクルは次のようになりますどのように何のアイデアを持っていないミラーリング対角線でメイン行列し、印刷行列を印刷することです。

行列を180度回転させるサイクルを考えましたが、対角線に含まれていない要素の位置が緩くなります。

または、対角線を保存して、それを何とか元に戻すことができます。 ここでは、行列と対角のコードを見てください。

あなたのご協力をお待ちしています。

+0

は、スタックオーバーフローへようこそ!これまでのところあなたの研究/デバッグの努力を示してください。まず[Ask]ページをお読みください。 –

答えて

0

アプローチの一つは、以下

#include <stdio.h> 

#define N 4 

int main(void) 
{ 
    int a[N][N] = 
    { 
     { 1, 0, 0, 2 },  
     { 0, 3, 4, 0 }, 
     { 0, 5, 6, 0 }, 
     { 7, 0, 0, 8 } 
    };  

    for (size_t i = 0; i < N; i++) 
    { 
     for (size_t j = 0; j < N; j++) printf("%d ", a[i][j]); 
     printf("\n"); 
    } 

    printf("\n"); 

    for (size_t i = 0; i < N * N/2; i++) 
    { 
     int tmp = a[i/N][i % N]; 
     a[i/N][i % N] = a[(N * N - i - 1)/N][(N * N - i - 1) % N]; 
     a[(N * N - i - 1)/N][(N * N - i - 1) % N] = tmp; 
    } 

    for (size_t i = 0; i < N; i++) 
    { 
     for (size_t j = 0; j < N; j++) printf("%d ", a[i][j]); 
     printf("\n"); 
    } 

    printf("\n"); 

    return 0; 
} 

あるプログラムの出力は、同じポインタを使用して書くことができる

1 0 0 2 
0 3 4 0 
0 5 6 0 
7 0 0 8 

8 0 0 7 
0 6 5 0 
0 4 3 0 
2 0 0 1 

あります。例えば

#include <stdio.h> 

#define N 4 

int main(void) 
{ 
    int a[N][N] = 
    { 
     { 1, 0, 0, 2 },  
     { 0, 3, 4, 0 }, 
     { 0, 5, 6, 0 }, 
     { 7, 0, 0, 8 } 
    };  

    for (size_t i = 0; i < N; i++) 
    { 
     for (size_t j = 0; j < N; j++) printf("%d ", a[i][j]); 
     printf("\n"); 
    } 

    printf("\n"); 

    for (int *first = (int *)a, *last = (int *)a + N * N; 
      first < last; 
      ++first, --last) 
    { 
     int tmp = first[0]; 
     first[0] = last[-1]; 
     last[-1] = tmp; 
    } 

    for (size_t i = 0; i < N; i++) 
    { 
     for (size_t j = 0; j < N; j++) printf("%d ", a[i][j]); 
     printf("\n"); 
    } 

    printf("\n"); 

    return 0; 
} 
関連する問題