Modyfikacja macierzy c

0

Witam.
Muszę zmodyfikować macierz o rozmiarach od 1 do 9 .
Kod niżej modyfikuje macierz (np. 4x4) w ten sposób:
org:
[948300][47731][459503][130050]
[987250][891212][697553][1071594]
[1165415][955787][1174668][999604]
[1077571][848460][1284764][93722]

zmodyfikowana (zamiana "połówkami" lewa z prawą):
[459503][130050][948300][47731]
[697553][1071594][987250][891212]
[1174668][999604][1165415][955787]
[1284764][93722][1077571][848460]

Teraz ja potrzebuję zmienić ostatnią część programu, aby program dzielił macierz na 4 ćwiartki i I zamieniał z IV :
tj.
[1174668][999604][459503][130050]
[1284764][93722][697553][1071594]
[1165415][955787][948300][47731]
[1077571][848460][987250][891212]
To dla parzystych wymiarów, gdy np. mamy macierz 5x5 to środkowe kolumny i wiersze zostawiamy na swoich miejscach.

#include "matrix.h"

int arr_rnd    ( int arr[][N_MAX], int *m, int *n ){
    int i, j;

    if( 0 != arr_check( arr, *m, *n) ){ return -1; }

    for( i = 0; i < *m; i++ ){
        printf("\n%2d.", i);
        for( j = 0; j < *n; j++ ){
            printf("arr[%2d][%2d] = ", i, j);
            arr[i][j]=((float)random()/RAND_MAX)*20;
        }
    }
    return 0;
};

int arr_get    ( int arr[][N_MAX], int *m, int *n ){
    int i, j;
    printf("Podaj rozmiary macierzy rozdzielone spacjami np. 3 3 = " );
    scanf ("%d", m);
    scanf ("%d", n);

    if( 0 != arr_check( arr, *m, *n) ){ return -1; }

    for( i = 0; i < *m; i++ ){
        printf("\n%2d.", i);
        for( j = 0; j < *n; j++ ){
            printf("arr[%2d][%2d] = ", i, j);
            scanf("%d", &arr[i][j]);
        }
    }
    return 0;
};

int arr_disp   ( int arr[][N_MAX], int  m, int  n ){
    int i, j;

    if( 0 != arr_check( arr, m, n) ){ return -1; }

    for( i = 0; i < m; i++ ){
        for( j = 0; j < n; j++ ){
            printf("[%02d]",arr[i][j]);
        }
        printf("\n");
    }

    return 0;
};

int arr_check  ( int arr[][N_MAX], int  m, int  n ){
    if( m >= M_MAX || m <= 0 ){
                printf("ERROR: bad value m = %d\n", m ); return -1;
    }
    if( n >= N_MAX || n <= 0 ){
        printf("ERROR: bad value n = %d\n", n ); return -1;
    }
    if( arr == NULL ){
        printf("ERROR: arr is NULL pointer\n") ; return -1;
    }

    return 0;

}

 /* Część do modyfikacji : */

int arr_modifNR( int arr[][N_MAX], int *m, int *n ){  
    int i, j;
    int temp_cell, end_j, start_j ;

    if( 0 != arr_check( arr, *m, *n) ){ return -1; }

    end_j   = (*n) / 2;
    start_j = end_j;
    if( 0 != (*n) % 2 ){ /*end_j*/; start_j+=1; }

    for( i = 0; i < *m ; i++ ){
        for( j = 0; j < end_j ; j++ ){
            temp_cell = arr[i][(start_j + j)];
            arr[i][(start_j + j)] = arr[i][j];
            arr[i][j] = temp_cell;
        }
    }
    return 0;
}

Czy mógłby ktoś podpowiedzieć jak pozmieniać kod, aby program spełniał swoją funkcję.
Pozdrawiam

0

podpowiedź:

Wyobraz sobie maicerz jako obrys walca, pionowy albo poziomy w zaleznosci czy przechodzisz z kolumy na kolumne czy z wiersza na wiersz i wyobraz sobie ze przy n wierszach czy kolumnach indeksy są od 0 do n-1. takze idac wkolo kolistej krawedzi przechodzisz od indeksu n-1 do 0...

i to ci zapewnia modulo czyli operator %

dalej dla 10 kolumn/wierszy musisz zamienic elementy o indeksach 0 i 5 , 1 i 6, ... az do 4 i 9
dla 9 kolumn/wierszy musisz zamienic elementy o indeksach 0 i 5, 1 i 6, az do 3 i 8, kolumny srodkowej nie ruszasz, bo zrobilbys pie*dolnik

czyli dla m kolumn musisz zamienic ze soba 0 i 0+((m+1)/2), 1 i 1+((m+1)/2) az do... sam juz sobie policz :>

czyli
dla i lub j
wiersz_lub_kolumna=(i+((ilosc_wierszy_lub_kolumn+1)/2))modulo ilosc_wierszy_lub_kolumn

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0