📄 new.cpp
字号:
#include<iostream.h>
#include<stdio.h>
#include <stdlib.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++) //根据非零个数的多少,循环输入三元组
{
cout<<"请输入第"<<i<<"个非零元,格式为(x,y,z)"<<endl;
scanf("%d,%d,%d",&M.data[i].i,&M.data[i].j,&M.data[i].e);
}
}
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){++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。
}
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(i=1;i<=T.tu;i++)
{
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){++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 MUlTSMatrix(TSMatrix &M,TSMatrix &T,TSMatrix &Y) //三元组乘法运算。Y=M*T
{
int i,k=1,flag=0; //i为计数器,K为矩阵Y的第一个元素。
Y.mu=M.mu; //根据乘法定义,结果Y的行为第一个矩阵的行,列为第二个矩阵的列。
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.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++;}//如果Y中不存在此元,即把结果添加到Y中,此时Y中的非零元加1。
flag=0;
}
}
}
Y.tu=k-1; //因为初值是K=1,所以现在减1才是真正Y的非零元个数。
}
int input(TSMatrix &M,TSMatrix &T) //三元组M和T的设定建立函。
{
int m1,m2,n1,n2,k1,k2;
cout<<"请输入第一个距阵的行和列和非零元个数,如(x,y,z)"<<endl; //根据所给出的三元组行、列和非零元个数,循环输入到三元组中。
scanf("%d,%d,%d",&m1,&n1,&k1);
if(m1<1 || n1<1 || k1<0){cout<<"你的输入有错!!!"<<endl;return 0;}
printf("请输入第一个距阵信息:\n");
CreateTSMatrix(M,m1,n1,k1);
cout<<"请输入第二个距阵的行和列和非零元个数,如(x,y,z)"<<endl;
scanf("%d,%d,%d",&m2,&n2,&k2);
if(m2<1 || n2<1 || k2<0){cout<<"你的输入有错!!!"<<endl;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);//不存在保零。
}
printf("\n"); //矩阵换行。
}
}
void main(){
TSMatrix M; //定义三个三元组结构,用于存放矩阵。
TSMatrix T;
TSMatrix Y;
int choice; //主界面
cout<<"-----------------------------------------------------------------------"<<endl;
cout<<"__________________________稀疏矩阵运算器_______________________________"<<endl;
cout<<" "<<endl;
cout<<endl;
do{
cout<<endl;
cout<<"-----------------------------------------------------------------------"<<endl;
cout<<" <1> 矩阵加法 "<<endl;
cout<<" <2> 矩阵减法 "<<endl;
cout<<" <3> 矩阵乘法 "<<endl;
cout<<" <4> 退出系统 "<<endl<<endl;
cout<<"_______________________________________________________________________"<<endl;
cout<<"您的选择:";
cin>>choice;
switch(choice) //各菜单项
{
case 1:{input(M,T); if(M.mu!=T.mu && M.nu!=T.nu){cout<<"你的输入有错,返回!!!"<<endl; break;} else {AddTSMatrix(M,T,Y);cout<<endl;print(M); cout<<endl<<" +"<<endl<<endl;print(T);cout<<endl;print(Y);cout<<endl;} //矩阵加法
break;}
case 2:{input(M,T); if(M.mu!=T.mu && M.nu!=T.nu){cout<<"你的输入有错,返回!!!"<<endl; break;} else {SubTSMatrix(M,T,Y);cout<<endl;print(M); cout<<endl<<" -"<<endl<<endl;print(T);cout<<endl;print(Y);cout<<endl;} //矩阵减法
break;}
case 3:{input(M,T); if(M.nu!=T.mu){cout<<"你的输入有错,返回!!!"<<endl; break;}else {MUlTSMatrix(M,T,Y);cout<<endl;print(M); cout<<endl<<" *"<<endl<<endl;print(T);cout<<endl;print(Y);cout<<endl; } //矩阵乘法
break;}
case 4:exit(0); //退出系统
break;
default: printf("\n你的选择有错,请重新选择!!!");
}/*switch*/
}while(choice!='4'); //选择有错时自动返回
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -