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

下载本文档

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

文档简介

1、课 程 设 计 任 务 书学院信息科学与工程专业电子信息科学与技术学生姓名学号设计题目设计一个能够实现 nn 矩阵操作的类/计算器程序内容及要求:PART I设计一个能够实现 nn 矩阵操作的类矩阵是线性代数里一个重要的概念,在这里采用 C+语言实现一个简单的 nn 矩阵类,类中包括一些简单的运算等操作具体要求如下:(1)使用构造函数完成方阵的初始化赋值(动态内存分配) ;(2)使用析构函数完成矩阵动态内存的释放;(3)重载加法运算符、*、=,实现两个矩阵的运算;(4)使用函数实现矩阵的转置;(5)使用函数求矩阵中的最大、小值、对应行列式的值;(6)重载加法运算符,实现矩阵按照行列的格式输出;

2、(7)编写一个主函数测试上述功能。PART II计算器程序进度安排:第 17 周:分析题目,查阅课题相关资料,进行类设计、算法设计;第 18 周:上机调试程序,程序测试与分析,撰写课程设计报告,准备答辩。指导教师(签字):年 月 日学院院长(签字)年 月 日目目 录录PART I1 需求分析.22 算法基本原理.23 类设计.34 详细设计.44.1 类的接口设计.44.2 类的实现.54.3 主函数设计.115 运行结果与分析.125.1 程序运行结果.125.2 运行结果分析.14PART 1 需求分析.142 算法基本原理.143 类设计.144 详细设计.154.1 类的实现.154.

3、2 主函数设计.195 运行结果与分析.275.1 程序运行结果.275.2 运行结果分析.276 参考文献.28PART I1 需求分析需求分析矩阵是线性代数里一个重要的概念,在这里采用 C+语言实现一个简单的nn 矩阵类,类中包括一些简单的运算等操作具体要求如下:(1)使用构造函数完成方阵的初始化赋值(动态内存分配) ;(2)使用析构函数完成矩阵动态内存的释放;(3)重载加法运算符,实现两个矩阵的和;(4)重载加法运算符,实现两个矩阵的差;(5)重载加法运算符*,实现两个矩阵的积;(6)重载加法运算符=,实现两个矩阵之间的赋值;(7)使用函数实现矩阵的转置;(8)使用函数求矩阵中的最大值;

4、(9)使用函数求矩阵中的最小值;(10)添加函数 Det 以得到矩阵对应行列式的值;(11)重载加法运算符,实现矩阵按照行列的格式输出;(12)编写一个主函数测试上述功能。2 算法基本原理算法基本原理矩阵进行加法,减法,乘法运算时,必须满足两个矩阵阶数相同的条件。加法,减法计算是把矩阵对应的各行各列的每一对数值分别进行加减法运算,结果组成一个新的同阶矩阵。矩阵乘法是这样定义的,只有当矩阵 A 的列数与矩阵 B 的行数相等时 AB 才有意义。一个 mn 的矩阵 a(m,n)左乘一个 np 的矩阵 b(n,p),会得到一个 mp的矩阵 c(m,p),满足 矩阵乘法满足结合率,但不满足交换率3 类设

5、计类设计从上面的算法分析可以看到,本设计面临的计算问题的关键是矩阵运算。可以定义一个矩阵类 Matrix。矩阵类 Matrix 只处理 nn 类型的方阵,方阵用一个一维数组来存放,矩阵类 Matrix 的数据成员包括数组的首地址 num 和阶数n。矩阵类 Matrix 的功能有:默认构造函数 Matrix()、构造函数 Matrix(int n,int *a)、手动输入矩阵函数 SetMatrix(int n)、析构函数Matrix()、重载加法运算符,实现两个矩阵的和函数 Matrix operator +(const Matrix &a)、重载加法运算符,实现两个矩阵的差函数 Ma

6、trix operator -(const Matrix &a)、重载加法运算符*,实现两个矩阵的积函数 Matrix operator *(const Matrix &a)、重载加法运算符=,实现两个矩阵之间的赋值函数 Matrix &operator =(const Matrix &a)、实现矩阵的转置 Transpose()、求矩阵中的最大值 Max()、求矩阵中的最小值 Min()、求行列式 Det()、重载加法运算符,实现矩阵按照行列的格式输出 Matrix operator (const Matrix &a)、我的求行列式函数 MyDet(i

7、nt* array,int Jie)。矩阵类 Matrix 如图所示。Matrix+n:int+num:int+Matrix()+Matrix(int n,int *a)+ SetMatrix(int n):void+Matrix()+ operator +(const Matrix &a):Matrix+ operator -(const Matrix &a):Matrix+operator *(const Matrix &a):Matrix+ &operator =(const Matrix &a):Matrix+ Transpose():void+

8、 Max():int+ Min():int+ Det():double+ operator (const Matrix &a):MatrixMyDet(int* array,int Jie) :double图 1 Matrix 类的 UML 图形表示4 详细设计详细设计整个程序分为三个部分,首先是类,然后是类的功能函数,最后是一个主函数用来测试类的所有功能是否可是实现4.1 类的接口设计#include stdafx.h#includeusing namespace std;class Matrixpublic:int n;int *num;Matrix();/默认构造函数Matrix

9、(int n,int *a);/构造函数void SetMatrix(int n);/手动输入矩阵Matrix();/析构函数Matrix operator +(const Matrix &a);/重载加法运算符,实现两个矩阵的和Matrix operator -(const Matrix &a);/重载加法运算符,实现两个矩阵的差Matrix operator *(const Matrix &a);/重载加法运算符,实现两个矩阵的差Matrix &operator =(const Matrix &a);/重载加法运算符*,实现两个矩阵的积void Tr

10、anspose();/实现矩阵的转置int Max();/求矩阵中的最大值int Min();/求矩阵中的最小值double Det();/求行列式Matrix operator (const Matrix &a);/重载加法运算符n=n;num=new intn*n;for(int i=0;in=1)delete num;elsedeletenum;this-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=

11、1)delete num;elsedeletenum;Matrix Matrix:operator +(const Matrix &a)/重载加法运算符,实现两个矩阵的和if(a.n=n)int *p=new intn*n;for(int i=0;i1)deletep;elsedelete p;return *temp;elseMatrix temp;return temp;Matrix Matrix:operator -(const Matrix &a)/重载加法运算符,实现两个矩阵的差if(a.n=n)int *p=new intn*n;for(int i=0;i1)del

12、etep;elsedelete p;return *temp;elseMatrix temp;return temp;Matrix Matrix:operator *(const Matrix &a)/重载加法运算符*,实现两个矩阵的积if(a.n=n)int *p=new intn*n;int i=0,j=0,k=0;for(i=0;in*n;i+)*(p+i)=0;for(i=0;in;i+)for(j=0;jn;j+)for(k=0;k1)deletep;elsedelete p;return *temp;else Matrix temp;return temp;Matrix &

13、amp;Matrix:operator =(const Matrix &a)/重载加法运算符=,实现两个矩阵之间的赋值if(a.n=n)for(int i=0;i1)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()/求

14、矩阵中的最小值int temp;temp=*num;for(int i=0;in*n;i+)if(*(num+i)num,this-n);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

15、; 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 );

16、double temp= 0;tag = 1;for( i = 0 ; i Jie; i+) temp += tag * MyDet(subArrayi,Jie-1) * arrayi;tag *= -1;return temp;ostream &operator (ostream & stream,const Matrix &a)/重载加法运算符,实现矩阵按照行列的格式输出streamendl;for(int i=0;ia.n;i+)for(int j=0;ja.n;j+)stream*(a.num+i*a.n+j) ;streamendl;return stream

17、;以上就是类的成员函数,在编写中除了求行列式以外,没有遇到什么大的问题。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;d=a-c;coutd=dendl;d=a*c;coutd=dendl;max=a.

18、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()endl;return 0;在程序的主函数部分,选择了一个手动输入矩阵和三个固定矩阵作为一个实际例子来验证算法。5 运行结果与分析运行结果与分析5.1 程序运行结果程序运行结果如图 2 所示。图 2 程序运行结果从图 2 中可以看出,程序能够实现一个简单 nn 矩阵操作的类。5.2 运行结果分析整个程序中的矩阵存储采用的

19、是一维数组和动态内存分配方式。Matrix 类是专门处理矩阵的类结合问题的实际需要,增加了很矩阵所特有的运算,使 Matrix 类进一步具体化、特殊化,达到对问题的有效描述和处理。程序的访问控制也是根据问题的需要而设计的。PART 1 需求分析需求分析(1)很多自然科学和工程技术中的问题都需要计算器的参与,常见的计算器有三类:算数型计算器、科学型计算器、程序计算器。(2)算术型计算器 可进行加、减、乘、除等简单的四则运算,又称简单计算器。 科学型计算器 可进行乘方、开方、指数、 对数、三角函数、统计等方面的运算,又称函数计算器。程序计算器可以编程序,把较复杂的运算步骤贮存起来,进行多次重复的运

20、算。(3)本程序可以实现加、减、乘、除、平方、开方、sin、cos、清除、ce等操作。2 算法基本原理算法基本原理本程序使用 mfc 进行编写,首先建立一个基本对话框 Calc,用右边的控件管理,构造出该计算器的雏形。本计算器是以点击对应数字实现输入数据。定义一个变量,然后点击任何数字,首先该变量自乘 10 再加上对应数字来实现其输入功能。3 类设计类设计从上面的算法分析可以看到,本设计面临的计算问题的关键是数据输入以及数据操作。可以在 CCalcDlg 类中定义 m_fresult 用于装第一个操作数,m_foldresult 用于装第二个操作数。定义一个整型数据 m_ nOperator

21、用于判断操作符。定义一个整型数据 m_ncontrol 用于判断操作是否结束,以免获得结果后,按数字键还能继续执行输入操作。定义按钮数字函数,即对应数字的输入函数。定义按钮操作函数,即对应函数的操作函数。定义按钮清除函数:C 按钮,即为初始化所有操作数;Ce 按钮,即为初始化当前操作数。4 详细设计详细设计calcDlg.h 中定义变量以及操作函数。calcDlg.cpp 中将对应的操作函数内容代码编写进去。4.1 类的接口设计/calcDlg.h 文件,实现类的声明#include using namespace std;class CCalcDlg : public CDialog/ Co

22、nstructionpublic:CCalcDlg(CWnd* pParent = NULL); / standard constructor/ Dialog Data/AFX_DATA(CCalcDlg)enum IDD = IDD_CALC_DIALOG ;double m_fresult;double m_foldresult;int m_nOperator;int m_ncontrol;/AFX_DATA/ ClassWizard generated virtual function overrides/AFX_VIRTUAL(CCalcDlg)protected:virtual vo

23、id DoDataExchange(CDataExchange* pDX); / DDX/DDV support/AFX_VIRTUAL/ Implementationprotected:HICON m_hIcon;/ Generated message map functions/AFX_MSG(CCalcDlg)virtual BOOL OnInitDialog();afx_msg void OnSysCommand(UINT nID, LPARAM lParam);afx_msg void OnPaint();afx_msg HCURSOR OnQueryDragIcon();afx_m

24、sg void OnButton1();afx_msg void OnButton2();afx_msg void OnButton3();afx_msg void OnButton4();afx_msg void OnButton5();afx_msg void OnButton6();afx_msg void OnButton7();afx_msg void OnButton8();afx_msg void OnButton9();afx_msg void OnButton0();afx_msg void OnButtonC();afx_msg void OnButtonAdd();afx

25、_msg void OnButtonSub();afx_msg void OnButtonMul();afx_msg void OnButtonDiv();afx_msg void OnButtonResult();afx_msg void OnButtonSqu();afx_msg void OnButtonSqr();afx_msg void OnButtonSin();afx_msg void OnButtonCos();afx_msg void OnButtonCe();/AFX_MSGDECLARE_MESSAGE_MAP();/AFX_INSERT_LOCATION4.2 类的实现

26、/calcDlg.cpp 文件,类实现#include stdafx.h#include math.h#include calc.h#include calcDlg.h/包含类的声明头文件/calcDlg 类的实现CCalcDlg:CCalcDlg(CWnd* pParent /*=NULL*/)/初始化变量: CDialog(CCalcDlg:IDD, pParent)/AFX_DATA_INIT(CCalcDlg)m_fresult = 0.0;m_fresult = 0.0;m_nOperator = 0;m_ncontrol = 0;/AFX_DATA_INIT/ Note that

27、LoadIcon does not require a subsequent DestroyIcon in Win32m_hIcon = AfxGetApp()-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,

28、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)ON_BN_CLICKED(IDC_BUTTON_9, OnButton9)ON_BN_CLICKED(IDC_BUTTON

29、_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, On

30、ButtonSqu)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_MAPEND_MESSAGE_MAP()void CCalcDlg:OnButton1() /按 1 按钮UpdateData(TRUE);/将控件中的数据交换到变量中if(m_ncontrol!=0)/如果是操作结束后m_fre

31、sult=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;m_ncontrol=0;m_fresult=m_fresult*10+2;UpdateData(FALSE);void CCalcDlg:OnButton3() /按 3 按钮

32、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 按钮Updat

33、eData(TRUE);if(m_ncontrol!=0)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 按钮UpdateDat

34、a(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 按钮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(TR

35、UE);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);void CCalcDlg:OnButtonC() /按 C 按钮UpdateData(TRUE);m_

36、fresult=0;/初始化所有数据m_foldresult=0;m_nOperator=0;UpdateData(FALSE);void CCalcDlg:OnButtonAdd() /按+按钮UpdateData(TRUE);m_foldresult=m_fresult;/将操作数 1 赋值给操作数 2m_fresult=0;/初始化操作数 1m_nOperator=1;/记录操作为+UpdateData(FALSE);void CCalcDlg:OnButtonSub() /按-按钮UpdateData(TRUE);m_foldresult=m_fresult;m_fresult=0;m

37、_nOperator=2;UpdateData(FALSE);void CCalcDlg:OnButtonMul() /按*按钮UpdateData(TRUE);m_foldresult=m_fresult;m_fresult=0;m_nOperator=3;UpdateData(FALSE);void CCalcDlg:OnButtonDiv() /按/按钮UpdateData(TRUE);m_foldresult=m_fresult;m_fresult=0;m_nOperator=4;UpdateData(FALSE);void CCalcDlg:OnButtonResult() Upda

38、teData(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

温馨提示

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

评论

0/150

提交评论