Динамически создавать матрицы из числового ввода в C ++ - PullRequest
0 голосов
/ 29 октября 2018

У меня есть консольное приложение, в котором я пытаюсь создать двоичную матрицу из числового ввода.

Если вы хотите создать матрицу 2x4, я должен сделать два входных ввода, по одному для каждой строки. В этом случае вход (консоль) будет выглядеть так:

Первый ввод:

1101

второй вход:

0111

А потом я хочу создать матрицу, которая будет выглядеть так:

{
 1,1,0,1
 0,1,1,1
}

Когда пользователь набирает 1101 в консоли, номер должен быть разбит на цифры, и каждая цифра будет сохраняться в разных индексах в столбцах. Предполагается, что пользователь будет вводить только цифры 1 и 0. Я добавлю тест для этого позже.

Все мои попытки это создать матрицу в неправильных форматах, и поэтому, когда я пытаюсь прочитать данные в матрице, я получаю неправильные результаты.

Пока это моя попытка:

Конструктор, который спрашивает пользователя, какого размера будет матрица

Matrix::Matrix() {
    std::cout << "Enter size of matrix:" << std::endl;
    std::cout << "Rows: ";
    std::cin >> rows;
    std::cout << "Columns: ";
    std::cin >> cols;

    int EndX = rows;
    int EndY = cols;
    vect3 = CreateMatrix(rows); //This method is supposed to create the matrix
}

Метод CreateMatrix:

std::vector<std::vector<int>> Matrix::CreateMatrix(int row) {
    std::string number{};
    for (size_t i = 0; i < row; i++) {
        std::cout << "Enter row number " << i << ":" << std::endl;
        std::cin >> number;
        for (size_t i = 0; i < number.length(); i++)
            vect2.push_back(number[i] - '0');
        std::reverse(vect2.begin(), vect2.end());
        vect.emplace_back(std::move(vect2));
    }
    return vect;
}

Функция CreateMatrix не создает желаемую матрицу, которую я хочу создать, но я не могу понять, что я делаю неправильно.

Когда я сделаю этот тест позже в коде

if (vect[row][col]) {
    // Some code
}

Числа находятся в неправильном месте в матрице, поэтому я оцениваю этот тест как истинный, когда ожидается, что он будет ложным, и наоборот.

Если бы я создал массив вручную в стеке на примере сверху, он выглядел бы так:

int matrix[2][4]{
             {1,1,0,1},
             {0,1,1,1}
         };

И если я сделаю этот тест сейчас:

if (matrix[row][col]) {
    // Some code
}

Выражение оценивается как истинное и ложное, как и ожидалось.

Поэтому, когда я пытаюсь создать матрицу динамически с помощью пользовательского ввода, матрица не имеет правильного формата, то есть числа находятся в неправильных индексах.

Проблема в методе std::vector<std::vector<int>> Matrix::CreateMatrix(int row), но я не могу понять, что я делаю неправильно, поэтому любая помощь будет оценена.

Спасибо!

Matrix.h:

class Matrix {
public:
    Matrix();
    std::vector<std::vector<int>> CreateMatrix(int);
    std::vector<std::vector<int>> getMatrix()const;; //Returns vect3
    ~Matrix();

private:
    std::vector<std::vector<int>> vect{0};
    std::vector<int> vect2{0};
    std::vector<std::vector<int>> vect3{0};
};

Edit:

getMatrix:

std::vector<std::vector<int>> Matrix::getMatrix() const { return vect3; }

Тестирование:

Matrix matrixClass;
    std::vector<std::vector<int>> matrix = matrixClass.getMatrix(); //Returns vect3 from the Matrix class

    if (matrix[1][0]) //Should print false but prints true
        std::cout << "true\n";
    else
        std::cout << "false\n";

    int matrixxx[2][4]{
        {1,1,0,1},
        {0,1,1,1}
    };

    if (matrixxx[1][0]) //prints false
        std::cout << "true\n";
    else
        std::cout << "false\n";

    std::cin.get();
    std::cin.get();
    return 0;

Учитывая ту же матрицу, описанную выше:

    {
     1,1,0,1
     0,1,1,1
    }

Имя matrix - это матрица, которую я пытаюсь создать с помощью пользовательского ввода. Когда я проверяю число в индексе [1][0], программа должна вывести false, потому что число в этом индексе равно 0. Но программа печатает true, что означает, что каким-то образом есть 1 в этом индексе, даже если не должно быть.

Во второй попытке я создаю матрицу вручную в стеке, я называю ее matrixxx, и когда я сейчас пытаюсь получить доступ к этому номеру матрицы по индексу [1][0], программа выводит false, как и ожидалось.

1 Ответ

0 голосов
/ 29 октября 2018

У меня не хватило терпения прочитать твой код. Надеюсь, я понял вашу проблему.

  • Постарайтесь отделить пользовательский интерфейс от данных: не запрашивать ввод данных пользователем в конструкторе .

  • Используйте только один вектор для хранения ваших данных:

    class matrix_t
    {
      size_t col_count, row_count;
      vector< bool > data;
      //...
    
  • Напишите функцию для вычисления индекса в векторе, начиная с столбца и индекса строки. Таким образом, вы можете смотреть на вектор как на матрицу :

    size_t as_index( const size_t col, const size_t row ) const;
    
  • Запись функции индекса . Функция будет использовать вышеуказанную функцию преобразования индекса:

    auto at( const size_t col, const size_t row );
    

    Вы также можете добавить функцию индексации для константных объектов .

  • Запись функция чтения и записи . Вы должны прочитать введенный символ, символ:

    istream& read( istream& is );
    ostream& write( ostream& os );
    

    Вы также можете добавить операторы извлечения и вставки .

  • Использование:

    size_t col, row;
    cin >> col >> row;
    
    matrix_t m( col, row );
    m.read( cin );
    

Полный код ( демо ):

#include <iostream>
#include <vector>

using namespace std;

class matrix_t
{
  size_t col_count, row_count;
  vector< bool > data;

  size_t as_index( const size_t col, const size_t row ) const
  {
    return row * col_count + col;
  }

public:

  matrix_t( const size_t col_count, const size_t row_count )
    : col_count( col_count )
    , row_count( row_count )
    , data( row_count*col_count )
  {
    // nop
  }

  auto at( const size_t col, const size_t row ) const
  {
    return data[ as_index( col, row ) ];
  }

  auto at( const size_t col, const size_t row )
  {
    return data[ as_index( col, row ) ];
  }

  istream& read( istream& is )
  {
    for( size_t r = 0; r < row_count; ++r )
    {
      for( size_t c = 0; c < col_count; ++c )
      {
        char t;
        is >> t;
        at( c, r ) = t == '0' ? false : true;
      }
    }
    return is;
  }

  ostream& write( ostream& os )
  {
    for( size_t r = 0; r < row_count; ++r )
    {
      for( size_t c = 0; c < col_count; ++c )
      {
        os << at( c, r ) ? '1' : '0';
      }
      os << endl;
    }
    return os;
  }

};

int main()
{
  size_t col, row;
  cin >> col >> row;

  matrix_t m( col, row );
  m.read( cin );

  cout << endl;
  m.write( cout );

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