自己写的c++矩阵运算程序

期末考试的大作业,先贴这里了,嘿嘿~~~~

#include<iostream>
using namespace std;
//================================================================
//辅助类,用来重载第二层[]操作符
class Matrixrow
{
 friend class Cmatrix; //定义友元类
public:
 //构造函数
 Matrixrow()
 {
  row=0;
  col=0;
  p=new int[row*col*sizeof(int)];//为指针所指向的数组分配内存
 }
 //构造函数
 Matrixrow(int r,int c):row(r),col(c)
 {
  p=new int[r*c*sizeof(int)];//分配内存
 }
 //析构函数
 ~Matrixrow()
 {
  delete p;//释放内存
 }
 //重载第二层[]操作符
 int & operator[](int c)
 {
  return p[currentrow*col+c];//返回由第二层[]根据当前行取得的值作为[][]取得的值
 }
private:
 int *p;//指针
 int row;//行
 int col;//列
 int currentrow; //当前行
};
//================================================================
//矩阵运算类
class Cmatrix
{
private:  
 int **matrix;  //二维指针指向存矩阵元素的区域
 int height;   //矩阵的行数
 int width;  //矩阵的列数
 Matrixrow mr; //声明一个mr对象,以传入第一层[]获取的值作为其当前行,然后进行第二层[]元素确定
public:  
 //构造函数
 Cmatrix()
 {
  height=0;
  width=0;
  size();//分配内存
  for (int i=0;i<height;i++)
  {
   for (int j=0;j<width;j++)
   {
    matrix[i][j]=0;
   }
  }
 }
 //构造函数
 Cmatrix(int h,int w): mr(h, w)
 {
  height=h;
  width=w;
  size();//分配内存
 }
 //拷贝构造函数
 Cmatrix::Cmatrix(const Cmatrix &m1):height(m1.height),width(m1.width)  
 {  
  size();    
  for(int i=0;i<m1.height;i++)
  {
   for (int j=0;j<m1.width;j++)
   {
    matrix[i][j]=m1.matrix[i][j];
   }
  }
 }
 //分配内存的函数
 void size()
 {
  //为动态二维数组分配内存
  matrix=new int * [height];
  for(int i = 0; i < height; i++)
  {
   matrix[i] = new int[width];
  }
 }
 //初始化函数,用来输入矩阵元素
 void Initialize()
 {
  cout<<"请输入矩阵的  "<<height<<"(行)*"<<width<<"(列)  个元素:"<<endl;
  //输入元素
  for (int i=0;i<height;i++)
  {
   for (int j=0;j<width;j++)
   {
    cin>>matrix[i][j];
   }
  }
  //将输入的矩阵元素值传入mr对象
  for (int i=0;i<height;i++)
  {
   for (int j=0;j<width;j++)
   {
    *(mr.p+i*width+j)=matrix[i][j];
   }
  }
 }
 //显示矩阵的函数
 void display()
 {
  cout<<endl<<"得到的矩阵是:"<<endl<<endl;
  for (int i=0;i<height;i++)
  {
   for (int j=0;j<width;j++)
   {
    cout<<matrix[i][j]<<"   ";
   }
   cout<<endl;
  }
  cout<<endl;
 }
 //析构函数
 virtual ~Cmatrix()
 {
  {
   for (int i=0;i<height;i++)
   {  
    if(matrix!=NULL)
    {
     delete[] matrix[i]; //释放为存储矩阵元素而分配的内存
    }
   }
  }
 }
 //重载+操作符
 friend const Cmatrix operator +(Cmatrix m1,const Cmatrix & m2)  
 {
  //检验相加的条件
  if ((m1.width==m2.width)&&(m1.height==m2.height))
  {
   cout<<"两个矩阵可以相加!"<<endl;
   //完成矩阵相加
   for(int i=0;i<m2.height;i++)
   {
    for(int j=0;j<m2.width;j++)
     m1.matrix[i][j]+=m2.matrix[i][j];
   }
  }
  else
  {
   cout<<"两个矩阵不能相加!"<<endl;
  }
  return m1;
 }
 //重载-操作符
 friend const Cmatrix operator -(Cmatrix m1,const Cmatrix & m2)  
 {
  //检验相减的条件
  if ((m1.width==m2.width)&&(m1.height==m2.height))
  {
   cout<<"两个矩阵可以相减!"<<endl;
   //完成矩阵相减
   for(int i=0;i<m2.height;i++)
   {
    for(int j=0;j<m2.width;j++)
     m1.matrix[i][j]-=m2.matrix[i][j];
   }
  }
  else
  {
   cout<<"两个矩阵不能相减!"<<endl;
  }
  return m1;
 }
 //重载*操作符
 friend const Cmatrix operator *(const Cmatrix &m1,const Cmatrix & m2)  
 {
  Cmatrix mul(m1.height,m2.width);//定义一个Cmatrix对象临时存储乘积
  //元素全部初始化为零
  for(int m=0;m<mul.height;m++)
  {
   for (int n=0;n<mul.width;n++)
   {
    mul.matrix[m][n]=0;
   }
  }
  //检验相乘的条件
  if (m1.width==m2.height)
  {
   cout<<"两个矩阵可以相乘!"<<endl;
   //完成矩阵元素相乘
   for(int y=0;y<m1.height;y++)
   {
    for (int x=0;x<m2.width;x++)
    {
     for (int i=0;i<m1.width;i++)
     {
      mul.matrix[y][x]+=m1.matrix[y][i]*m2.matrix[i][x];
     }
    }
   }
  }
  else
   cout<<"两个矩阵不能相乘!"<<endl;
  return mul;//返回乘积
 }
 //重载=操作符
 const Cmatrix& Cmatrix::operator=(const   Cmatrix   &m)
 {
  if(matrix!=NULL)
   delete[] matrix;
  height = m.height;
  width = m.width;
  size();  
  for(int i=0;i<m.height;i++)
  {
   for (int j=0;j<m.width;j++)
   {
    matrix[i][j]=m.matrix[i][j];
   }
  }
  return   *this;
 }
 //重载第一层[]操作符
 Matrixrow & operator[](int row)
 {
  mr.currentrow = row;//获取第一层[]取得的值作为当前行
  return mr;//返回
 }
};
//================================================================
int main()  
{  
 //矩阵相乘=========================================
 Cmatrix c1(2,3);//2行3列的矩阵
 c1.Initialize();
 c1.display();
 cout<<"第一行第二列是: "<<c1[0][1]<<endl;
 Cmatrix c2(3,2);//3行2列的矩阵
 c2.Initialize();
 c2.display();
 Cmatrix c3;
 c3=c1*c2;//矩阵相乘
 c3.display();
 //矩阵相加==========================================
 Cmatrix c4(2,2),c5(2,2),c6;
 c4.Initialize();
 c4.display();
 c5.Initialize();
 c5.display();
 c6=c4+c5;
 c6.display();
 //矩阵相减=========================================
 c4.Initialize();
 c4.display();
 c5.Initialize();
 c5.display();
 c6=c4-c5;
 c6.display();

 return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值