PDA

View Full Version : [c] Trasposta matrice


Split91
17-03-2011, 11:08
Devo effettuare la trasposta utilizzando la struttura dati matrice.. Senza usare la struttura dati non ho problemi, ma con questa struttura la matrice outupt viene azzerata stampando 0..
A cosa è dovuto?


#include <stdio.h>
#include <stdlib.h>
#define r 100
#define c 100
struct matrice {
float m[r][c];
int righe;
int colonne;
};
typedef struct matrice matrice;
int i,j;
void trasposta(matrice mat1, matrice mat2);


int main(int argc, char *argv[])
{
matrice m_in;
matrice m_out;

printf("Numero righe: ");
scanf("%d", &m_in.righe);
printf("\nNumero colonne: ");
scanf("%d", &m_in.colonne);
printf("\nNumero righe:");
scanf("%d", &m_out.righe);
printf("\nNumero colonne: ");
scanf("%d", &m_out.colonne);
for (i=0; i<m_in.righe; i++)
{
for (j=0; j<m_in.colonne; j++)
{
printf("a[%d][%d]",i,j);
scanf("%d", &m_in.m[i][j]);

}
}

trasposta(m_in, m_out);
for (i=0; i<m_in.righe; i++)
{
for (j=0; j<m_in.colonne; j++)
{
printf("%5f",m_out.m[i][j]);

}
printf("\n");
}

system("PAUSE");
return 0;
}
void trasposta(matrice mat1, matrice mat2)
{
int i,j;
for (i=0; i<mat1.righe; i++)
{
for (j=0; j<mat1.colonne; j++)
{
mat2.m[i][j]=mat1.m[j][i];

}
}

}

krivo
17-03-2011, 18:00
Ciao, concettualmente la funzione trasposta è sbagliata, nell'assegnazione devi fare

for (i=0; i<mat1.righe; i++) {
for (j=0; j<mat1.colonne; j++) {
mat2.m[j][i]=mat1.m[i][j];
}
}

perchè tu stai scorrendo secondo la disposizione della matrice mat1, altrimenti puoi fare

for (i=0; i<mat2.righe; i++) {
for (j=0; j<mat2.colonne; j++) {
mat2.m[i][j]=mat1.m[j][i];
}
}

che è lo stesso.
Inoltre avendo una matrice m[i][j] la sua trasposta sarà m[j][i], quindi dopo aver inserito le righe e le colonne per la prima si conosceranno quelle della seconda:

printf("Numero righe: ");
scanf("%d", &m_in.righe);
printf("Numero colonne: ");
scanf("%d", &m_in.colonne);
m_out.righe = m_in.colonne;
m_out.colonne = m_in.righe;
ti risparmi due print e scanf da fare. Un ultima cosa, prima di usare le matrici m_in.m[][] e m_out.m[][] andrebbero inizializzate a 0 con un ciclo for altrimenti nella stampa potrebbe darti in output valori inaspettati