#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/*
Este programa realiza a multiplicação de duas matrizes fornecidas como entrada (ver formato
abaixo).
A rotina MultiplicaMatrizes apresenta duas versões: uma utilizando aritmética de
ponteiros, e outra utilizando índices de vetor.
Exemplo de formato de entrada (sem os comentários)
2 3 4 //( indica duas matrizes: 2 x 3 e 3 x 4
1,2,3,4,5,6 //Elementos da primeira matriz de 2 x 3
1,2,3,4,5,6,7,5,2,1,2,1 //elementos da segunda matriz de 3 x 4
Ver ao final mais arquivos de entrada de exemplo
*/
void MultiplicaMatrizes(int, int, int, float *, float *);
void MultiplicaMatrizes1(int m, int p, int n,float mxA[m][p], float mxB[p][n]);
void RetornaMatriz(char linhaMx[], int , int , float * );
//int main(int argc, char * argv[])
int main(void)
{
char linMxA[255], linMxB[255];
int m, p, n;
float * mxA, *mxB;
scanf("%d%d%d%s%s", &m
,&p
,&n
, (char*) &linMxA
, (char*) &linMxB
); //float mxA[m][p], mxB[p][n]; // se não quiser usar malloc
mxA
=(float *) malloc(m
*p
*sizeof(float)); mxB
=(float *) malloc(n
*p
*sizeof(float)); RetornaMatriz(linMxA, m, p, mxA);
RetornaMatriz(linMxB, p, n, mxB);
MultiplicaMatrizes( m, p, n,mxA,mxB);
MultiplicaMatrizes1( m, p, n, (float (*)[p]) mxA, (float (*)[n]) mxB);
//getchar();
//getchar();
}
void RetornaMatriz(char linhaMx[], int nLinhas, int nColunas, float * mxRet)
{
int i;
char * pLinhaMx;
pLinhaMx=linhaMx;
for (i=0;i<nLinhas*nColunas;i++)
{
sscanf(pLinhaMx
, "%f", (mxRet
+ i
)); pLinhaMx
=strstr(pLinhaMx
, ","); pLinhaMx++;
printf("%.2f\n", *(mxRet
+ i
)); }
puts("------------------------\n"); }
void MultiplicaMatrizes1(int m, int p, int n,float mxA[m][p], float mxB[p][n])
{
printf("\nResultado da rotina MultiplicaMatrizes1:\n"); int i, j, k;
float mxResultado[m][n];
memset(mxResultado
, '\0', m
*n
*sizeof(float));
for (k=0;k<p;k++)
{
for (i=0;i<m;i++)
{
for (j=0;j<n;j++)
{
mxResultado[i][j]+=mxA[i][k]*mxB[k][j];
}
}
}
for (i=0;i<m;i++)
{
for (j=0;j<n;j++)
{
printf("%.2f\t", mxResultado
[i
][j
]); }
}
}
void MultiplicaMatrizes( int m, int p, int n, float * mxA, float * mxB)
{
int i, j, k;
float mxResultado[m][n], tempA, tempB;
memset(mxResultado
, '\0', m
*n
*sizeof(float)); puts("\nEtapas da multiplicacao:\n"); for (k=0;k<p;k++)
{
for (i=0;i<m;i++)
{
for (j=0;j<n;j++)
{
tempA=(*(mxA+(i*p)+k));
tempB=(*(mxB+(k*n)+j));
printf("[%d,%d]->%f, %f\n", i
,j
, tempA
, tempB
); mxResultado[i][j]+= tempA * tempB;
}
}
}
puts("----------------------------------------------\n"); puts("Resultado da multiplicacao das matrizes A e B, na rotina MultiplicaMatrizes:\n"); for (i=0;i<m;i++)
{
for (j=0;j<n;j++)
{
printf("%.2f\t", mxResultado
[i
][j
]); }
}
}
/*
void RetiraVirgulas(char * linha)
{
char c;
while (c=(char) (*linha++))
{
if (c=='\n') break;
if (c==',' || c==';') (*(linha-1))=' ';
}
}
*/
/*
Arquivos de entrada ( utilizar o redirecionamento: < in.txt)
Exemplo 1:
2 3 2
1,2,3,4,5,6
7,8,9,10,11,12
Exemplo 2:
1 3 2
2,3,5
6,7,5,3,4,1
Exemplo 3:
1 2 3
2,3
2,7,5,3,4,6
Exemplo 4:
4 3 5
2,3.2,5,7,43,3,2.3,3.6,5,7,4,3.8
2,73.2,50,12,4,1,2.3,6.7,5.45,4,6,2.8,15,42,3
*/
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgoKLyoKRXN0ZSBwcm9ncmFtYSByZWFsaXphIGEgbXVsdGlwbGljYcOnw6NvIGRlIGR1YXMgbWF0cml6ZXMgZm9ybmVjaWRhcyBjb21vIGVudHJhZGEgKHZlciBmb3JtYXRvCmFiYWl4bykuCgpBIHJvdGluYSBNdWx0aXBsaWNhTWF0cml6ZXMgYXByZXNlbnRhIGR1YXMgdmVyc8O1ZXM6IHVtYSB1dGlsaXphbmRvIGFyaXRtw6l0aWNhIGRlCnBvbnRlaXJvcywgZSBvdXRyYSB1dGlsaXphbmRvIMOtbmRpY2VzIGRlIHZldG9yLgoKRXhlbXBsbyBkZSBmb3JtYXRvIGRlIGVudHJhZGEgKHNlbSBvcyBjb21lbnTDoXJpb3MpCjIgMyA0ICAgIC8vKCBpbmRpY2EgZHVhcyBtYXRyaXplczogMiB4IDMgZSAzIHggNAoxLDIsMyw0LDUsNiAvL0VsZW1lbnRvcyBkYSBwcmltZWlyYSBtYXRyaXogZGUgMiB4IDMKMSwyLDMsNCw1LDYsNyw1LDIsMSwyLDEgLy9lbGVtZW50b3MgZGEgc2VndW5kYSBtYXRyaXogZGUgMyB4IDQKVmVyIGFvIGZpbmFsIG1haXMgYXJxdWl2b3MgZGUgZW50cmFkYSBkZSBleGVtcGxvCiovCgp2b2lkIE11bHRpcGxpY2FNYXRyaXplcyhpbnQsIGludCwgaW50LCBmbG9hdCAqLCBmbG9hdCAqKTsKdm9pZCBNdWx0aXBsaWNhTWF0cml6ZXMxKGludCBtLCBpbnQgcCwgaW50IG4sZmxvYXQgbXhBW21dW3BdLCBmbG9hdCBteEJbcF1bbl0pOwp2b2lkIFJldG9ybmFNYXRyaXooY2hhciBsaW5oYU14W10sIGludCAsIGludCAsIGZsb2F0ICogKTsKCi8vaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiBhcmd2W10pCmludCBtYWluKHZvaWQpCnsKICAgIGNoYXIgbGluTXhBWzI1NV0sIGxpbk14QlsyNTVdOwogICAgaW50IG0sIHAsIG47CiAgICBmbG9hdCAqIG14QSwgKm14QjsKICAgIHNjYW5mKCIlZCVkJWQlcyVzIiwgJm0sJnAsJm4sIChjaGFyKikgJmxpbk14QSwgKGNoYXIqKSAmbGluTXhCKTsKICAgIC8vZmxvYXQgbXhBW21dW3BdLCBteEJbcF1bbl07ICAgLy8gc2UgbsOjbyBxdWlzZXIgdXNhciBtYWxsb2MKCiAgICBteEE9KGZsb2F0ICopIG1hbGxvYyhtKnAqc2l6ZW9mKGZsb2F0KSk7CiAgICBteEI9KGZsb2F0ICopIG1hbGxvYyhuKnAqc2l6ZW9mKGZsb2F0KSk7CiAgICBwdXRzKCJcbk1hdHJpeiBBXG4iKTsKICAgIFJldG9ybmFNYXRyaXoobGluTXhBLCBtLCBwLCBteEEpOwogICAgcHV0cygiXG5NYXRyaXogQlxuIik7CiAgICBSZXRvcm5hTWF0cml6KGxpbk14QiwgcCwgbiwgbXhCKTsKICAgIE11bHRpcGxpY2FNYXRyaXplcyggbSwgcCwgbixteEEsbXhCKTsKICAgIE11bHRpcGxpY2FNYXRyaXplczEoIG0sIHAsIG4sIChmbG9hdCAoKilbcF0pIG14QSwgKGZsb2F0ICgqKVtuXSkgbXhCKTsKICAgIGZyZWUobXhBKTsKICAgIGZyZWUobXhCKTsKICAgIC8vZ2V0Y2hhcigpOwogICAgLy9nZXRjaGFyKCk7Cgp9Cgp2b2lkIFJldG9ybmFNYXRyaXooY2hhciBsaW5oYU14W10sIGludCBuTGluaGFzLCBpbnQgbkNvbHVuYXMsIGZsb2F0ICogbXhSZXQpCnsKICAgIGludCBpOwogICAgY2hhciAqIHBMaW5oYU14OwogICAgcExpbmhhTXg9bGluaGFNeDsKCgogICAgZm9yIChpPTA7aTxuTGluaGFzKm5Db2x1bmFzO2krKykKICAgIHsKICAgICAgICBzc2NhbmYocExpbmhhTXgsICIlZiIsIChteFJldCArIGkpKTsKICAgICAgICBwTGluaGFNeD1zdHJzdHIocExpbmhhTXgsICIsIik7CiAgICAgICAgcExpbmhhTXgrKzsKICAgICAgICBwcmludGYoIiUuMmZcbiIsICoobXhSZXQgKyBpKSk7CiAgICB9CiAgICBwdXRzKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOwp9CnZvaWQgTXVsdGlwbGljYU1hdHJpemVzMShpbnQgbSwgaW50IHAsIGludCBuLGZsb2F0IG14QVttXVtwXSwgZmxvYXQgbXhCW3BdW25dKQp7CiAgICBwcmludGYoIlxuUmVzdWx0YWRvIGRhIHJvdGluYSBNdWx0aXBsaWNhTWF0cml6ZXMxOlxuIik7CiAgICBpbnQgaSwgaiwgazsKICAgIGZsb2F0IG14UmVzdWx0YWRvW21dW25dOwogICAgbWVtc2V0KG14UmVzdWx0YWRvLCAnXDAnLCBtKm4qc2l6ZW9mKGZsb2F0KSk7CgogICAgZm9yIChrPTA7azxwO2srKykKICAgIHsKICAgICAgICBmb3IgKGk9MDtpPG07aSsrKQogICAgICAgIHsKICAgICAgICAgICAgZm9yIChqPTA7ajxuO2orKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgbXhSZXN1bHRhZG9baV1bal0rPW14QVtpXVtrXSpteEJba11bal07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBmb3IgKGk9MDtpPG07aSsrKQogICAgewogICAgICAgIGZvciAoaj0wO2o8bjtqKyspCiAgICAgICAgewogICAgICAgICAgICBwcmludGYoIiUuMmZcdCIsIG14UmVzdWx0YWRvW2ldW2pdKTsKICAgICAgICB9CiAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgfQp9CnZvaWQgTXVsdGlwbGljYU1hdHJpemVzKCBpbnQgbSwgaW50IHAsIGludCBuLCBmbG9hdCAqIG14QSwgZmxvYXQgKiBteEIpCnsKICAgIGludCBpLCBqLCBrOwogICAgZmxvYXQgbXhSZXN1bHRhZG9bbV1bbl0sIHRlbXBBLCB0ZW1wQjsKICAgIG1lbXNldChteFJlc3VsdGFkbywgJ1wwJywgbSpuKnNpemVvZihmbG9hdCkpOwogICAgcHV0cygiXG5FdGFwYXMgZGEgbXVsdGlwbGljYWNhbzpcbiIpOwogICAgZm9yIChrPTA7azxwO2srKykKICAgIHsKICAgICAgICBmb3IgKGk9MDtpPG07aSsrKQogICAgICAgIHsKICAgICAgICAgICAgZm9yIChqPTA7ajxuO2orKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGVtcEE9KCoobXhBKyhpKnApK2spKTsKICAgICAgICAgICAgICAgIHRlbXBCPSgqKG14QisoaypuKStqKSk7CiAgICAgICAgICAgICAgICBwcmludGYoIlslZCwlZF0tPiVmLCAlZlxuIiwgaSxqLCB0ZW1wQSwgdGVtcEIpOwogICAgICAgICAgICAgICAgbXhSZXN1bHRhZG9baV1bal0rPSB0ZW1wQSAqIHRlbXBCOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgcHV0cygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CiAgICBwdXRzKCJSZXN1bHRhZG8gZGEgbXVsdGlwbGljYWNhbyBkYXMgbWF0cml6ZXMgQSBlIEIsIG5hIHJvdGluYSBNdWx0aXBsaWNhTWF0cml6ZXM6XG4iKTsKICAgIGZvciAoaT0wO2k8bTtpKyspCiAgICB7CiAgICAgICAgZm9yIChqPTA7ajxuO2orKykKICAgICAgICB7CiAgICAgICAgICAgIHByaW50ZigiJS4yZlx0IiwgbXhSZXN1bHRhZG9baV1bal0pOwogICAgICAgIH0KICAgICAgICBwcmludGYoIlxuIik7CiAgICB9Cn0KLyoKdm9pZCBSZXRpcmFWaXJndWxhcyhjaGFyICogbGluaGEpCnsKICAgIGNoYXIgYzsKICAgIHdoaWxlIChjPShjaGFyKSAoKmxpbmhhKyspKQogICAgewogICAgICAgIGlmIChjPT0nXG4nKSBicmVhazsKICAgICAgICBpZiAoYz09JywnIHx8IGM9PSc7JykgKCoobGluaGEtMSkpPScgJzsKICAgIH0KfQoqLwoKLyoKQXJxdWl2b3MgZGUgZW50cmFkYSAoIHV0aWxpemFyIG8gcmVkaXJlY2lvbmFtZW50bzogPCBpbi50eHQpCgpFeGVtcGxvIDE6CjIgMyAyCjEsMiwzLDQsNSw2CjcsOCw5LDEwLDExLDEyCgpFeGVtcGxvIDI6CjEgMyAyCjIsMyw1CjYsNyw1LDMsNCwxCgpFeGVtcGxvIDM6CjEgMiAzCjIsMwoyLDcsNSwzLDQsNgoKRXhlbXBsbyA0Ogo0IDMgNQoyLDMuMiw1LDcsNDMsMywyLjMsMy42LDUsNyw0LDMuOAoyLDczLjIsNTAsMTIsNCwxLDIuMyw2LjcsNS40NSw0LDYsMi44LDE1LDQyLDMKCiov
Matriz A
2.00
3.20
5.00
7.00
43.00
3.00
2.30
3.60
5.00
7.00
4.00
3.80
------------------------
Matriz B
2.00
73.20
50.00
12.00
4.00
1.00
2.30
6.70
5.45
4.00
6.00
2.80
15.00
42.00
3.00
------------------------
Etapas da multiplicacao:
[0,0]->2.000000, 2.000000
[0,1]->2.000000, 73.199997
[0,2]->2.000000, 50.000000
[0,3]->2.000000, 12.000000
[0,4]->2.000000, 4.000000
[1,0]->7.000000, 2.000000
[1,1]->7.000000, 73.199997
[1,2]->7.000000, 50.000000
[1,3]->7.000000, 12.000000
[1,4]->7.000000, 4.000000
[2,0]->2.300000, 2.000000
[2,1]->2.300000, 73.199997
[2,2]->2.300000, 50.000000
[2,3]->2.300000, 12.000000
[2,4]->2.300000, 4.000000
[3,0]->7.000000, 2.000000
[3,1]->7.000000, 73.199997
[3,2]->7.000000, 50.000000
[3,3]->7.000000, 12.000000
[3,4]->7.000000, 4.000000
[0,0]->3.200000, 1.000000
[0,1]->3.200000, 2.300000
[0,2]->3.200000, 6.700000
[0,3]->3.200000, 5.450000
[0,4]->3.200000, 4.000000
[1,0]->43.000000, 1.000000
[1,1]->43.000000, 2.300000
[1,2]->43.000000, 6.700000
[1,3]->43.000000, 5.450000
[1,4]->43.000000, 4.000000
[2,0]->3.600000, 1.000000
[2,1]->3.600000, 2.300000
[2,2]->3.600000, 6.700000
[2,3]->3.600000, 5.450000
[2,4]->3.600000, 4.000000
[3,0]->4.000000, 1.000000
[3,1]->4.000000, 2.300000
[3,2]->4.000000, 6.700000
[3,3]->4.000000, 5.450000
[3,4]->4.000000, 4.000000
[0,0]->5.000000, 6.000000
[0,1]->5.000000, 2.800000
[0,2]->5.000000, 15.000000
[0,3]->5.000000, 42.000000
[0,4]->5.000000, 3.000000
[1,0]->3.000000, 6.000000
[1,1]->3.000000, 2.800000
[1,2]->3.000000, 15.000000
[1,3]->3.000000, 42.000000
[1,4]->3.000000, 3.000000
[2,0]->5.000000, 6.000000
[2,1]->5.000000, 2.800000
[2,2]->5.000000, 15.000000
[2,3]->5.000000, 42.000000
[2,4]->5.000000, 3.000000
[3,0]->3.800000, 6.000000
[3,1]->3.800000, 2.800000
[3,2]->3.800000, 15.000000
[3,3]->3.800000, 42.000000
[3,4]->3.800000, 3.000000
----------------------------------------------
Resultado da multiplicacao das matrizes A e B, na rotina MultiplicaMatrizes:
37.20 167.76 196.44 251.44 35.80
75.00 619.70 683.10 444.35 209.00
38.20 190.64 214.12 257.22 38.60
40.80 532.24 433.80 265.40 55.40
Resultado da rotina MultiplicaMatrizes1:
37.20 167.76 196.44 251.44 35.80
75.00 619.70 683.10 444.35 209.00
38.20 190.64 214.12 257.22 38.60
40.80 532.24 433.80 265.40 55.40