fork download
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. /*
  6. Este programa realiza a multiplicação de duas matrizes fornecidas como entrada (ver formato
  7. abaixo).
  8.  
  9. A rotina MultiplicaMatrizes apresenta duas versões: uma utilizando aritmética de
  10. ponteiros, e outra utilizando índices de vetor.
  11.  
  12. Exemplo de formato de entrada (sem os comentários)
  13. 2 3 4 //( indica duas matrizes: 2 x 3 e 3 x 4
  14. 1,2,3,4,5,6 //Elementos da primeira matriz de 2 x 3
  15. 1,2,3,4,5,6,7,5,2,1,2,1 //elementos da segunda matriz de 3 x 4
  16. Ver ao final mais arquivos de entrada de exemplo
  17. */
  18.  
  19. void MultiplicaMatrizes(int, int, int, float *, float *);
  20. void MultiplicaMatrizes1(int m, int p, int n,float mxA[m][p], float mxB[p][n]);
  21. void RetornaMatriz(char linhaMx[], int , int , float * );
  22.  
  23. //int main(int argc, char * argv[])
  24. int main(void)
  25. {
  26. char linMxA[255], linMxB[255];
  27. int m, p, n;
  28. float * mxA, *mxB;
  29. scanf("%d%d%d%s%s", &m,&p,&n, (char*) &linMxA, (char*) &linMxB);
  30. //float mxA[m][p], mxB[p][n]; // se não quiser usar malloc
  31.  
  32. mxA=(float *) malloc(m*p*sizeof(float));
  33. mxB=(float *) malloc(n*p*sizeof(float));
  34. puts("\nMatriz A\n");
  35. RetornaMatriz(linMxA, m, p, mxA);
  36. puts("\nMatriz B\n");
  37. RetornaMatriz(linMxB, p, n, mxB);
  38. MultiplicaMatrizes( m, p, n,mxA,mxB);
  39. MultiplicaMatrizes1( m, p, n, (float (*)[p]) mxA, (float (*)[n]) mxB);
  40. free(mxA);
  41. free(mxB);
  42. //getchar();
  43. //getchar();
  44.  
  45. }
  46.  
  47. void RetornaMatriz(char linhaMx[], int nLinhas, int nColunas, float * mxRet)
  48. {
  49. int i;
  50. char * pLinhaMx;
  51. pLinhaMx=linhaMx;
  52.  
  53.  
  54. for (i=0;i<nLinhas*nColunas;i++)
  55. {
  56. sscanf(pLinhaMx, "%f", (mxRet + i));
  57. pLinhaMx=strstr(pLinhaMx, ",");
  58. pLinhaMx++;
  59. printf("%.2f\n", *(mxRet + i));
  60. }
  61. puts("------------------------\n");
  62. }
  63. void MultiplicaMatrizes1(int m, int p, int n,float mxA[m][p], float mxB[p][n])
  64. {
  65. printf("\nResultado da rotina MultiplicaMatrizes1:\n");
  66. int i, j, k;
  67. float mxResultado[m][n];
  68. memset(mxResultado, '\0', m*n*sizeof(float));
  69.  
  70. for (k=0;k<p;k++)
  71. {
  72. for (i=0;i<m;i++)
  73. {
  74. for (j=0;j<n;j++)
  75. {
  76. mxResultado[i][j]+=mxA[i][k]*mxB[k][j];
  77. }
  78. }
  79. }
  80. for (i=0;i<m;i++)
  81. {
  82. for (j=0;j<n;j++)
  83. {
  84. printf("%.2f\t", mxResultado[i][j]);
  85. }
  86. printf("\n");
  87. }
  88. }
  89. void MultiplicaMatrizes( int m, int p, int n, float * mxA, float * mxB)
  90. {
  91. int i, j, k;
  92. float mxResultado[m][n], tempA, tempB;
  93. memset(mxResultado, '\0', m*n*sizeof(float));
  94. puts("\nEtapas da multiplicacao:\n");
  95. for (k=0;k<p;k++)
  96. {
  97. for (i=0;i<m;i++)
  98. {
  99. for (j=0;j<n;j++)
  100. {
  101. tempA=(*(mxA+(i*p)+k));
  102. tempB=(*(mxB+(k*n)+j));
  103. printf("[%d,%d]->%f, %f\n", i,j, tempA, tempB);
  104. mxResultado[i][j]+= tempA * tempB;
  105. }
  106. }
  107. }
  108. puts("----------------------------------------------\n");
  109. puts("Resultado da multiplicacao das matrizes A e B, na rotina MultiplicaMatrizes:\n");
  110. for (i=0;i<m;i++)
  111. {
  112. for (j=0;j<n;j++)
  113. {
  114. printf("%.2f\t", mxResultado[i][j]);
  115. }
  116. printf("\n");
  117. }
  118. }
  119. /*
  120. void RetiraVirgulas(char * linha)
  121. {
  122.   char c;
  123.   while (c=(char) (*linha++))
  124.   {
  125.   if (c=='\n') break;
  126.   if (c==',' || c==';') (*(linha-1))=' ';
  127.   }
  128. }
  129. */
  130.  
  131. /*
  132. Arquivos de entrada ( utilizar o redirecionamento: < in.txt)
  133.  
  134. Exemplo 1:
  135. 2 3 2
  136. 1,2,3,4,5,6
  137. 7,8,9,10,11,12
  138.  
  139. Exemplo 2:
  140. 1 3 2
  141. 2,3,5
  142. 6,7,5,3,4,1
  143.  
  144. Exemplo 3:
  145. 1 2 3
  146. 2,3
  147. 2,7,5,3,4,6
  148.  
  149. Exemplo 4:
  150. 4 3 5
  151. 2,3.2,5,7,43,3,2.3,3.6,5,7,4,3.8
  152. 2,73.2,50,12,4,1,2.3,6.7,5.45,4,6,2.8,15,42,3
  153.  
  154. */
Success #stdin #stdout 0s 2384KB
stdin
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
stdout
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