稀疏矩阵程序设计报告Word文件下载.docx
《稀疏矩阵程序设计报告Word文件下载.docx》由会员分享,可在线阅读,更多相关《稀疏矩阵程序设计报告Word文件下载.docx(17页珍藏版)》请在冰豆网上搜索。
80
一.类设计
1.定义了一个三元组Triple类,用三元组形式输入稀疏矩阵的数据信息。
2.定义了一个稀疏矩阵SMatrix类。
二.小组成员分工
负责乘法功能以及输出打印功能的编写。
负责创建矩阵功能、加减法功能以及主函数的编写,并整合整个程序。
最后共同完成课程设计报告。
三.验证(主)程序设计
voidmain()
{
SMatrixA,B,C;
intflag;
while(true)
{
system("
cls"
);
printf("
\n\n\n"
\t************稀疏矩阵的加、减、乘法运算************\n"
\t\n"
\t1、稀疏矩阵的加法\n"
\t2、稀疏矩阵的减法\n"
\t3、稀疏矩阵的乘法\n"
\t4、退出该应用程序\n"
输入要进行的操作的编号(1-4):
"
cin>
>
flag;
if(flag==4)break;
A.Creat();
矩阵A:
\n"
A.Print_SMatrix();
switch(flag)
{
case1:
B.Creat();
printf("
矩阵B:
B.Print_SMatrix();
if(A.getHs()==B.getLs()&
&
A.getLs()==B.getLs())
{
printf("
A+B:
C=A+B;
cout<
<
C;
}
elseprintf("
错误!
AB矩阵行列不一致\n"
break;
case2:
if(A.getHs()==B.getLs()&
A.getLs()==B.getLs())
A-B:
C=A-B;
case3:
A*B:
C=A*B;
cout<
default:
输入错误!
}
A.Destory_SSMatrix();
B.Destory_SSMatrix();
C.Destory_SSMatrix();
getchar();
}
printf("
\n\t\t\t***程序已退出***\n"
getchar();
}
四.类源程序代码
#include"
stdafx.h"
#include<
iostream>
#include<
malloc.h>
stdlib.h>
usingnamespacestd;
#defineMAXSIZE40//假设非零元素个数的最大值为40
#defineMAXRC20//假设矩阵的最大行数为20
classTriple//三元组的定义
protected:
inti,j;
//非零元的行下标和列下标
inte;
//非零元的值
public:
intgetI(){returni;
}//在重载<
输出矩阵时用到这个方法
intgetJ(){returnj;
intgetE(){returne;
friendclassSMatrix;
//友元类
};
classSMatrix//稀疏矩阵
protected:
Tripledata[MAXSIZE+1];
//=newTriple[MAXSIZE+1];
intrpos[MAXRC+1];
//各行第一个非零元在三元组的位置表
inths,ls,fls;
//行数列数非零元素个数
SMatrix(){//默认的构造函数
hs=0;
ls=0;
fls=0;
~SMatrix(){}//析构函数a
intgetHs(){returnhs;
intgetLs(){returnls;
}//返回行数,列数在矩阵乘法比较两个矩阵的行列号是否一致时用到
voidCreat()//创造稀疏矩阵
inti,k;
for(i=1;
i<
=MAXRC+1;
i++)
rpos[i]=0;
请输入矩阵的行数、列数和非零元素个数(以空格隔开):
hs>
ls>
fls;
=fls;
请输入矩阵中非零元素所在的行、列和数值(以空格隔开):
cin>
data[i].i>
data[i].j>
data[i].e;
for(i=1,k=1;
=hs;
rpos[i]=k;
//k为非零元素的标号即代表是第几个非零元素
while(data[k].i<
=i&
k<
=fls)k++;
SMatrix&
operator+(SMatrix&
A)//运算符重载加法
inta,b,temp,l;
SMatrixC;
C.hs=A.hs;
C.ls=A.ls;
a=b=l=1;
//abl分别表示A当前C表的第几个非零数
while(a<
=A.fls&
b<
=fls)
if(A.data[a].i==data[b].i)//非零数行号一样
if(A.data[a].j<
data[b].j)//a的列数小于b的列数
C.data[l++]=A.data[a++];
//将a的值(包括行号列号)先赋予c两表的非零数的下标都向前相加一
elseif(A.data[a].j>
data[b].j)
{
C.data[l++]=data[b++];
//将b的值先赋予c两表的非零数的下标都向前相加一
}
else{
temp=A.data[a].e+data[b].e;
//将ab的值相加赋予tem再赋a予c再修改c的数值为tem最后下标都加一
if(temp)
{
C.data[l]=A.data[a];
C.data[l].e=temp;
l++;
}
a++;
b++;
elseif(A.data[a].i<
data[b].i)//a的行号小于b的行号
C.data[l++]=A.data[a++];
else//a的行号大于b的行号
C.data[l++]=data[b++];
=A.fls)
C.data[l++]=A.data[a++];
while(b<
C.data[l++]=data[b++];
C.fls=l-1;
//因为l的值++多加了个一这里要给减去
returnC;
operator-(SMatrix&
A){//运算符重载减法
data[b].j){//a的列数小于b的列数
A.data[a].e=-A.data[a].e;
//取负数
C.data[l++]=data[b++];
temp=data[b].e-A.data[a].e;
//将ab的值相减赋予tem再赋a予c再修改c的数值为tem最后下标都加一
elseif(A.data[a].i<
data[b].i){//a的行号小于b的行号
A.data[a].e=-A.data[a].e;
C.data[l++]=data[b++];
=A.fls){
A.data[a].e=-A.data[a].e;
C.data[l++]