http://www.coder4.com/archives/363
题目:
编写模板类matrix,支持任意数据类型的矩阵,重载+,-,*,=,==,[]等操作。利用int, double, 类complex(包含实数real,虚数virt两部分)等数据类型测试所写matrix类接口
题目:
编写模板类matrix,支持任意数据类型的矩阵,重载+,-,*,=,==,[]等操作。利用int, double, 类complex(包含实数real,虚数virt两部分)等数据类型测试所写matrix类接口
题目:
编写模板类matrix,支持任意数据类型的矩阵,重载+,-,*,=,==,[]等操作。利用int, double, 类complex(包含实数real,虚数virt两部分)等数据类型测试所写matrix类接口
查看源代码
打印帮助
/********************************************
CopyRight 2007 北京交通大学 计科0601 李赫元
程序名称: Matrix模板类
文件名: Matrix.h
修改日期: 2007-4-14 19:51:59
描述: 定义、实现了Matrix模板类
********************************************/
#include <iostream>
template <class T>
class Matrix
{
public:
//构造函数、拷贝函数、赋值
Matrix(int r,int c);
Matrix(const Matrix<T> &M);
Matrix();
Matrix<T> operator = (const Matrix<T> & rMatrix);
~Matrix(){delete m_elem;}
//输出矩阵
void Print();
int GetRow(){ return m_row;}
int GetCol(){ return m_col;}
//操作符的重载
T& operator [] (int pos);
Matrix<T> operator + (const Matrix<T> & rMatrix);
Matrix<T> operator * (const Matrix<T> & rMatrix);
bool operator == (const Matrix<T> & rMatrix);
private:
//指向数据区的指针
T * m_elem;
//记录行列
int m_row,m_col;
};
template <class T>
Matrix<T>::Matrix(int r,int c)
:m_row(r),m_col(c)
{
if(m_col==0 || m_row==0)
m_elem=NULL;
else
{
m_elem = new T[m_row * m_col];
if (!m_elem)
{
throw Error("无法分配内存");
}
cout<<"创建一个"<<m_row<<"×"<<m_col<<"的矩阵..."<<endl;
for(int irow=0;irow != m_row; ++irow)
{
cout<<"请输入第"<<irow+1<<"行数据(每行"<<m_col<<"个)";
for(int icol=0;icol != m_col; ++icol)
{
cin >> m_elem[irow * m_col + icol];
}
}
}
}
template <class T>
T& Matrix<T>::operator [] (int pos)
{
return m_elem[pos];
}
template <class T>
Matrix<T> Matrix<T>::operator + (const Matrix<T> & rMatrix)
{
if(this->m_row != rMatrix.m_row || this->m_col != rMatrix.m_col)
throw Error("不同型矩阵无法相加!");
else
{
Matrix<T> mResult(*this);
for(int i = 0;i != m_row * m_col;++i)
{
mResult.m_elem[i] += rMatrix.m_elem[i];
}
return mResult;
}
}
template <class T>
Matrix<T>::Matrix(const Matrix<T> &M)
{
this->m_elem = new T[M.m_row * M.m_col];
if (!m_elem)
{
throw Error("无法分配内存");
}
m_row = M.m_row;
m_col = M.m_col;
memcpy(m_elem,M.m_elem,sizeof(T) * m_row * m_col);
}
template <class T>
Matrix<T> Matrix<T>::operator = (const Matrix<T> &M)
{
this->m_elem = new T[M.m_row * M.m_col];
if (!m_elem)
{
throw Error("无法分配内存");
}
m_row = M.m_row;
m_col = M.m_col;
memcpy(m_elem,M.m_elem,sizeof(T) * m_row * m_col);
return *this;
}
template <class T>
Matrix<T> Matrix<T>::operator * (const Matrix<T> & mRight)
{
if(this->m_col != mRight.m_row)
throw Error("两个矩阵不满足相乘条件!");
else
{
Matrix<T> Result(0,0);
Result.m_elem = new T [m_row * mRight.m_col];
Result.m_row = m_row;
Result.m_col = mRight.m_col;
memset(Result.m_elem,0,sizeof(T) * m_row * mRight.m_col);
for(int irow=0;irow!=Result.m_row;++irow)
{
for(int icol=0;icol!=Result.m_col;++icol)
{
//上述两层循环,确定要算出的Result中元素
T sum=0;
//i,j为左右矩阵在各自数组中下标
for(int i=irow * m_col,j=icol,cnt=0; cnt != m_col ; ++i,j+=mRight.m_col,++cnt)
sum+=this->m_elem[i] * mRight.m_elem[j];
Result.m_elem[irow * Result.m_col + icol]=sum;
}
}
return Result;
}
}
template <class T>
void Matrix<T>::Print()
{
for(int i = 0 ;i != m_row * m_col;++i)
{
cout<< setw(4) <<m_elem[i]<<" ";
if(!((i+1) % m_col))
cout<<endl;
}
}
template<class T>
Matrix<T>::Matrix()
{
cout<<"/n请输入行数 列数:";
cin>>m_row>>m_col;
m_elem = new T[m_row * m_col];
if (!m_elem)
{
throw Error("无法分配内存");
}
cout<<"创建一个"<<m_row<<"×"<<m_col<<"的矩阵..."<<endl;
for(int irow=0;irow != m_row; ++irow)
{
cout<<"请输入第"<<irow<<"行数据(每行"<<m_col<<"个)";
for(int icol=0;icol != m_col; ++icol)
{
cin >> m_elem[irow * m_col + icol];
}
}
}
template<class T>
bool Matrix<T>::operator == (const Matrix<T> & rMatrix)
{
if (m_col != rMatrix.m_col || m_col != rMatrix.m_row)
{
return false;
}
else
{
for(int i=0;i != m_row * m_col;++i)
if (m_elem[i] != rMatrix.m_elem[i])
{
return false;
}
return true;
}
}
/********************************************
CopyRight 2007 北京交通大学 计科0601 李赫元
工程名称: Matrix模板类
文件名: Error.h
修改日期: 2007-4-14 20:04:07
描述: 描述和定义了错误类
********************************************/
#include <iostream>
#include <string>
using namespace std;
class Error
{
public:
Error(const string &str):m_err_info(str){}
void ShowErr(){ cout<<m_err_info;};
private:
string m_err_info;
};
/********************************************
CopyRight 2007 北京交通大学 计科0601 李赫元
程序名称: Matrix模板类
文件名: main.cpp
修改日期: 2007-4-14 19:23:08
描述: main函数,测试加法,乘法,==等
********************************************/
#include <iostream>
#include <iomanip>
#include "Error.h"
#include "Matrix.h"
using namespace std;
int main()
{
try
{
cout<<"创建矩阵m1:";
Matrix<double> m1;
cout<<"/n创建矩阵m2:";
Matrix<double> m2;
Matrix<double> m3(0,0);
cout<<"计算m3=m1*m2/n";
m3 = m1 * m2;
cout<<"/n输出矩阵m3:"<<endl;
m3.Print();
cout<<"/n创建矩阵m4:";
Matrix<double> m4;
Matrix<double> m5(0,0);
m5 = m3 + m4;
cout<<"/n计算m5=m3+m4:/n输出m5:"<<endl;
m5.Print();
cout<<"/n创建矩阵m6:";
Matrix<double> m6;
cout<<"/nm5==m6:"<<(m5==m6);
}
catch(Error err)
{
cout<<endl;
err.ShowErr();
}
return 0;
}