📄 sm1.cpp
字号:
#include <stdio.h>
#define max 20
void convert(int a[max][3],int a1[max][3])
{
int p,q,col;
a1[0][0]=a[0][1];
a1[0][1]=a[0][0];
a1[0][2]=a[0][2];
if(a1[0][2]!=0)
{
q=1;
for(col=1;col<=a[0][1];col++)
for(p=1;p<=a[0][2];p++)
if(a[p][1]==col)
{
a1[q][1]=a[p][0];
a1[q][0]=a[p][1];
a1[q][2]=a[p][2];
q++;
}
}
}
void add(int a[max][3],int b[max][3],int c[max][3])
{
int i=1,j=1,k=1;
while(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
{
c[k][0]=b[j][0];
c[k][1]=b[j][1];
c[k][2]=b[j][2];
k++;
j++;
}
c[0][0]=a[0][0];
c[0][1]=a[0][1];
c[0][2]=k-1;
}
}
int value(int c[max][3],int i,int j)
{
int k=1;
while(k<=c[0][2]&&!(c[k][0]==i&&c[k][1]==j))
k++;
if(c[k][0]==i&&c[k][1]==j)
return(c[k][2]);
else return(0);
}
void multi(int a[max][3],int b[max][3],int c[max][3])
{
int i,j,p,s,q;
p=1;
for(i=1;i<=a[0][0];i++)
for(j=1;j<=b[0][1];j++)
{
s=0;
for(q=1;q<=a[0][1];q++)
s=s+value(a,i,q)*value(b,q,j);
if(s!=0)
{
c[p][0]=i;
c[p][1]=j;
c[p][2]=s;
p++;
}
}
c[0][0]=a[0][0];
c[0][1]=b[0][1];
c[0][2]=p-1;
}
void print(int a[max][3])
{
int i,j,t;
int aout[max+1][max+1];
for(i=1;i<=a[0][0];i++)
{
for(j=1;j<=a[0][1];j++)
{
aout[i][j]=0;
}
}
for(t=1;t<=a[0][2];t++)
{
i=a[t][0];
j=a[t][1];
aout[i][j]=a[t][2];
}
for(i=1;i<=a[0][0];i++)
{
for(j=1;j<=a[0][1];j++)
{
printf("%5d",aout[i][j]);
}
printf("\n");
}
}
void main()
{
int a[max][3],b[max][3],a1[max][3],b1[max][3],c[max][3],d[max][3];
int i,y;
printf("输入稀疏方阵A的行数,列数和非零元个数:");
scanf("%d,%d,%d",&a[0][0],&a[0][1],&a[0][2]);
for(i=1;i<=a[0][2];i++)
{
printf("输入第%d个非0元素的行数,列数和值:",i);
scanf("%d,%d,%d",&a[i][0],&a[i][1],&a[i][2]);
}
printf("输出A的阵列表示:\n");
print(a);
printf("\n输入稀疏方阵B的行数,列数和非零元个数:");
scanf("%d,%d,%d",&b[0][0],&b[0][1],&b[0][2]);
for(i=1;i<=b[0][2];i++)
{
printf("输入第%d个非0元素的行数,列数和值:",i);
scanf("%d,%d,%d",&b[i][0],&b[i][1],&b[i][2]);
}
printf("输出B的阵列表示:\n");
print(b);
printf("\n");
printf("============= 菜 单 ==============\n");
printf(" 1 A矩阵转置\n");
printf(" 2 B矩阵转置\n");
printf(" 3 C = A + B\n");
printf(" 4 D = A * B\n");
printf("======================================\n\n");
loop: printf("请选择相应操作的序号:");
scanf("%d",&y);
switch(y)
{
case 1: convert(a,a1);
printf("输出A转置的阵列表示:\n");
print(a1);
printf("\n");
goto loop;
case 2: convert(b,b1);
printf("输出B转置的阵列表示:\n");
print(b1);
printf("\n");
goto loop;
case 3: add(a,b,c);
printf("输出C=A+B的阵列表示:\n");
print(c);
printf("\n");
goto loop;
case 4: multi(a,b,d);
printf("输出D=A*B的阵列表示:\n");
print(d);
printf("\n");
goto loop;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -