1、课 程 设 计 任 务 书 学院 信息科学与工程 专业 电子信息科学与技术 学生姓名 学号 设计题目 设计一个能够实现n×n矩阵操作的类/计算器程序 内容及要求: PART I.设计一个能够实现n×n矩阵操作的类 矩阵是线性代数里一个重要的概念,在这里采用C++语言实现一个简单的n×n矩阵类,类中包括一些简单的运算等操作具体要求如下: (1)使用构造函数完成方阵的初始化赋值(动态内存分配); (2)使用析构函数完成矩阵动态内存的释放; (3)重载加法运算符+、-、*、=,实现两个矩阵的运算; (4)使用函数实现矩阵的转置; (5)使用函数求矩阵中的最
2、大、小值、对应行列式的值; (6)重载加法运算符<<,实现矩阵按照行列的格式输出; (7)编写一个主函数测试上述功能。 PART II.计算器程序 …………………………………………… 进度安排: 第17周:分析题目,查阅课题相关资料,进行类设计、算法设计; 第18周:上机调试程序,程序测试与分析,撰写课程设计报告,准备答辩。 指导教师(签字): 年 月 日 学院院长(签字) 年 月 日 目 录 PART I 1 需求分析2 2 算法基本原理2 3 类设计3 4 详细设计4 4.1 类的接口设计4 4.2 类的
3、实现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)使用析构
4、函数完成矩阵动态内存的释放; (3)重载加法运算符+,实现两个矩阵的和; (4)重载加法运算符-,实现两个矩阵的差; (5)重载加法运算符*,实现两个矩阵的积; (6)重载加法运算符=,实现两个矩阵之间的赋值; (7)使用函数实现矩阵的转置; (8)使用函数求矩阵中的最大值; (9)使用函数求矩阵中的最小值; (10)添加函数Det以得到矩阵对应行列式的值; (11)重载加法运算符<<,实现矩阵按照行列的格式输出; (12)编写一个主函数测试上述功能。 2 算法基本原理 矩阵进行加法,减法,乘法运算时,必须满足两个矩阵阶数相同的条件。加法,减法计算是把矩阵对应的各行各列
5、的每一对数值分别进行加减法运算,结果组成一个新的同阶矩阵。矩阵乘法是这样定义的,只有当矩阵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
6、 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
7、)、求矩阵中的最小值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
8、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 详细设计 整个程序分为三个部分,首先是类,然后是类的功能函数,最后是一个主函数用来测试类的所有功能是
9、否可是实现
4.1 类的接口设计
#include "stdafx.h"
#include
10、erator -(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);//重载
11、加法运算符<<,实现矩阵按照行列的格式输出 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::Matri
12、x(int n,int *a)//构造函数
{
this->n=n;
num=new int[n*n];
for(int i=0;i 13、"请输入第"<>*(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 14、um+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 15、)
*(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];
i 16、nt i=0,j=0,k=0;
for(i=0;i 17、urn temp;
}
}
Matrix &Matrix::operator =(const Matrix &a)//重载加法运算符=,实现两个矩阵之间的赋值
{
if(a.n==n)
for(int i=0;i 18、 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 19、 i=0;i 20、 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;
fo 21、r( 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






