gpt4 book ai didi

c++ - 从 C++ 中的数字输入动态创建矩阵

转载 作者:太空狗 更新时间:2023-10-29 22:55:09 27 4
gpt4 key购买 nike

我有一个控制台应用程序,我在其中尝试从数字输入创建二进制矩阵。

如果要创建一个 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
}

数字在矩阵中的位置错误,因此我在这个测试中评估为真,而预期为假,反之亦然。

如果我使用 abow 中的示例在堆栈上手动创建数组,它将如下所示:

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

如果我现在做这个测试:

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

表达式正在按预期评估为 true 和 false。

所以当我尝试通过自定义输入动态创建矩阵时,矩阵没有正确的格式,即数字在错误的索引中。

问题出在std::vector<std::vector<int>> Matrix::CreateMatrix(int row)方法,但我无法确定我做错了什么,所以我们将不胜感激。

谢谢!

矩阵.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};
};

编辑:

获取矩阵:

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正如预期的那样。

最佳答案

我没有耐心阅读你的代码。我希望我理解你的问题。

  • 尽量将用户界面与数据分开:不要在构造函数中要求用户输入

  • 使用仅一个 vector 来存储您的数据:

    class matrix_t
    {
    size_t col_count, row_count;
    vector< bool > data;
    //...
  • 编写一个函数来计算 vector 中的索引,从列索引和行索引开始。这样您就可以将 vector 视为矩阵:

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

完整代码( demo ):

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

关于c++ - 从 C++ 中的数字输入动态创建矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53045856/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com