矩阵类 重载.docx
- 文档编号:8112338
- 上传时间:2023-01-28
- 格式:DOCX
- 页数:13
- 大小:17.26KB
矩阵类 重载.docx
《矩阵类 重载.docx》由会员分享,可在线阅读,更多相关《矩阵类 重载.docx(13页珍藏版)》请在冰豆网上搜索。
矩阵类重载
/***设计一个矩阵(摸板)类Matrix,实现矩阵的输入和输出(重载>>和<<),重载拷贝构造函数,
赋值运算和函数调用运算符()实现矩阵的转置!
、加、减、乘和求负-,必须处理各种异常
(越界、下标错误、不匹配等)然后编写主函数进行全面的测试。
*********************/
/****************************************************************************************************/
#include
#include
usingnamespacestd;
//空间申请异常类
classWrongmem{};
//下标越界异常类
classOutofrange{};
//定义错误异常类
classDiffer{};
/*********************************矩阵类开始**************************************/
constintMAX_SIZE=1000;
template
classMatrix
{
public:
//两参数构造函数
Matrix(intr,intc):
rows(r),cols(c)
{
if(rows>MAX_SIZE||rows<1||cols>MAX_SIZE||cols<1)throwOutofrange();
mem=newT[rows*cols];
if(mem==NULL)throwOutofrange();
}
//四参数构造函数
Matrix(intr,intc,T*data,intsize=0):
rows(r),cols(c)
{
if(rows>MAX_SIZE||rows<1||cols>MAX_SIZE||cols<1)throwOutofrange();
if(size&&size mem=newT[rows*cols]; if(mem==NULL)throwWrongmem(); for(inti=0;i mem[i]=data[i]; } //析构函数 ~Matrix(){delete[]mem;} Tsetrows()const{returnrows;} Tsetcols()const{returncols;} //修改矩阵 voidsetMatrix(T*data,intsize); voidsetMatrix(T*data); //重载函数调用运算符() T&operator()(inti,intj); //拷贝构造函数 Matrix(constMatrix //重载赋值运算符 Matrix //重载转置! Matrix (); //重载+ Matrix //重载- Matrix //重载* Matrix //重载求负- Matrix private: T*mem; constintrows,cols; }; /**************************函数实现**********************************/ //修改矩阵 template voidMatrix : setMatrix(T*data,intsize) { if(rows*cols>size)throwOutofrange(); for(inti=0;i mem[i]=data[i]; } template voidMatrix : setMatrix(T*data) { for(inti=0;i mem[i]=data[i]; } //重载函数调用运算符() template T&Matrix : operator()(inti,intj) { if(i>=rows||j>=cols)throwOutofrange(); elsereturnmem[i*cols+j]; } //重载输入运算符 template istream&operator>>(istream&in,Matrix { for(inti=0;i { for(intj=0;j in>>x(i,j); } returnin; } //重载输出<< template ostream&operator<<(ostream&out,Matrix { for(inti=0;i { for(intj=0;j out< out< } out< returnout; } //拷贝构造函数 template Matrix : Matrix(constMatrix rows(x.rows),cols(x.cols) { mem=newT[rows*cols]; if(mem==NULL)throwDiffer(); else for(inti=0;i mem[i]=x.mem[i]; } //重载附值运算符= template Matrix : operator=(Matrix { if(rows! =x.rows||cols! =x.cols)throwDiffer(); if(this! =&x) { delete[]mem; mem=newT[rows*cols]; if(mem==NULL)throwWrongmem(); else for(inti=0;i mem[i]=x.mem[i]; } return*this; } //重载转置! template Matrix : operator! () { Matrix for(inti=0;i for(intj=0;j temp(i,j)=(*this)(j,i); returntemp; } //重载+ template Matrix : operator+(constMatrix { inti; if(rows! =x.rows||cols! =x.cols)throwDiffer(); Matrix if(rows==x.rows&&cols==x.cols) { for(i=0;i temp.mem[i]=mem[i]+x.mem[i]; returntemp; } elsethrowDiffer(); } //重载- template Matrix : operator-(constMatrix { inti; if(rows! =x.rows||cols! =x.cols)throwDiffer(); Matrix if(rows==x.rows&&cols==x.cols) { for(i=0;i temp.mem[i]=mem[i]-x.mem[i]; returntemp; } elsethrowDiffer(); } wanfustudio-雁南飞: 知识之败,慕虚名而不务潜修也at2007-10-27> #3 //重载矩阵乘法运算符* template Matrix : operator*(constMatrix { if(cols! =x.rows)throwDiffer(); Matrix for(inti=0;i for(intj=0;j { temp(i,j)=0; for(intk=0;k temp(i,j)+=mem[i*cols+k]*x.mem[k*x.cols+j]; } returntemp; } //重载求负- template Matrix : operator-() { Matrix for(inti=0;i temp.mem[i]=(-1)*mem[i]; returntemp; } /**************************主函数开始***************************/ voidmain() { try{ //矩阵的行和列必须在1和MAX_SIZE之间 Matrix } catch(...){ cout<<"执行语句Matrix \n"; } try{ //矩阵的行和列必须在1和MAX_SIZE之间 Matrix } catch(...){ cout<<"执行语句Matrix <<",3);导致矩阵的大小错误! \n"; } cout< //定义3行3列的空矩阵m1 Matrix cout<<"InputMatrixm1(3,3): \n"; //利用已重载的输入运算符>>输入矩阵 cin>>m1; //利用已重载的输出运算符<<输出矩阵 cout<<"Matrixm1(3,3): \n"< //利用拷贝构造函数构造矩阵m2(3行3列) Matrix cout<<"Matrixm2(m1): \n"< inta[]={9,8,7,6,5,4,3,2,1}; /**************************************************************** **定义3行3列的空矩阵m3,并用数组a进行初始化** **等价于下述语句: ** **Matrix **构造函数的最后一个参数为数组的长度,默认值为0** **当数组长度参数非0时将进行数组长度和矩阵元素个数的匹配检查! ** ****************************************************************/ Matrix cout<<"Matrix \n"< m3=-m1;//求负(矩阵所有元素取相反值) cout<<"Matrixm3=-m1: \n"< m3=m1=m1;//与C++一样允许连续赋值! cout<<"Matrixm3=m1=m1: \n"< cout< cout<<"按任意键继续.....\n"; getch(); cout< //矩阵转置,等价于: m2=m1.transpose(); m2=! m1; cout<<"Matrixm2=! m1: \n"< m2.setMatrix(a);//用数组a修改矩阵m2各元素的值 cout<<"Matrixm2.setMatrix(a): \n"< m2=m1+m1;//矩阵加 cout<<"Matrixm2=m1+m1: \n"< m3=m1*m2;//矩阵乘 cout<<"Matrixm3=m1*m2: \n"< m3=m3-m2;//矩阵减 cout<<"Matrixm3=m3-m2: \n"< cout< cout<<"按任意键继续.....\n"; getch(); cout< Matrix //利用已重载的运算符()直接给矩阵m4赋值 for(inti=0;i for(intj=0;j m4(i,j)=(i+1)*(j+1); cout<<"Matrixm4: \n"< try{ //m4矩阵空间大于存放矩阵m3所有元素的空间 m4=m3; cout<<"Matrixm4=m3: \n"< //允许元素个数不相同的矩阵进行赋值! //只要求目标矩阵的容量足够存放源矩阵的所有元素就允许赋值! } catch(...){ cout<<"\n执行语句m4=m3;导致矩阵的大小错误异常! \n\n"; //不允许元素个数不相同的矩阵进行赋值时输出该信息! } intb[]={0,1,2,3,4,5,6,7,8,9,9,8,7,6,5,4,3,2,1,0}; //用数组b修改矩阵m4各元素的值,同时进行个数匹配检查 m4.setMatrix(b,sizeof(b)/sizeof(int)); cout<<"m4.setMatrix(b,"< \n"< //重载运算符! 实现矩阵转置,与成员函数transpose()功能一致! m5=! m4; cout<<"Matrixm5=! m4: \n"< cout< cout<<"按任意键继续.....\n"; getch(); cout< cout<<"Matrixm5*m4: \n"< cout<<"Matrixm4*m5: \n"< cout< try{ //第1个矩阵的列数不等于第2个矩阵的行数 cout< } catch(...){ cout<<"执行语句cout< \n"; } try{ //超过矩阵m4的最大行、列数 for(i=0;i<=m4.setrows();++i) for(intj=0;j<=m4.setcols();++j) m4(i,j)=(i+1)*(j+1); } catch(...){ cout<<"执行上述程序段将导致下标(访问)越界异常! \n\n"; } try{ //数组长度不足于给矩阵m4的所有元素赋值 m4.setMatrix(a,sizeof(a)/sizeof(int)); } catch(...){ cout<<"执行语句m4.setMatrix(a,"< <<");导致数组长度不足异常! \n"; } try{ //虽然数组b有足够的元素,但指定的长度小于矩阵m4的元素个数 m4.setMatrix(b,15); } catch(...){ cout<<"执行语句m4.setMatrix(b,15);导致数组长度不足异常! \n"; } try{ //m3矩阵不足于存放矩阵m4的所有元素 m3=m4; } catch(...){ cout<<"执行语句m3=m4;导致矩阵的大小错误异常! \n"; } try{ //第1个矩阵的列数必须等于第2个矩阵的行数才能相乘 m3=m1*m4; } catch(...){ cout<<"执行语句m3=m1*m4;导致矩阵的大小错误异常! \n"; } try{ //两个矩阵的行数和列数必须完全一致才能相加 m3=m4+m1; } catch(...){ cout<<"执行语句m3=m4+m1;导致矩阵的大小错误异常! \n"; } try{ //两个矩阵的行数和列数必须完全一致才能相减 m3=m4-m1; } catch(...){ cout<<"执行语句m3=m4-m1;导致矩阵的大小错误异常! \n"; } cout< }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 矩阵类 重载 矩阵