题目:编制一个稀疏矩阵运算器的程序
班级:计算机科学与技术四班
姓名:奚明 学号:41012170
源代码:
//head.h
#define MAXSIZE 10000
typedef struct//稀疏矩阵的三元组顺序
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
存储表示
{
int i,j; //该非零元的行下标和列下标
int e;
}Triple;
typedef struct
{
Triple data[MAXSIZE]; //非零元三元组表,data[0]未用
int rpos[MAXSIZE+1]; //各行第一个非零元的位置表
int mu,nu,tu; //矩阵的行数列数和非零元的个数
}RLSMatrix;
void CreateSMatrix(RLSMatrix *T);
void AddRLSMatrix(RLSMatrix M,RLSMatrix N,RLSMatrix *Q);
void SubRLSMatrix(RLSMatrix M,RLSMatrix N,RLSMatrix *Q);
int MulTSMatrix(RLSMatrix M,RLSMatrix N,RLSMatrix *Q);
void PrintSMatrix(RLSMatrix Q) ;
//main.cpp
#include
using namespace std;
#include "head.h"
void main()
{
RLSMatrix M,N,Q;
int i;
do
{
printf("\t\t***************************\n");
printf("\t\t 稀疏矩阵运算器\n");
printf("\t\t***************************\n\n");
printf("\t\t 1.矩阵相加\n\n");
printf("\t\t 2.矩阵相减\n\n");
printf("\t\t 3.矩阵相乘\n\n");
printf("\t\t 4.退出\n\n");
printf("\t\t 请选择: ");
scanf("%d",&i);
if(i==4) goto end;
else
{
printf("\n请输入第一个矩阵M:\n");
CreateSMatrix(&M);
printf("\n请输入第二个矩阵N:\n");
CreateSMatrix(&N);
switch(i)
{
case 1:AddRLSMatrix(M,N,&Q);break;
case 2:SubRLSMatrix(M,N,&Q);break;
case 3:MulTSMatrix(M,N,&Q);break;
default:break;
}
}
PrintSMatrix(Q);
getchar();
getchar();
end: ;
}while(i!=4);
}
//xishujuzhen.cpp
#include
using namespace std;
#include "head.h"
void CreateSMatrix(RLSMatrix *T) //输入创建稀疏矩阵
{
int k;
printf(" \n请输入矩阵行数、列数及非零元个数: ");
scanf("%d%d%d",&T->mu,&T->nu,&T->tu);
printf("\n");
if(T->tu>MAXSIZE||T->mu>21)
{
printf("非零个数超出定义范围!出错!");
exit(0);
}
for(k=1;k<=T->tu;k++)
{
printf("请输入第%d个非零元素的行数,列数及其值: ",k);
scanf("%d%d%d",&T->data[k].i,&T->data[k].j,&T->data[k].e);
}
}
void AddRLSMatrix(RLSMatrix M,RLSMatrix N,RLSMatrix *Q) //稀疏矩阵相加
{
int p,q,k=1;
if(M.mu!=N.mu||M.nu!=N.nu)
{
printf("你的输入不满足矩阵相加的条件!\n");
exit(1);
}
Q->mu=M.mu;Q->nu=M.nu;
for(p=1,q=1;p<=M.tu&&q<=N.tu;)
{
if(M.data[p].i==N.data[q].i)
{
if(M.data[p].j==N.data[q].j)
{
Q->data[k].i=M.data[p].i;
Q->data[k].j=M.data[p].j;
Q->data[k].e=M.data[p].e+N.data[q].e;
p++;q++;k++;
}
else if(M.data[p].jdata[k].i=M.data[p].i;
Q->data[k].j=M.data[p].j;
Q->data[k].e=M.data[p].e;
k++;p++;
}
else if(M.data[p].j>N.data[q].j)
{
Q->data[k].i=N.data[q].i;
Q->data[k].j=N.data[q].j;
Q->data[k].e=N.data[q].e;
k++;p++;
}
}
else if(M.data[p].idata[k].i=M.data[p].i;
Q->data[k].j=M.data[p].j;
Q->data[k].e=M.data[p].e;
k++;p++;
}
else if(M.data[p].i>N.data[q].i)
{
Q->data[k].i=N.data[q].i;
Q->data[k].j=N.data[q].j;
Q->data[k].e=N.data[q].e;
k++;q++;
}
}
if(p!=M.tu+1)
for(;p<=M.tu;p++)
{
Q->data[k].i=M.data[p].i;
Q->data[k].j=M.data[p].j;
Q->data[k].e=M.data[p].e;
k++;
}
if(q!=N.tu+1)
for(;q<=N.tu;q++)
{
Q->data[k].i=N.data[q].i;
Q->data[k].j=N.data[q].j;
Q->data[k].e=N.data[q].e;
k++;
}
}
void SubRLSMatrix(RLSMatrix M,RLSMatrix N,RLSMatrix *Q) //稀疏矩阵相减
{
int p,q,k=1;
if(M.mu!=N.mu||M.nu!=N.nu)
{
printf("你的输入不满足矩阵相减的条件!\n");
exit(1);
}
Q->mu=M.mu;Q->nu=M.nu;
for(p=1,q=1;p<=M.tu&&q<=N.tu;)
{
if(M.data[p].i==N.data[q].i)
{
if(M.data[p].j==N.data[q].j)
{
Q->data[k].i=M.data[p].i;
Q->data[k].j=M.data[p].j;
Q->data[k].e=M.data[p].e-N.data[q].e;
p++;q++;k++;
}
else if(M.data[p].jdata[k].i=M.data[p].i;
Q->data[k].j=M.data[p].j;
Q->data[k].e=M.data[p].e;
k++;p++;
}
else if(M.data[p].j>N.data[q].j)
{
Q->data[k].i=N.data[q].i;
Q->data[k].j=N.data[q].j;
Q->data[k].e=-N.data[q].e;
k++;p++;
}
}
else if(M.data[p].idata[k].i=M.data[p].i;
Q->data[k].j=M.data[p].j;
Q->data[k].e=M.data[p].e;
k++;p++;
}
else if(M.data[p].i>N.data[q].i)
{
Q->data[k].i=N.data[q].i;
Q->data[k].j=N.data[q].j;
Q->data[k].e=-N.data[q].e;
k++;q++;
}
}
if(p!=M.tu+1)
for(;p<=M.tu;p++)
{
Q->data[k].i=M.data[p].i;
Q->data[k].j=M.data[p].j;
Q->data[k].e=M.data[p].e;
k++;
}
if(q!=N.tu+1)
for(;q<=N.tu;q++)
{
Q->data[k].i=N.data[q].i;
Q->data[k].j=N.data[q].j;
Q->data[k].e=-N.data[q].e;
k++;
}
}
int MulTSMatrix(RLSMatrix M,RLSMatrix N,RLSMatrix *Q) //稀疏矩阵相乘
{
int ccol=0,tp,brow,t,arow,p,q,i;
int ctemp[MAXSIZE+1];
if(M.nu!=N.mu)
{
printf("你的输入不满足矩阵相乘的条件!\n");
return 0;
}
Q->mu=M.mu;
Q->nu=N.nu;