Description:
Please complete the class Matrix.
Suppose you have understood the overload operator of C++.
Matrix(string, int, int, int**)
Matrix(const Matrix &)
~Matrix()
bool operator ==(const Matrix& matOther)
bool operator !=(const Matrix& matOther)
void operator +=(const Matrix& matOther) // addition
void operator -=(const Matrix& matOther) // substraction
Matrix operator *(const Matrix& matOther) // production, return a new Matrix named "newMat"
Note:
If the caculation is invalid, print like the following:
“invalid addition.\n”
“invalid substraction.\n”
“invalid multiplication.\n” and return an empty matrix
出题人: 林楚庭
Provided Codes
main.cpp
#include <iostream>
#include "Matrix.h"
using namespace std;
int main() {
int h1, w1, h2, w2, n;
string name1 = "Mat1";
string name2 = "Mat2";
cin >> h1 >> w1;
int **mat1_arr = new int*[h1];
for (int i = 0; i < h1; i++) {
mat1_arr[i] = new int[w1];
for (int j = 0; j < w1; j++) {
cin >> mat1_arr[i][j];
}
}
cin >> h2 >> w2;
int **mat2_arr = new int*[h2];
for (int i = 0; i < h2; i++) {
mat2_arr[i] = new int[w2];
for (int j = 0; j < w2; j++) {
cin >> mat2_arr[i][j];
}
}
Matrix mat1 = Matrix(name1, h1, w1, mat1_arr);
mat1.print();
Matrix mat2 = Matrix(name2, h2, w2, mat2_arr);
mat2.print();
cout << "\n(Mat1 += Mat2) addition result:\n";
mat1 += mat2;
mat1.print();
cout << "\n(Mat1 -= Mat2) substraction result:\n";
mat1 -= mat2;
mat1.print();
cout << "\n(Mat1 * Mat2) production result:\n";
Matrix mat3 = mat1 * mat2;
if (mat3.getName() != "") mat3.print();
for (int i = 0; i < h1; i++) {
delete [] mat1_arr[i];
}
delete [] mat1_arr;
for (int i = 0; i < h2; i++) {
delete [] mat2_arr[i];
}
delete []mat2_arr;
return 0;
}
Matrix.h
#ifndef MATRIX_H
#define MATRIX_H
#include <iostream>
#include <string.h>
using namespace std;
class Matrix {
public:
Matrix() {
name = "";
width = height = 0;
param = NULL;
}
Matrix(string, int, int, int**);
Matrix(const Matrix &);
~Matrix();
void setName(string newName) {
name = newName;
}
string getName() {
return name;
}
void print() {
cout << name << " = [\n";
for (int i = 0; i < height; i++) {
for (int j = 0; j < width; j++) {
if (j == width-1) cout << param[i][j];
else cout << param[i][j] << ", ";
}
cout << "\n";
}
cout << "]\n";
}
// overload operator
bool operator ==(const Matrix&);
bool operator !=(const Matrix&);
void operator +=(const Matrix&);
void operator -=(const Matrix&);
Matrix operator *(const Matrix&);
private:
string name;
int width, height, **param;
};
#endif
Submission
Matrix.cpp
#include <string>
#include <algorithm>
#include <iterator>
#include <iostream>
//#include <assert.h>
#include "Matrix.h"
using namespace std;
Matrix::Matrix(string n, int h, int w, int** mat){
//param=NULL;
setName(n);
this->width=w;
this->height=h;
this->param=new int*[h];
//assert(param!=NULL);
for(int i=0;i<h;i++){
param[i]=new int[w];
for(int j=0;j<w;j++)
param[i][j]=mat[i][j];
}
}
Matrix::Matrix(const Matrix &mat){
//param=NULL;
setName(mat.name);
this->width=mat.width;
this->height=mat.height;
//assert(param!=NULL);
this->param=new int*[this->height];
for(int i=0;i<this->height;i++){
param[i]=new int[this->width];
for(int j=0;j<this->width;j++)
param[i][j]=mat.param[i][j];
}
}
Matrix::~Matrix(){
if(this->param!=NULL){
for(int i=0;i<height;i++)
delete []param[i];
}
delete []param;
param==NULL;
}
bool Matrix::operator ==(const Matrix& mat){
for(int i=0;i<this->height;i++)
for(int j=0;j<this->width;j++)
if(this->param[i][j]!=mat.param[i][j])
return false;
return true;
}
bool Matrix::operator !=(const Matrix& mat){
for(int i=0;i<this->height;i++)
for(int j=0;j<this->width;j++)
if(this->param[i][j]!=mat.param[i][j])
return true;
return false;
}
void Matrix::operator +=(const Matrix& mat){
if(this->width!=mat.width||this->height!=mat.height){
cout<<"invalid addition.\n";
}
else{
for(int i=0;i<this->height;i++)
for(int j=0;j<this->width;j++)
this->param[i][j]+=mat.param[i][j];
}
}
void Matrix::operator -=(const Matrix& mat){
if(this->width!=mat.width||this->height!=mat.height){
cout<<"invalid substraction.\n";
}
else{
for(int i=0;i<this->height;i++)
for(int j=0;j<this->width;j++)
this->param[i][j]-=mat.param[i][j];
}
}
Matrix Matrix::operator *(const Matrix& mat){
if(this->width!=mat.height){
cout<<"invalid multiplication.\n";
return Matrix();
}
Matrix tem;
//tem.param=NULL;
tem.setName("newMat");
tem.width=mat.width;
tem.height=height;
tem.param=new int*[tem.height];
//assert(tem.param!=NULL);
for(int i=0;i<tem.height;i++){
//动态分配数组时,如果数组元素具有类类型,将使用该类的默认构造函数实现初始化;如果数组元素是内置类型,则无初始化。
tem.param[i]=new int[tem.width]();
//也可以使用跟在数组长度后面的一对空圆括号,对数组元素做值初始化。圆括号要求编译器对数组做值初始化。
for(int j=0;j<tem.width;j++)
for(int k=0;k<this->width;k++)
tem.param[i][j]+=param[i][k]*mat.param[k][j];
}
return tem;
}