从数据文件中读取矩阵的代码,然后计算它们的乘积,然后将结果矩阵打印到数据文件
Code that reads matrices from data files, and then computes their product and then prints the resultant matrix to data file
#define n 50
void matread(char *, double [][n], int *, int *);
void matprint(double [][n],int ,int, char);
int matmul(int, int,int,int,int *, int *, double [][n],double [n][n], double [][n]);
void matprintf(double [][n], int, int, char *);
int main(){
int ra,rb,rc,ca,cb,cc,flag;
double a[n][n],b[n][n],c[n][n];
FILE *fp;
fp=fopen("matA.dat","w");
fprintf(fp,"%d %d\n%.2lf %.2lf %.2lf\n%.2lf %.2lf %.2lf\n",2,3,
1.0, 0.0, 4.0, -2.0, 4.0, 1.0);
fclose(fp);
fp=fopen("matB.dat","w");
fprintf(fp,"%d %d\n%.2lf %.2lf %.2lf %.2lf \n%.2lf %.2lf %.2lf %.2lf \n%.2lf %.2lf %.2lf %.2lf\n",3,4,2.0,0.0,5.0, 1.0,4.0,0.0,-6.0,1.0,5.0,1.0,2.0,1.0);
fclose(fp);
matread("matA.dat",a,&ra,&ca);
matprint(a,ra,ca,'A');
matread("matB.dat",b,&rb,&cb);
matprint(b,rb,cb,'B');
flag=matmul(ra,ca,rb,cb,&rc,&cc,a,b,c);
if(flag==0){
printf("\nMatrices A and B are incompatiable for marix multiplication");
}
else{
matprint(c,rc,cc,'C');
matprintf(c,rc,cc,"matC.dat"); \PROBLEM OCCURS WHEN THIS IS EXECUTED
}
return 0;
}
void matprintf(double c[][n], int row, int col, char *file){
FILE *fp;
int i,j;
fp=fopen(file,"w");
printf(fp,"%d %d\n", row, col);
for(i=0;i<row;++i){
for(j=0;j<col;++j){
fprintf(fp,"%lf ", c[i][j]);
}
printf("\n");
}
}
int matmul(int ra, int ca,int rb,int cb,int *row, int *col,
double a[][n], double b[n][n], double c[][n]){
int i,j,k;
if(ca!=rb) return 0;
else {
*row=ra;
*col=cb;
for(i=0;i<*row;++i){
for(j=0;j<*col;++j){
c[i][j]=0;
for(k=0; k<cb; k++)
c[i][j]+= (a[i][k])*(b[k][j]);
}
}
}
return 1;
}
void matread(char *file, double a[][n], int *row, int *col){
FILE *fp;
int p,q,i,j;
fp=fopen(file,"r");
assert(fp!=NULL);
fscanf(fp,"%d %d", &p, &q);
*row=p;
*col=q;
for(i=0; i<*row; ++i){
for(j=0;j<*col; ++j){
fscanf(fp,"%lf",&a[i][j]);
}
}
}
void matprint(double a[][n],int row,int col, char c){
int i,j;
printf("Matrix %c is\n",c);
for(i=0; i<row; ++i){
for(j=0;j<col; ++j){
printf("%.1lf ", a[i][j]);
}
printf("\n");
}
}
此代码应该首先从各自的数据文件 matA.dat 和 matB.dat 中提取矩阵 A 和 B。这些数据文件在第一行包含矩阵大小,随后是矩阵条目。
这是使用 matread() 完成的;(正在运行)
然后我们使用 matprint() 打印这两个矩阵; (工作)
然后应该检查它们是否兼容乘法(只检查 AB)。
如果不兼容,matmul() returns 0,
如果兼容 matmul() 计算 AB,存储在 C 和 returns 1 中; (工作)
如果兼容的话,我们现在应该将矩阵 C 打印到数据文件中 matC.dat
这就是我迷路的地方。
这个问题明确要求我使用这个:matprintf(c,rc,cc,"matC.dat");然后自己定义matprintf()。
所以我的问题是,首先 matC.dat 此时在 main() 中不存在,那么我应该如何将它作为文件传递?我应该将它作为字符串传递吗?
请帮帮我
目前使用这段代码我得到错误:
矩阵product.c:53:9:警告:不兼容的指针类型传递'FILE *'
(又名 'struct __sFILE *')到 'const char *' 类型的参数
[-Win 兼容指针类型]
printf(fp,"%d %d\n", 行, 列);
^~
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/stdio.h:170:36: 注意:
在此处将参数传递给参数
int printf(const char * __restrict, ...) __printflike(1, 2);
^
生成 1 个警告。
您正在将 fp
传递给 printf
; printf
不接受文件参数,但 fprintf
(如您所知)接受。
#define n 50
void matread(char *, double [][n], int *, int *);
void matprint(double [][n],int ,int, char);
int matmul(int, int,int,int,int *, int *, double [][n],double [n][n], double [][n]);
void matprintf(double [][n], int, int, char *);
int main(){
int ra,rb,rc,ca,cb,cc,flag;
double a[n][n],b[n][n],c[n][n];
FILE *fp;
fp=fopen("matA.dat","w");
fprintf(fp,"%d %d\n%.2lf %.2lf %.2lf\n%.2lf %.2lf %.2lf\n",2,3,
1.0, 0.0, 4.0, -2.0, 4.0, 1.0);
fclose(fp);
fp=fopen("matB.dat","w");
fprintf(fp,"%d %d\n%.2lf %.2lf %.2lf %.2lf \n%.2lf %.2lf %.2lf %.2lf \n%.2lf %.2lf %.2lf %.2lf\n",3,4,2.0,0.0,5.0, 1.0,4.0,0.0,-6.0,1.0,5.0,1.0,2.0,1.0);
fclose(fp);
matread("matA.dat",a,&ra,&ca);
matprint(a,ra,ca,'A');
matread("matB.dat",b,&rb,&cb);
matprint(b,rb,cb,'B');
flag=matmul(ra,ca,rb,cb,&rc,&cc,a,b,c);
if(flag==0){
printf("\nMatrices A and B are incompatiable for marix multiplication");
}
else{
matprint(c,rc,cc,'C');
matprintf(c,rc,cc,"matC.dat"); \PROBLEM OCCURS WHEN THIS IS EXECUTED
}
return 0;
}
void matprintf(double c[][n], int row, int col, char *file){
FILE *fp;
int i,j;
fp=fopen(file,"w");
printf(fp,"%d %d\n", row, col);
for(i=0;i<row;++i){
for(j=0;j<col;++j){
fprintf(fp,"%lf ", c[i][j]);
}
printf("\n");
}
}
int matmul(int ra, int ca,int rb,int cb,int *row, int *col,
double a[][n], double b[n][n], double c[][n]){
int i,j,k;
if(ca!=rb) return 0;
else {
*row=ra;
*col=cb;
for(i=0;i<*row;++i){
for(j=0;j<*col;++j){
c[i][j]=0;
for(k=0; k<cb; k++)
c[i][j]+= (a[i][k])*(b[k][j]);
}
}
}
return 1;
}
void matread(char *file, double a[][n], int *row, int *col){
FILE *fp;
int p,q,i,j;
fp=fopen(file,"r");
assert(fp!=NULL);
fscanf(fp,"%d %d", &p, &q);
*row=p;
*col=q;
for(i=0; i<*row; ++i){
for(j=0;j<*col; ++j){
fscanf(fp,"%lf",&a[i][j]);
}
}
}
void matprint(double a[][n],int row,int col, char c){
int i,j;
printf("Matrix %c is\n",c);
for(i=0; i<row; ++i){
for(j=0;j<col; ++j){
printf("%.1lf ", a[i][j]);
}
printf("\n");
}
}
此代码应该首先从各自的数据文件 matA.dat 和 matB.dat 中提取矩阵 A 和 B。这些数据文件在第一行包含矩阵大小,随后是矩阵条目。
这是使用 matread() 完成的;(正在运行) 然后我们使用 matprint() 打印这两个矩阵; (工作)
然后应该检查它们是否兼容乘法(只检查 AB)。
如果不兼容,matmul() returns 0, 如果兼容 matmul() 计算 AB,存储在 C 和 returns 1 中; (工作)
如果兼容的话,我们现在应该将矩阵 C 打印到数据文件中 matC.dat
这就是我迷路的地方。
这个问题明确要求我使用这个:matprintf(c,rc,cc,"matC.dat");然后自己定义matprintf()。
所以我的问题是,首先 matC.dat 此时在 main() 中不存在,那么我应该如何将它作为文件传递?我应该将它作为字符串传递吗?
请帮帮我
目前使用这段代码我得到错误:
矩阵product.c:53:9:警告:不兼容的指针类型传递'FILE *' (又名 'struct __sFILE *')到 'const char *' 类型的参数 [-Win 兼容指针类型] printf(fp,"%d %d\n", 行, 列); ^~ /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/stdio.h:170:36: 注意: 在此处将参数传递给参数 int printf(const char * __restrict, ...) __printflike(1, 2); ^ 生成 1 个警告。
您正在将 fp
传递给 printf
; printf
不接受文件参数,但 fprintf
(如您所知)接受。