1、 面向对象程序设计课程设计报告第一章 需求分析1.1引言 当我们在学线性代数的时候,都需要学习矩阵的相关内容,在学习的时候,当然离不开矩阵的相关计算,例如求矩阵的加、减、乘、运算,判断两个矩阵是否相等,求矩阵的行列式以及矩阵的逆等等。要知道其结果,往往要花比较多的时间去计算,因此,设计一个能完成这些计算的程序是很有必要的。它可以帮助我们便捷、快速地完成计算,节约我们宝贵的时间。1.2任务概述 (A) 使用C+设计矩阵类及相应的测试主程序。该矩阵类可进行基本的统计计算,矩阵类的每一行为一向量,基本统计计算针对该向量进行。矩阵生成可如1方式实现,也可以从磁盘文件中读入。矩阵的行、列数有默认值,也可
2、通过类成员函数设置更改;如从磁盘文件读入,该磁盘文件名及其存储路径有默认值,也可通过类成员函数设置更改;矩阵类有加、减、乘、判断相等的运算成员函数;基本统计计算包括求均值、协方差;基本统计计算结果在该类对象退出作用域时可自动存入磁盘文件,该磁盘文件名及其存储路径有默认值,也可通过类成员函数设置更改。(B) 在按上述要求实现的C+类中添加可求协方差矩阵对应的行列式值和求矩阵(方阵)逆的类成员,更改测试主程序对此加以验证要求: (1)提交类声明头文件、类实现文件和测试程序文件3个源代码文件; (2)2014年6月27日前完成并提交。1.3数据描述 该程序包含一下信息: 1)、声明一个矩阵类 2)、
3、有矩阵的输入、输出功能 3)、有完成矩阵计算个功能函数1.4功能需求根据要求设计一个矩阵类及相应的测试主程序,该矩阵类可进行基本的统计计算,矩阵类有加、减、乘、判断相等的运算成员函数,可求协方差矩阵对应的行列式值和求矩阵(方阵)逆的类成员。1.5运行需求 应用VisualC+,VisualC+6.0不仅仅是一个C+编译器,而且是一个基于Windows操作系统的是集成开发环境,这种环境开发出来的软件稳定性好、可移植性强,可以编制各种的Windows应用程序。 第二章 概要设计2.1 矩阵类(Matrix)设计 根据题目要求,设计矩阵类及相应的测试主程序:矩阵类可进行基本的统计计算 详细程序代码如
4、下:class Matrix public: Matrix(); /无参构造函数 friend void In(Matrix &); /设置为友元的输入函数 friend void Out(Matrix &); /设置为友元的输出函数 Matrix operator +(Matrix &); /加法重载函数 Matrix operator -(Matrix &); /减法重载函数 Matrix operator *(Matrix &); /乘法重载函数 friend Matrix Adjunct(Matrix &, int , int ); /设置成友元的求代数余子式 friend doubl
5、e Det(Matrix &); /设置成友元的递归求行列式 friend Matrix Inv(Matrix &); /设置成友元的求矩阵的逆 private: int m,n; /矩阵的行数和列数 Datatype *p; /矩阵的基址;2.2 输入、输出显示矩阵模块设计主要功能是检验从键盘输入矩阵的保存及输出显示该矩阵。再对系统进行加、减、乘等一系列操作。程序代码如下:void In(Matrix &a) /输入函数 couta.ma.n;int i,j;a.p=new Datatypea.m*a.n;Datatype *q;cout请按行优先输入矩阵endl;for(j=0;ja.m;
6、j+) for(q=a.p+j*a.n,i=0;i*q;void Out(Matrix &b) /输出函数 int i,j; Datatype *p=b.p; double *q; for(i=0;ib.m;i+) for(q=p+i*b.n,j=0;jb.n;j+,q+) cout*qt; if(j=b.n-1) coutendl; 测试输入、输出显示情况2.3两个矩阵加、减、乘运算模块设计程序代码如下:Matrix Matrix:operator+(Matrix &b) /加法重载函数 if(m!=b.m|n!=b.n) coutn行或列不匹配; exit(0); Matrix c; c.
7、m=m; c.n=n; c.p=new doublem*n; int i,j; for(i=0;im;i+) for(j=0;jn;j+) c.pi*c.n+j=pi*c.n+j+b.pi*c.n+j; Out(c); return c;Matrix Matrix:operator -(Matrix &b) /减法重载函数 if(m!=b.m|n!=b.n) coutn行或列不匹配; exit(0); Matrix c; c.m=m; c.n=n; c.p=new doublem*n; for(int i=0;im;i+) for(int j=0;jn;j+) c.pi*c.n+j=pi*c.
8、n+j-b.pi*c.n+j; Out(c); return c;Matrix Matrix:operator *(Matrix &b) /乘法重载函数 Matrix c; c.m=m; c.n=n; c.p=new doublem*n; if(m!=b.n) coutn行列不匹配; exit(0); int i,j,k; for(i=0;im;i+) for(j=0;jb.n;j+) for(c.pi*b.n+j=0,k=0;kb.n;k+) c.pi*b.n+j+=pi*b.n+k*b.pk*b.n+j; Out(c); return c;测试任意两个矩阵加、减、乘情况例如,输入以下两个矩
9、阵,矩阵a: 矩阵b:1 2 3 1 4 74 5 6 2 5 87 8 9 3 6 9其效果如下:2.4求矩阵对应的行列式值和求矩阵(方阵)逆设计模块程序代码如下:Matrix Adjunct(Matrix &a, int indexm, int indexn) /求第indexm行indexn列元素 的代数余子式 Matrix adj ; adj.m=a.m - 1; adj.n=a.n - 1; adj.p = new double(a.n-1) * (a.n-1); for (int i=0; iindexm; i+) for (int j=0; jindexn; j+) adj.pi
10、*(a.n-1) +j = a.pi*a.n+j; for (int k=indexn+1; ka.n;k+) adj.pi *(a.n-1)+k-1 = a.pi*a.n+k; for (int m=indexm+1; ma.n; m+) for (int j=0;ja.n-1;j+) adj.p(m-1)*(a.n-1)+j=a.pm*a.n+j; for (int k=indexn+1; ka.n;k+) adj.p(m-1)*(a.n-1)+k-1=a.pm*a.n+k; return adj;double Det(Matrix &a) /递归求行列式 double det = 0;
11、if (a.m != a.n) cout不是方阵,没有行列式!endl; cout求行列式退出endl; if (a.n = 1) det = a.p0; return det; else for (int i = 0; i a.n; i+) if (i % 2 = 0) det += a.pi * a.n * Det(Adjunct(a, i, 0); else det -= a.pi * a.n * Det(Adjunct(a, i, 0); return det;Matrix Inv(Matrix &a) /求矩阵的逆 Matrix temp ; temp.m=a.n; temp.n=a
12、.m; temp.p = new doublea.m * a.n; double det = Det(a); /矩阵的逆 = 伴随矩阵 / 行列式 if (det = 0) /如果行列式的值为0,则没有逆 cout此矩阵没有逆!endl; cout求矩阵逆退出!; exit(0); for (int i=0; itemp.m;i+) for (int j=0; jtemp.n;j+) if (i+j) % 2 = 0) temp.pi*temp.m+j=Det(Adjunct(a,i,j)/det; else temp.pi*temp.m+j=-Det(Adjunct(a,i,j)/det;
13、return temp; 求矩阵对应的行列式值和求矩阵(方阵)逆设计模块测试情况注意:本程序输出的逆矩阵是先输出列的,如上图所示。按照正常的显示是先输出行的。上图中的a矩阵的逆矩阵应看成: -2 1 1.5 -0.5附录:程序代码/Matrix.h文件,Matrix类的定义#includeusing namespace std;typedef double Datatype; class Matrixpublic: Matrix(); /无参构造函数 friend void In(Matrix &); /设置为友元的输入函数 friend void Out(Matrix &); /设置为友元的
14、输出函数 Matrix operator +(Matrix &); /加法重载函数Matrix operator -(Matrix &); /减法重载函数 Matrix operator *(Matrix &); /乘法重载函数 friend Matrix change(Matrix &); /转置函数 friend Matrix Adjunct(Matrix &, int , int );/设置成友元的求代数余子式 friend double Det(Matrix &); /设置成友元的递归求行列式 friend Matrix Inv(Matrix &); /设置成友元的求矩阵的逆 priv
15、ate: int m,n; /矩阵的行数和列数 Datatype *p; /矩阵的基址;/Matrix.cpp文件,Matrix类的实现#includeMatrix.h#includeusing namespace std;Matrix:Matrix() m=0; n=0;void In(Matrix &a) /输入函数couta.ma.n;int i,j;a.p=new Datatypea.m*a.n;Datatype *q;cout请按行优先输入矩阵endl;for(j=0;ja.m;j+) for(q=a.p+j*a.n,i=0;i*q;void Out(Matrix &b) /输出函数
16、 int i,j; Datatype *p=b.p; double *q; for(i=0;ib.m;i+) for(q=p+i*b.n,j=0;jb.n;j+,q+) cout*qt; if(j=b.n-1) coutendl; Matrix Matrix:operator+(Matrix &b) /加法重载函数 if(m!=b.m|n!=b.n) coutn行或列不匹配; exit(0); Matrix c; c.m=m; c.n=n; c.p=new doublem*n; int i,j; for(i=0;im;i+) for(j=0;jn;j+) c.pi*c.n+j=pi*c.n+j
17、+b.pi*c.n+j; Out(c); return c;Matrix Matrix:operator -(Matrix &b) /减法重载函数 if(m!=b.m|n!=b.n) coutn行或列不匹配; exit(0); Matrix c; c.m=m; c.n=n; c.p=new doublem*n; for(int i=0;im;i+) for(int j=0;jn;j+) c.pi*c.n+j=pi*c.n+j-b.pi*c.n+j; Out(c); return c;Matrix Matrix:operator *(Matrix &b) /乘法重载函数 Matrix c; c.
18、m=m; c.n=n; c.p=new doublem*n; if(m!=b.n) coutn行列不匹配; exit(0); int i,j,k; for(i=0;im;i+) for(j=0;jb.n;j+) for(c.pi*b.n+j=0,k=0;kb.n;k+) c.pi*b.n+j+=pi*b.n+k*b.pk*b.n+j; Out(c); return c;Matrix Adjunct(Matrix &a, int indexm, int indexn) /求第indexm行indexn列元素的代数余子式 Matrix adj ; adj.m=a.m - 1; adj.n=a.n
19、- 1; adj.p = new double(a.n-1) * (a.n-1); for (int i=0; iindexm; i+) for (int j=0; jindexn; j+) adj.pi*(a.n-1) +j = a.pi*a.n+j; for (int k=indexn+1; ka.n;k+) adj.pi *(a.n-1)+k-1 = a.pi*a.n+k; for (int m=indexm+1; ma.n; m+) for (int j=0;ja.n-1;j+) adj.p(m-1)*(a.n-1)+j=a.pm*a.n+j; for (int k=indexn+1;
20、 ka.n;k+) adj.p(m-1)*(a.n-1)+k-1=a.pm*a.n+k; return adj;double Det(Matrix &a) /递归求行列式 double det = 0; if (a.m != a.n) cout不是方阵,没有行列式!endl; cout求行列式退出endl; if (a.n = 1) det = a.p0; return det; else for (int i = 0; i a.n; i+) if (i % 2 = 0) det += a.pi * a.n * Det(Adjunct(a, i, 0); else det -= a.pi *
21、a.n * Det(Adjunct(a, i, 0); return det;Matrix Inv(Matrix &a) /求矩阵的逆 Matrix temp ; temp.m=a.n; temp.n=a.m; temp.p = new doublea.m * a.n; double det = Det(a); /矩阵的逆 = 伴随矩阵 / 行列式 if (det = 0) /如果行列式的值为0,则没有逆 cout此矩阵没有逆!endl; cout求矩阵逆退出!; exit(0); for (int i=0; itemp.m;i+) for (int j=0; jtemp.n;j+) if (
22、i+j) % 2 = 0) temp.pi*temp.m+j=Det(Adjunct(a,i,j)/det; else temp.pi*temp.m+j=-Det(Adjunct(a,i,j)/det; return temp; /main.cpp主函数测试部分#includeMatrix.h#includeusing namespace std;void main() Matrix a,b,c; cout对于a矩阵;In(a);couta=endl;Out(a); cout对于b矩阵;In(b);coutb=endl;Out(b); couta+b=endl;c=a+b;coutendl;
23、couta-b=endl;c=a-b;coutendl; couta*b=endl;c=a*b;coutendl; couta的行列式为:endl;coutDet(b)endl;coutb的行列式为:endl;coutDet(b)endl; couta矩阵的逆矩阵为:endl;c=Inv(a);Out(c);coutendl; cout注意,这里是先输出逆矩阵的列的:endl;coutb矩阵的逆矩阵为:endl;c=Inv(b);Out(c); coutendl;参考文献C+面向对象程序设计清华大学出版社注:判断相等的运算,基本统计计算求均值、协方差,没有做面向对象程序设计(课程设计)成绩评定表评分项目分值得分程序(系统)(60分)原创性15程序功能20代码质量(健壮性和可扩展性)15核心代码和功能模块注释10设计报告(40分)课题来源&任务描述10系统设计15代码编写与实现结果说明15成绩总计老师签字: 蒋正锋25
版权声明:以上文章中所选用的图片及文字来源于网络以及用户投稿,由于未联系到知识产权人或未发现有关知识产权的登记,如有知识产权人并不愿意我们使用,如有侵权请立即联系:2622162128@qq.com ,我们立即下架或删除。
Copyright© 2022-2024 www.wodocx.com ,All Rights Reserved |陕ICP备19002583号-1
陕公网安备 61072602000132号 违法和不良信息举报:0916-4228922