c++运算符重载矩阵运算课程设计.docx
- 文档编号:12872398
- 上传时间:2023-04-22
- 格式:DOCX
- 页数:15
- 大小:71.04KB
c++运算符重载矩阵运算课程设计.docx
《c++运算符重载矩阵运算课程设计.docx》由会员分享,可在线阅读,更多相关《c++运算符重载矩阵运算课程设计.docx(15页珍藏版)》请在冰豆网上搜索。
c++运算符重载矩阵运算课程设计
实验矩阵运算
题目:
对具有同行列数的整形矩阵进行加、减、乘、转置、赋值运算
一、问题分析和任务定义
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类和友元
#ifndefMATRIX_H
#defineMATRIX_H
#include
usingnamespacestd;
classMatrix;
Matrixoperator+(constMatrix&a,constMatrix&b);
Matrixoperator-(constMatrix&a,constMatrix&b);
Matrixoperator*(constMatrix&a,constMatrix&b);
classMatrix
{
friendMatrixoperator+(constMatrix&a,constMatrix&b);
friendMatrixoperator-(constMatrix&a,constMatrix&b);
friendMatrixoperator*(constMatrix&a,constMatrix&b);
public:
Matrix(intl,intc);
Matrix(constMatrix&m);
~Matrix();
voidsetLine(intl);
voidsetCol(intc);
voidsetElems();
intgetLine()const;
intgetCol()const;
voidprint()const;
Matrix&operator=(constMatrix&m);
Matrixoperator~()const;
private:
intline;
intcol;
int*elems;
};
#endif
2.Matrix的构造函数与赋值构造函数和析构函数
Matrix:
:
Matrix(intl,intc)
{
setLine(l);
setCol(c);
elems=newint[col*line];
}
Matrix:
:
Matrix(constMatrix&m)
{
line=m.line;
col=m.col;
elems=newint[line*col];
for(inti=0;i elems[i]=m.elems[i]; } 3.Matrix的赋值运算 Matrix&Matrix: : operator=(constMatrix&m) { setLine(m.line); setCol(m.col); delete[]elems; elems=newint[line*col]; for(inti=0;i {elems[i]=m.elems[i];} return*this; } 4.Matrix的转置运算 MatrixMatrix: : operator~()const { Matrixt(col,line); for(inti=0;i for(intj=0;j t.elems[line*j+i]=elems[col*i+j]; returnt; } 5.Matrix的加法运算 Matrixoperator+(constMatrix&a,constMatrix&b) { if(a.line! =b.line||a.col! =b.col) { cerr<<"两矩阵的行列数不相同! "< exit(EXIT_FAILURE); } Matrixc(a.line,a.col); for(inti=0;i c.elems[i]=a.elems[i]+b.elems[i]; returnc; } 6.Matrix的减法运算 Matrixoperator-(constMatrix&a,constMatrix&b) { if(a.line! =b.line||a.col! =b.col) { cerr<<"两矩阵的行列数不相同! "< exit(EXIT_FAILURE); } Matrixc(a.line,a.col); for(inti=0;i c.elems[i]=a.elems[i]-b.elems[i]; returnc; } 7.Matrix的乘法运算 Matrixoperator*(constMatrix&a,constMatrix&b) { if(a.col! =b.line) { cerr<<"第一个矩阵的列数和第二个矩阵的行数不相同! "< exit(EXIT_FAILURE); } intline=a.line,col=b.col; inti,j,k; Matrixtemp(line,col); for(i=0;i temp.elems[i]=0; for(i=0;i for(k=0;k for(j=0;j temp.elems[i*col+k]+=a.elems[i*col+j]*b.elems[j*col+k]; returntemp; } 8.输出矩阵的元素 voidMatrix: : print()const {inti; for(i=0;i { if((i+1)%(col)==0) { cout< } else cout< } } 9.主函数 intmain() { Matrixa(3,3),b(3,3); cout<<"请输入第一个矩阵的元素: "< a.setElems(); a.print(); cout<<"请输入第二个矩阵的元素: "< b.setElems(); b.print(); Matrixc(3,3); cout<<"两矩阵的乘积为: "< c=a*b; c.print(); cout<<"\n转置矩阵为: "< (~c).print(); return0; } 四、调试分析 本程序通过自己构造矩阵类,对矩阵进行构造,并进行一系列运算,还进行复制构造函数之类的进行操作,开始进行调试构造函数没问题,在进行“operator=”运算时一直出错,经过长达一个小时左右的调试,查错,最终终于查到错误,一个很小的错误尽然困惑了1个小时,在进行赋值构造函数时竟然没有进行动态存储分配空间,导致每次运行到“operator=”时直接程序爆掉,也让我想起上次的一个程序尽然没有释放一个开辟的空间,导致在循环中一直开辟空间导致程序一直处于开辟空间的状态,也使程序一直爆掉,生活中很少能够做到很谨慎的处理问题,这是一个合格的程序员必须克服的问题,自己在以后的一定要在熟练掌握各种知识点的同时好好的注意没一个细节。 五、运行结果 附源程序: #ifndefMATRIX_H #defineMATRIX_H #include usingnamespacestd; classMatrix; Matrixoperator+(constMatrix&a,constMatrix&b); Matrixoperator-(constMatrix&a,constMatrix&b); Matrixoperator*(constMatrix&a,constMatrix&b); classMatrix { friendMatrixoperator+(constMatrix&a,constMatrix&b); friendMatrixoperator-(constMatrix&a,constMatrix&b); friendMatrixoperator*(constMatrix&a,constMatrix&b); public: Matrix(intl,intc); Matrix(constMatrix&m); ~Matrix(); voidsetLine(intl); voidsetCol(intc); voidsetElems(); intgetLine()const; intgetCol()const; voidprint()const; Matrix&operator=(constMatrix&m); Matrixoperator~()const; private: intline; intcol; int*elems; }; #endif #include"matrix.h" #include Matrix: : Matrix(intl,intc) { setLine(l); setCol(c); elems=newint[col*line]; } Matrix: : Matrix(constMatrix&m) { line=m.line; col=m.col; elems=newint[line*col]; for(inti=0;i elems[i]=m.elems[i]; } Matrix: : ~Matrix() { delete[]elems; } voidMatrix: : setLine(intl) { line=l; } voidMatrix: : setCol(intc) { col=c; } voidMatrix: : setElems() { inti,size=col*line; for(i=0;i { cin>>elems[i]; } } intMatrix: : getLine()const { returnline; } intMatrix: : getCol()const { returncol; } voidMatrix: : print()const {inti; for(i=0;i { if((i+1)%(col)==0) { cout< } else cout< } } Matrix&Matrix: : operator=(constMatrix&m) { setLine(m.line); setCol(m.col); delete[]elems; elems=newint[line*col]; for(inti=0;i {elems[i]=m.elems[i]; } return*this; } MatrixMatrix: : operator~()const { Matrixt(col,line); for(inti=0;i for(intj=0;j t.elems[line*j+i]=elems[col*i+j]; returnt; } #include"matrix.h" Matrixoperator*(constMatrix&a,constMatrix&b) { if(a.col! =b.line) { cerr<<"第一个矩阵的列数和第二个矩阵的行数不相同! "< exit(EXIT_FAILURE); } intline=a.line,col=b.col; inti,j,k; Matrixtemp(line,col); for(i=0;i temp.elems[i]=0; for(i=0;i for(k=0;k for(j=0;j temp.elems[i*col+k]+=a.elems[i*col+j]*b.elems[j*col+k]; returntemp; } Matrixoperator-(constMatrix&a,constMatrix&b) { if(a.line! =b.line||a.col! =b.col) { cerr<<"两矩阵的行列数不相同! "< exit(EXIT_FAILURE); } Matrixc(a.line,a.col); for(inti=0;i c.elems[i]=a.elems[i]-b.elems[i]; returnc; } Matrixoperator+(constMatrix&a,constMatrix&b) { if(a.line! =b.line||a.col! =b.col) { cerr<<"两矩阵的行列数不相同! "< exit(EXIT_FAILURE); } Matrixc(a.line,a.col); for(inti=0;i c.elems[i]=a.elems[i]+b.elems[i]; returnc; }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- c+ 运算 重载 矩阵 课程设计
![提示](https://static.bdocx.com/images/bang_tan.gif)