Ir ao conteúdo
  • Cadastre-se
psydhelic

Multiplicação de matrizes em c

Recommended Posts

o quem tem de errado no codigo que ele nao recebe os numeros das matrizes digitadas corretamente..

exemplo

se digito a matriz: 1 2 3. 4 5 6. 7 8 9

ele exibe a matriz: 789. 789. 789

o que acontece???

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <locale.h>


main (){

int l, c, l1, c1, i, j, k;
float matriz[l][c], matriz2[l1][c1], o[c][l1];

printf ("Digite a quantidade de (linhas/colunas) da primeira matriz.\n\n");

printf ("Linhas = ");
scanf ("%d", &l );
printf ("Colunas = ");
scanf ("%d", &c );

printf ("\nDigite a primeira matriz\n");

for (i = 0; i < l; i++){
for (j = 0; j < c; j++){
scanf("%f", &matriz[i][j] );
}
printf ("\n");
}

system("cls");
printf ("Digite a quantidade de (linhas/colunas) da segunda matriz.\n\n");

printf ("Linhas = ");
scanf ("%d", &l1 );
printf ("Colunas = ");
scanf ("%d", &c1 );
printf ("\nDigite a segunda matriz\n");

for (i = 0; i < l1; i++){
for (j = 0; j < c1; j++){
scanf("%f", &matriz2[i][j] );
}
printf ("\n");
}

system("cls");
printf("---------------------------- 1 - Matriz Gerada ---------------------------------\n\n");

for(i=0; i<l; i++) {
for(j=0; j<c; j++){
printf("\t%6.f", matriz[i][j]);
}
printf("\n\n");
}

printf("---------------------------- 2 - Matriz Gerada ---------------------------------\n\n");

for(i=0; i<l1; i++){
for(j=0; j<c1; j++){
printf("\t%6.f", matriz2[i][j]);
}
printf("\n\n");
}

if (c == l1){

printf("----------------- Resultado da Multiplicação das Matrizes --------------------\n\n");
for (i = 0; i < l; i++){
for (j = 0; j < c1; j++){
o[i][j] = 0;
for (k = 0; k < l1; k++){
o[i][j] += matriz[i][k] * matriz2 [k][j];

}
printf ("\t%6.f ", o[i][j]);
}
printf ("\n\n");
}

}
else {
printf("-------------------------------------------------------------------------------\n\n");
printf ("Imposivel multiplicar as matrizes ");

}

getch ();
return 0;
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Esse programa executa no windows sem problema?

No linux, logo depois de pôr para rodar, já dá erro. =/

Essa região de código não faz sentido:


main (){

int l, c, l1, c1, i, j, k;
float matriz[l][c], matriz2[l1][c1], o[c][l1];

Você está alocando na memória uma quantidade de bytes que dependem de lixo de memória.

O que quero dizer: Você declara as variáveis l e c e, sem inciá-las, já declara uma matriz que usa esses valores. O problema é que você não garante que esses valores sejam os que você quer.

Para resolver esse problema, usamos ponteiro e alocação dinâmica. Como se segue:

#include <stdio.h>
#include <stdlib.h>
#include <locale.h>


main (){

int l, c, l1, c1, i, j, k;
float **matriz, **matriz2, **o;

printf ("Digite a quantidade de (linhas/colunas) da primeira matriz.\n\n");

printf ("Linhas = ");
scanf ("%d", &l );
printf ("Colunas = ");
scanf ("%d", &c );

matriz = (float **) malloc(sizeof(float *) * l);

for(i = 0; i < l; i++)
matriz[i] = (float *) malloc(sizeof(float) * c);

printf ("\nDigite a primeira matriz\n");

for (i = 0; i < l; i++){
for (j = 0; j < c; j++){
scanf("%f", &matriz[i][j] );
}
printf ("\n");
}

printf ("Digite a quantidade de (linhas/colunas) da segunda matriz.\n\n");

printf ("Linhas = ");
scanf ("%d", &l1 );
printf ("Colunas = ");
scanf ("%d", &c1 );
printf ("\nDigite a segunda matriz\n");

matriz2 = (float **) malloc(sizeof(float *) * l1);

for(i = 0; i < l; i++)
matriz2[i] = (float *) malloc(sizeof(float) * c1);

o = (float **) malloc(sizeof(float *) * c);

for(i = 0; i < l; i++)
o[i] = (float *) malloc(sizeof(float) * l1);



for (i = 0; i < l1; i++){
for (j = 0; j < c1; j++){
scanf("%f", &matriz2[i][j] );
}
printf ("\n");
}

printf("---------------------------- 1 - Matriz Gerada ---------------------------------\n\n");

for(i=0; i<l; i++) {
for(j=0; j<c; j++){
printf("\t%6.f", matriz[i][j]);
}
printf("\n\n");
}

printf("---------------------------- 2 - Matriz Gerada ---------------------------------\n\n");

for(i=0; i<l1; i++){
for(j=0; j<c1; j++){
printf("\t%6.f", matriz2[i][j]);
}
printf("\n\n");
}

if (c == l1){

printf("----------------- Resultado da Multiplicação das Matrizes --------------------\n\n");
for (i = 0; i < l; i++){
for (j = 0; j < c1; j++){
o[i][j] = 0;
for (k = 0; k < l1; k++){
o[i][j] += matriz[i][k] * matriz2 [k][j];

}
printf ("\t%6.f ", o[i][j]);
}
printf ("\n\n");
}

}
else {
printf("-------------------------------------------------------------------------------\n\n");
printf ("Imposivel multiplicar as matrizes ");

}

return 0;
}

Do jeito que está, esse código roda, mas não garanto que exiba os resultados esperados.

Dê uma olhada.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Funcionou direitinho aqui... nao sei usar muito bem ponteiros ainda mas deu uma clareada

seria correto se eu iniciar assim:


main (){

int l=3, c=3, l1=3, c1=3, i, j, k;
float matriz[l][c], matriz2[l1][c1], o[c][l1];

= 3 para matrizes de ordem 3. desta forma funciona aqui sem ter que usar os ponteiros

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sim, assim também funciona.

A única diferença é que, dessa maneira, você terá sempre matrizes de mesmo tamanho.

Usando ponteiros, o tamanho de sua matriz pode depender de valores inseridos pelo usuário.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×