1811 Matrix Calculation (eden)

来源:互联网 发布:农村淘宝怎么下载 编辑:程序博客网 时间:2024/06/08 04:17

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) // additionvoid operator -=(const Matrix& matOther) // substractionMatrix 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;}
原创粉丝点击