1811 Matrix Calculation (eden)

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;
}

猜你喜欢

转载自blog.csdn.net/z_j_q_/article/details/72809937