#include
#include
#define STD_IN "<stdin>"
void myprint(char* ifile,const char *va_alist,...);
void mxm(double *A,double *B,double* C,int m,int n,int p);
int main(int argc,char* argv[])
{
FILE *ifp;
char *ifile;
int i,j,k;
int m,n,p;
double *A,*B,*C;
if(argc >= 2){
if((ifp=fopen(argv[1],"r")) == NULL){
printf("can't open file.\n");
return 0;
}
ifile = argv[1];
} else {
ifp = stdin; ifile = STD_IN;
}
myprint(ifile,"input m:"); fscanf(ifp,"%d",&m);
myprint(ifile,"input n:"); fscanf(ifp,"%d",&n);
myprint(ifile,"input p:"); fscanf(ifp,"%d",&p);
A = (double*)calloc(m*n,sizeof(double));
B = (double*)calloc(n*p,sizeof(double));
C = (double*)calloc(m*p,sizeof(double));
myprint(ifile,"matrix A:\n",m);
for(i=0;i<m;i++)for(j=0;j<n;j++){
myprint(ifile,"%d.%d:",i,j);
fscanf(ifp,"%lf",(A+i*n+j));
}
myprint(ifile,"matrix B:\n",m);
for(i=0;i<n;i++)for(j=0;j<p;j++){
myprint(ifile,"%d.%d:",i,j);
fscanf(ifp,"%lf",(B+i*p+j));
}
mxm(A,B,C,m,n,p);
printf("\nmatrix A:\n");
for(i=0;i<m;i++){
for(j=0;j<n;j++) printf("%lf ",*(A+i*n+j));
printf("\n");
}
printf("\nmatrix B:\n");
for(i=0;i<n;i++){
for(j=0;j<p;j++) printf("%lf ",*(B+i*p+j));
printf("\n");
}
printf("\nmatrix C=A*B:\n");
for(i=0;i<m;i++){
for(j=0;j<p;j++) printf("%lf ",*(C+i*p+j));
printf("\n");
}
printf("\n");
if(strcmp(STD_IN,"<stdin>")) fclose(ifp);
free(A);free(B);free(C);
return 0;
}
void myprint(char* ifile,const char *va_alist,...)
{
va_list args;
char *fmt;
char print_fmt[256];
va_start(args);
fmt=va_arg(args, char *);
vsprintf(print_fmt, fmt, args);
va_end(args);
if(!strcmp(ifile,STD_IN)) fprintf(stdout,print_fmt);
}
void mxm(double *A,double *B,double* C,int m,int n,int p)
{
int i,j,k;
for(k=0;k<m;k++) for(j=0;j<p;j++){
double s=0.;
for(i=0;i<n;i++) s+=*(A+k*n+i)*(*(B+i*p+j));
*(C+k*p+j)=s;
}
}
|