2016-11-10 3 views
-1

So habe ich 2D-Array mit Zufallszahlen .Für Beispiel gefüllt:Bewegliche Elemente in 2D-Array für c

#define d 4 

int main(void) 
{ 
int a[d][d]; 
int primary[d], secondary[d]; 
size_t i, j; 

srand(time(NULL)); 

/* fill array with random numbers */ 
for (i = 0; i < d; i++) 
    for (j = 0; j < d; j++) 
     a[i][j] = rand() % 100; 

/* save diagonals */ 
for (i = 0; i < d; i++) 
{ 
    primary[i] = a[i][i]; 
    secondary[i] = a[d - (i + 1)][i]; 

Wie horizontal Diagonalen spiegeln?

Zum Beispiel:

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 

Aufgabe ist Hauptmatrix und dann Druckmatrix mit verspiegelten Diagonalen i keine Ideen hätte jedoch zu drucken, wie Zyklus für diese aussehen soll.

Ich dachte über Zyklus für rotierende Matrix für 180 Grad, aber ich werde die Positionen von Elementen verlieren, die nicht zu den Diagonalen gehören.

Oder kann ich Diagonale speichern und dann irgendwie umkehren. Hier ist Code für Matrix und Diagonale was soll ich jetzt tun.

Hoffnung für Ihre Hilfe.

+0

Willkommen bei Stack Overflow! Bitte zeigen Sie Ihre Recherche/Debugging-Aufwand bis jetzt. Bitte lesen Sie zuerst die [Ask] -Seite. –

Antwort

0

Ein Ansatz ist die folgende

#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; 
} 

Die Programmausgabe

ist
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 

Das gleiches geschrieben Zeiger verwendet werden kann. Zum Beispiel

#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; 
}