PTA:矩阵的乘法运算(c++,运算符重载)

线性代数中的矩阵可以表示为一个row*column的二维数组,当row和column均为1时,退化为一个数,当row为1时,为一个行向量,当column为1时,为一个列向量。
建立一个整数矩阵类matrix,其私有数据成员如下:

int row;
int column;
int **mat;

建立该整数矩阵类matrix构造函数;
建立一个 *(乘号)的运算符重载,以便于对两个矩阵直接进行乘法运算;
建立输出函数void display(),对整数矩阵按行进行列对齐输出,格式化输出语句如下:

cout<<setw(10)<<mat[i][j];

主函数里定义三个整数矩阵类对象m1、m2、m3.
输入格式:
分别输入两个矩阵,分别为整数矩阵类对象m1和m2。
每个矩阵输入如下:
第一行两个整数 r c,分别给出矩阵的行数和列数
接下来输入r行,对应整数矩阵的每一行
每行输入c个整数,对应当前行的c个列元素
输出格式:
整数矩阵按行进行列对齐(宽度为10)后输出
判断m1和m2是否可以执行矩阵相乘运算。
若可以,执行m3=m1*m2运算之后,调用display函数,对m3进行输出。
若不可以,输出"Invalid Matrix multiplication!"
提示:输入或输出的整数矩阵,保证满足row>=1和column>=1。
输入样例:

4  5
1 0 0 0 5
0 2 0 0 0
0 0 3 0 0
0 0 0 4 0
5  5
1 2 3 4 5
2 3 4 5 6
3 4 5 6 7
4 5 6 8 9
5 6 7 8 9

输出样例:

        26        32        38        44        50
         4         6         8        10        12
         9        12        15        18        21
        16        20        24        32        36
#include
#include
using namespace std;
class matrix{
 private:
  int row;     
  int column;
  int **mat;        //mat作为指针来表示数组
 public:
  matrix(int a=0,int b=0):row(a),column(b){};   //构造函数初始化
  void get(int ,int);      //把输入的行列赋值给row column并且构建二维数组开辟内存空间
  void display();          //输出矩阵m3
  friend bool judge(const matrix &a,const matrix &b);   //判断是否满足矩阵乘法运算条件
  friend matrix operator*(const matrix &a,const matrix &b);  //重载*运算符
};
void matrix::get(int a,int b){  //读入输入的行列并赋值
 int i,j;
 row=a;                
 column=b;
 mat=new int*[a];
 for(i=0;i<a;i++){       //创建二维数组
  mat[i]=new int[b];
 }
 for(i=0;i<row;i++){
  for(j=0;j<column;j++){
   cin>>mat[i][j];
  }
 }
}
bool judge(const matrix &a,const matrix &b){
 if(a.column==b.row||a.column==1&&a.row==1){   //在矩阵的乘法中,有两种可以计算的情况,第一种是a的列=b的行
  return true;                                //第二种是数乘矩阵的情况,这种情况很容易被忽略且要分开考虑
 }else{                                       //矩阵乘法不满足交换律(不然情况多到哭泣(┬_┬))
  return false;
 }
}
void matrix::display(){
    int i,j;
    for(i=0;i<row;i++){
     for(j=0;j<column;j++){
      cout<<setw(10)<<mat[i][j];
  }
  cout<<endl;         
 }
}
matrix operator*(const matrix &a,const matrix &b){
 matrix c;
 int i=0,j=0,k=0,l=0,sum=0;
 if(a.column==1&&a.row==1){     //数*矩阵情况,先给对象c创建二维数组
  c.row=b.row;
  c.column=b.column;
  c.mat=new int*[b.row];
 for(i=0;i<b.row;i++){
  c.mat[i]=new int[b.column];
 }
 for(i=0;i<b.row;i++){
  for(j=0;j<b.column;j++){     //b的每项*a唯一的那个数即可
   c.mat[i][j]=a.mat[0][0]*b.mat[i][j];
  }
 }
 }else{
 c.row=a.row;       //矩阵*矩阵的一般情况,由于创建二维数组和前面情况不同要分别创建
 c.column=b.column;
 c.mat=new int*[a.row];
 for(i=0;i<a.row;i++){
  c.mat[i]=new int[b.column];
 }
 for(i=0;i<a.row;i++){
  for(j=0;j<b.column;j++){    //矩阵乘法计算并给c的二维数组赋值,要考虑清楚行列!
   for(k=0;k<a.column;k++){
   sum+=a.mat[i][k]*b.mat[k][j]; 
   }
   c.mat[i][j]=sum;
   sum=0;
  }
 }
 }
 return c;
}
int main(){          //写好函数,一一调用就好啦~
 matrix m1,m2,m3;
 int a,b;
 cin>>a>>b;
 m1.get(a,b);
 cin>>a>>b;
 m2.get(a,b);
 if(judge(m1,m2)){
  m3=m1*m2;
  m3.display();
 }else{
  cout<<"Invalid Matrix multiplication!"<<endl;
 }
 return 0;
}

你可能感兴趣的:(PTA:矩阵的乘法运算(c++,运算符重载))