矩阵转化成三元组表
这是一个把矩阵转化成三元组表然后相加的一个课程设计 如题,我在运行的时候始终显示文件A.txt不能打开!
这是以下的全部代码
#include<stdio.h>
#include<string.h>
#include <stdlib.h>
#define MAX_SIZE 100
typedef struct
{
int i;
int j;
int d;
}DataType;
typedef struct
{
int rn;
int cn;
int tn;
DataType Data[MAX_SIZE];
}TriType;
void pp(FILE *fp, TriType *A) //文件中矩阵转化为三元组表
{
char ch;
char a[10];
int i=1,j=1,k=0,t=0,n=0;
while((ch=fgetc(fp))!=EOF)
{
if((ch!='\n')&&(ch!=','))
{
a[k]=ch;
k++;
}
else
{
a[k]='\0';
k=0;
if((t=atoi(a))!=0) //t=atoi(a)把字符串a转换成整型数并赋值给t
{
A->Data[n].d=t;
A->Data[n].i=i;
A->Data[n].j=j;
n++;
}
if(ch==',') j++;
else if(ch=='\n')
{
i++;
A->rn=j;
j=1;
}
}
}
A->cn=i-1;
A->tn=n;
}
void AddMatrix(TriType a,TriType b,TriType *c) //实现a,b相加
{
int i=0,j=0,k=0; //下标置初始值
while(i<a.tn&&j<b.tn) //a,b均未超出有效数!
{
if(a.Data[i].i==b.Data[j].i) //a的行号等于b的行号
{
if(a.Data[i].j==b.Data[j].j) //a的列号等于b的列号
{
c->Data[k].i=a.Data[i].i;
c->Data[k].j=a.Data[i].j;
c->Data[k].d=a.Data[i].d+b.Data[j].d; //此时将他们的数据直接相加
i++;
j++;
k++;
}
else if(a.Data[i].j<b.Data[j].j) //a的列号小于b的列号
{
c->Data[k].i=a.Data[i].i;
c->Data[k].j=a.Data[i].j;
c->Data[k].d=a.Data[i].d; //如果行号相等,则相加后的值等于列号更小的矩阵
//中对应元素的值
i++;
k++;
}
else if(a.Data[i].j>b.Data[j].j) //a的列号大于b的列号
{
c->Data[k].i=b.Data[j].i;
c->Data[k].j=b.Data[j].j;
c->Data[k].d=b.Data[j].d; //如果行号相等,则相加后的值等于列号更小的矩//阵中对应元素的值
j++;
k++;
}
}
else if(a.Data[i].i<b.Data[j].i) //a的行号小于b的行号
{
c->Data[k].i=a.Data[i].i;
c->Data[k].j=a.Data[i].j;
c->Data[k].d=a.Data[i].d; //如果列号相等,则相加后的值等于行号更小的矩阵//中对应元素的值
i++;
k++;
}
else if(a.Data[i].i>b.Data[j].i) //a的行号大于b的行号
{
c->Data[k].i=b.Data[j].i;
c->Data[k].j=b.Data[j].j;
c->Data[k].d=b.Data[j].d; //如果列号相等,则相加后的值等于行号更小的矩//阵中对应元素的值
j++;
k++;
}
}
while(i>=a.tn&&j<=b.tn)//a超出a的有效数个数,而b未超出,直接把b中超出部分复制到c
{
c->Data[k].i=b.Data[j].i;
c->Data[k].j=b.Data[j].j;
c->Data[k].d=b.Data[j].d;
j++;
k++;
}
while(j>=b.tn&&i<=a.tn) //超出b的有效数个数,而a未超出,直接把a中超出部分复制给c
{
c->Data[k].i=a.Data[i].i;
c->Data[k].j=a.Data[i].j;
c->Data[k].d=a.Data[i].d;
i++;
k++;
}
c->rn=a.rn;
c->cn=
c->tn=k;
}
void pull(FILE *fp,TriType &C) //将C存入fp所指向的文件
{
int ch1=0;
char ch2=',' ,ch3='\n';
int i=1,j=1,k=0;
for(i=1;i<=)
for(j=1;j<=C.rn;j++)
{
if(j==C.Data[k].j&&i==C.Data[k].i) //如果i,j分别等于C中元素的行和列!写入C
//中的第k个元素!否则写入'0,'
{
fprintf(fp,"%4d",C.Data[k].d);
if(j!=C.rn)fputc(ch2,fp);
k++;
}
else
{
fprintf(fp,"%4d",ch1);
if(j!=C.rn)fputc(ch2,fp);
}
if(j==C.rn) fputc(ch3,fp);
}
fclose(fp);
}
void main()
{
TriType A;
TriType B;
TriType C;
FILE *fp1;
if((fp1=fopen("A.txt","r"))==NULL) //只读方式打开A.txt
{
printf("文件A.txt不能打开!\n");
return;
}
FILE *fp2;
if((fp2=fopen("B.txt","r"))==NULL) //只读方式打开B.txt
{
printf("文件B.txt不能打开!\n");
return;
}
FILE *fp3;
if((fp3=fopen("C.txt","w+"))==NULL) //读写方式打开C.txt
{
printf("文件C.txt不能打开!\n");
return;
}
pp(fp1, &A); //文件A.txt中矩阵转化为三元组表A
pp(fp2, &B); //文件B.txt中矩阵转化为三元组表B
if() //判断A,B是否是相同类型的矩阵
{
AddMatrix(A,B,&C); //矩阵相加后存入C
pull(fp3,C); //C存入到文件C.txt
printf("矩阵相加后结果如下:\n");
char ch;
if((fp3=fopen("C.txt","r"))==NULL) //只读方式打开C.txt
{
printf("文件C.txt不能打开!\n");
return;
}
ch=fgetc(fp3); //从文件C.txt中输出矩阵C
while(ch!=EOF)
{
putchar(ch);
ch=fgetc(fp3);
}
fclose(fp3);
printf("有效数字共:%d\n行数:%d\n列数:%d\n",C.tn,,C.rn);
}
else printf("A,B不是同种类型矩阵,即矩阵行数或列数不相等!!\n");
}
补充下,A.txt和B.txt如下图