c++实验矩阵类

  • 格式:doc
  • 大小:96.50 KB
  • 文档页数:9

华南农业大学信息(软件)学院综合性、设计性实验成绩单开设时间:2013~2014年第二学期1 实验内容及目的目的:学习掌握运算符重载,理解异常处理机制。

实验内容:1. 编程实现一个实数矩阵类,它可以进行加、减、乘和赋值运算,并且要重载运算符“()”,用来返回矩阵元素的值。

2. 该类还要支持异常处理机制,能够处理可能的非法矩阵操作。

提示:一个Matrix对象是具有row和col列的double类型元素,将它们以行顺序存放在数组elems中。

2 实验步骤1、定义一个实数矩阵类Matrix,私有成员有矩阵的行、列,公有成员主要是重载运算符“()”、“+”、“*”等,用以实现矩阵之间的运算。

2、定义一个Elem矩阵(以行的形式)存储用户输入的矩阵元素信息,并编写SetElem函数进行矩阵自定义设置。

3、设置异常处理机制,在每个重载运算符下设throw抛出机制,当输入的参数不符合时,将会机制异常处理用throw抛出。

编写异常处理信息头文件,定义异常信息基类MatrixException,并派生出singular冲突、InvalidIndex索引无效、IncompatibleDimension矩阵大小不一致三个异常子类。

4、根据矩阵的运算形式,编写重载运算符的矩阵运算形式,例如:“()”重载函数表示为:double Matrix::operator()(int r,int c)constthrow(InvalidIndex)//异常抛出处理{if(r<0||r>=row||c<0||c>col)throw(InvalidIndex(string("GetElement(")+int2String(r)+","+int2String(c)+")"+"from("+int2String(row)+"x"+int2String(col)+")" +"matrix."));return elems[r*col+c];}5、编写输出函数,要注意矩阵的输出格式:void Matrix::Print()const{for(int i=0;i<row;i++){for(int j=0;j<col-1;j++)cout<<elems[i*col+j]<<"\t";cout<<elems[i*col+col-1];cout<<endl;}cout<<endl;}6、编写测试函数,首先定义两个数组a,b用以存储矩阵数值。

然后调用Matrix类函数x1(a,4,5);y1(b,5,3);设置一个4行5列和5行3列矩阵,分别取a,b数组的值。

利用Print();函数将x1,y1输出显示。

测试运算符“*”重载:z1=x1*y1;输出两个矩阵直接相乘的结果;测试SetElem函数:Matrix x2(2,2);x2.SetElem(0,0,1.0);x2.SetElem(0,1,2.0);x2.SetElem(1,0,3.0);x2.SetElem(1,1,4.0);新建一个空2*2矩阵x2,用SetElem分别给矩阵各个元素赋值。

最终得到x2矩阵: 1 2 并输出显示;3 4测试异常处理机制:利用重载运算符“*”对上述设置的x1、x2 相乘x1*x2;由于x1为4行5列矩阵,x2为两行两列矩阵,矩阵大小不相同,故执行抛出函数throw,并且由catch函数获得异常信息并由what()函数输出异常原因:IncompatibleDimension;3 源代码#include<stdexcept>#include<string>using namespace std;class MatrixException:public logic_error{ public:MatrixException(const string&s):logic_error(s){}};//冲突class singular:public MatrixException{ public:singular (const string&s):MatrixException("singular:"+s){}};//索引无效class InvalidIndex: public MatrixException{ public:InvalidIndex (const string&s):MatrixException("InvalidIndex:"+s){}};//矩阵大小不一致class IncompatibleDimension: public MatrixException{ public:IncompatibleDimension(const string&s):MatrixException("IncompatibleDimension:"+s){} };#include"MatrixException.h"class Matrix{double*elems;int row, col;public:M atrix(int r,int c);M atrix(double*m,int r,int c);~Matrix();double operator()(int i,int j) constthrow(InvalidIndex);void SetElem(int i,int j,double val)t hrow(InvalidIndex);Matrix&operator*(const Matrix&b) constthrow(IncompatibleDimension);Matrix&operator+(const Matrix&b) constthrow(IncompatibleDimension);Matrix&operator-(const Matrix&b) constt hrow(IncompatibleDimension);Matrix&operator=(const Matrix&b) constt hrow(IncompatibleDimension);void Print()const;double rowTimesCol(int i,double*b,int j, int bc)const; };#include<iostream>#include<strstream>#include<string>#include"Matrix.h"using namespace std;string int2String(int i){c har buf[64];o strstream mystr(buf,64);m ystr<<i<<'\0';r eturn string(buf);}Matrix::Matrix(int r,int c){i f(r>0&&c>0){row=r;col=c;elems=new double[r*c];}e lse{elems=NULL;row=col=0;}}Matrix::Matrix(double*m,int r,int c){i f(r>0&&c>0){row=r;col=c;elems=new double[r*c];}e lse{elems=NULL;row=col=0;}i f(elems!=NULL)elems[i]=m[i];}Matrix::~Matrix(){d elete[]elems;}double Matrix::operator()(int r,int c)constthrow(InvalidIndex){i f(r<0||r>=row||c<0||c>col)throw(InvalidIndex (string("Get Element(")+int2String(r)+","+int2String(c)+")"+"from("+int2String(row)+"x"+int2String(col)+")"+"matrix."));r eturn elems[r*col+c];}void Matrix::SetElem(int r,int c,double val)throw(InvalidIndex){i f(r<0||r>=row||c<0||c>col)throw(InvalidIndex (string("Get Element(")+int2String(r)+","+int2String(c)+")"+"for("+int2String(row)+"x"+int2String(col)+")"+"matrix."));elems[r*col+c]=val;}Matrix& Matrix::operator*(const Matrix&b)constthrow(IncompatibleDimension){i f(col!=b.row) //incompatible dimensionsthrow(IncompatibleDimension ("Matrix"+int2String(row)+"x"+int2String(col)+"times matrix"+int2String(b.row)+"x"+int2String(b.col)+"."));Matrix*ans=new Matrix(row,b.col);for(int r=0;r<row;r++)for(int c=0;c<b.col;c++)ans->SetElem(r,c,rowTimesCol(r,b.elems,c,b.col));return *ans;}Matrix& Matrix::operator+(const Matrix& b)constthrow(IncompatibleDimension){i f(col!=b.col||row!=b.row)throw(IncompatibleDimension ("Matrix"+int2String(row)+"x"+int2String(col)+"times matrix"+int2String(b.row)+"x"+int2String(b.col)+"."));Matrix*ans=new Matrix(row,b.col);for(int c=0;c<col;c++)ans->SetElem(r,c,elems[r*col+c]+b.elems[r*col+c]);return *ans;}Matrix& Matrix::operator-(const Matrix&b)constthrow(IncompatibleDimension){i f(col!=b.col||row!=b.row)throw(IncompatibleDimension ("Matrix"+int2String(row)+"x"+int2String(col)+"times matrix"+int2String(b.row)+"x"+int2String(b.col)+"."));Matrix*ans=new Matrix(row,b.col);for(int r=0;r<row;r++)for(int c=0;c<col;c++)ans->SetElem(r,c,elems[r*col+c]-b.elems[r*col+c]);return *ans;}Matrix& Matrix::operator=(const Matrix&b)constthrow(IncompatibleDimension){i f(col!=b.col||row!=b.row)throw(IncompatibleDimension ("Matrix"+int2String(row)+"x"+int2String(col)+"times matrix"+int2String(b.row)+"x"+int2String(b.col)+"."));Matrix*ans=new Matrix(row,b.col);for(int r=0;r<row;r++)for(int c=0;c<col;c++)ans->SetElem(r,c,b.elems[r*col+c]);return *ans;}void Matrix::Print()const{f or(int i=0;i<row;i++){for(int j=0;j<col-1;j++)cout<<elems[i*col+j]<<"\t";cout<<elems[i*col+col-1];cout<<endl;}cout<<endl;}double Matrix::rowTimesCol(int i,double*b,int j,int bc)const{d ouble sum=0.0;f or(int k=0;k<col;k++)sum+=elems[i*col+k]*b[k*bc+j];r eturn sum;}#include<iostream>#include"Matrix.h"using namespace std;int main(){t ry{double a[20]={1.0,3.0,-2.0,0.0,4.0,-2.0,-1.0,5.0,-7.0,2.0,0.0,8.0,4.0,1.0,-5.0,3.0,-3.0,2.0,-4.0,1.0};double b[15]={4.0,5.0,-1.0,2.0,-2.0,6.0,7.0,8.0,1.0,0.0,3.0, -5.0,9.0,8.0,-6.0};Matrix x1(a,4,5);cout<<"the matrix of x1 is:"<<endl;x1.Print();Matrix y1(b,5,3);cout<<"the matrix of y1 is:"<<endl;y1.Print();Matrix z1=x1*y1;cout<<"the matrix of z1=x1*y1 is:"<<endl;z1.Print();//测试SetElem函数Matrix x2(2,2);x2.SetElem(0,0,1.0);x2.SetElem(0,1,2.0);x2.SetElem(1,0,3.0);x2.SetElem(1,1,4.0);cout<<"the matrix of x2 is:"<<endl;x2.Print();cout<<"x1*x2 is:"<<endl;x1*x2;cout<<"x1-x2 is:"<<endl;x1-x2;cout<<"Set a new element for x1:"<<endl;x1.SetElem(7,8,30);cout<<"Get a element for x1:"<<endl;x1(4,5);}//输出错误信息c atch(MatrixException&e){cout<<e.what()<<endl;}r eturn 0;}4 遇到的问题与分析1、为实现矩阵的加、减、乘、转置、赋值运算必须弄清楚矩阵的具体运算规则。