面向对象程序设计课程设计报告.doc_第1页
面向对象程序设计课程设计报告.doc_第2页
面向对象程序设计课程设计报告.doc_第3页
面向对象程序设计课程设计报告.doc_第4页
面向对象程序设计课程设计报告.doc_第5页
已阅读5页,还剩21页未读 继续免费阅读

下载本文档

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

文档简介

面向对象程序设计课程设计报告院 系 物理与电子工程系 专 业 电子信息工程(本) 班 级 电子信息工程(本)121班 姓 名 学 号 _指导教师单位广西民族师范学院数计系_指导教师姓名_ _ 完成日期 2014年 6月 27 日第一章 需求分析1.1引言 当我们在学线性代数的时候,都需要学习矩阵的相关内容,在学习的时候,当然离不开矩阵的相关计算,例如求矩阵的加、减、乘、运算,判断两个矩阵是否相等,求矩阵的行列式以及矩阵的逆等等。要知道其结果,往往要花比较多的时间去计算,因此,设计一个能完成这些计算的程序是很有必要的。它可以帮助我们便捷、快速地完成计算,节约我们宝贵的时间。1.2任务概述 (A) 使用C+设计矩阵类及相应的测试主程序。该矩阵类可进行基本的统计计算,矩阵类的每一行为一向量,基本统计计算针对该向量进行。矩阵生成可如1方式实现,也可以从磁盘文件中读入。矩阵的行、列数有默认值,也可通过类成员函数设置更改;如从磁盘文件读入,该磁盘文件名及其存储路径有默认值,也可通过类成员函数设置更改;矩阵类有加、减、乘、判断相等的运算成员函数;基本统计计算包括求均值、协方差;基本统计计算结果在该类对象退出作用域时可自动存入磁盘文件,该磁盘文件名及其存储路径有默认值,也可通过类成员函数设置更改。(B) 在按上述要求实现的C+类中添加可求协方差矩阵对应的行列式值和求矩阵(方阵)逆的类成员,更改测试主程序对此加以验证要求: (1)提交类声明头文件、类实现文件和测试程序文件3个源代码文件; (2)2014年6月27日前完成并提交。1.3数据描述 该程序包含一下信息: 1)、声明一个矩阵类 2)、有矩阵的输入、输出功能 3)、有完成矩阵计算个功能函数1.4功能需求根据要求设计一个矩阵类及相应的测试主程序,该矩阵类可进行基本的统计计算,矩阵类有加、减、乘、判断相等的运算成员函数,可求协方差矩阵对应的行列式值和求矩阵(方阵)逆的类成员。1.5运行需求 应用VisualC+,VisualC+6.0不仅仅是一个C+编译器,而且是一个基于Windows操作系统的是集成开发环境,这种环境开发出来的软件稳定性好、可移植性强,可以编制各种的Windows应用程序。 第二章 概要设计2.1 矩阵类(Matrix)设计 根据题目要求,设计矩阵类及相应的测试主程序:矩阵类可进行基本的统计计算 详细程序代码如下: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 double 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;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.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.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;测试任意两个矩阵加、减、乘情况例如,输入以下两个矩阵,矩阵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*(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; 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.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; 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 &); /设置为友元的输出函数 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 &); /设置成友元的求矩阵的逆 private: 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) /输出函数 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+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.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 - 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; 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 * 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 (i+j

温馨提示

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

评论

0/150

提交评论