急求一个稀疏矩阵运算器的源代码(C语言版的)..能运行..用于课程设计
2个回答
2011-12-22
展开全部
#include "stdio.h"
#define MAXSIZE 100 //非零个数100
#define MAXROW 20 //最大行数20
#define MAXCOL 20 //最大列数20
typedef struct
{
int data[MAXSIZE+1][3]; //非零元素的三元组表,data[0]未用
int m,n,len;
}smat;
void matadd(smat A,smat B,smat C)
{ //稀疏矩阵相加
int i=1,j=1,k=1,a[20][20];
while(i<=A.len||j<=B.len)
{
if(A.data[i][0]>B.data[j][0]||i>A.len) //当A的当前行号大于B的行号时,则将小的行号B加入C
{
C.data[k][0]=B.data[j][0];
C.data[k][1]=B.data[j][1];
C.data[k][2]=B.data[j][2];
k++; j++;
}
else if(A.data[i][0]<B.data[j][0]||j>B.len) //当A的当前行号小于B的行号时,则将小的行号A加人C
{
C.data[k][0]=A.data[i][0];
C.data[k][1]=A.data[i][1];
C.data[k][2]=A.data[i][2];
k++; i++;
}
else //若A当前行号等于B当前行,则比较列号将较小的列项存入C,如果相等就相加存入C
{
if(A.data[i][1]>B.data[j][1])
{
C.data[k][0]=B.data[j][0];
C.data[k][1]=B.data[j][1];
C.data[k][2]=B.data[j][2];
k++; j++;
}
else if(A.data[i][1]<B.data[j][1])
{
C.data[k][0]=A.data[i][0];
C.data[k][1]=A.data[i][1];
C.data[k][2]=A.data[i][2];
k++; i++;
}
else
{
C.data[k][0]=A.data[i][0];
C.data[k][1]=A.data[i][1];
C.data[k][2]=A.data[i][2]+B.data[j][2];
k++; i++; j++;
}
}
}
C.data[0][0]=A.m; //将稀疏矩阵的行数放在C.data[0][0]
C.data[0][1]=A.n; //将稀疏矩阵的列数放在C.data[0][1]
C.data[0][2]=k-1; //将稀疏矩阵的列数放在C.data[0][2]
i=1;j=1;k=1;
for(i=1;i<=C.data[0][0];i++) //初始化阵列式矩阵
{
for(j=1;j<=C.data[0][1];j++)
{
a[i][j]=0;
}
}
i=1; j=1;
for(k=1;k<=C.data[0][2];k++)
{
i=C.data[k][0]; //将行号赋值给i
j=C.data[k][1]; //将列号赋值给j
a[i][j]=C.data[k][2]; //将非零元素值赋值给a[i][j]
}
i=1;
printf(" C=A+B的阵列式形式是:\n");
for(i=1;i<=C.data[0][0];i++) //将运算结果以阵列式输出
{
printf(" |");
for(j=1;j<=C.data[0][1];j++)
{
printf("%4d",a[i][j]);
}
printf(" |");
printf("\n");
}
}
void matmul(smat A,smat B,smat C)
{ //两个矩阵相乘
int i=1,j=1,k,a[20][20],b[20][20],s[400],p=1,q=1,v=1,w;
s[1]=0;
for(i=1;i<=A.m;i++) // //初始化二维数值a[][]
{
for(j=1;j<=A.n;j++)
{
a[i][j]=0;
}
}
for(k=1;k<=A.len;k++)
{
i=A.data[k][0]; //将A.data[k][0]行号赋值给i
j=A.data[k][1]; //将A.data[k][1]列号赋值给j
a[i][j]=A.data[k][2]; //将A.data[k][2]非零元素值赋值给a[i][j]
}
k=1;
for(p=1;p<=B.m;p++)
{
for(q=1;q<=B.n;q++)
{
b[p][q]=0;
}
}
for(k=1;k<=B.len;k++)
{
p=B.data[k][0];
q=B.data[k][1];
b[p][q]=B.data[k][2];
}
i=1;j=1;k=1;p=1;q=1;v=1;
for(i=1;i<=A.m;i++) //两个稀疏矩阵相乘,结果放在s[v]里
{
for(q=1;q<=B.n;q++)
{
for(j=1,p=1;j<=A.n,p<=B.m;j++,p++)
{
s[v]=s[v]+a[i][j]*b[p][q];
}
v++;
s[v]=0;
}
v++;
s[v]=0;
}
w=v-1;
v=1;
k=1;
printf(" C=A*B的阵列式形式是:\n");
for(v=1;v<=w;v++) //将运算结果以阵列式输出
{
printf(" |");
for(k=1;k<=B.n;k++)
{
printf("%4d",s[v]);
v++;
}
printf(" |");
printf("\n");
}
}
void matsub(smat A,smat B,smat C)
{ //两个稀疏矩阵相减
int i=1,j=1,k=1,a[20][20];
while(i<=A.len||j<=B.len)
{
if(A.data[i][0]>B.data[j][0]||i>A.len) // //当A的当前行号大于B的行数时,则将小的行号B加入C
{
C.data[k][0]=B.data[j][0];
C.data[k][1]=B.data[j][1];
if(B.data[j][2]>=0)
{
C.data[k][2]=B.data[j][2];
}
else
{
C.data[k][2]=-B.data[j][2];
}
k++; j++;
}
else if(A.data[i][0]<B.data[j][0]||j>B.len) //当A的当前行号小于B的行数时,则将小的行号A加人C
{
C.data[k][0]=A.data[i][0];
C.data[k][1]=A.data[i][1];
C.data[k][2]=A.data[i][2];
k++; i++;
}
else //若A当前行号等于B当前行,则比较列号将较小的列项存入C,如果相等就相加存入C
{
if(A.data[i][1]>B.data[j][1])
{
C.data[k][0]=B.data[j][0];
C.data[k][1]=B.data[j][1];
if(B.data[j][2]>=0)
{
C.data[k][2]=B.data[j][2];
}
else
{
C.data[k][2]=-B.data[j][2];
}
k++; j++;
}
else if(A.data[i][1]<B.data[j][1])
{
C.data[k][0]=A.data[i][0];
C.data[k][1]=A.data[i][1];
C.data[k][2]=A.data[i][2];
k++; i++;
}
else
{
C.data[k][0]=A.data[i][0];
C.data[k][1]=A.data[i][1];
C.data[k][2]=A.data[i][2]-B.data[j][2];
k++; i++; j++;
}
}
}
C.data[0][0]=A.m;
C.data[0][1]=A.n;
C.data[0][2]=k-1;
i=1;j=1;k=1;
for(i=1;i<=C.data[0][0];i++)
{
for(j=1;j<=C.data[0][1];j++)
{
a[i][j]=0;
}
}
i=1; j=1;
for(k=1;k<=C.data[0][2];k++)
{
i=C.data[k][0];
j=C.data[k][1];
a[i][j]=C.data[k][2];
}
i=1;
printf(" C=A-B的阵列式形式是:\n");
for(i=1;i<=C.data[0][0];i++)
{
printf(" |");
for(j=1;j<=C.data[0][1];j++)
{
printf("%4d",a[i][j]);
}
printf(" |");
printf("\n");
}
}
void Initsmat(smat A)
{
int i=0,j=0;
for(i=0;i<=A.m;i++)
{
for(j=0;j<A.n;j++)
{
A.data[i][j]=0;
}
}
}
int main()
{
int e,m,n,p,k,a[20][20],b[20][20],i=1,j=1;
smat A,B,C;
Initsmat(A);
Initsmat(B);
Initsmat(C);
printf(" *************************************************************************\n");
printf(" \n");
printf(" 稀疏矩阵运算器 \n");
printf(" \n");
printf(" *************************************************************************\n");
loop1:
printf("\n");
printf(" 请输入第一个三元组A的信息(行数在1~20之间,列数在1~20之间,非零元个数在1~100之间)如果在输入过程想重新输入信息请按0:\n");
printf("请输入行数:");
scanf("%d",&A.m);
if(!(A.m<=20&&A.m>=1))
{
printf("你输入的行号超出范围,请重新输入第一个稀疏矩阵A三元组的信息:\n");
goto loop1;
}
printf("请输入列数:");
scanf("%d",&A.n);
if(A.n>20||A.n<1)
{
printf("你输入的列号超出范围,请重新输入第一个稀疏矩阵A三元组的信息:\n");
goto loop1;
}
printf("请输入三元组的非零个数:");
scanf("%d",&A.len);
if(A.len>100||A.len<1)
{
printf("你输入的非零元个数超出范围,请重新输入第一个稀疏矩阵A三元组的信息:\n");
goto loop1;
}
for(i=1;i<=A.len;i++)
{
printf("请输入第%d个非零元素的行数:",i);
scanf("%d",&a[i][1]);
if(a[i][1]>A.m||a[i][1]<1)
{
printf("输入错误,请重新输入:\n");
goto loop1;
}
printf("请输入第%d个非零元素的列数:",i);
scanf("%d",&a[i][2]);
if(a[i][2]>A.n||a[i][2]<1)
{
printf("输入错误,请重新输入:\n");
goto loop1;
}
printf("请输入第%d个非零元素的数值:",i);
scanf("%d",&a[i][3]);
}
Initsmat(A);
for(i=1,k=1;i<=A.len,k<=A.len;i++,k++)
{
A.data[k][0]=a[i][1];
if(A.data[k][0]>20||A.data[k][0]<1)
{
printf("你输入的行号超出范围,请重新输入第一个稀疏矩阵A三元组的信息:\n");
goto loop1;
}
A.data[k][1]=a[i][2];
if(A.data[k][1]>20||A.data[k][1]<1||A.n>20||A.n<1)
{
printf("你输入的列号超出范围,请重新输入第一个稀疏矩阵A三元组的信息:\n");
goto loop1;
}
A.data[k][2]=a[i][3];
if(A.data[k][2]>32767||A.data[k][2]<-32768)
{
printf("你输入的非零元数值超出范围,请重新输入第一个稀疏矩阵A三元组的信息:\n");
goto loop1;
}
}
printf("\n");
printf(" 稀疏矩阵A的三元组是:\n");
printf(" ==================\n");
printf(" 行号 列号 数值\n");
printf(" -------------------\n");
k=1;
for(k=1;k<=A.len;k++)
{
printf("\t%4d%4d%4d\n",A.data[k][0],A.data[k][1],A.data[k][2]);
}
printf(" ==================\n");
goto loop2;
loop2:
printf("\n");
printf("请输入第二个三元组B的信息\n");
printf("行数在1~20之间,列数在1~20之间,非零元个数在1~100之间\n");
printf("如果在输入过程想重新输入信息请按0:\n");
printf("请输入行数:");
scanf("%d",&B.m);
if(B.m>20||B.m<1)
{
printf("\n");
printf("你输入的行号超出范围,请重新输入第二个矩阵B三元组的信息:\n");
goto loop2;
}
printf("请输入列数:");
scanf("%d",&B.n);
if(B.n>20||B.n<1)
{
printf("\n");
printf("你输入的列号超出范围,请重新输入第二个矩阵B三元组的信息:\n");
goto loop2;
}
printf("请输入三元组的非零个数:");
scanf("%d",&B.len);
if(B.len>100||B.len<1)
{
printf("\n");
printf("你输入的非零元个数超出范围,请重新输入第二个矩阵B三元组的信息:\n");
goto loop2;
}
i=1;j=1; k=1;
for(i=1;i<=A.len;i++)
{
printf("请输入第%d个非零元素的行数:",i);
scanf("%d",&b[i][1]);
if(b[i][1]>B.m||b[i][1]<1)
{
printf("输入错误,请重新输入:\n");
goto loop2;
}
printf("请输入第%d个非零元素的列数:",i);
scanf("%d",&b[i][2]);
if(b[i][2]>B.n||b[i][2]<1)
{
printf("输入错误,请重新输入:\n");
goto loop2;
}
printf("请输入第%d个非零元素的数值:",i);
scanf("%d",&b[i][3]);
}
Initsmat(B);
for(i=1,k=1;i<=B.len,k<=B.len;i++,k++)
{
B.data[k][0]=b[i][1];
if(B.data[k][0]>20||B.data[k][0]<1||B.m>20||B.m<1)
{
printf("\n");
printf("你输入的行号超出范围,请重新输入第二个矩阵B三元组的信息:\n");
goto loop2;
}
B.data[k][1]=b[i][2];
if(B.data[k][1]>20||B.data[k][1]<1||B.n>20||B.n<1)
{
printf("\n");
printf("你输入的列号超出范围,请重新输入第二个矩阵B三元组的信息:\n");
goto loop2;
}
B.data[k][2]=b[i][3];
if(B.data[k][2]>32767||B.data[k][2]<-32768)
{
printf("\n");
printf("你输入的非零元数值超出范围,请重新输入第二个矩阵B三元组的信息:\n");
goto loop2;
}
}
printf("\n");
printf(" 矩阵B的三元组是:\n");
printf(" ==================\n");
printf(" 行号 列号 数值\n");
printf(" -------------------\n");
k=1;
B.data[0][2]=B.len;
for(k=1;k<=B.len;k++)
{
printf("\t%4d%4d%4d\n",B.data[k][0],B.data[k][1],B.data[k][2]);
}
printf(" ==================\n");
goto loop3;
loop3:
printf("\n");
printf("1.两个矩阵相加请选择.\n");
printf("2.两个矩阵相减请选择.\n");
printf("3.两个矩阵相剩请选择.\n");
printf("4.重新输入两个矩阵的三元组请选择\n");
printf("0.退出请选择.\n");
scanf("%d",&e);
if(e==1)
{
if(A.m!=B.m||A.n!=B.n)
{
printf("你输入的两个三元组不符合矩阵相加,请重新选择:\n");
goto loop3;
}
matadd(A,B,C);
goto loop3;
}
else if(e==2)
{
if(A.m!=B.m||A.n!=B.n)
{
printf("你输入的两个三元组不符合矩阵相减,请重新选择:\n");
goto loop3;
}
matsub(A,B,C);
goto loop3;
}
else if(e==3)
{
if(A.n!=B.m)
{
printf("你输入的两个三元组不符合矩阵相乘,请重新选择:\n");
goto loop3;
}
matmul(A,B,C);
goto loop3;
}
else if(e==4)
{
goto loop1;
}
else if(e==0)
{
return 0;
}
else
{
printf("你输入的选择无效,请重新选择:\n");
goto loop3;
}
return 0;
}
#define MAXSIZE 100 //非零个数100
#define MAXROW 20 //最大行数20
#define MAXCOL 20 //最大列数20
typedef struct
{
int data[MAXSIZE+1][3]; //非零元素的三元组表,data[0]未用
int m,n,len;
}smat;
void matadd(smat A,smat B,smat C)
{ //稀疏矩阵相加
int i=1,j=1,k=1,a[20][20];
while(i<=A.len||j<=B.len)
{
if(A.data[i][0]>B.data[j][0]||i>A.len) //当A的当前行号大于B的行号时,则将小的行号B加入C
{
C.data[k][0]=B.data[j][0];
C.data[k][1]=B.data[j][1];
C.data[k][2]=B.data[j][2];
k++; j++;
}
else if(A.data[i][0]<B.data[j][0]||j>B.len) //当A的当前行号小于B的行号时,则将小的行号A加人C
{
C.data[k][0]=A.data[i][0];
C.data[k][1]=A.data[i][1];
C.data[k][2]=A.data[i][2];
k++; i++;
}
else //若A当前行号等于B当前行,则比较列号将较小的列项存入C,如果相等就相加存入C
{
if(A.data[i][1]>B.data[j][1])
{
C.data[k][0]=B.data[j][0];
C.data[k][1]=B.data[j][1];
C.data[k][2]=B.data[j][2];
k++; j++;
}
else if(A.data[i][1]<B.data[j][1])
{
C.data[k][0]=A.data[i][0];
C.data[k][1]=A.data[i][1];
C.data[k][2]=A.data[i][2];
k++; i++;
}
else
{
C.data[k][0]=A.data[i][0];
C.data[k][1]=A.data[i][1];
C.data[k][2]=A.data[i][2]+B.data[j][2];
k++; i++; j++;
}
}
}
C.data[0][0]=A.m; //将稀疏矩阵的行数放在C.data[0][0]
C.data[0][1]=A.n; //将稀疏矩阵的列数放在C.data[0][1]
C.data[0][2]=k-1; //将稀疏矩阵的列数放在C.data[0][2]
i=1;j=1;k=1;
for(i=1;i<=C.data[0][0];i++) //初始化阵列式矩阵
{
for(j=1;j<=C.data[0][1];j++)
{
a[i][j]=0;
}
}
i=1; j=1;
for(k=1;k<=C.data[0][2];k++)
{
i=C.data[k][0]; //将行号赋值给i
j=C.data[k][1]; //将列号赋值给j
a[i][j]=C.data[k][2]; //将非零元素值赋值给a[i][j]
}
i=1;
printf(" C=A+B的阵列式形式是:\n");
for(i=1;i<=C.data[0][0];i++) //将运算结果以阵列式输出
{
printf(" |");
for(j=1;j<=C.data[0][1];j++)
{
printf("%4d",a[i][j]);
}
printf(" |");
printf("\n");
}
}
void matmul(smat A,smat B,smat C)
{ //两个矩阵相乘
int i=1,j=1,k,a[20][20],b[20][20],s[400],p=1,q=1,v=1,w;
s[1]=0;
for(i=1;i<=A.m;i++) // //初始化二维数值a[][]
{
for(j=1;j<=A.n;j++)
{
a[i][j]=0;
}
}
for(k=1;k<=A.len;k++)
{
i=A.data[k][0]; //将A.data[k][0]行号赋值给i
j=A.data[k][1]; //将A.data[k][1]列号赋值给j
a[i][j]=A.data[k][2]; //将A.data[k][2]非零元素值赋值给a[i][j]
}
k=1;
for(p=1;p<=B.m;p++)
{
for(q=1;q<=B.n;q++)
{
b[p][q]=0;
}
}
for(k=1;k<=B.len;k++)
{
p=B.data[k][0];
q=B.data[k][1];
b[p][q]=B.data[k][2];
}
i=1;j=1;k=1;p=1;q=1;v=1;
for(i=1;i<=A.m;i++) //两个稀疏矩阵相乘,结果放在s[v]里
{
for(q=1;q<=B.n;q++)
{
for(j=1,p=1;j<=A.n,p<=B.m;j++,p++)
{
s[v]=s[v]+a[i][j]*b[p][q];
}
v++;
s[v]=0;
}
v++;
s[v]=0;
}
w=v-1;
v=1;
k=1;
printf(" C=A*B的阵列式形式是:\n");
for(v=1;v<=w;v++) //将运算结果以阵列式输出
{
printf(" |");
for(k=1;k<=B.n;k++)
{
printf("%4d",s[v]);
v++;
}
printf(" |");
printf("\n");
}
}
void matsub(smat A,smat B,smat C)
{ //两个稀疏矩阵相减
int i=1,j=1,k=1,a[20][20];
while(i<=A.len||j<=B.len)
{
if(A.data[i][0]>B.data[j][0]||i>A.len) // //当A的当前行号大于B的行数时,则将小的行号B加入C
{
C.data[k][0]=B.data[j][0];
C.data[k][1]=B.data[j][1];
if(B.data[j][2]>=0)
{
C.data[k][2]=B.data[j][2];
}
else
{
C.data[k][2]=-B.data[j][2];
}
k++; j++;
}
else if(A.data[i][0]<B.data[j][0]||j>B.len) //当A的当前行号小于B的行数时,则将小的行号A加人C
{
C.data[k][0]=A.data[i][0];
C.data[k][1]=A.data[i][1];
C.data[k][2]=A.data[i][2];
k++; i++;
}
else //若A当前行号等于B当前行,则比较列号将较小的列项存入C,如果相等就相加存入C
{
if(A.data[i][1]>B.data[j][1])
{
C.data[k][0]=B.data[j][0];
C.data[k][1]=B.data[j][1];
if(B.data[j][2]>=0)
{
C.data[k][2]=B.data[j][2];
}
else
{
C.data[k][2]=-B.data[j][2];
}
k++; j++;
}
else if(A.data[i][1]<B.data[j][1])
{
C.data[k][0]=A.data[i][0];
C.data[k][1]=A.data[i][1];
C.data[k][2]=A.data[i][2];
k++; i++;
}
else
{
C.data[k][0]=A.data[i][0];
C.data[k][1]=A.data[i][1];
C.data[k][2]=A.data[i][2]-B.data[j][2];
k++; i++; j++;
}
}
}
C.data[0][0]=A.m;
C.data[0][1]=A.n;
C.data[0][2]=k-1;
i=1;j=1;k=1;
for(i=1;i<=C.data[0][0];i++)
{
for(j=1;j<=C.data[0][1];j++)
{
a[i][j]=0;
}
}
i=1; j=1;
for(k=1;k<=C.data[0][2];k++)
{
i=C.data[k][0];
j=C.data[k][1];
a[i][j]=C.data[k][2];
}
i=1;
printf(" C=A-B的阵列式形式是:\n");
for(i=1;i<=C.data[0][0];i++)
{
printf(" |");
for(j=1;j<=C.data[0][1];j++)
{
printf("%4d",a[i][j]);
}
printf(" |");
printf("\n");
}
}
void Initsmat(smat A)
{
int i=0,j=0;
for(i=0;i<=A.m;i++)
{
for(j=0;j<A.n;j++)
{
A.data[i][j]=0;
}
}
}
int main()
{
int e,m,n,p,k,a[20][20],b[20][20],i=1,j=1;
smat A,B,C;
Initsmat(A);
Initsmat(B);
Initsmat(C);
printf(" *************************************************************************\n");
printf(" \n");
printf(" 稀疏矩阵运算器 \n");
printf(" \n");
printf(" *************************************************************************\n");
loop1:
printf("\n");
printf(" 请输入第一个三元组A的信息(行数在1~20之间,列数在1~20之间,非零元个数在1~100之间)如果在输入过程想重新输入信息请按0:\n");
printf("请输入行数:");
scanf("%d",&A.m);
if(!(A.m<=20&&A.m>=1))
{
printf("你输入的行号超出范围,请重新输入第一个稀疏矩阵A三元组的信息:\n");
goto loop1;
}
printf("请输入列数:");
scanf("%d",&A.n);
if(A.n>20||A.n<1)
{
printf("你输入的列号超出范围,请重新输入第一个稀疏矩阵A三元组的信息:\n");
goto loop1;
}
printf("请输入三元组的非零个数:");
scanf("%d",&A.len);
if(A.len>100||A.len<1)
{
printf("你输入的非零元个数超出范围,请重新输入第一个稀疏矩阵A三元组的信息:\n");
goto loop1;
}
for(i=1;i<=A.len;i++)
{
printf("请输入第%d个非零元素的行数:",i);
scanf("%d",&a[i][1]);
if(a[i][1]>A.m||a[i][1]<1)
{
printf("输入错误,请重新输入:\n");
goto loop1;
}
printf("请输入第%d个非零元素的列数:",i);
scanf("%d",&a[i][2]);
if(a[i][2]>A.n||a[i][2]<1)
{
printf("输入错误,请重新输入:\n");
goto loop1;
}
printf("请输入第%d个非零元素的数值:",i);
scanf("%d",&a[i][3]);
}
Initsmat(A);
for(i=1,k=1;i<=A.len,k<=A.len;i++,k++)
{
A.data[k][0]=a[i][1];
if(A.data[k][0]>20||A.data[k][0]<1)
{
printf("你输入的行号超出范围,请重新输入第一个稀疏矩阵A三元组的信息:\n");
goto loop1;
}
A.data[k][1]=a[i][2];
if(A.data[k][1]>20||A.data[k][1]<1||A.n>20||A.n<1)
{
printf("你输入的列号超出范围,请重新输入第一个稀疏矩阵A三元组的信息:\n");
goto loop1;
}
A.data[k][2]=a[i][3];
if(A.data[k][2]>32767||A.data[k][2]<-32768)
{
printf("你输入的非零元数值超出范围,请重新输入第一个稀疏矩阵A三元组的信息:\n");
goto loop1;
}
}
printf("\n");
printf(" 稀疏矩阵A的三元组是:\n");
printf(" ==================\n");
printf(" 行号 列号 数值\n");
printf(" -------------------\n");
k=1;
for(k=1;k<=A.len;k++)
{
printf("\t%4d%4d%4d\n",A.data[k][0],A.data[k][1],A.data[k][2]);
}
printf(" ==================\n");
goto loop2;
loop2:
printf("\n");
printf("请输入第二个三元组B的信息\n");
printf("行数在1~20之间,列数在1~20之间,非零元个数在1~100之间\n");
printf("如果在输入过程想重新输入信息请按0:\n");
printf("请输入行数:");
scanf("%d",&B.m);
if(B.m>20||B.m<1)
{
printf("\n");
printf("你输入的行号超出范围,请重新输入第二个矩阵B三元组的信息:\n");
goto loop2;
}
printf("请输入列数:");
scanf("%d",&B.n);
if(B.n>20||B.n<1)
{
printf("\n");
printf("你输入的列号超出范围,请重新输入第二个矩阵B三元组的信息:\n");
goto loop2;
}
printf("请输入三元组的非零个数:");
scanf("%d",&B.len);
if(B.len>100||B.len<1)
{
printf("\n");
printf("你输入的非零元个数超出范围,请重新输入第二个矩阵B三元组的信息:\n");
goto loop2;
}
i=1;j=1; k=1;
for(i=1;i<=A.len;i++)
{
printf("请输入第%d个非零元素的行数:",i);
scanf("%d",&b[i][1]);
if(b[i][1]>B.m||b[i][1]<1)
{
printf("输入错误,请重新输入:\n");
goto loop2;
}
printf("请输入第%d个非零元素的列数:",i);
scanf("%d",&b[i][2]);
if(b[i][2]>B.n||b[i][2]<1)
{
printf("输入错误,请重新输入:\n");
goto loop2;
}
printf("请输入第%d个非零元素的数值:",i);
scanf("%d",&b[i][3]);
}
Initsmat(B);
for(i=1,k=1;i<=B.len,k<=B.len;i++,k++)
{
B.data[k][0]=b[i][1];
if(B.data[k][0]>20||B.data[k][0]<1||B.m>20||B.m<1)
{
printf("\n");
printf("你输入的行号超出范围,请重新输入第二个矩阵B三元组的信息:\n");
goto loop2;
}
B.data[k][1]=b[i][2];
if(B.data[k][1]>20||B.data[k][1]<1||B.n>20||B.n<1)
{
printf("\n");
printf("你输入的列号超出范围,请重新输入第二个矩阵B三元组的信息:\n");
goto loop2;
}
B.data[k][2]=b[i][3];
if(B.data[k][2]>32767||B.data[k][2]<-32768)
{
printf("\n");
printf("你输入的非零元数值超出范围,请重新输入第二个矩阵B三元组的信息:\n");
goto loop2;
}
}
printf("\n");
printf(" 矩阵B的三元组是:\n");
printf(" ==================\n");
printf(" 行号 列号 数值\n");
printf(" -------------------\n");
k=1;
B.data[0][2]=B.len;
for(k=1;k<=B.len;k++)
{
printf("\t%4d%4d%4d\n",B.data[k][0],B.data[k][1],B.data[k][2]);
}
printf(" ==================\n");
goto loop3;
loop3:
printf("\n");
printf("1.两个矩阵相加请选择.\n");
printf("2.两个矩阵相减请选择.\n");
printf("3.两个矩阵相剩请选择.\n");
printf("4.重新输入两个矩阵的三元组请选择\n");
printf("0.退出请选择.\n");
scanf("%d",&e);
if(e==1)
{
if(A.m!=B.m||A.n!=B.n)
{
printf("你输入的两个三元组不符合矩阵相加,请重新选择:\n");
goto loop3;
}
matadd(A,B,C);
goto loop3;
}
else if(e==2)
{
if(A.m!=B.m||A.n!=B.n)
{
printf("你输入的两个三元组不符合矩阵相减,请重新选择:\n");
goto loop3;
}
matsub(A,B,C);
goto loop3;
}
else if(e==3)
{
if(A.n!=B.m)
{
printf("你输入的两个三元组不符合矩阵相乘,请重新选择:\n");
goto loop3;
}
matmul(A,B,C);
goto loop3;
}
else if(e==4)
{
goto loop1;
}
else if(e==0)
{
return 0;
}
else
{
printf("你输入的选择无效,请重新选择:\n");
goto loop3;
}
return 0;
}
展开全部
我也手痒,写了一个,不过我想不通楼上的为什么那么麻烦,这个代码很简单的
文件从工程目录下的input.txt读取,存入到工程目录下的output.txt里
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class baidu_6
{
public static void main(String[] args)
{
int intR,intA=0,inta=0,intC=0,intN=0;
try
{
FileInputStream fisIn=new FileInputStream("./input.txt");
文件从工程目录下的input.txt读取,存入到工程目录下的output.txt里
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class baidu_6
{
public static void main(String[] args)
{
int intR,intA=0,inta=0,intC=0,intN=0;
try
{
FileInputStream fisIn=new FileInputStream("./input.txt");
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询