收藏 分销(赏)

C--课设设计一个能够实现n×n矩阵操作的类计算器程序.doc

上传人:快乐****生活 文档编号:2668643 上传时间:2024-06-04 格式:DOC 页数:29 大小:209.50KB 下载积分:10 金币
下载 相关 举报
C--课设设计一个能够实现n×n矩阵操作的类计算器程序.doc_第1页
第1页 / 共29页
C--课设设计一个能够实现n×n矩阵操作的类计算器程序.doc_第2页
第2页 / 共29页


点击查看更多>>
资源描述
课 程 设 计 任 务 书 学院 信息科学与工程 专业 电子信息科学与技术 学生姓名 学号 设计题目 设计一个能够实现n×n矩阵操作的类/计算器程序 内容及要求: PART I.设计一个能够实现n×n矩阵操作的类 矩阵是线性代数里一个重要的概念,在这里采用C++语言实现一个简单的n×n矩阵类,类中包括一些简单的运算等操作具体要求如下: (1)使用构造函数完成方阵的初始化赋值(动态内存分配); (2)使用析构函数完成矩阵动态内存的释放; (3)重载加法运算符+、-、*、=,实现两个矩阵的运算; (4)使用函数实现矩阵的转置; (5)使用函数求矩阵中的最大、小值、对应行列式的值; (6)重载加法运算符<<,实现矩阵按照行列的格式输出; (7)编写一个主函数测试上述功能。 PART II.计算器程序 …………………………………………… 进度安排: 第17周:分析题目,查阅课题相关资料,进行类设计、算法设计; 第18周:上机调试程序,程序测试与分析,撰写课程设计报告,准备答辩。 指导教师(签字): 年 月 日 学院院长(签字) 年 月 日 目 录 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 PART I 1 需求分析 矩阵是线性代数里一个重要的概念,在这里采用C++语言实现一个简单的n×n矩阵类,类中包括一些简单的运算等操作具体要求如下: (1)使用构造函数完成方阵的初始化赋值(动态内存分配); (2)使用析构函数完成矩阵动态内存的释放; (3)重载加法运算符+,实现两个矩阵的和; (4)重载加法运算符-,实现两个矩阵的差; (5)重载加法运算符*,实现两个矩阵的积; (6)重载加法运算符=,实现两个矩阵之间的赋值; (7)使用函数实现矩阵的转置; (8)使用函数求矩阵中的最大值; (9)使用函数求矩阵中的最小值; (10)添加函数Det以得到矩阵对应行列式的值; (11)重载加法运算符<<,实现矩阵按照行列的格式输出; (12)编写一个主函数测试上述功能。 2 算法基本原理 矩阵进行加法,减法,乘法运算时,必须满足两个矩阵阶数相同的条件。加法,减法计算是把矩阵对应的各行各列的每一对数值分别进行加减法运算,结果组成一个新的同阶矩阵。矩阵乘法是这样定义的,只有当矩阵A的列数与矩阵B的行数相等时A×B才有意义。一个m×n的矩阵a(m,n)左乘一个n×p的矩阵b(n,p),会得到一个m×p的矩阵c(m,p),满足 矩阵乘法满足结合率,但不满足交换率 3 类设计 从上面的算法分析可以看到,本设计面临的计算问题的关键是矩阵运算。可以定义一个矩阵类Matrix。矩阵类Matrix只处理n×n类型的方阵,方阵用一个一维数组来存放,矩阵类Matrix的数据成员包括数组的首地址num和阶数n。矩阵类Matrix的功能有:默认构造函数Matrix()、构造函数Matrix(int n,int *a)、手动输入矩阵函数SetMatrix(int n)、析构函数~Matrix()、重载加法运算符+,实现两个矩阵的和函数Matrix operator +(const Matrix &a)、重载加法运算符-,实现两个矩阵的差函数Matrix operator -(const Matrix &a)、重载加法运算符*,实现两个矩阵的积函数Matrix operator *(const Matrix &a)、重载加法运算符=,实现两个矩阵之间的赋值函数Matrix &operator =(const Matrix &a)、实现矩阵的转置Transpose()、求矩阵中的最大值Max()、求矩阵中的最小值Min()、求行列式Det()、重载加法运算符<<,实现矩阵按照行列的格式输出Matrix operator <<(const Matrix &a)、我的求行列式函数MyDet(int* array,int Jie)。 矩阵类Matrix如图1所示。 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 + Max():int + Min():int + Det():double + operator <<(const Matrix &a):Matrix -MyDet(int* array,int Jie) :double 图1 Matrix类的UML图形表示 4 详细设计 整个程序分为三个部分,首先是类,然后是类的功能函数,最后是一个主函数用来测试类的所有功能是否可是实现 4.1 类的接口设计 #include "stdafx.h" #include<iostream> using namespace std; class Matrix { public: int n; int *num; Matrix();//默认构造函数 Matrix(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 Transpose();//实现矩阵的转置 int Max();//求矩阵中的最大值 int Min();//求矩阵中的最小值 double Det();//求行列式 Matrix operator <<(const Matrix &a);//重载加法运算符<<,实现矩阵按照行列的格式输出 private: double MyDet(int* array,int Jie);//我的求行列式函数 }; 由于成员函数要实现重载运算符,就把数据成员都设为public。这个问题也可用设重载函数为友元函数来解决。另外,实现行列式的函数过于复杂,于是参考了网上一些资料,然后编写了double MyDet(int* array,int Jie)函数来实现。 4.2 类的实现 Matrix::Matrix()//默认构造函数 { n=1; num=new int(1); *num=0; } Matrix::Matrix(int n,int *a)//构造函数 { this->n=n; num=new int[n*n]; for(int i=0;i<n*n;i++) *(num+i)=*(a+i); } void Matrix::SetMatrix(int n)//手动输入矩阵 { if(this->n=1) delete num; else delete[]num; this->n=n; num=new int[n*n]; for(int i=0;i<n;i++) for(int j=0;j<n;j++) { cout<<"请输入第"<<i+1<<"行第"<<j+1<<"列个元素"<<endl; cin>>*(num+i*n+j); } } Matrix::~Matrix()//析构函数 { if(n=1) delete num; else delete[]num; } Matrix Matrix::operator +(const Matrix &a)//重载加法运算符+,实现两个矩阵的和 { if(a.n==n) { int *p=new int[n*n]; for(int i=0;i<n*n;i++) *(p+i)=*(a.num+i)+*(num+i); Matrix* temp = new Matrix(n,p); if(n>1) delete[]p; else delete p; return *temp; } else { Matrix temp; return temp; } } Matrix Matrix::operator -(const Matrix &a)//重载加法运算符-,实现两个矩阵的差 { if(a.n==n) { int *p=new int[n*n]; for(int i=0;i<n*n;i++) *(p+i)=*(a.num+i)-*(num+i); Matrix* temp = new Matrix(n,p); if(n>1) delete[]p; else delete p; return *temp; } else { Matrix temp; return temp; } } Matrix Matrix::operator *(const Matrix &a)//重载加法运算符*,实现两个矩阵的积 { if(a.n==n) { int *p=new int[n*n]; int i=0,j=0,k=0; for(i=0;i<n*n;i++) *(p+i)=0; for(i=0;i<n;i++) for(j=0;j<n;j++) for(k=0;k<n;k++) *(p+j)+=*(num+n*i+k)**(a.num+n*k+j); Matrix* temp = new Matrix(n,p); if(n>1) delete[]p; else delete p; return *temp; } else { Matrix temp; return temp; } } Matrix &Matrix::operator =(const Matrix &a)//重载加法运算符=,实现两个矩阵之间的赋值 { if(a.n==n) for(int i=0;i<n*n;i++) *(num+i)=*(a.num+i); return *this; } void Matrix::Transpose()//实现矩阵的转置 { if(n*n>1) { int temp; for(int i=0;i<n;i++) for(int j=0;j<i;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;i<n*n;i++) if(*(num+i)>temp) temp=*(num+i); return temp; } int Matrix::Min()//求矩阵中的最小值 { int temp; temp=*num; for(int i=0;i<n*n;i++) if(*(num+i)<temp) temp=*(num+i); return temp; } double Matrix::Det()//求行列式 { return MyDet(this->num,this->n); } double Matrix::MyDet(int* array,int Jie)//我的求行列式函数 { if( Jie <= 0 ) { cerr << "阶小于0或等于0!" << endl; return 0; } else if( Jie == 1) return array[0]; else { int i,j,k,tag; int *subArray[500]; for( i = 0; i < Jie; i++ ) subArray[i] = 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++ ) *(subArray[i] + 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 ) *(subArray[i] + j*(Jie-1) + k) = *(array + (j+1)*Jie + k ); else *(subArray[i] + j*(Jie-1) + k) = *(array + (j+1)*Jie + k+1 ); } double temp= 0; tag = 1; for( i = 0 ; i < Jie; i++) { temp += tag * MyDet(subArray[i],Jie-1) * array[i]; tag *= -1; } return temp; } } ostream &operator <<(ostream & stream,const Matrix &a)//重载加法运算符<<,实现矩阵按照行列的格式输出 { stream<<endl; for(int i=0;i<a.n;i++) { for(int j=0;j<a.n;j++) stream<<*(a.num+i*a.n+j)<<" "; stream<<endl; } 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; cout<<"d="<<d<<endl; d=a-c; cout<<"d="<<d<<endl; d=a*c; cout<<"d="<<d<<endl; max=a.Max(); min=a.Min(); cout<<"The max of a is:"<<max<<endl; cout<<"The min of a is:"<<min<<endl; cout<<"a="<<a<<endl; a.Transpose(); cout<<"a="<<a<<endl; cout<<"The Det of c is:"<<c.Det()<<endl; return 0; } 在程序的主函数部分,选择了一个手动输入矩阵和三个固定矩阵作为一个实际例子来验证算法。 5 运行结果与分析 5.1 程序运行结果 程序运行结果如图2所示。 图2 程序运行结果 从图2中可以看出,程序能够实现一个简单n×n矩阵操作的类。 5.2运行结果分析 整个程序中的矩阵存储采用的是一维数组和动态内存分配方式。 Matrix类是专门处理矩阵的类结合问题的实际需要,增加了很矩阵所特有的运算,使Matrix类进一步具体化、特殊化,达到对问题的有效描述和处理。程序的访问控制也是根据问题的需要而设计的。 PART Ⅱ 1 需求分析 (1)很多自然科学和工程技术中的问题都需要计算器的参与,常见的计算器有三类:算数型计算器、科学型计算器、程序计算器。 (2)算术型计算器——可进行加、减、乘、除等简单的四则运算,又称简单计算器。②科学型计算器——可进行乘方、开方、指数、对数、三角函数、统计等方面的运算,又称函数计算器。程序计算器——可以编程序,把较复杂的运算步骤贮存起来,进行多次重复的运算。 (3)本程序可以实现加、减、乘、除、平方、开方、sin、cos、清除、ce等操作。 2 算法基本原理 本程序使用mfc进行编写,首先建立一个基本对话框Calc,用右边的控件管理,构造出该计算器的雏形。本计算器是以点击对应数字实现输入数据。定义一个变量,然后点击任何数字,首先该变量自乘10再加上对应数字来实现其输入功能。 3 类设计 从上面的算法分析可以看到,本设计面临的计算问题的关键是数据输入以及数据操作。可以在CCalcDlg类中定义m_fresult用于装第一个操作数,m_foldresult用于装第二个操作数。定义一个整型数据m_ nOperator用于判断操作符。定义一个整型数据m_ncontrol用于判断操作是否结束,以免获得结果后,按数字键还能继续执行输入操作。 定义按钮数字函数,即对应数字的输入函数。 定义按钮操作函数,即对应函数的操作函数。 定义按钮清除函数: C按钮,即为初始化所有操作数; Ce按钮,即为初始化当前操作数。 4 详细设计 calcDlg.h中定义变量以及操作函数。 calcDlg.cpp中将对应的操作函数内容代码编写进去。 4.1 类的接口设计 //calcDlg.h文件,实现类的声明 #include <iostream> using namespace std; class CCalcDlg : public CDialog { // Construction public: 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 void DoDataExchange(CDataExchange* pDX); // DDX/DDV support //}}AFX_VIRTUAL // Implementation protected: 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_msg 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_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_MSG DECLARE_MESSAGE_MAP() }; //{{AFX_INSERT_LOCATION}} 4.2 类的实现 //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 LoadIcon does not require a subsequent DestroyIcon in Win32 m_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, 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_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; 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) { 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按钮 { 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); } 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); } 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); } 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::
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服