[ fimalbonegaculo @ 02.06.2003. 17:10 ] @
Zapetljao sam se ovdje.
Imam ovaj kod i treba da matricu transponujem u funkciji.
Riješio sam to ovako, ali mi se čini da postoji ljepše rješenje.
Da ne bih puno pričao evo kod:
Code:

#include    <stdio.h>
#define MAX 10

void citaj  (int* p, int n);
void pisi   (int* p, int n);
void transp (int* p, int n);

int main() 
{
    int n;
    int mat[MAX][MAX];
    
    printf ("Unesite red matrice: "); scanf("%d",&n);

    printf("%d",sizeof(mat[0]));
    citaj   (mat[0],n);
    pisi    (mat[0],n);

    transp  (mat[0],n);
    pisi    (mat[0],n);

    getch   ();
}

/*
    funkcije citaj, pisi i transp
    odradjuju posao...
*/

void citaj(int* p, int n)
{
    int i, j, *ptr;
    
    printf ("\nUnesite elemente matrice po vrstama: \n");
    
    ptr = (int *)p;

    for (i=0;i<=n-1;i++) {
        for (j=0;j<=n-1;j++){
            printf("mat[%d][%d]: ",i,j);
            scanf("%d", ptr++);
        }
        for (j=0;j<=MAX-n-1;j++,ptr++) *ptr = 0;
    }
    for (i=0;i<=MAX-n-1;i++,ptr++) *ptr = 0;  
}

/*
    pisi
*/
void pisi(int *p, int n)
{
    int i, j, *ptr;
    
    printf ("\nElementi matrice: \n");
    
    ptr = (int *)p;

    for (i=0;i<=n-1;i++) {
        for (j=0;j<=n-1;j++) printf("%3d",*(ptr++));
            printf("\n");
        for (j=0;j<=MAX-n-1;j++,ptr++);
    }
    for (i=0;i<=MAX-n-1;i++,ptr++);
}

/*
    transp
*/
void transp(int *p, int n)
{
    int i, j, *ptr, tmp1, tmp[MAX][MAX];
    
    printf ("\nTransponujem matricu...");
    
    ptr = (int *)p;

    for (i=0;i<=MAX-1;i++)
        for (j=0;j<=MAX-1;j++)
            tmp[i][j] = *(ptr++);
            
    ptr = (int *)p;

    for (i=0;i<=MAX-1;i++)
        for (j=0;j<=MAX-1;j++) {
            *ptr = tmp[j][i];
            ptr++;
        }
   
    printf ("\t\t[ OK ]\n");

}
[ leka @ 02.06.2003. 18:43 ] @
Konacno se pojavila tema koja je po meni za "Art of Programming", i sta se desi? - Ode u C/C++ diskusionu grupu! :)

Zasto nisi zadovoljan svojim resenjem?
[ fimalbonegaculo @ 02.06.2003. 19:29 ] @
Tek učim C, ali mi se čini nepotrebnim da prvo prebacim mulri-dim polje u tmp promjenjivu pa da ga onda obradim. Vjerovatno može direktno sa pokazivačima... Nešto kao prvih 0-(MAX-1) je jedna vrsta, jeli, a onda kao od MAX pa do 2*MAX-1 je druga i tako dalje... pa ... onda ... ne znam ni ja.. Tako nešto
[ alkal @ 02.06.2003. 20:26 ] @
Mislim da je ovo razumljivije:

Code:

#include <stdio.h>

#define MAX 100

typedef struct {    /* Definicija tipa kvadratne matrice. */
    int n;
    int element[MAX][MAX];
} Matrica;

int upis (Matrica *mat) {
    int i, j, n;
    printf ("Unesi red kvadratne matrice: ");
    scanf ("%d", &n);
    if (n > MAX) return 0;    /* U slucaju prekoracenja vrati 0 (false). */
    mat->n = n;
    for (i=0; i<n; i++)
        for (j=0; j<n; j++) {
            printf ("mat[%d][%d]: ", i, j);
            scanf ("%d", &(mat->element[i][j]));
        }
    return 1;
}

void ispis (Matrica *mat) {
    int i, j, n;
    n = mat->n;
    printf ("----Kvadratna matrica:----\n");
    for (i=0; i<n; i++)
        for (j=0; j<n; j++)
            printf ("mat[%d][%d] = %d\n", i, j, mat->element[i][j]);
}

void transponuj (Matrica *mat1, Matrica *mat2) {
    int i, j, n;
    n = mat2->n = mat1->n;
    for (i=0; i<n; i++)
        for (j=0; j<n; j++)
            mat2->element[j][i] = mat1->element[i][j];
}

int main () {
    Matrica mat1, mat2;
    
    if ( upis (&mat1) == 0 ) { printf ("Prekoracenje!\n"); return 1; }
    ispis (&mat1);

    transponuj (&mat1, &mat2);
    ispis (&mat2);

    return 0;    /* Normalan zavrsetak programa. */
}


Iako ovaj program radi samo sa kvadratnim matricama nije ga teško uopštiti.
Za opšti slučaj bi definicija tipa matrice bila:

Code:

typedef struct {    /* Definicija tipa matrice. */
    int vrste;               /* Broj vrsta. */
    int kolone;              /* Broj kolona. */
    int element[MAX][MAX];
} Matrica;

Izvorni kod programa je priložen uz poruku.