2

我必须创建一个程序,允许用户填写 4 阶的(部分)拉丁方。您可以使用 0 来表示空单元格。用户将给出要放置的数字、行和列。只有在不违反部分拉丁方格的属性并且不应该重写已放置的数字时,才应放置该数字。

我有一个现在输出全零的矩阵。所以接下来我必须用用户输入的内容替换这些值中的每一个。问题是我不知道该怎么做。

这是我的代码:

#include <iostream>
using namespace std;

const int ORDER = 4;
void fill (int m[], int order);
void outputMatrix (int m[], int order);
void replaceValue (int m[], int order, int n, int row, int column);

int main(){
    int matrix[ORDER];
    int row;
    int column;
    int n;
    fill (matrix, ORDER);
    outputMatrix (matrix, ORDER);
    do {
    cout << "Enter the number to place, the row and the column, each seperated by a space: ";
    cin >> n;
    cin >> row;
    cin >> column;

    }while (n > 0 || n <= ORDER);
    if (n <= 0 || n >= ORDER){
        cout << "Thank you";
        cout << endl;
    }

    return 0;
}


void fill (int m[], int order){
   for (int i = 0; i < order*order; i++){
        m[i] = 0;
   }
}

void outputMatrix (int m[], int order){
    int c = 0;
    for (int i = 0; i < order*order; i++){
         c++;
            cout << m[i] << ' ';
            if (c == order){
                cout << endl;
                c = 0;
            }
        }
        cout << endl;   
}

void replaceValue (int m[], int order, int n, int row, int column){
    for (int i = 0; i < order; i++){
        m[order] = m[row][column];
        m[row][column] = n;
    }
}

如何在 C++ 中替换矩阵中的值?

4

3 回答 3

2

如果你有一个矩阵,matrix[row][col] = value; 会成功的。但是,我看到您分配了一个数组。确保你看看这个。

编辑:

我仔细看了你的代码,你做错了一些事情。

首先: matrix[ORDER] 将创建一个 ORDER 值的数组。如果您想按 ORDER 矩阵排序,请尝试:matrix[ORDER][ORDER]

第二:您正在调用:

void fill (int m[], int order){
    for (int i = 0; i < order*order; i++){
        m[i] = 0;
    }
}

大小为 4 且 order == 4。这将在数组外循环并给您带来问题。

尝试类似:

matrix[ORDER][ORDER];
for (int row = 0; row != ORDER; ++row)
{
    for (int col = 0; col != ORDER; ++col)
    {
        matrix[row][col] = 0;
    }
}

希望这可以帮助。

于 2013-11-06T19:38:42.727 回答
1

清除/归零矩阵的最简单方法是:

memset( &matrix, 0, sizeof(matrix));

;-)

于 2013-11-06T19:52:43.870 回答
1

你不能真正写arr[i][j]ifarr被定义为arr[]. 没有关于行长的信息(有多少列)。

您可以使用 type 的数组arr[][4],并像这样编写函数:

// The & is to pass by reference.
void print(int (&arr)[][4], int length)
{
    for(int i = 0; i < length; i++) {
        for(int j = 0; j < 4; j++) {
            cout << arr[i][j] << " ";
        }
        cout << endl;
    }
}

但在我看来,对于像这样的低阶多维数组,使用 typedef 作为向量向量是更好的选择:

typedef vector<vector<int> > Matrix;
void print(Matrix& arr)
{
    for(int i = 0; i < arr.size(); i++) {
        for(int j = 0; j < arr[i].size(); j++) {
            cout << arr[i][j] << " ";
        }
        cout << endl;
    }
}

无论哪种情况,写作arr[i][j] = k都会如你所愿。

于 2013-11-06T19:41:50.030 回答