矩阵类 重载.docx

上传人:b****6 文档编号:8112338 上传时间:2023-01-28 格式:DOCX 页数:13 大小:17.26KB
下载 相关 举报
矩阵类 重载.docx_第1页
第1页 / 共13页
矩阵类 重载.docx_第2页
第2页 / 共13页
矩阵类 重载.docx_第3页
第3页 / 共13页
矩阵类 重载.docx_第4页
第4页 / 共13页
矩阵类 重载.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

矩阵类 重载.docx

《矩阵类 重载.docx》由会员分享,可在线阅读,更多相关《矩阵类 重载.docx(13页珍藏版)》请在冰豆网上搜索。

矩阵类 重载.docx

矩阵类重载

/***设计一个矩阵(摸板)类Matrix,实现矩阵的输入和输出(重载>>和<<),重载拷贝构造函数,

赋值运算和函数调用运算符()实现矩阵的转置!

、加、减、乘和求负-,必须处理各种异常

(越界、下标错误、不匹配等)然后编写主函数进行全面的测试。

*********************/

/****************************************************************************************************/

#include

#include//getch原型

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&x);

//重载赋值运算符

Matrixoperator=(Matrix&x);

//重载转置!

Matrixoperator!

();

//重载+

Matrixoperator+(constMatrix&x);

//重载-

Matrixoperator-(constMatrix&x);

//重载*

Matrixoperator*(constMatrix&x);

//重载求负-

Matrixoperator-();

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&x)

{

for(inti=0;i

{

for(intj=0;j

in>>x(i,j);

}

returnin;

}

//重载输出<<

template

ostream&operator<<(ostream&out,Matrix&x)

{

for(inti=0;i

{

for(intj=0;j

out<

out<

}

out<

returnout;

}

//拷贝构造函数

template

Matrix:

:

Matrix(constMatrix&x):

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

MatrixMatrix:

:

operator=(Matrix&x)

{

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

MatrixMatrix:

:

operator!

()

{

Matrixtemp(cols,rows);

for(inti=0;i

for(intj=0;j

temp(i,j)=(*this)(j,i);

returntemp;

}

//重载+

template

MatrixMatrix:

:

operator+(constMatrix&x)

{

inti;

if(rows!

=x.rows||cols!

=x.cols)throwDiffer();

Matrixtemp(*this);

if(rows==x.rows&&cols==x.cols)

{

for(i=0;i

temp.mem[i]=mem[i]+x.mem[i];

returntemp;

}

elsethrowDiffer();

}

//重载-

template

MatrixMatrix:

:

operator-(constMatrix&x)

{

inti;

if(rows!

=x.rows||cols!

=x.cols)throwDiffer();

Matrixtemp(*this);

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

MatrixMatrix:

:

operator*(constMatrix&x)

{

if(cols!

=x.rows)throwDiffer();

Matrixtemp(rows,x.cols);

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

MatrixMatrix:

:

operator-()

{

Matrixtemp(*this);

for(inti=0;i

temp.mem[i]=(-1)*mem[i];

returntemp;

}

/**************************主函数开始***************************/

voidmain()

{

try{

//矩阵的行和列必须在1和MAX_SIZE之间

Matrixm0(0,3);

}

catch(...){

cout<<"执行语句Matrixm0(0,3);导致矩阵的大小错误!

\n";

}

try{

//矩阵的行和列必须在1和MAX_SIZE之间

Matrixmax(MAX_SIZE+1,3);

}

catch(...){

cout<<"执行语句Matrixmax("<

<<",3);导致矩阵的大小错误!

\n";

}

cout<

//定义3行3列的空矩阵m1

Matrixm1(3,3);

cout<<"InputMatrixm1(3,3):

\n";

//利用已重载的输入运算符>>输入矩阵

cin>>m1;

//利用已重载的输出运算符<<输出矩阵

cout<<"Matrixm1(3,3):

\n"<

//利用拷贝构造函数构造矩阵m2(3行3列)

Matrixm2(m1);

cout<<"Matrixm2(m1):

\n"<

inta[]={9,8,7,6,5,4,3,2,1};

/****************************************************************

**定义3行3列的空矩阵m3,并用数组a进行初始化**

**等价于下述语句:

**

**Matrixm3(3,3,a,sizeof(a)/sizeof(int));**

**构造函数的最后一个参数为数组的长度,默认值为0**

**当数组长度参数非0时将进行数组长度和矩阵元素个数的匹配检查!

**

****************************************************************/

Matrixm3(3,3,a);

cout<<"Matrixm3(3,3,a):

\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<

Matrixm4(4,5),m5(5,4);

//利用已重载的运算符()直接给矩阵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<

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 小学教育 > 小学作文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1