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

2024-03-29

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

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

创建矩阵方法:

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
}

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

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

问题在于std::vector<std::vector<int>> Matrix::CreateMatrix(int row)方法,但我不知道我做错了什么,所以任何帮助将不胜感激。

Thanks!

矩阵.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:

gtMetrix:

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

Testing:

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


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

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

  • Use 只有一个向量存储您的数据:

    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;
    
  • Write a 下标函数。该函数将使用上面的索引转换函数:

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

    您还可以添加下标函数常量对象.

  • Write 读和写功能。您必须逐字符读取输入的字符:

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

    您还可以添加提取和插入运算符.

  • Usage:

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

完整代码(demo https://www.ideone.com/q6j9tJ):

#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;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从 C++ 中的数字输入动态创建矩阵 的相关文章

随机推荐

  • INSERT INTO 语句中的情况

    我正在尝试设置ActionReq当未提供 ActionReq 时 将此存储过程的列设置为 Expiration AdvancedCancel 的值 ActionReq和 Expiration 是日期时间 AdvancedCancel 是 i
  • 线程不更新进度条控件 - C#

    我有一个带有自定义进度条的自定义表单 在主类 主线程 中生成 然后我生成一个线程并向其发送 ThreadStart 函数 此线程启动函数应该更新自定义控件中的进度条 但没有 class MyClass Custom form with pr
  • 尝试思考如何在 Angular 2 中构建多步表单

    我正在尝试构建一个小型的三步表单 它会类似于这样 我在 React 中执行此操作的方法是使用 redux 来跟踪表单完成情况并根据步骤号 0 1 2 渲染表单主体标记 在 Angular 2 中 什么是做到这一点的好方法 这就是我目前正在尝
  • 使用 Flexbox 将元素与底部对齐

    我正在尝试使用 Flexbox 将 DIV 与底部对齐align content flex end 并尝试align self flex end 没有运气 我在这里做错了什么 我想align content对齐 好吧 内容到任何允许的高度
  • 当前端/后端位于两个不同的域时,CSRF 保护如何为我提供比 CORS 控制更高的安全性?

    如果我有 一个域上的 Web 前端 另一个域上的 REST API 通过设置 header 将 REST API 服务器配置为仅允许来自 Web 前端域的跨源请求Access Control Allow Origin到 Web 前端域 除了
  • 总和大于给定值的子数组的数量

    给定一个数组N整数 正数和负数 找出连续的总和大于或等于的子数组K 也可以是正数或负数 I have managed to work out a naive O N2 solution is it possible to get bette
  • 正则表达式去除注释、多行注释和空行

    我想解析一个文件 我想使用 php 和 regex 来剥离 空白或空行 单行注释 多行注释 基本上我想删除任何包含的行 text 或多行注释 some text 如果可能 另一个正则表达式来检查该行是否为空 删除空行 那可能吗 有人可以向我
  • HTML5 WebSocket 与 hybi-17

    Update 我解决了解码问题 感谢pimvdb 解决方案如下 PHP len masks data decoded null len ord buffer 1 127 if len 126 masks substr buffer 4 4
  • 苹果推送通知,定期发出蜂鸣声

    我对 iOS 上的苹果推送通知负载有一个小但棘手的问题 据我所知 推送通知有效负载可以有声音 长度 可行吗 如何 PS 它是一个企业应用程序 不会部署在App Store上 提前致谢 是的 您可以这样实现 注册设备以发送推送通知 每 30
  • 如何将 Python/Pandas 数据插入规范化数据库

    假设我有一个 Pandas 数据框 其中包含以下记录 Time Action User Company User2 00 02 buy share msmith ACME tjones 00 03 sell share tjones Alp
  • 调用网络服务。需要缺失的链接

    有人可以填写下面代码中缺少的链接吗 第一种方式 Web服务接口文件是HappyService xml JaxWSProxyFactoryBean factory new JaxWsProxyFactoryBean factory getIn
  • 如何自动检测代理?

    对于我的一个项目 我制作了一个 QWebView 一切工作正常 但是当我在学校使用它时 我收到错误 因为代理未定义 我怎样才能像在 Firefox 和 IE 中那样自动检测代理 我在中找到了这个QNetworkProxyFactory ht
  • 更改标签栏项目图像和文本颜色 iOS

    这是我的标签栏 下图显示了正在运行的程序和选定的 新闻 项 很明显 条形色调的颜色工作得很好 正如我想要的 但tintColor只影响图像而不影响文本 另外 当选择一个项目时 如上所示 新闻 项目颜色变为蓝色 我该如何防止这种情况发生 我希
  • 不支持的操作:在 Web 上使用 dart io 时的_Namespace

    I am trying to use dart io to read and write file I am getting below exception Uncaught Error Unsupported operation Name
  • 在 PHP 中仅缓存页面的一部分

    是否可以只缓存 PHP 页面的特定部分 或者 PHP 脚本中特定代码段的输出 似乎当我尝试缓存特定页面时 它缓存了我不想要的整个页面 页面中的某些内容应该随着每次页面加载而更新 而其他内容 例如包含来自数据库的数据的下拉列表 只需要每小时左
  • Spring bean别名使用

    我知道bean别名在spring中意味着什么 但我想知道使用别名的用例 为什么有人想要使用别名而不是名称来引用 bean 提前致谢 我见过的用法如下 您有给定接口的两个实例 SomeBean 一个用于环境 A 一个用于环境 B 因此 您定义
  • 悬停时的黑白 CSS 背景

    我有一个 CSS 精灵 如下所示 HTML a href http www domain com estate a CSS estates background position 200px 0px width 96px height 90
  • 尝试使用地址栏或刷新页面访问时,Azure Web应用程序返回404

    我需要一些有关我的天蓝色应用程序的帮助 我有一个website使用 Azure 上托管的 ReactJS 但发生了一些奇怪的事情 我可以使用地址栏访问的唯一页面是 mydomain com 或 www mydomain com 如果我尝试访
  • 使段落文本换行到 div 内

    我读了这篇文章here https stackoverflow com questions 1587964 wrap text inside fixed div with css or javascript 我有一个简单的目标 我只想让我的
  • 从 C++ 中的数字输入动态创建矩阵

    我有一个控制台应用程序 我试图从数字输入创建一个二进制矩阵 如果想要创建一个 2x4 矩阵 我必须做两个输入 每一行一个 输入 控制台 将如下所示 第一个输入 1101 第二个输入 0111 然后我想创建一个如下所示的矩阵 1 1 0 1