4
This code creates matrix, initializes and prints, as well as adding, subtracting and multiplying matrices:
typedef struct{
int nl;
int nc;
int **elementos;
}MATRIZ;
void criar_matriz (int, int, MATRIZ *);
void inicializar_matriz (MATRIZ *);
void imprimir_matriz (MATRIZ *);
void somar_matrizes (MATRIZ *, MATRIZ *,MATRIZ *);
void subtrair_matrizes (MATRIZ *, MATRIZ *,MATRIZ *);
void multiplicar_matrizes (MATRIZ *, MATRIZ *, MATRIZ *);
void criar_matriz (int nl, int nc, MATRIZ *m) {
int i, j;
m->elementos = (int **) malloc (sizeof(int *)*nl);
if (!m->elementos) {
printf("Nao foi possivel reservar memoria para a matriz!\n");
exit(1);
}
for (i=0; i<nl; i++) {
m->elementos[i] = (int *) malloc (sizeof(int)*nc);
if (!(m->elementos[i])) {
printf("Nao foi possivel reservar memoria para a matriz!\n");
exit(2);
}
}
m->nl = nl;
m->nc = nc;
for (i=0; i<nl; i++)
for (j=0; j<nc; j++)
m->elementos[i][j] = 0;
}
void inicializar_matriz (MATRIZ *m) {
int i, j;
for (i=0; i<m->nl; i++)
for (j=0; j<m->nc; j++) {
printf ("\nEntre com matriz[%d][%d]=",i+1,j+1);
scanf ("%d",&(m->elementos[i][j]));
}
}
void imprimir_matriz (MATRIZ *m) {
int i, j;
for (i=0;i<m->nl;i++) {
printf("\n|");
for (j=0;j<m->nc;j++)
printf ("%5d", m->elementos[i][j]);
printf(" |");
}
}
void somar_matrizes (MATRIZ *m1, MATRIZ *m2, MATRIZ *m3) {
if (m1->nl==m2->nl && m1->nc==m2->nc) {
int i, j;
criar_matriz (m1->nl, m1->nc, m3);
for (i=0; i<m3->nl; i++)
for (j=0; j<m3->nc; j++)
m3->elementos[i][j] = m1->elementos[i][j] + m2->elementos[i][j];
} else {
printf ("A soma nao eh possivel!\n");
}
}
void subtrair_matrizes (MATRIZ *m1, MATRIZ *m2, MATRIZ *m3) {
if (m1->nl==m2->nl && m1->nc==m2->nc) {
int i, j;
criar_matriz (m1->nl, m1->nc, m3);
for (i=0; i<m3->nl; i++)
for (j=0; j<m3->nc; j++)
m3->elementos[i][j] = m1->elementos[i][j] - m2->elementos[i][j];
} else {
printf ("A soma nao eh possivel!\n");
}
}
void multiplicar_matrizes (MATRIZ *m1, MATRIZ *m2, MATRIZ *m3) {
if (m1->nc==m2->nl) {
int i, j, z;
criar_matriz (m1->nl, m2->nc, m3);
for (i=0; i<m3->nl; i++)
for (j=0; j<m3->nc; j++) {
m3->elementos[i][j] = 0;
for (z=0; z<m1->nc; z++)
m3->elementos[i][j] += m1->elementos[i][z] * m2->elementos[z][j];
}
} else {
printf ("A multiplicacao nao eh possivel!\n");
}
}
But I don’t understand why he puts indexes on elements when he wasn’t declared that way. And why he uses pointer to pointer to int
; and what would be the difference if it was just a pointer to int
?
If you know English, take a look at c-Faq especially section 6.
– pmg