📄 jiuzhen.cpp
字号:
#include<iostream.h>
#include<stdio.h>
#define MAXSIZE 400 //元素个数的最大值为400
typedef struct{
int i,j; //该非零元的行下标和列下标
int e;
}Triple;
typedef struct{
Triple data[MAXSIZE+1]; //非零元三元组表,data[0]未用
int mu,nu,tu; //矩阵的行数、列数和非零元个数。
}TSMatrix;
void CreateTSMatrix(TSMatrix &M,int m,int n,int k) //根据行数、列数和非零元个数建立三元组
{
int i;
M.mu=m;
M.nu=n;
M.tu=k;
for(i=1;i<=k;i++) //根据非零个数的多少,循环输入三元组
{
printf(" 第%d个非零元(行 列 值): ",i);
scanf("%d %d %d",&M.data[i].i,&M.data[i].j,&M.data[i].e);
}
}
int input(TSMatrix &M,TSMatrix &T)//矩阵输入函数,根据行数、列数和非零元个数循环输入到三元组中
{
int m1,m2,n1,n2,k1,k2;
printf("请输入第一个距阵的行数、列数和非零元个数: ");
scanf("%d %d %d",&m1,&n1,&k1);
if(m1<1||n1<1||k1<0)
{
printf("输入有误!请重新输入…\n");return 0;}
printf("第一个距阵信息:\n");
CreateTSMatrix(M,m1,n1,k1);
printf("请输入第二个距阵的行数、列数和非零元个数: ");
scanf("%d %d %d",&m2,&n2,&k2);
if(m2<1||n2<1||k2<0)
{printf("输入有误!请重新输入…\n");return 0;}
printf("第二个距阵信息:\n");
CreateTSMatrix(T,m2,n2,k2);
return 1;
}
void print(TSMatrix &Y) //矩阵输出函数,输出矩阵形式
{
int i,j,p=1;
for(i=1;i<=Y.mu;i++)
{
for(j=1;j<=Y.nu;j++)
{
if(i==Y.data[p].i && j==Y.data[p].j) //如果此元存在,即直接输出
{printf("%5d",Y.data[p].e);p++;}
else printf("%5d",0);//不存在则输出零
}
cout<<endl; //矩阵换行
}
}
void AddTSMatrix(TSMatrix &M,TSMatrix &T,TSMatrix &Y) //矩阵加法运算,Y=M+T
{
Y.mu=M.mu; //定义相加结果的行、列个数
Y.nu=M.nu;
for(int i=1;i<=M.tu;i++) //把矩阵M复制到结果Y
{
Y.data[i].i=M.data[i].i;
Y.data[i].j=M.data[i].j;
Y.data[i].e=M.data[i].e;
}
int m=0,k=M.tu;
for(i=1;i<=T.tu;i++) //读取矩阵T的元素
{
for(int j=1;j<=M.tu;j++)
if(T.data[i].i==Y.data[j].i && T.data[i].j==Y.data[j].j) //如果元素的行数和列数相同,则把两结果相加
{ Y.data[j].e=Y.data[j].e+T.data[i].e; m=1;}
if(m==0) //如果元素的行数和列数不同,则把它添加进矩阵Y
{
++k;
Y.data[k].i=T.data[i].i;
Y.data[k].j=T.data[i].j;
Y.data[k].e=T.data[i].e;
}
else m=0;
}
Y.tu=k;
}
void SubTSMatrix(TSMatrix &M,TSMatrix &T,TSMatrix &Y) //矩阵减法运算,Y=M-T
{
Y.mu=M.mu;
Y.nu=M.nu;
for(int i=1;i<=M.tu;i++)
{Y.data[i].i=M.data[i].i;
Y.data[i].j=M.data[i].j;
Y.data[i].e=M.data[i].e;}
int m=0,k=M.tu;
for(int s=1;s<=T.tu;s++)
{for(int t=1;t<=M.tu;t++)
if(T.data[s].i==Y.data[t].i && T.data[s].j==Y.data[t].j)
{Y.data[t].e=Y.data[t].e-T.data[s].e;m=1;}
if(m==0)
{++k;
Y.data[k].i=T.data[s].i;
Y.data[k].j=T.data[s].j;
Y.data[k].e=-T.data[s].e;}
else m=0;
} Y.tu=k;
}
void MUlTSMatrix(TSMatrix &M,TSMatrix &T,TSMatrix &Y) //矩阵乘法运算,Y=M*T
{
int i,k=1,flag=0;
Y.mu=M.mu;
Y.nu=T.nu;
Y.tu=0; //Y的初始非零元为零
for(i=1;i<=M.tu;i++) //逐个读取矩阵M中非零元
{for(int j=1;j<=T.tu;j++) //逐个读取矩阵T中的非零元
{if(M.data[i].j==T.data[j].i ) //如果M中第i个元素的列与T中第j个元素的行相等
{for(int m=1;m<=k;m++) //检查Y中是否存在第i行第j列的元素
{if(Y.data[m].i==M.data[i].i && Y.data[m].j==T.data[j].j)//如果存在,则把M与T的元素相乘后加到这个元素上
{Y.data[m].e=Y.data[m].e+M.data[i].e*T.data[j].e;
flag=1;//此时判参数flag=1;
}
}
if(flag==0) //如果Y中不存在此元,则把结果添加到Y中,此时Y中的非零元加1
{
Y.data[k].e=M.data[i].e*T.data[j].e;
Y.data[k].i=M.data[i].i;
Y.data[k].j=T.data[j].j;
k++;
}
flag=0;
}
}
}
Y.tu=k-1; //因为初值是K=1,所以现在减1才是真正Y的非零元个数
}
void main() //主函数
{
TSMatrix M; //定义三个三元组结构,用于存放矩阵。
TSMatrix T;
TSMatrix Y;
char choice;
cout<<" 稀疏矩阵运算器 "<<endl<<endl;
do{
printf("运算选择:\n" );
printf(" 矩阵加法<A> 矩阵减法<S> 矩阵乘法<M> 退出系统<Q>\n");
printf("请选择:\n");
scanf("%c",&choice);
if (choice==10)scanf("%c",&choice);
switch(choice) //各菜单项
{
case'A':{ //矩阵加法
input(M,T);
if(M.mu!=T.mu && M.nu!=T.nu)
{printf("两个矩阵的行、列数不匹配,请重新输入…\n");break;}
else
{
AddTSMatrix(M,T,Y);
cout<<"第一个要加的矩阵是:" <<endl;
print(M);
cout<<"第二个要加的矩阵是:" <<endl;
print(T);
cout<<"相加结果矩阵是:" <<endl;
print(Y);}
}break;
case'S':{ //矩阵减法
input(M,T);
if(M.mu!=T.mu && M.nu!=T.nu)
{printf("两个矩阵的行、列数不匹配,请重新输入…\n"); break;}
else
{SubTSMatrix(M,T,Y);
cout<<"被减矩阵是:"<<endl;
print(M);
cout<<"要减矩阵是:"<<endl;
print(T);
cout<<"相减结果矩阵是:"<<endl;
print(Y);}
}break;
case'M':{ //矩阵乘法
input(M,T);
if(M.nu!=T.mu)
{cout<<"两个矩阵的行、列数不匹配,请重新输入…\n"<<endl; break;}
else
{MUlTSMatrix(M,T,Y);
cout<<"第一个要乘的矩阵是:" <<endl;
print(M);
cout<<"第二个要乘的矩阵是:" <<endl;
print(T);
cout<<"相乘结果矩阵是:" <<endl;
print(Y);}
}break;
case 'Q': //退出系统
break;
default: cout<<"输入有误,请重新选择!\n";break;
}/*switch*/
}while(choice!='Q');
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -