📄 yasuojuzhen.cpp
字号:
#include<stdio.h>
#include<stdlib.h>
#define MAX 50 //假设非零元个数的最大值为50
#define OK 1
#define NULL 0
//--------------------------------功能函数---------------------------------------------//
int Add(int a[][3],int b[][3])
{
if(a[0][0]==0)
{
printf("您还没有输入矩阵,请输入矩阵!\n");
return NULL;
}
int c[MAX][3],i,j,k=1,m=1,n=1;
c[0][0]=a[0][0];
c[0][1]=a[0][1];
while(i<=a[0][2] || j<=b[0][2])
{
if(i<=a[0][2] && j<=b[0][2])
{
for(i=1,j=1;i<=a[0][2] && j<=b[0][2];)
{
if(a[i][0]==b[j][0])
{
if(a[i][1]<b[j][1])
{
c[k][0]=a[i][0];
c[k][1]=a[i][1];
c[k][2]=a[i][2];
k++;
i++;
}
else if(a[i][1]>b[j][1])
{
c[k][0]=b[j][0];
c[k][1]=b[j][1];
c[k][2]=b[j][2];
k++;
j++;
}
else
{
c[k][0]=b[j][0];
c[k][1]=b[j][1];
c[k][2]=a[i][2]+b[j][2];
k++;
i++;
j++;
}
}
else if(a[i][0]<b[j][0])
{
c[k][0]=a[i][0];
c[k][1]=a[i][1];
c[k][2]=a[i][2];
k++;
i++;
}
else if(a[i][0]>b[j][0])
{
c[k][0]=b[j][0];
c[k][1]=b[j][1];
c[k][2]=b[j][2];
k++;
j++;
}
}
}
else if(i>a[0][2])
{
c[k][0]=b[j][0];
c[k][1]=b[j][1];
c[k][2]=b[j][2];
k++;
j++;
}
else if(j>b[0][2])
{
c[k][0]=a[i][0];
c[k][1]=a[i][1];
c[k][2]=a[i][2];
k++;
i++;
}
c[0][2]=k-1;
}
printf("A与B的和的矩阵表是为:\n");
for(i=1;i<=c[0][0];++i)
{
for(j=1;j<=c[0][1];++j)
{
if(i==c[m][0] && j==c[m][1])
{
printf("%5d",c[m][2]);
m++;
n++;
}
else printf("%5d",0);
}
if(n=c[0][1])
printf("\n");
}
return OK;
}
int Sub(int a[][3],int b[][3])
{
if(a[0][0]==0)
{
printf("您还没有输入矩阵,请输入矩阵!\n");
return NULL;
}
int c[MAX][3],i,j,k=1,m=1,n=1;
c[0][0]=a[0][0];
c[0][1]=a[0][1];
while(i<=a[0][2] || j<=b[0][2])
{
if(i<=a[0][2] && j<=b[0][2])
{
for(i=1,j=1;i<=a[0][2] && j<=b[0][2];)
{
if(a[i][0]==b[j][0])
{
if(a[i][1]<b[j][1])
{
c[k][0]=a[i][0];
c[k][1]=a[i][1];
c[k][2]=a[i][2];
k++;
i++;
}
else if(a[i][1]>b[j][1])
{
c[k][0]=b[j][0];
c[k][1]=b[j][1];
c[k][2]=-b[j][2];
k++;
j++;
}
else
{
c[k][0]=b[j][0];
c[k][1]=b[j][1];
c[k][2]=a[i][2]-b[j][2];
k++;
i++;
j++;
}
}
else if(a[i][0]<b[j][0])
{
c[k][0]=a[i][0];
c[k][1]=a[i][1];
c[k][2]=a[i][2];
k++;
i++;
}
else if(a[i][0]>b[j][0])
{
c[k][0]=b[j][0];
c[k][1]=b[j][1];
c[k][2]=-b[j][2];
k++;
j++;
}
}
}
else if(i>a[0][2])
{
c[k][0]=b[j][0];
c[k][1]=b[j][1];
c[k][2]=-b[j][2];
k++;
j++;
}
else if(j>b[0][2])
{
c[k][0]=a[i][0];
c[k][1]=a[i][1];
c[k][2]=a[i][2];
k++;
i++;
}
}
printf("A与B的差的矩阵表是为:\n");
for(i=1;i<=c[0][0];++i)
{
for(j=1;j<=c[0][1];++j)
{
if(i==c[m][0] && j==c[m][1])
{
printf("%5d",c[m][2]);
m++;
n++;
}
else printf("%5d",0);
}
if(n=c[0][1])
printf("\n");
}
return OK;
}
int Value(int a[][3],int i,int j)
//在M中寻找行号为i和列号为j的元素,找到则返回其元素值,找不到则返回0
{
int p;
for(p=1;p<=a[0][2];++p)
{
if(a[p][0]==i && a[p][1]==j)
return (a[p][2]);
}
return 0;
}
int Mul(int a[][3],int b[][3])
{
if(a[0][0]==0)
{
printf("您还没有输入矩阵,请输入矩阵!\n");
return NULL;
}
int c[MAX][3],sum=0,i,j,t,p=1,m=1,n=0;
//p指示C的三元组表的当前项,初始时为1
for(i=1;i<=a[0][0];i++)
{
for(j=1;j<=b[0][1];j++)
{
for(t=1;t<=a[0][1];t++)
sum=sum+Value(a,i,t)*Value(b,t,j);// 调用Value函数,求出A中行号为i和列号为s的元素值
if(sum!=0) //产生一个C的三元组表元素
{
c[p][0]=i;
c[p][1]=j;
c[p][2]=sum;
sum=0;
p++;
}
}
}
c[0][0]=a[0][0];
c[0][1]=b[0][1];
c[0][2]=p-1;
printf("A与B的积的矩阵表是为:\n");
for(i=1;i<=c[0][0];i++)
{
for(j=1;j<=c[0][1];j++)
{
if(i==c[m][0] && j==c[m][1])
{
printf("%5d",c[m][2]);
m++;
n++;
if(n==c[0][1])
{
printf("\n");
n=0;
}
}
else
{
printf("%5d",0);
n++;
if(n==c[0][1])
{
printf("\n");
n=0;
}
}
}
}
return OK;
}
//---------------------------------------主函数--------------------------------------------------//
int main()
{
int a[MAX][3],b[MAX][3],i=0,j=0;
char ch;
a[0][0]=0;
printf(" 欢迎您使用稀疏矩阵运算器\n\n");
printf("********************************** 菜单 ***************************************\n");
printf("* A输入矩阵 B 矩阵相加 C 矩阵相减 D 矩阵相乘 E 退出 *\n");
printf("********************************** 菜单 ***************************************\n");
while(1)
{
while(1)
{
fflush(stdin);
printf("请选择您的操作:\n");
scanf("%c",&ch);
fflush(stdin);
if(ch>=65 && ch<=69) break;
}
switch(ch)
{
case'A':
printf("请输入A矩阵的行数、列数及非零元个数,中间以逗号隔开如(a,b,c):");
scanf("%d,%d,%d",&a[0][0],&a[0][1],&a[0][2]);
for(i=1;i<=a[0][2];++i)
{
printf("请输入第%d个非零元的行下标、列下标及数值如(a,b,c):",i);
scanf("%d,%d,%d",&a[i][0],&a[i][1],&a[i][2]);
}
printf("请输入B矩阵的行数、列数及非零元个数,中间以逗号隔开如(a,b,c):");
scanf("%d,%d,%d",&b[0][0],&b[0][1],&b[0][2]);
for(j=1;j<=b[0][2];++j)
{
printf("请输入第%d个非零元的行下标、列下标及数值如(a,b,c):",j);
scanf("%d,%d,%d",&b[j][0],&b[j][1],&b[j][2]);
}
break;
case'B':
Add(a,b);
break;
case'C':
Sub(a,b);
break;
case'D':
Mul(a,b);
break;
case'E':
return 0;
default: break;
}
}
return OK;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -