2.9 (C++)

Design a class Matrix that has the following private member variables:
int rows
int columns
double * values
Besides, it has the following public object functions:
A constructor Matrix(int rows, int column, double values[]), which initializes all elements in the matrix to the given values. Note that the given values are in one-dimensional, you need to fill then into the two-dimensional matrix correctly.
A copy constructor Matrix(const Matrix & matrix2).
A destructor.
A print function which prints each row of elements in a single line, with each element preceded with 4 spaces.
An operator Matrix Matrix::operator + (const Matrix & matrix2) const.
An operator Matrix Matrix::operator + (double value) const.
An operator Matrix Matrix::operator - (const Matrix & matrix2) const.
An operator Matrix Matrix::operator - (double value) const.
EXAMPLE INPUT
4 4
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
4 4
16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
8
EXAMPLE OUTPUT

1    2    3    4
5    6    7    8
9    10    11    12
13    14    15    16

16    15    14    13
12    11    10    9
8    7    6    5
4    3    2    1

17    17    17    17
17    17    17    17
17    17    17    17
17    17    17    17

-15    -13    -11    -9
-7    -5    -3    -1
1    3    5    7
9    11    13    15

9    10    11    12
13    14    15    16
17    18    19    20
21    22    23    24

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

主程序 (不能修改)

#include "source.cpp"

Matrix read() {
    int rows;
    int columns;
    double values[1000];
    cin >> rows >> columns;
    for (int i = 0; i < rows * columns; ++ i) {
        cin >> values[i];
    }
    Matrix matrix(rows, columns, values);
    return matrix;
}

int main() {
    Matrix matrix1 = read(); // calls copy constructor
    Matrix matrix2 = read();
    
    double value;
    cin >> value;
    
    matrix1.print();
    cout << endl;
    matrix2.print();
    cout << endl;
    
    Matrix matrix3 = matrix1 + matrix2;
    matrix3.print();
    cout << endl;
    
    Matrix matrix4 = matrix1 - matrix2;
    matrix4.print();
    cout << endl;
    
    Matrix matrix5 = matrix1 + value;
    matrix5.print();
    cout << endl;

    Matrix matrix6 = matrix1 - value;
    matrix6.print();
    cout << endl;
}

我的答案

#include <iostream>
using namespace std;

class Matrix{
private:    
    int rows;
    int columns;
    double *addr;
    
    void _init(int rows,int columns,double values[]){
        this->rows=rows;
        this->columns=columns;
        this->addr=new double[rows*columns];
        for (int i = 0; i < rows*columns ; ++ i) {
            this->addr[i]=(values==NULL ? 0: values[i]);
        }
    }
    
public:
    //构造函数1
    Matrix(int rows,int columns){
        this->_init(rows,columns,NULL);
    }
    //构造函数2
    Matrix(int rows,int columns,double values[]){
        this->_init(rows,columns,values);
    }
    //释构函数
    Matrix(const Matrix & m){
        this->_init(m.rows,m.columns,m.addr);
    }
    //=
    Matrix & operator = (const Matrix & m){
        delete [] this->addr;
        this->_init(m.rows,m.columns,m.addr);
        return *this;
    }
    //析构函数
    ~Matrix(){
        delete [] this->addr;
    }
    
    double get(int row, int col) const{
        int index = (row-1)* this->columns + (col-1);
        return this->addr[index];
    }
    
    void set(int row, int col,double val){
        int index = (row-1)* this->columns + col-1;
        this->addr[index] = val;
    }
    
    void print() const {
        for (int i = 0; i < this->rows; ++ i) {
            for (int j = 0; j < this->columns; ++ j) {
                cout << "    " << this->get(i+1,j+1);
            }
            cout<<endl;
        }
    }
    
    Matrix operator + (const Matrix & matrix2) const{
        Matrix m(this->rows,this->columns, NULL);
        for (int i = 0; i < this->rows ; ++ i) {
            for (int j = 0; j < this->columns ; ++ j) {
                m.set(i+1,j+1,this->get(i+1,j+1)+matrix2.get(i+1,j+1));
            }
        }
        return m;
    }
    
    Matrix operator + (double val) const{
        Matrix m(this->rows,this->columns, NULL);
        for (int i = 0; i < this->rows ; ++ i) {
            for (int j = 0; j < this->columns ; ++ j) {
                m.set(i+1,j+1,this->get(i+1,j+1)+val);
            }
        }
        return m;
    }
    
    Matrix operator - (const Matrix & matrix2) const{
        Matrix m(this->rows,this->columns, NULL);
        for (int i = 0; i < this->rows ; ++ i) {
            for (int j = 0; j < this->columns ; ++ j) {
                m.set(i+1,j+1,this->get(i+1,j+1)-matrix2.get(i+1,j+1));
            }
        }
        return m;
    }
    
    Matrix operator - (double val) const{
        Matrix m(this->rows,this->columns, NULL);
        for (int i = 0; i < this->rows ; ++ i) {
            for (int j = 0; j < this->columns ; ++ j) {
                m.set(i+1,j+1,this->get(i+1,j+1)-val);
            }
        }
        return m;    
    }
    
};
上一篇: 2.10 (C++) 下一篇: 2.8 (C++)
支持 makedown语法

仅有一条评论

  1. yzb

    #include
    using namespace std;
    class Matrix
    {
    private:
    int rows;
    int columns;
    double * data;

    void _init(int rows, int columns, double values[]) {
    this->rows = rows;
    this->columns = columns;
    this->data = new double[rows * columns];
    for (int i = 0; i < rows * columns; ++ i)
    this->data[i] = (values == NULL ? 0 : values[i]);
    }
    int _index(int row, int column) const {
    return (row - 1) * this->columns + (column - 1);
    }
    public:
    Matrix(int rows, int columns) {
    this->_init(rows, columns, NULL);
    }
    Matrix(int rows, int columns, double values[]) {
    this->_init(rows, columns, values);
    }
    Matrix(const Matrix & matrix) {
    this->_init(matrix.rows, matrix.columns, matrix.data);
    }
    ~Matrix() {
    delete [] this->data;
    }
    void print() const {
    for (int i = 0; i < this->rows; ++ i) {
    for (int j = 0; j < this->columns; ++ j) {
    cout _index(row, column)] = value;
    }

    double get(int row, int column) const {
    return this->data[this->_index(row, column)];
    }
    Matrix operator + (const Matrix & matrix2) const{
    Matrix m3(rows,columns,NULL);
    for (int i = 0; i < this->rows*this->columns; ++ i) {
    m3.data[i]=this->data[i]+matrix2.data[i];
    }
    return m3;
    }
    Matrix operator - (const Matrix & matrix2) const{
    Matrix m3(rows,columns,NULL);
    for (int i = 0; i < this->rows*this->columns; ++ i) {
    m3.data[i]=this->data[i]-matrix2.data[i];
    }
    return m3;
    }
    Matrix operator + (double value) const{
    Matrix m3(rows,columns,NULL);
    for (int i = 0; i < this->rows*this->columns; ++ i) {
    m3.data[i]=this->data[i]+value;
    }
    return m3;
    }
    Matrix operator - (double value) const{
    Matrix m3(rows,columns,NULL);
    for (int i = 0; i < this->rows*this->columns; ++ i) {
    m3.data[i]=this->data[i]-value;
    }
    return m3;
    }
    };

    yzb March 21st, 2021 at 08:39 pm回复