Ir ao conteúdo

Exercício em C


maluga

Posts recomendados

Postado

Estou tentando fazer um exercício onde devo alocar dinamicamente 2 matrizes e checar se elas podem ser multiplicadas,se possível então o resultado deve ser exibido em outra matriz,porém quando na parte para multiplicar e exibir o resultado não ta dando certo,ele sempre aparece zero,para a multiplicação de 2 matrizes que não sejam iguais.

aqui o código que eu fiz

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

int main()
{
float **m1,**m2,**mr;
int l1,l2,c1,c2,cont,cont2,lr,cr;
printf("Digite o numero de linhas da primeira matriz: ");
scanf("%d",&l1);
while(l1<=0)
{
printf("Digite um valor valido: ");
scanf("%d",&l1);
}
printf("Digite o numero de colunas da primeira matriz: ");
scanf("%d",&c1);
while(c1<=0)
{
printf("Digite um valor valido: ");
scanf("%d",&c1);
}
printf("Digite o numero de linhas da segunda matriz: ");
scanf("%d",&l2);
while(l2<=0)
{
printf("Digite um valor valido: ");
scanf("%d",&l2);
}
printf("Digite o numero de colunas da segunda matriz: ");
scanf("%d",&c2);
while(c2<=0)
{
printf("Digite um valor valido: ");
scanf("%d",&c2);
}

if((m1 = (float**) calloc(l1,sizeof(float*)))==NULL)
{
printf("Sem memoria para tal alocacao");
exit (0);
}

for(cont=0;cont<l1;cont++)
{
if( ( *(m1+cont) = (float*) calloc(c1,sizeof(float)) )==NULL)
{
printf("Sem memoria para tal alocacao");
exit (0);
}
}

if((m2 = (float**) calloc(l2,sizeof(float*))) ==NULL)
{
printf("Sem memoria para tal alocacao");
exit (0);
}


for(cont=0;cont<l2;cont++)
{
if(( *(m2+cont) = (float*) calloc(c2,sizeof(float)) )==NULL )
{
printf("Sem memoria para tal alocacao");
exit (0);
}
}


for(cont=0;cont<l1;cont++)
{
for(cont2=0;cont2<c1;cont2++)
{
printf("Digite o elemento A%d%d da primeira matriz:",cont+1,cont2+1);
scanf("%f",&m1[cont][cont2]);
}
}


for(cont=0;cont<l2;cont++)
{
for(cont2=0;cont2<c2;cont2++)
{
printf("Digite o elemento A%d%d da segunda matriz:",cont+1,cont2+1);
scanf("%f",&m2[cont][cont2]);
}
}

if( ( mr = (float**) calloc(l1,sizeof(float*)) )==NULL)
{
printf("Sem memoria para tal alocacao");
exit (0);
}

for(cont=0;cont<c2;cont++)
{
if( ( *(mr+cont) = (float*) calloc(c2,sizeof(float)) )==NULL )
{
printf("Sem memoria para tal alocacao");
exit(0);
}
}

if(c1==l2)
{
printf("A sua matriz resultante da multiplicacao das duas matrizes fornecidas e\n");
for(lr=0;lr<l1;lr++)
{
for(cr=0;cr<c2;cr++)
{
mr[lr][cr]=m1[lr][cr]*m2[lr][cr];
printf(" %f ",mr[lr][cr]);
}
printf("\n");
}
}

else
{
mr=NULL;
printf("As matrizes nao podem ser multiplicadas.");
}



return 0;
}

obrigado a quem puder ajudar.

Postado

você usou 2 matrizes iguais ou algo parecido?tenta fazer esse teste

matriz 1:

1 3

2 0

-1 4

matriz 2:

2 1

3 1

a matriz resultante e pra ser

11 4

4 2

10 3

Postado


for (lr = 0; lr < l1; lr++) {
for (cr = 0; cr < c2; cr++) {
mr[lr][cr] = m1[lr][cr] * m2[lr][cr];
printf(" %f ", mr[lr][cr]);
}
printf("\n");
}

O erro tá aí em cima...


[ [COLOR=Red]1 3[/COLOR] ] [ [COLOR=Red]2[/COLOR] 1 ] [ x y ]
[ 2 0 ] x [ [COLOR=Red]3[/COLOR] 1 ] = [ z w ]
[-1 4 ] [ a b ]

x vai ser igual a multiplicação da primeira linha da primeira matriz, com a primeira coluna da segunda matriz.

Então: x = (1*2) + (3*3) = 11

y = (1*1) + (3*1) = 4

z =

No seu código você tá fazendo apenas: x = 1*2

mr[lr][cr] = m1[lr][cr] * m2[lr][cr];

Eu fiz assim e acho que funcionou:


// só pra zerar a mr
for (lr = 0; lr < l1; lr++) {
for (cr = 0; cr < c2; cr++)
mr[lr][cr] = 0;
}

if (c1 == l2) {
printf("A sua matriz resultante da multiplicacao das duas matrizes fornecidas e\n");
for (lr = 0; lr < l1; lr++) {
for (cr = 0; cr < c2; cr++) {
for (z = 0; z < c1; z++)
mr[lr][cr] += (m1[lr][z] * m2[z][cr]);
printf(" %f ", mr[lr][cr]);
}
printf("\n");
}
} else {
mr = NULL;
printf("As matrizes nao podem ser multiplicadas.");
}

Testa aí depois se funciona com outros casos também.

Postado

Hum... eu não lembro agora se alterei outras coisas além daquilo... então vou postar o código inteiro e você vê aí:


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

int main()
{
float **m1, **m2, **mr;
int l1, l2, c1, c2, cont, cont2, lr, cr, z, w;
printf("Digite o numero de linhas da primeira matriz: ");
scanf("%d", &l1);
while (l1 <= 0) {
printf("Digite um valor valido: ");
scanf("%d", &l1);
}
printf("Digite o numero de colunas da primeira matriz: ");
scanf("%d", &c1);
while (c1 <= 0) {
printf("Digite um valor valido: ");
scanf("%d", &c1);
}
printf("Digite o numero de linhas da segunda matriz: ");
scanf("%d", &l2);
while (l2 <= 0) {
printf("Digite um valor valido: ");
scanf("%d", &l2);
}
printf("Digite o numero de colunas da segunda matriz: ");
scanf("%d", &c2);
while (c2 <= 0) {
printf("Digite um valor valido: ");
scanf("%d", &c2);
}

if ((m1 = (float **)calloc(l1, sizeof(float *))) == NULL) {
printf("Sem memoria para tal alocacao");
exit(0);
}

for (cont = 0; cont < l1; cont++) {
if ((*(m1 + cont) = (float *)calloc(c1, sizeof(float))) == NULL) {
printf("Sem memoria para tal alocacao");
exit(0);
}
}

if ((m2 = (float **)calloc(l2, sizeof(float *))) == NULL) {
printf("Sem memoria para tal alocacao");
exit(0);
}

for (cont = 0; cont < l2; cont++) {
if ((*(m2 + cont) = (float *)calloc(c2, sizeof(float))) == NULL) {
printf("Sem memoria para tal alocacao");
exit(0);
}
}

for (cont = 0; cont < l1; cont++) {
for (cont2 = 0; cont2 < c1; cont2++) {
printf("Digite o elemento A%d%d da primeira matriz:",
cont + 1, cont2 + 1);
scanf("%f", &m1[cont][cont2]);
}
}

for (cont = 0; cont < l2; cont++) {
for (cont2 = 0; cont2 < c2; cont2++) {
printf("Digite o elemento A%d%d da segunda matriz:",
cont + 1, cont2 + 1);
scanf("%f", &m2[cont][cont2]);
}
}

for (cont = 0; cont < l1; cont++) {
for (cont2 = 0; cont2 < c1; cont2++) {
printf("%f ", m1[cont][cont2]);
}
printf("\n");
}

for (cont = 0; cont < l2; cont++) {
for (cont2 = 0; cont2 < c2; cont2++) {
printf("%f ", m2[cont][cont2]);
}
printf("\n");
}

if ((mr = (float **)calloc(c1, sizeof(float *))) == NULL) {
printf("Sem memoria para tal alocacao");
exit(0);
}

for (cont = 0; cont < l1; cont++) {
if ((*(mr + cont) = (float *)calloc(c2, sizeof(float))) == NULL) {
printf("Sem memoria para tal alocacao");
exit(0);
}
}

for (lr = 0; lr < l1; lr++) {
for (cr = 0; cr < c2; cr++)
mr[lr][cr] = 0;
}


if (c1 == l2) {
printf("A sua matriz resultante da multiplicacao das duas matrizes fornecidas e\n");
for (lr = 0; lr < l1; lr++) {
for (cr = 0; cr < c2; cr++) {
for (z = 0; z < c1; z++)
mr[lr][cr] += (m1[lr][z] * m2[z][cr]);
printf(" %f ", mr[lr][cr]);
}
printf("\n");
}
} else {
mr = NULL;
printf("As matrizes nao podem ser multiplicadas.");
}

printf("\n");

return 0;
}

Tem uns printfs inúteis que coloquei apenas pra debug, pode tirar eles depois.

Postado

agora esse funcionou,deixa eu ver se entendi,você mudou essa parte

for (lr = 0; lr < l1; lr++)

{

for (cr = 0; cr < c2; cr++)

{

for (z = 0; z < c1; z++)

{

mr[lr][cr] += (m1[lr][z] * m2[z][cr]);

}

printf(" %f ", mr[lr][cr]);

}

printf("\n");

}

pra percorrer as linhas e colunas da primeira e da segunda matriz fazendo a multiplicação de todos os termos e depois somando todos,ai so depois que ele vai passar pra próxima linha da primeira matriz?

Não tinha me ligado nesse pequeno detalhe pra adicionar mais um laço com outra variável.obrigado.

Postado
agora esse funcionou,deixa eu ver se entendi,você mudou essa parte

pra percorrer as linhas e colunas da primeira e da segunda matriz fazendo a multiplicação de todos os termos e depois somando todos,ai so depois que ele vai passar pra próxima linha da primeira matriz?

É isso aí.

Porque precisava fazer o somatório das linhas por colunas das matrizes 1 e 2.

for (z = 0; z < c1; z++)

z vai até c1 (ou l2, tanto faz porque são iguais) que é o que a matriz 1 tem em comum com a 2.

Depois faz o somatório:

mr[lr][cr] += (m1[lr][z] * m2[z][cr]);

Note que na matriz2 eu inverti a posição do z, porque na verdade a gente quer pegar a coluna dela e não a linha.

É isso. :)

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades 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

×
×
  • Criar novo...