稀疏矩阵程序设计报告_第1页
稀疏矩阵程序设计报告_第2页
稀疏矩阵程序设计报告_第3页
稀疏矩阵程序设计报告_第4页
稀疏矩阵程序设计报告_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、苏州科技学院二一五 二一六学年第一学期电子信息工程学院课程设计报告书课程名称: C+程序设计基础 班 级: 软件1312 组 号: 13 组长姓名: 闫自立 组成员姓名: 指导教师: 严迪新 二一五年十一月小组得分小组成员姓名组内评分总分8080 一 类设计1. 定义了一个三元组Triple类,用三元组形式输入稀疏矩阵的数据信息。2. 定义了一个稀疏矩阵SMatrix类。二 小组成员分工负责乘法功能以及输出打印功能的编写。负责创建矩阵功能、加减法功能以及主函数的编写,并整合整个程序。最后共同完成课程设计报告。三 验证(主)程序设计void main()SMatrix A, B, C;int f

2、lag;while (true)system(cls);printf(nnn);printf(t* 稀疏矩阵的加、减、乘法运算 *n);printf(t n);printf(t 1、稀疏矩阵的加法 n);printf(t 2、稀疏矩阵的减法 n); printf(t 3、稀疏矩阵的乘法 n);printf(t 4、退出该应用程序 n);printf(t n);printf(输入要进行的操作的编号(1-4):);cin flag;if (flag = 4) break;A.Creat();printf(矩阵A:n);A.Print_SMatrix();switch (flag)case 1:B.

3、Creat(); printf(矩阵B:n);B.Print_SMatrix();if (A.getHs()=B.getLs() & A.getLs()= B.getLs()printf(A+B:n);C = A + B;cout C;else printf(错误!AB矩阵行列不一致n); break;case 2:B.Creat();printf(矩阵B:n);B.Print_SMatrix();if (A.getHs() = B.getLs() & A.getLs() = B.getLs()printf(A-B:n);C=A-B;cout C;else printf(错误!AB矩阵行列不一

4、致n); break;case 3:B.Creat();printf(矩阵B:n);B.Print_SMatrix();printf(A*B:n);C = A*B;cout C; break;default:printf(输入错误!n);A.Destory_SSMatrix();B.Destory_SSMatrix(); C.Destory_SSMatrix();getchar();getchar();printf(nttt *程序已退出*n);getchar();四 类源程序代码#include stdafx.h#include #include #include using namespa

5、ce std;#define MAXSIZE 40 /假设非零元素个数的最大值为40 #define MAXRC 20 /假设矩阵的最大行数为20 class Triple/三元组的定义protected:int i, j; /非零元的行下标和列下标 int e;/非零元的值public:int getI() return i; /在重载 输出矩阵时用到这个方法int getJ() return j; int getE() return e; friend class SMatrix;/友元类;class SMatrix/稀疏矩阵 protected: Triple dataMAXSIZE +

6、 1; /= new TripleMAXSIZE + 1;int rposMAXRC + 1; /各行第一个非零元在三元组的位置表 int hs, ls, fls; /行数 列数 非零元素个数 public:SMatrix()/默认的构造函数hs = 0;ls = 0;fls = 0;SMatrix() /析构函数aint getHs() return hs; int getLs() return ls; /返回行数,列数 在矩阵乘法比较两个矩阵的行列号是否一致时用到void Creat()/创造稀疏矩阵int i, k;for (i = 1; i hs ls fls;for (i = 1;

7、i datai.i datai.jdatai.e;for (i = 1, k = 1; i = hs; i+)rposi = k; /k为非零元素的标号 即代表是第几个非零元素 while (datak.i = i & k = fls) k+; SMatrix& operator +(SMatrix& A) /运算符重载加法int a, b, temp, l;SMatrix C;C.hs = A.hs;C.ls = A.ls;a = b = l = 1; /a b l分别表示A 当前 C 表的第几个非零数 while (a = A.fls & b = fls)if (A.dataa.i = d

8、atab.i) /非零数行号一样 if (A.dataa.jdatab.j)C.datal+ = datab+; /将b的值先赋予c 两表的非零数的下标都向前相加一 elsetemp = A.dataa.e +datab.e; /将 ab的值相加赋予tem 再赋a予c 再修改c的数值为tem 最后下标都加一 if (temp)C.datal = A.dataa;C.datal.e = temp;l+;a+; b+;else if (A.dataa.idatab.i)/a的行号小于b的行号 C.datal+ = A.dataa+;else/a的行号大于b的行号 C.datal+ =datab+;

9、while (a = A.fls)C.datal+ = A.dataa+;while (b = fls)C.datal+ = datab+;C.fls = l - 1; /因为l的值+多加了个一 这里要给减去return C; SMatrix& operator -(SMatrix& A) /运算符重载减法 SMatrix C; int a, b, temp, l; C.hs = A.hs; C.ls = A.ls; a = b = l = 1; /a b l分别表示A 当前 C 表的第几个非零数 while (a = A.fls & b = fls) if (A.dataa.i = data

10、b.i) /非零数行号一样 if (A.dataa.jdatab.j) C.datal+ =datab+; /将b的值先赋予c 两表的非零数的下标都向前相加一 else temp = datab.e-A.dataa.e; /将 ab的值相减赋予tem 再赋a予c 再修改c的数值为tem 最后下标都加一 if (temp) C.datal = A.dataa; C.datal.e = temp; l+; a+; b+; else if (A.dataa.i datab.i)/a的行号小于b的行号 A.dataa.e = -A.dataa.e; C.datal+ = A.dataa+; else/

11、a的行号大于b的行号 C.datal+ = datab+; while (a = A.fls) A.dataa.e = -A.dataa.e; C.datal+ = A.dataa+; while (b = fls) C.datal+ = datab+; C.fls = l - 1; /因为l的值+多加了个一 这里要给减去 return C; SMatrix& operator *(SMatrix& A) /运算符重载乘法 SMatrix Q;/Q为引用保存结果 int arow, brow, ccol, tp, p, q, t; /arow(brow)表示q的最终的行数(列数) 最后和A的行

12、数(B的列数)相等 arow a行 brow b列 ccol c列 int ctempMAXRC + 1; if (ls !=A.hs) exit(0);/当前行和A的列不一致相等 无法相乘 退出 Q.hs = hs; Q.ls =A.ls; Q.fls = 0; if (A.fls*fls) for (arow = 1; arow = hs; arow+)/从当前矩阵的第一行开始 for (ccol = 1; ccol = Q.ls; ccol+) /从当前矩阵的第一列开始 ctempccol = 0; Q.rposarow = Q.fls + 1;/矩阵中 第arow行的第一个非零的数的位

13、置是Q.fls+1 if (arowhs) tp = rposarow + 1; /tp保存下一行的第一个非零元素的位置 else tp = fls + 1; for (p = rposarow; ptp; p+)/取第arow行所有元素 brow = datap.j; / A.datap的列 if (browA.hs) t = A.rposbrow + 1;/t取第 brow+1行的第一个元素 else t = A.fls + 1; for (q = A.rposbrow; qt; q+)/从brow行到下一行 ccol = A.dataq.j; ctempccol += datap.e*A

14、.dataq.e; /第ccol列等于 arow行(从第一列开始)乘以A的 brow列到最后一行 for (ccol = 1; ccol MAXSIZE) exit(0);/超出最大数据上线 退出 Q.dataQ.fls.i = arow; Q.dataQ.fls.j = ccol; Q.dataQ.fls.e = ctempccol; return Q; friend ostream& operator (ostream& out, SMatrix& M)/重载输出流操作符 int k, l; int n = 1; /SMatrix p; p = &M; for (k = 1; k = M.

15、hs; k+) /从第一行开始 n代表元素是矩阵中的第几个数 for (l = 1; l = M.ls; l+) /从第一列开始 if (M.datan.getI() = k & M.datan.getJ() = l)/行列号一致就输出值 out M.datan.getE() ;/换为out流输出 不用printf了 n+; else out 0 ; out endl; return out; ; void Print_SMatrix()/打印稀疏矩阵 int k, l; int n = 1; for (k = 1; k = hs; k+) /从第一行开始 n代表元素是矩阵中的第几个数 for (l = 1; l = ls; l+) /从第一列开始 if (datan.i = k & datan.j = l)/行列号一致就输出值 printf(%2d, datan.e); n+; else printf(%2d, 0); printf(n); /换行 void Destory_SSMatrix()/销毁三元组 hs = ls = fls = 0; friend class Triple;五 调试分析过程描述程序主界面加法运算减法运算乘法运算退出程序6. 本组的创新内容1. 在创建稀疏矩阵时运用三元组

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论