C++课设1、设计一个能够实现n×n矩阵操作的类2、计算器程序.doc_第1页
C++课设1、设计一个能够实现n×n矩阵操作的类2、计算器程序.doc_第2页
C++课设1、设计一个能够实现n×n矩阵操作的类2、计算器程序.doc_第3页
C++课设1、设计一个能够实现n×n矩阵操作的类2、计算器程序.doc_第4页
C++课设1、设计一个能够实现n×n矩阵操作的类2、计算器程序.doc_第5页
已阅读5页,还剩24页未读 继续免费阅读

下载本文档

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

文档简介

课 程 设 计 任 务 书 学院信息科学与工程专业电子信息科学与技术 学生姓名学号 设计题目设计一个能够实现 nn 矩阵操作的类/计算器程序 内容及要求: PART I设计一个能够实现 nn 矩阵操作的类 矩阵是线性代数里一个重要的概念,在这里采用 C+语言实现一个简单的 nn 矩阵类, 类中包括一些简单的运算等操作具体要求如下: (1)使用构造函数完成方阵的初始化赋值(动态内存分配) ; (2)使用析构函数完成矩阵动态内存的释放; (3)重载加法运算符、*、=,实现两个矩阵的运算; (4)使用函数实现矩阵的转置; (5)使用函数求矩阵中的最大、小值、对应行列式的值; (6)重载加法运算符,实现矩阵按照行列的格式输出; (7)编写一个主函数测试上述功能。 PART II计算器程序 进度安排: 第 17 周:分析题目,查阅课题相关资料,进行类设计、算法设计; 第 18 周:上机调试程序,程序测试与分析,撰写课程设计报告,准备答辩。 指导教师(签字): 年 月 日 学院院长(签字) 年 月 日 1 目目 录录 PART I 1 需求分析.2 2 算法基本原理.2 3 类设计.3 4 详细设计.4 4.1 类的接口设计.4 4.2 类的实现.5 4.3 主函数设计.11 5 运行结果与分析.12 5.1 程序运行结果.12 5.2 运行结果分析.14 PART 1 需求分析.14 2 算法基本原理.14 3 类设计.14 4 详细设计.15 4.1 类的实现.15 4.2 主函数设计.19 5 运行结果与分析.27 5.1 程序运行结果.27 5.2 运行结果分析.27 6 参考文献.28 2 PART I 1 需求分析需求分析 矩阵是线性代数里一个重要的概念,在这里采用 C+语言实现一个简单的 nn 矩阵类,类中包括一些简单的运算等操作具体要求如下: (1)使用构造函数完成方阵的初始化赋值(动态内存分配) ; (2)使用析构函数完成矩阵动态内存的释放; (3)重载加法运算符,实现两个矩阵的和; (4)重载加法运算符,实现两个矩阵的差; (5)重载加法运算符*,实现两个矩阵的积; (6)重载加法运算符=,实现两个矩阵之间的赋值; (7)使用函数实现矩阵的转置; (8)使用函数求矩阵中的最大值; (9)使用函数求矩阵中的最小值; (10)添加函数 Det 以得到矩阵对应行列式的值; (11)重载加法运算符,实现矩阵按照行列的格式输出; (12)编写一个主函数测试上述功能。 2 算法基本原理算法基本原理 矩阵进行加法,减法,乘法运算时,必须满足两个矩阵阶数相同的条件。加法,减法 计算是把矩阵对应的各行各列的每一对数值分别进行加减法运算,结果组成一个新的同阶 矩阵。矩阵乘法是这样定义的,只有当矩阵 A 的列数与矩阵 B 的行数相等时 AB 才 有意义。一个 mn 的矩阵 a(m,n)左乘一个 np 的矩阵 b(n,p),会得到一个 mp 的矩阵 c(m,p),满足 矩阵乘法满足结合率,但不满足交换率 3 3 类设计类设计 从上面的算法分析可以看到,本设计面临的计算问题的关键是矩阵运算。 可以定义一个矩阵类 Matrix。矩阵类 Matrix 只处理 nn 类型的方阵,方阵用 一个一维数组来存放,矩阵类 Matrix 的数据成员包括数组的首地址 num 和阶数 n。矩阵类 Matrix 的功能有:默认构造函数 Matrix()、构造函数 Matrix(int n,int *a)、手动输入矩阵函数 SetMatrix(int n)、析构函数Matrix()、重载加法运算符 ,实现两个矩阵的和函数 Matrix operator +(const Matrix class Matrix public: int n; int *num; Matrix();/默认构造函数 Matrix(int n,int *a);/构造函数 void SetMatrix(int n);/手动输入矩阵 Matrix();/析构函数 Matrix operator +(const Matrix /重载加法运算符,实现两个矩阵 的和 Matrix operator -(const Matrix /重载加法运算符,实现两个矩阵的 差 Matrix operator *(const Matrix /重载加法运算符,实现两个矩阵的 差 Matrix /重载加法运算符*,实现两个矩阵 的积 void Transpose();/实现矩阵的转置 int Max();/求矩阵中的最大值 int Min();/求矩阵中的最小值 double Det();/求行列式 5 Matrix operator (const Matrix /重载加法运算符n=n; num=new intn*n; for(int i=0;in;i+) for(int j=0;jn;j+) cout请输入第i+1行第j+1列个元素*(num+i*n+j); Matrix:Matrix()/析构函数 if(n=1) delete num; else deletenum; Matrix Matrix:operator +(const Matrix for(int i=0;i1) deletep; else delete p; return *temp; 7 else Matrix temp; return temp; Matrix Matrix:operator -(const Matrix for(int i=0;i1) deletep; else delete p; return *temp; else Matrix temp; return temp; Matrix Matrix:operator *(const Matrix int i=0,j=0,k=0; 8 for(i=0;in*n;i+) *(p+i)=0; for(i=0;in;i+) for(j=0;jn;j+) for(k=0;k1) deletep; else delete p; return *temp; else Matrix temp; return temp; Matrix i1) 9 int temp; for(int i=0;in;i+) for(int j=0;ji;j+) temp=*(num+i*n+j); *(num+i*n+j)=*(num+j*n+i); *(num+j*n+i)=temp; int Matrix:Max()/求矩阵中的最大值 int temp; temp=*num; for(int i=0;itemp) temp=*(num+i); return temp; int Matrix:Min()/求矩阵中的最小值 int temp; temp=*num; for(int i=0;in); double Matrix:MyDet(int* array,int Jie)/我的求行列式函数 if( Jie = 0 ) cerr 阶小于 0 或等于 0! endl; return 0; else if( Jie = 1) return array0; else int i,j,k,tag; int *subArray500; for( i = 0; i Jie; i+ ) subArrayi = new int(Jie-1)*(Jie-1); for( i = 0; i Jie; i+ ) for( j = 0; j Jie-1; j+ ) for( k = 0; k Jie-1; k+ ) *(subArrayi + j*(Jie-1) + k) = 0; for( i = 0; i Jie; i+ ) for( j = 0; j Jie-1; j+ ) for( k = 0; k Jie-1; k+ ) if( k i ) *(subArrayi + j*(Jie-1) + k) = *(array + (j+1)*Jie + k ); else *(subArrayi + j*(Jie-1) + k) = *(array + (j+1)*Jie + k+1 ); double temp= 0; tag = 1; for( i = 0 ; i Jie; i+) 11 temp += tag * MyDet(subArrayi,Jie-1) * arrayi; tag *= -1; return temp; ostream for(int i=0;ia.n;i+) for(int j=0;ja.n;j+) stream*(a.num+i*a.n+j) ; streamendl; return stream; 以上就是类的成员函数,在编写中除了求行列式以外,没有遇到什么大的 问题。 4.3 主函数设计 int main(int argc, char* argv) int n1=3,n2=3,n3=3,max,min; int num1=1,1,1,1,1,1,1,1,1; int num2=2,3,3,2,2,3,2,2,2; int num3=3,3,3,3,3,3,3,3,3; Matrix a,b(n1,num1),c(n2,num2),d(n3,num3); a.SetMatrix(3); d=a+b; coutd=dendl; 12 d=a-c; coutd=dendl; d=a*c; coutd=dendl; max=a.Max(); min=a.Min(); coutThe max of a is:maxendl; coutThe min of a is:minendl; couta=aendl; a.Transpose(); couta=aendl; coutThe Det of c is:c.Det()LoadIcon(IDR_MAINFRAME); BEGIN_MESSAGE_MAP(CCalcDlg, CDialog)/将变量于外面输入 /AFX_MSG_MAP(CCalcDlg)/联系起来 产生映射 ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_BN_CLICKED(IDC_BUTTON12, OnButton1) ON_BN_CLICKED(IDC_BUTTON_2, OnButton2) ON_BN_CLICKED(IDC_BUTTON_3, OnButton3) ON_BN_CLICKED(IDC_BUTTON_4, OnButton4) ON_BN_CLICKED(IDC_BUTTON_5, OnButton5) ON_BN_CLICKED(IDC_BUTTON_6, OnButton6) ON_BN_CLICKED(IDC_BUTTON_7, OnButton7) ON_BN_CLICKED(IDC_BUTTON_8, OnButton8) 20 ON_BN_CLICKED(IDC_BUTTON_9, OnButton9) ON_BN_CLICKED(IDC_BUTTON_0, OnButton0) ON_BN_CLICKED(IDC_BUTTON_C, OnButtonC) ON_BN_CLICKED(IDC_BUTTON_ADD, OnButtonAdd) ON_BN_CLICKED(IDC_BUTTON_SUB, OnButtonSub) ON_BN_CLICKED(IDC_BUTTON_MUL, OnButtonMul) ON_BN_CLICKED(IDC_BUTTON_DIV, OnButtonDiv) ON_BN_CLICKED(IDC_BUTTON_RESULT, OnButtonResult) ON_BN_CLICKED(IDC_BUTTON_SQU, OnButtonSqu) ON_BN_CLICKED(IDC_BUTTON_SQR, OnButtonSqr) ON_BN_CLICKED(IDC_BUTTON_SIN, OnButtonSin) ON_BN_CLICKED(IDC_BUTTON_COS, OnButtonCos) ON_BN_CLICKED(IDC_BUTTON_CE, OnButtonCe) /AFX_MSG_MAP END_MESSAGE_MAP() void CCalcDlg:OnButton1() /按 1 按钮 UpdateData(TRUE);/将控件中的数据交换到变量中 if(m_ncontrol!=0)/如果是操作结束后 m_fresult=m_foldresult=0;/操作数初始化 m_ncontrol=0;/符号初始化 m_fresult=m_fresult*10+1;/操作数自乘 10,加对应按钮数 UpdateData(FALSE);/将变量中的数据交换到控件中 void CCalcDlg:OnButton2() /按 2 按钮 UpdateData(TRUE); if(m_ncontrol!=0) m_fresult=m_foldresult=0; 21 m_ncontrol=0; m_fresult=m_fresult*10+2; UpdateData(FALSE); void CCalcDlg:OnButton3() /按 3 按钮 UpdateData(TRUE); if(m_ncontrol!=0) m_fresult=m_foldresult=0; m_ncontrol=0; m_fresult=m_fresult*10+3; UpdateData(FALSE); void CCalcDlg:OnButton4() /按 4 按钮 UpdateData(TRUE); if(m_ncontrol!=0) m_fresult=m_foldresult=0; m_ncontrol=0; m_fresult=m_fresult*10+4; UpdateData(FALSE); void CCalcDlg:OnButton5()/按 5 按钮 UpdateData(TRUE); if(m_ncontrol!=0) 22 m_fresult=m_foldresult=0; m_ncontrol=0; m_fresult=m_fresult*10+5; UpdateData(FALSE); void CCalcDlg:OnButton6() /按 6 按钮 UpdateData(TRUE); if(m_ncontrol!=0) m_fresult=m_foldresult=0; m_ncontrol=0; m_fresult=m_fresult*10+6; UpdateData(FALSE); void CCalcDlg:OnButton7() /按 7 按钮 UpdateData(TRUE); if(m_ncontrol!=0) m_fresult=m_foldresult=0; m_ncontrol=0; m_fresult=m_fresult*10+7; UpdateData(FALSE); void CCalcDlg:OnButton8() /按 8 按钮 23 UpdateData(TRUE); if(m_ncontrol!=0) m_fresult=m_foldresult=0; m_ncontrol=0; m_fresult=m_fresult*10+8; UpdateData(FALSE); void CCalcDlg:OnButton9() /按 9 按钮 UpdateData(TRUE); if(m_ncontrol!=0) m_fresult=m_foldresult=0; m_ncontrol=0; m_fresult=m_fresult*10+9; UpdateData(FALSE); void CCalcDlg:OnButton0() /按 0 按钮 UpdateData(TRUE); if(m_ncontrol!=0) m_fresult=m_foldresult=0; m_ncontrol=0; m_fresult=m_fresult*10; UpdateData(FALSE); 24 void CCalcDlg:OnButtonC() /按 C 按钮 UpdateData(TRUE); m_fresult=0;/初始化所有数据 m_foldresult=0; m_nOperator=0; UpdateData(FALSE); void CCalcDlg:OnButtonAdd() /按+按钮 UpdateData(TRUE); m_foldresult=m_fresult;/将操作数 1 赋值给操作数 2 m_fresult=0;/初始化操作数 1 m_nOperator=1;/记录操作为+ UpdateData(FALSE); void CCalcDlg:OnButtonSub() /按-按钮 UpdateData(TRUE); m_foldresult=m_fresult; m_fresult=0; m_nOperator=2; UpdateData(FALSE); void CCalcDlg:OnButtonMul() /按*按钮 UpdateData(TRUE); m_foldresult=m_fresult; m_fresult=0; m_nOperator=3; UpdateData(FALSE); 25 void CCalcDlg:OnButtonDiv() /按/按钮 UpdateData(TRUE); m_foldresult=m_fresult; m_fresult=0; m_nOperator=4; UpdateData(FALSE); void CCalcDlg:OnButtonResult() UpdateData(TRUE); switch(m_nOperator)/判断操作符 case 1:/m_nOperator 为 1,则加法运算 m_fresult=m_foldresult+m_fresult; break; case 2:/m_nOperator 为 2,则减法运算 m_fresult=m_foldresult-m_fresult; break; case 3:/m_nOperator 为 3,则乘法运算 m_fresult=m_foldresult*m_fresult; break; case 4:/m_nOperator 为 4,则除法运算 m_fresult=m_foldresult/m_fresult; break; m_ncontrol=1;/令 m_ncontrol 为 1,说明操作完 毕 UpdateData(FALSE); 26 void CCalcDlg:OnButtonSqu() /按平方按钮 UpdateData(TRUE); m_fresult*=m_fresult;/操作数自乘本身 m_ncontrol=1;/令 m_ncontrol 为 1,说明操作完 毕 UpdateData(FALSE); void CCalcDlg:OnButtonSqr() /按开方按钮 UpdateData(TRUE); m_fresult=sqrt(m_fresult);/调用 math.h 头文件中的开方函数 m_ncontrol=1;/令 m_ncontrol 为 1,说明操作完 毕 UpdateData(FALSE); void CCalcDlg:OnButtonSin() /按 sin 按钮 UpdateData(TRU

温馨提示

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

评论

0/150

提交评论