Произвольное матричное измерение в матричном классе - PullRequest
0 голосов
/ 15 октября 2019

Задача следующая: описать класс «матрица чисел» с компонентными данными: размеры матрицы, указатель на элементы. Операции перегрузки: << (вывод матрицы на экран), + (добавление матриц), унарные ¬– (изменение знака каждого элемента), / = (деление каждого элемента на число). Я выполнил это, и выполнил это правильно, но вам нужно установить размер матрицы с клавиатуры, и, как вы можете видеть, он установлен заранее для меня [3] [3]. Звучит довольно просто, но что-то я действительно тупой. Заранее спасибо за вашу помощь. Вот код: </p>

#include "pch.h"
#include <iostream>
using namespace std;
class Matrix
{
public:
    Matrix()
    {
        int Table[3][3];
    }
    int Table[3][3];
    void Create()
    {
        for (int i = 0; i < 3; i++)
            for (int j = 0; j < 3; j++)
                Table[i][j] = 10;
    }
};
ostream& operator <<(ostream& t, Matrix a)
{
    for (int i = 0; i < 3; i++)
    {
        for (int j = 0; j < 3; j++)
            t << a.Table[i][j] << " ";
        t << "\n";
    }
    return t;
}
Matrix& operator /=(Matrix& a, int num)
{
    for (int i = 0; i < 3; i++)
        for (int j = 0; j < 3; j++)
            a.Table[i][j] /= num;
    return a;
}
Matrix& operator -(Matrix& a, int empty)
{
    for (int i = 0; i < 3; i++)
        for (int j = 0; j < 3; j++)
            a.Table[i][j] = -a.Table[i][j];
    return a;
}
Matrix& operator +(Matrix& a, Matrix b)
{
    for (int i = 0; i < 3; i++)
        for (int j = 0; j < 3; j++)
            a.Table[i][j] += b.Table[i][j];
    return a;
}
int main()
{
    int u;
    setlocale(LC_ALL, "Russian");
    Matrix Example;
    Example.Create();
    Matrix Example1;
    Example1.Create();


    cout << Example;

    cout << Example1;
    cout << "Сумма матриц: "<<endl;
    cout << Example + Example1;

                Example - 1;

                Example1 - 1;


cout<< Example + Example1;

            cout << "На сколько вы хотите её поделить?\n";
            cin >> u;

                Example /= u;

                Example1 /= u;
                cout << Example;

                cout << Example1;


}`

Ответы [ 2 ]

0 голосов
/ 15 октября 2019

Для этого вам нужно динамическое распределение памяти. Я не буду возиться с указателями (new / delete), если вам явно не сказано. Как новичок вы, вероятно, должны использовать стандартные инструменты библиотеки шаблонов (STL):

#include <vector> и использовать std::vector<std::vector<int>> Table вместо int Table[3][3]. Затем напишите конструктор следующим образом:

Matrix(std::size_t rows, std::size_t cols)
{
    Table.resize(rows);
    for (unsigned int i = 0; i < Table.size(); ++i)
        Table[i].resize(cols);
}

Вы можете дополнительно сохранить размерность матрицы, но делать это не нужно, так как вы можете получить информацию из векторов. Замените жестко закодированные размеры во всех циклах соответствующими динамическими размерами (сохраненными или извлеченными из векторов). Например:


Matrix& operator +(Matrix& a, Matrix b)
{
    unsigned int rows = a.Table.size();
    unsigned int cols = a.Table[0].size();

    for (unsigned int i = 0; i < rows; i++)
        for (unsigned int j = 0; j < cols; j++)
            a.Table[i][j] += b.Table[i][j];
    return a;
}

Однако этот вектор векторов не очень эффективен. Лучше было бы одного вектора, но я думаю, для новичка это нормально.

Привет

0 голосов
/ 15 октября 2019

Вам нужно динамически создать матрицу. Для этого вам нужно использовать указатели (*). Изменить int table [3] [3] double table **;

Пример того, как это можно реализовать (обратите внимание, что я использую матрицу вместо таблицы)

class Matrix {
private:
    double** matrix;
    int col;
    int row;
public:
    Matrix(){};
    void Create(int row, int col);
};


void Matrix::Create(int row_, int col_){

    double val = 0.0;
    col = col_; // initalize private members
    row = row_;

    matrix = new double*[row]; // Create a new array of size row_

    for(int i = 0; i < row; i++)
    {
        matrix[i] = new double[col]; // Create new cols of size col (inside array of row)
    }

    for(int i = 0; i < row; i++)
    {
        for(int j = 0; j < col; j++)
        {
            matrix[i][j] = val;
            val = val + 1.0;
        }
    }
}

Я пыталсядля простоты повторно используйте ваш дизайн, но я действительно предлагаю вам вместо этого попытаться указать размеры матрицы в конструкторе и, возможно, даже построить матрицу в нем. Примерно так:

Matrix(int row_, int col_) : row(row_), col(col_) {*/ create matrix here /*};

Вы можете пропустить часть «создать матрицу здесь» и использовать свой собственный Create (), если хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...