c++运算符重载矩阵运算.docx_第1页
c++运算符重载矩阵运算.docx_第2页
c++运算符重载矩阵运算.docx_第3页
c++运算符重载矩阵运算.docx_第4页
c++运算符重载矩阵运算.docx_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

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

文档简介

C+上机实验报告指导教师: 冯潇 姓 名: 赵蕊 学 号: 2010211864 班 级: 0411003 时 间: 2012/5/21 实验6-3 矩阵运算题目:对具有同行列数的整形矩阵进行加、减、乘、转置、赋值运算一、问题分析和任务定义1.本实验通过矩阵类Matrix来实现,并运用Matrix类的重载做运算。2.Matrix的数据成员有:行line、列col、指向矩阵的元素的指针int *elems。它的成员函数有:(1) 构造函数;(2) 析构函数;(3) 复制构造函数;(4) 对属性进行修改的set方法;(5) 对属性进行读取的get方法;(6) 对Matrix进行重载加运算符;(7) 对Matrix进行重载减运算符;(8) 对Matrix进行重载乘运算符;(9) 对Matrix进行重载转置运算符;(10) 对Matrix进行重载赋值运算符;二、概要设计1.为实现矩阵的加、减、乘、转置、赋值运算必须弄清楚矩阵的具体运算规则。 (1) 矩阵的加减法运算; 矩阵的加减法必须俩个矩阵的行列数相同,然后对应位置的行列进行相加减。(2) 矩阵的乘法运算;矩阵的乘法运算必须运算的矩阵的第一个矩阵的列数与运算的第二个矩阵的行数相同,否则不能运算。运算时,第一个矩阵的第i行第j列的数与第二个矩阵的第i列元素分别相乘为新矩阵的第i行第j列的数。(3) 矩阵的赋值运算;矩阵的赋值运算即俩个矩阵的元素完全相同。(4) 矩阵的转置运算;矩阵的转置运算即为转置前的第i行第j列的数即为转置后的矩阵的第j行第i列的数。开始2.程序的流程图 初始化俩个矩阵对矩阵进行初始化使其进行转置运算让其结果进行赋值运算让俩个矩阵进行乘法运算结束进行析构矩阵三、详细设计1.定义Matrix类和友元#ifndef MATRIX_H#define MATRIX_H#includeusing namespace std;class Matrix;Matrix operator+(const Matrix &a, const Matrix &b);Matrix operator-(const Matrix &a, const Matrix &b);Matrix operator*(const Matrix &a, const Matrix &b);class Matrixfriend Matrix operator+(const Matrix &a, const Matrix &b);friend Matrix operator-(const Matrix &a, const Matrix &b);friend Matrix operator*(const Matrix &a, const Matrix &b);public :Matrix(int l,int c);Matrix(const Matrix &m);Matrix();void setLine(int l);void setCol(int c);void setElems(); int getLine() const;int getCol() const;void print() const ; Matrix& operator= (const Matrix &m);Matrix operator () const;private :int line;int col;int *elems;#endif2. Matrix的构造函数与赋值构造函数和析构函数Matrix:Matrix(int l,int c)setLine(l);setCol(c);elems = new intcol*line;Matrix:Matrix(const Matrix &m)line = m.line;col = m.col;elems = new intline * col;for(int i = 0;i line * col;i+)elemsi= m.elemsi;3. Matrix的赋值运算Matrix& Matrix:operator=(const Matrix &m)setLine(m.line);setCol(m.col);delete elems;elems = new intline * col;for(int i = 0;i line * col;i+)elemsi = m.elemsi;return *this;4. Matrix的转置运算Matrix Matrix:operator() constMatrix t(col,line);for(int i = 0; i line;i+)for(int j = 0; j col; j+)t.elemsline*j + i=elemscol*i + j;return t;5. Matrix的加法运算Matrix operator+(const Matrix &a, const Matrix &b) if(a.line != b.line | a.col != b.col)cerr 两矩阵的行列数不相同! endl;exit(EXIT_FAILURE);Matrix c(a.line,a.col);for(int i = 0;i a.line * a.col;i+)c.elemsi = a.elemsi + b.elemsi;return c;6. Matrix的减法运算Matrix operator-(const Matrix &a, const Matrix &b) if(a.line != b.line | a.col != b.col)cerr 两矩阵的行列数不相同! endl;exit(EXIT_FAILURE);Matrix c(a.line,a.col);for(int i = 0;i a.line * a.col;i+)c.elemsi = a.elemsi - b.elemsi;return c;7. Matrix的乘法运算Matrix operator*(const Matrix &a,const Matrix &b)if(a.col != b.line )cerr 第一个矩阵的列数和第二个矩阵的行数不相同! endl;exit(EXIT_FAILURE);int line = a.line,col = b.col;int i,j,k;Matrix temp(line,col);for(i = 0;i line * col;i+)temp.elemsi = 0;for(i = 0;i line;i+)for(k = 0;k col;k+)for(j = 0;j b.line;j+)temp.elemsi * col + k += a.elemsi * col + j * b.elemsj * col + k;return temp;8. 输出矩阵的元素void Matrix:print() const int i;for(i = 0 ; i line*col;i+)if(i+1)%(col)=0)coutsetw(5)elemsiendl;elsecoutsetw(5)elemsi;9.主函数int main()Matrix a(3,3),b(3,3);cout 请输入第一个矩阵的元素: endl;a.setElems();a.print();cout 请输入第二个矩阵的元素: endl;b.setElems(); b.print();Matrix c(3,3);cout 两矩阵的乘积为: endl;c = a*b;c.print();cout n转置矩阵为: endl;(c).print();return 0;四、调试分析本程序通过自己构造矩阵类,对矩阵进行构造,并进行一系列运算,还进行复制构造函数之类的进行操作,开始进行调试构造函数没问题,在进行“operator=”运算时一直出错,经过长达一个小时左右的调试,查错,最终终于查到错误,一个很小的错误尽然困惑了1个小时,在进行赋值构造函数时竟然没有进行动态存储分配空间,导致每次运行到“operator=”时直接程序爆掉,也让我想起上次的一个程序尽然没有释放一个开辟的空间,导致在循环中一直开辟空间导致程序一直处于开辟空间的状态,也使程序一直爆掉,生活中很少能够做到很谨慎的处理问题,这是一个合格的程序员必须克服的问题,自己在以后的一定要在熟练掌握各种知识点的同时好好的注意没一个细节。五、运行结果附源程序:#ifndef MATRIX_H#define MATRIX_H#includeusing namespace std;class Matrix;Matrix operator+(const Matrix &a, const Matrix &b);Matrix operator-(const Matrix &a, const Matrix &b);Matrix operator*(const Matrix &a, const Matrix &b);class Matrixfriend Matrix operator+(const Matrix &a, const Matrix &b);friend Matrix operator-(const Matrix &a, const Matrix &b);friend Matrix operator*(const Matrix &a, const Matrix &b);public :Matrix(int l,int c);Matrix(const Matrix &m);Matrix();void setLine(int l);void setCol(int c);void setElems(); int getLine() const;int getCol() const;void print() const ; Matrix& operator= (const Matrix &m);Matrix operator () const;private :int line;int col;int *elems;#endif#includematrix.h#includeMatrix:Matrix(int l,int c)setLine(l);setCol(c);elems = new intcol*line;Matrix:Matrix(const Matrix &m)line = m.line;col = m.col;elems = new intline * col;for(int i = 0;i line * col;i+)elemsi= m.elemsi;Matrix:Matrix()delete elems;void Matrix:setLine(int l) line = l;void Matrix:setCol(int c)col = c;void Matrix:setElems()int i,size = col*line;for(i = 0;i elemsi;int Matrix:getLine() constreturn line;int Matrix:getCol() constreturn col;void Matrix:print() const int i;for(i = 0 ; i line*col;i+)if(i+1)%(col)=0)coutsetw(5)elemsiendl;elsecoutsetw(5)elemsi;Matrix& Matrix:operator=(const Matrix &m)setLine(m.line);setCol(m.col);delete elems;elems = new intline * col;for(int i = 0;i line * col;i+)elemsi = m.elemsi;return *this;Matrix Matrix:operator() constMatrix t(col,line);for(int i = 0; i line;i+)for(int j = 0; j col; j+)t.elemsline*j + i=elemscol*i + j; return t;#includematrix.hMatrix operator*(const Matrix &a,const Matrix &b)if(a.col != b.line )cerr 第一个矩阵的列数和第二个矩阵的行数不相同! endl;exit(EXIT_FAILURE);int line = a.line,col = b.col;int i,j,k;Matrix temp(line,col);for(i = 0;i line * col;i+)temp.elemsi = 0;for(i = 0;i line;i+)for(k = 0;k col;k+)for(j = 0;j b.line;j+)temp.elemsi * col + k += a.elemsi * col + j * b.elemsj * col + k;return temp;Matrix operator-(const Matrix &a, const Matrix &b) if(a.line != b.line | a.col != b.col)cerr 两矩阵的行列数不相同! endl;exit(EXIT_FAILURE);Matrix c(a.line,a.col);for

温馨提示

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

评论

0/150

提交评论