📄 juzheng.cpp
字号:
#include<stdio.h>
#include<stdlib.h>
#define maxsize 15
typedef struct {
int row,line;
int e;
}tri;
struct{
tri data[maxsize];
int r1,L1,nonzero;
}array1,array2,array3; //构建两个三元组存放矩阵1和2的非零元,另一个用来作为运算后的非零元存放的位置
void main()
{
int i,j,k=0,b=0;
char signal;
while(b!=1){
printf("输入运算符:");
signal=getchar();
printf("%c\n",signal);
//判断输入的符号确定行列应该满足的值
printf("输入运算的第一个和矩阵的行于列:\n");
scanf("%d,%d,%d,%d",&(array1.r1),&(array1.L1));
printf("输入运算的第二个矩阵的行于列:\n");
scanf("%d,%d",&(array2.r1),&(array2.L1));
if(signal=='+'||signal=='-')
{
if(array1.r1==array2.r1&&array2.L1==array2.L1) b=1;
}
else if(signal=='*'){
if(array1.L1==array2.r1) b=1;
}
else
printf("对不起,你输入的格式不对,请输入合适的格式:\n");
}
//输入两个矩阵的非零元的信息
printf("请输入array1和array2的非零元个数:\n");
scanf("%d,%d",&(array1.nonzero),&(array2.nonzero));
printf("请输入array1的非零元信息,即该非零元的行列和数值:\n");
for(i=0;i<array1.nonzero;i++)
scanf("%d,%d,%d",&(array1.data[i].row),&(array1.data[i].line),&(array1.data[i].e));
printf("array1的***行***列***非零元***:\n");
for(i=0;i<array1.nonzero;i++)
printf("%11d,%4d,%4d\n",array1.data[i].row,array1.data[i].line,array1.data[i].e);
//矩阵1的非零元信息
printf("请输入array2的非零元信息,即该非零元的行列和数值:\n");
for(i=0;i<array2.nonzero;i++)
scanf("%d,%d,%d",&(array2.data[i].row),&(array2.data[i].line),&(array2.data[i].e));
printf("array2的***行***列***非零元***:\n");
for(i=0;i<array2.nonzero;i++)
printf("%11d,%4d,%4d\n",array2.data[i].row,array2.data[i].line,array2.data[i].e);
//矩阵2的非零元信息
switch(signal)
{
case'+':
//int i,j,k;
for(i=0;i<array1.nonzero;i++) //n为中不为零的数目
{
for(j=0;j<array2.nonzero;j++)
{
if((array1.data[i].row==array2.data[j].row)&&(array1.data[i].line==array2.data[j].line))
{
array3.data[k].row=array1.data[i].row;
array3.data[k].line=array1.data[j].line;
array3.data[k].e=array1.data[i].e+array2.data[j].e;
array2.data[j].e=0;
k++;
}//如果三元矩阵1中有与三元矩阵2中相同的行于列则将其相加放到三元矩阵3中.
}
array3.data[k].row=array1.data[i].row;
array3.data[k].line=array1.data[i].line;
array3.data[k].e=array1.data[i].e;
k++;
}//若三元矩阵1与2中没有匹配的行于列则矩阵相加后,新矩阵中与1相同的行于列的数值相同因而也不为零,所以应该存储在三元矩阵3中
for(j=0;j<array2.nonzero;j++)
{
if(array2.data[j].e!=0)
{
array3.data[k].row=array2.data[j].row;
array3.data[k].line=array2.data[j].line;
array3.data[k].e=array2.data[j].e;
k++;
}
} break; //若矩阵2中没有与矩阵1匹配的,则与矩阵1相加后矩阵3中相同的位置数据不为零,应该存储在三元组3中
case'-':
//int i,j,k;
for(i=0;i<array1.nonzero;i++)//n为中不为零的数目
{
for(j=0;j<array2.nonzero;j++)
{
if((array1.data[i].row)==(array2.data[j].row)&&(array1.data[i].line)==(array2.data[j].line))
{
array3.data[k].row=array1.data[i].row;
array3.data[k].line=array1.data[j].line;
array3.data[k].e=array1.data[i].e-array2.data[j].e;
array2.data[j].e=0;
k++;
}//如果三元矩阵1中有与三元矩阵2中相同的行于列则将其相减放到三元矩阵3中.
}
array3.data[k].row=array1.data[i].row;
array3.data[k].line=array1.data[i].line;
array3.data[k].e=array1.data[i].e;
k++;
}//若三元矩阵1与2中没有匹配的行于列则矩阵相减后,新矩阵中与1相同的行于列的数值相同因而也不为零,所以应该存储在三元矩阵3中
for(j=0;j<array2.nonzero;j++)
{
if(array2.data[j].e!=0)
{
array3.data[k].row=array2.data[j].row;
array3.data[k].line=array2.data[j].line;
array3.data[k].e=0-array2.data[j].e;
k++;
}
} break; //若矩阵2中没有与矩阵1匹配的,则与矩阵1相加后矩阵3中相同的位置数据不为零,应该存储在三元组3中
case'*':
//int i,j;
int *Nc,*Tc; //定义一个临时数组Nc和Tc
Nc=(int *)malloc((array2.r1+1)*sizeof(int));
Tc=(int *)malloc((array1.L1+1)*sizeof(int));
if(!Nc||!Tc) break; //分配空间不成功时退出程序
for(i=1;i<array2.L1;i++)
{
for(j=0;j<array2.r1;j++)
Nc[j]=0;
for(j=0;j<array1.r1;j++)
Tc[j]=0;
for(j=0;j<array2.nonzero;j++)
{
if(array2.data[j].line==i)
Nc[array2.data[j].row]=array2.data[j].e;
}
for(j=0;j<array1.nonzero;j++)
Tc[array1.data[j].row]=Tc[array1.data[j].row]+(array1.data[j].e*Nc[array1.data[j].line]);
for(j=0;j<(array1.r1);j++)
{
if(Tc[j]!=0)
{
array3.data[k].e=Tc[j];
array3.data[k].row=j;
array3.data[k].line=i;
k++;
}
}
} break;
}
printf("输出运算后的三元组:\n");
for(i=0;i<k;i++)
printf("%8d,%4d,%4d\n",array3.data[k].row,array3.data[k].line,array3.data[k].e);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -