C++课设1设计一个能够实现nn矩阵操作的类2计算器程序.docx
- 文档编号:6387873
- 上传时间:2023-01-05
- 格式:DOCX
- 页数:28
- 大小:98.24KB
C++课设1设计一个能够实现nn矩阵操作的类2计算器程序.docx
《C++课设1设计一个能够实现nn矩阵操作的类2计算器程序.docx》由会员分享,可在线阅读,更多相关《C++课设1设计一个能够实现nn矩阵操作的类2计算器程序.docx(28页珍藏版)》请在冰豆网上搜索。
C++课设1设计一个能够实现nn矩阵操作的类2计算器程序
课程设计任务书
学院
信息科学与工程
专业
电子信息科学与技术
学生姓名
学号
设计题目
设计一个能够实现n×n矩阵操作的类/计算器程序
内容及要求:
PARTI.设计一个能够实现n×n矩阵操作的类
矩阵是线性代数里一个重要的概念,在这里采用C++语言实现一个简单的n×n矩阵类,类中包括一些简单的运算等操作具体要求如下:
(1)使用构造函数完成方阵的初始化赋值(动态内存分配);
(2)使用析构函数完成矩阵动态内存的释放;
(3)重载加法运算符+、-、*、=,实现两个矩阵的运算;
(4)使用函数实现矩阵的转置;
(5)使用函数求矩阵中的最大、小值、对应行列式的值;
(6)重载加法运算符<<,实现矩阵按照行列的格式输出;
(7)编写一个主函数测试上述功能。
PARTII.计算器程序
……………………………………………
进度安排:
第17周:
分析题目,查阅课题相关资料,进行类设计、算法设计;
第18周:
上机调试程序,程序测试与分析,撰写课程设计报告,准备答辩。
指导教师(签字):
年月日
学院院长(签字)
年月日
目录
PARTI
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
PARTI
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(intn,int*a)、手动输入矩阵函数SetMatrix(intn)、析构函数~Matrix()、重载加法运算符+,实现两个矩阵的和函数Matrixoperator+(constMatrix&a)、重载加法运算符-,实现两个矩阵的差函数Matrixoperator-(constMatrix&a)、重载加法运算符*,实现两个矩阵的积函数Matrixoperator*(constMatrix&a)、重载加法运算符=,实现两个矩阵之间的赋值函数Matrix&operator=(constMatrix&a)、实现矩阵的转置Transpose()、求矩阵中的最大值Max()、求矩阵中的最小值Min()、求行列式Det()、重载加法运算符<<,实现矩阵按照行列的格式输出Matrixoperator<<(constMatrix&a)、我的求行列式函数MyDet(int*array,intJie)。
矩阵类Matrix如图1所示。
Matrix
+n:
int
+num:
int
+Matrix()
+Matrix(intn,int*a)
+SetMatrix(intn):
void
+~Matrix()
+operator+(constMatrix&a):
Matrix
+operator-(constMatrix&a):
Matrix
+operator*(constMatrix&a):
Matrix
+&operator=(constMatrix&a):
Matrix
+Transpose():
void
+Max():
int
+Min():
int
+Det():
double
+operator<<(constMatrix&a):
Matrix
-MyDet(int*array,intJie):
double
图1Matrix类的UML图形表示
4详细设计
整个程序分为三个部分,首先是类,然后是类的功能函数,最后是一个主函数用来测试类的所有功能是否可是实现
4.1类的接口设计
#include"stdafx.h"
#include
usingnamespacestd;
classMatrix
{
public:
intn;
int*num;
Matrix();//默认构造函数
Matrix(intn,int*a);//构造函数
voidSetMatrix(intn);//手动输入矩阵
~Matrix();//析构函数
Matrixoperator+(constMatrix&a);//重载加法运算符+,实现两个矩阵的和
Matrixoperator-(constMatrix&a);//重载加法运算符-,实现两个矩阵的差
Matrixoperator*(constMatrix&a);//重载加法运算符-,实现两个矩阵的差
Matrix&operator=(constMatrix&a);//重载加法运算符*,实现两个矩阵的积
voidTranspose();//实现矩阵的转置
intMax();//求矩阵中的最大值
intMin();//求矩阵中的最小值
doubleDet();//求行列式
Matrixoperator<<(constMatrix&a);//重载加法运算符<<,实现矩阵按照行列的格式输出
private:
doubleMyDet(int*array,intJie);//我的求行列式函数
};
由于成员函数要实现重载运算符,就把数据成员都设为public。
这个问题也可用设重载函数为友元函数来解决。
另外,实现行列式的函数过于复杂,于是参考了网上一些资料,然后编写了doubleMyDet(int*array,intJie)函数来实现。
4.2类的实现
Matrix:
:
Matrix()//默认构造函数
{
n=1;
num=newint
(1);
*num=0;
}
Matrix:
:
Matrix(intn,int*a)//构造函数
{
this->n=n;
num=newint[n*n];
for(inti=0;i *(num+i)=*(a+i); } voidMatrix: : SetMatrix(intn)//手动输入矩阵 { if(this->n=1) deletenum; else delete[]num; this->n=n; num=newint[n*n]; for(inti=0;i for(intj=0;j {cout<<"请输入第"< cin>>*(num+i*n+j); } } Matrix: : ~Matrix()//析构函数 { if(n=1) deletenum; else delete[]num; } MatrixMatrix: : operator+(constMatrix&a)//重载加法运算符+,实现两个矩阵的和 { if(a.n==n) { int*p=newint[n*n]; for(inti=0;i *(p+i)=*(a.num+i)+*(num+i); Matrix*temp=newMatrix(n,p); if(n>1) delete[]p; else deletep; return*temp; } else { Matrixtemp; returntemp; } } MatrixMatrix: : operator-(constMatrix&a)//重载加法运算符-,实现两个矩阵的差 { if(a.n==n) { int*p=newint[n*n]; for(inti=0;i *(p+i)=*(a.num+i)-*(num+i); Matrix*temp=newMatrix(n,p); if(n>1) delete[]p; else deletep; return*temp; } else { Matrixtemp; returntemp; } } MatrixMatrix: : operator*(constMatrix&a)//重载加法运算符*,实现两个矩阵的积 { if(a.n==n) { int*p=newint[n*n]; inti=0,j=0,k=0; for(i=0;i *(p+i)=0; for(i=0;i for(j=0;j for(k=0;k *(p+j)+=*(num+n*i+k)**(a.num+n*k+j); Matrix*temp=newMatrix(n,p); if(n>1) delete[]p; else deletep; return*temp; } else { Matrixtemp; returntemp; } } Matrix&Matrix: : operator=(constMatrix&a)//重载加法运算符=,实现两个矩阵之间的赋值 { if(a.n==n) for(inti=0;i *(num+i)=*(a.num+i); return*this; } voidMatrix: : Transpose()//实现矩阵的转置 { if(n*n>1) { inttemp; for(inti=0;i for(intj=0;j { temp=*(num+i*n+j); *(num+i*n+j)=*(num+j*n+i); *(num+j*n+i)=temp; } } } intMatrix: : Max()//求矩阵中的最大值 { inttemp; temp=*num; for(inti=0;i if(*(num+i)>temp) temp=*(num+i); returntemp; } intMatrix: : Min()//求矩阵中的最小值 { inttemp; temp=*num; for(inti=0;i if(*(num+i) temp=*(num+i); returntemp; } doubleMatrix: : Det()//求行列式 { returnMyDet(this->num,this->n); } doubleMatrix: : MyDet(int*array,intJie)//我的求行列式函数 { if(Jie<=0) { cerr<<"阶小于0或等于0! "< return0; } elseif(Jie==1) returnarray[0]; else { inti,j,k,tag; int*subArray[500]; for(i=0;i subArray[i]=newint[(Jie-1)*(Jie-1)]; for(i=0;i for(j=0;j for(k=0;k *(subArray[i]+j*(Jie-1)+k)=0; for(i=0;i for(j=0;j for(k=0;k {if(k *(subArray[i]+j*(Jie-1)+k)=*(array+(j+1)*Jie+k); else *(subArray[i]+j*(Jie-1)+k)=*(array+(j+1)*Jie+k+1); } doubletemp=0; tag=1; for(i=0;i { temp+=tag*MyDet(subArray[i],Jie-1)*array[i]; tag*=-1; } returntemp; } } ostream&operator<<(ostream&stream,constMatrix&a)//重载加法运算符<<,实现矩阵按照行列的格式输出 { stream< for(inti=0;i { for(intj=0;j stream<<*(a.num+i*a.n+j)<<""; stream< } returnstream; } 以上就是类的成员函数,在编写中除了求行列式以外,没有遇到什么大的问题。 4.3主函数设计 intmain(intargc,char*argv[]) { intn1=3,n2=3,n3=3,max,min; intnum1[]={1,1,1,1,1,1,1,1,1}; intnum2[]={2,3,3,2,2,3,2,2,2}; intnum3[]={3,3,3,3,3,3,3,3,3}; Matrixa,b(n1,num1),c(n2,num2),d(n3,num3); a.SetMatrix(3); d=a+b; cout<<"d="< d=a-c; cout<<"d="< d=a*c; cout<<"d="< max=a.Max(); min=a.Min(); cout<<"Themaxofais: "< cout<<"Theminofais: "< cout<<"a="< a.Transpose();
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C+ 设计 一个 能够 实现 nn 矩阵 操作 计算器 程序
![提示](https://static.bdocx.com/images/bang_tan.gif)