C++课程设计---两个矩阵的加减法.docVIP

  • 47
  • 0
  • 约5.38千字
  • 约 6页
  • 2018-06-12 发布于贵州
  • 举报
C课程设计---两个矩阵的加减法

C++课程设计 功能描述 通过运算符重载的方式定义了矩阵的加法、乘法、以及数乘,使得矩阵的符号运算更加的方便、简捷。 设计目的 熟练掌握程序设计语言的基础知识,进一步的理解面向对象编程的分析设计方法以及运算符重载,为以后进行更加复杂的编程打下坚实的基础。 二.系统总体设计 1.设计框架 由于矩阵的乘法要求前面的一个矩阵列数等于后面一个矩阵的行数,因此构造的矩阵可能会出现错误,使得无法进行运算。 三.详细的设计 1.类的设计 首先在.h头文件中构造一个matrix的类,将矩阵行数、列数以及一个指针设为私有,公有部分则声明相关的函数,采用运算符重载的方式重新定义了矩阵的加法、乘法以及数乘。同时声明构造函数,拷贝构造函数和析构函数。 2.算法设计与分析 由于两个矩阵的加减法是对应位置矩阵元素的相加减,因此只要通过指针将对应元素的相加减即可。矩阵的数乘的运算法则是将该实数与矩阵中的每一个元素相乘后所得的矩阵。所以通过指针和一个循环使得矩阵中的每一个元素与实数相乘即可。矩阵的乘法的运算法则就显得较特殊。新矩阵中的某个元素(矩阵的第行,第列)是通过前面的一个矩阵的第行每一个元素与后面一个相乘矩阵的对应第列中的每一个元素相乘再相加后所得的结果。 3.安全环境的分析 由于这里是动态的构造了一个矩阵,对于内存的分配也是动态的,因此很容易造成内存的泄漏。在构造matrix类的时候,采用new的方式动态的分配了内存,同时关键的是在类中同时声明了一个拷贝构造函数,使得在定义矩阵的加减乘的运算时将临时矩阵的值拷贝构造,使运算的值不至于因为临时矩阵的消失而造成结果的不存在而引发内存的泄漏。同时在析构函数里记得写delete,使用完内存后安全的释放。 四.源代码展示 #include stdafx.h #include iostream #includeiomanip using namespace std; class Matrix { public: Matrix(int m,int n, double *value=NULL) { rows=m; cols=n; p=new double[m*n]; if(value) {for (int i=0;irows;i++) for (int j=0;jcols;j++) p[i*cols+j]=value[i*cols+j]; } } ~Matrix () {delete []p;} Matrix(Matrix K) { cols=K.cols; rows=K.rows; p=new double[cols*rows]; for(int i=0;irows;i++) { for(int j=0;jcols;j++) { p[i*cols+j]=K.p[i*cols+j]; } } } friend Matrix operator +(Matrix c1,Matrix c2); friend Matrix operator *(Matrix c1,Matrix c2); friend Matrix operator *(Matrix c1,double a); friend ostream operator (ostream output,Matrix c2); private: int rows; int cols; double *p; }; Matrix operator +(Matrix c1,Matrix c2) { Matrix K(c1.rows,c2.cols); for (int i=0;iK.rows;i++) { for(int j=0;jK.cols;j++) { K.p[i*K.cols+j]=c1.p[i*c1.cols+j]+c2.p[i*c2.cols+j]; } } return K; } Matrix operator *(Matrix c1,Matrix c2) { Matrix K(c1.rows,c2.cols); for (int i=0;ic1.rows;i++) { for (int j=0;jc2.cols;j++) { double s=0; for (int k=0;kc1.cols;k++) { s=s+c1.p[i*c1.cols+k]*c2.p[k*c2.cols+j]; } K.p[i*K.cols+j]=s;

文档评论(0)

1亿VIP精品文档

相关文档