【问题标题】:Turn code into an Array and Display将代码转换为数组并显示
【发布时间】:2023-03-22 14:54:01
【问题描述】:

我怎样才能把它变成一个数组?我需要一块板来显示空白,当用户输入时,它会被另一个函数填充为 X 或 O。当前板子工作我想把它做成一个数组[3][3]并显示数组的内容。

void showboard(char &squareOne, char &squareTwo, char &squareThree, char &squareFour, char &squareFive, char &squareSix, char &squareSeven,
    char &squareEight, char &squareNine)
{


 cout << squareOne << "|" << squareTwo << "|" << squareThree << endl
  << "-+-+-"<< endl
  << squareFour << "|" << squareFive << "|" << squareSix << endl
  << "-+-+-"<< endl
  << squareSeven << "|" << squareEight << "|" << squareNine << endl;
 }
}

【问题讨论】:

    标签: c++ arrays function


    【解决方案1】:

    您可以让showboard() 函数接受对chars 的3x3 数组的引用。看起来很奇怪的参数char (&amp;squares)[3][3] 表示“引用名为squareschars 的3x3 数组”。

    void showboard(char (&squares)[3][3]) 
    { 
        std::cout << squares[0][0] << "|" << squares[0][1] << "|"
             << squares[0][2] << "\n" << "-+-+-"<< "\n" 
             << squares[1][0] << "|" << squares[1][1] << "|"
             << squares[1][2] << "\n" << "-+-+-"<< "\n"
             << squares[2][0] << "|" << squares[2][1] << "|"
             << squares[2][2] << std::endl; 
    } 
    
    int main()
    {
        char s[3][3] = { {'1', '2', '3'}, {'4', '5', '6'}, {'7', '8', '9'} };
        showboard(s);
    }
    

    或者,这是一个使用 for 循环的实现:

    void showboard(char (&squares)[3][3]) 
    { 
        for(int i = 0; i < 3; ++i)
        {
            for(int j = 0; j < 3; ++j)
            {
                std::cout << squares[i][j];
                if(j < 2) std::cout << "|";
            }
            std::cout << "\n";
            if(i < 2) std::cout << "-+-+-" << std::endl;;
        }
    } 
    

    【讨论】:

    • 我已经展开了循环。但是您当然可以为此使用 for 循环。
    【解决方案2】:
    template <typename T, int nRows, int nCols>
    class Matrix: public vector<vector<T>>
    {
    public:
        Matrix()
        {
            for (int r = 0; r < nRows; ++r)
            {
                vector<T> row;
                row.resize(nCols);
                fill(row.begin(), row.end(), 0);
                this->push_back(row);
            }
        }
    
        int rows() const { return nRows; }
        int columns() const { return nCols; }
    };
    
    typedef Matrix<int, 3, 3> Board;
    
    void show(const Board& board)
    {
        for (int i = 0; i < board.rows(); ++i)
        {
            for (int j = 0; j < board.columns(); ++j)
                cout << board[i][j] << " ";
            cout << endl;
        }
    }
    

    【讨论】:

    • +1 表示模板和显然有太多时间在你手上
    • 我不喜欢的东西:STL 容器不应该派生自。您应该在向量功能而不是它的接口之上构建您的界面:更喜欢组合而不是继承!在这种情况下,您将您的实现细节泄露给外部用户,您将无法在以后更改您的实现,也无法控制他们如何使用您的 Matrix。如果他们这样做了:Matrix&lt;3,3&gt; m; m.clear();?他们可以检查并看到m.rows() == m.cols() == 0; m[0][0] 会失败。
    • 在多维数组中,通常是recommended提供函数类型访问器m(1,2),而不是数组类型访问器m[1][2]。此外,您需要 4 次内存分配(每个向量一个),并且内存可以分段。您可以避免四种分配中的三种,并通过使用单个线性向量并提供将在特定位置提供元素的访问函数来改善数据的局部性。避免过早的优化以及早期的悲观
    • 而且我认为我的回答对于那个问题来说有点矫枉过正......此外,如果 STL 容器真的不是要从它们派生出来的,它们可能会通过一种可用的语言手段来限制它?
    猜你喜欢
    • 2011-11-15
    • 2018-01-24
    • 2011-02-09
    • 1970-01-01
    • 2012-06-16
    • 2013-10-04
    • 2022-01-12
    • 2016-10-12
    相关资源
    最近更新 更多