/* matrix1.c - 2D array */

#include <stdio.h>

#define MAXR 5
#define MAXC 5

readMatrix(fin,M,m,n)
FILE * fin;
int M[][MAXC];
int m,n;
{  int i,j;

   for(i=0;i<m;i++)
    for(j=0;j<n;j++)
     fscanf(fin,"%d",&(M[i][j]));
}

writeMatrix(fout,M,m,n)
FILE * fout;
int M[][MAXC];
int m,n;
{  int i,j;

   for(i=0;i<m;i++)
   {  for(j=0;j<n;j++)
       fprintf(fout,"%d ",M[i][j]);
      putc('\n',fout);
   }
}

matrixProd(M1,M2,M3,m,n)
int M1[][MAXC];
int M2[][MAXC];
int M3[][MAXC];
int m,n;
{  int i,j,k;
   
   for(i=0;i<m;i++)
    for(j=0;j<m;j++)
    {  M3[i][j]=0;
       for(k=0;k<n;k++)
        M3[i][j] = M3[i][j]+M1[i][k]*M2[k][j];
    }
}

main(argc,argv)
int argc;
char ** argv;
{  FILE * fin;
   int m1[MAXR][MAXC];
   int m2[MAXR][MAXC];
   int m3[MAXR][MAXC];
   int m,n;

   fin = fopen(argv[1],"r");
   fscanf(fin,"%d %d",&m,&n);
   readMatrix(fin,m1,m,n);
   readMatrix(fin,m2,n,m);
   fclose(fin);
   writeMatrix(stdout,m1,m,n);
   putchar('\n');
   writeMatrix(stdout,m2,n,m);
   putchar('\n');
   matrixProd(m1,m2,m3,m,n);
   writeMatrix(stdout,m3,m,m);
}
