将一维数组转换成二维数组在C++中的实现

6

我有一个一维数组,声明为int boardArray [49];,还有一个二维7x7数组,声明为int boardArrayTwo [7][7]。我正在尝试使用嵌套的for循环将一维数组放入二维数组中,以下是我用来测试它的代码。

for (int i = 0; i > 50; ++i)
{
    boardArray[i] = i; //fills the array with ints 0 - 48 to test
}
for (int x = 0; x >= 7; ++x)
{
    for (int k = 0; k >= 7; ++k)
    {
        for (int n = 0; n >= 49; ++n)
        {
            boardArrayTwo[x][k] = boardArray[n];
            cout << boardArrayTwo[x][k] << " " << endl;
        }

    }
}

我试了一下,但没有任何反应。我是做错了吗?

1
由for (int n = 0; n >= 49; ++n)和for (int x = 0; x >= 7; ++x)所引导的循环将完全不会运行。这就是为什么什么都不会发生的原因。 - David Nehme
8个回答

7
for (int x = 0; x >= 7; ++x)
{
    for (int k = 0; k >= 7; ++k){
         for (int n = 0; n >= 49; ++n)
    {

这是错误的。x和k应该小于7(而且不应该使用第三个循环):

for (int x = 0; x < 7; ++x)
{
    for (int k = 0; k < 7; ++k){
        boardArrayTwo[x][k] = boardArray[7*x + k];

编辑:

像@Fabio Ceconello在他的评论中指出的那样,甚至第一个循环也是错误的,因为条件检查被倒置了,应该按以下方式进行修改:

for (int i = 0; i < 49; ++i)
{
    boardArray[i] = i; //fills the array with ints 0 - 48 to test
}

不仅如此,循环中的所有条件语句逻辑都被反转了。 - Fabio Ceconello
出了什么问题?我不理解反对意见。你们两个能给我澄清一下吗? - Heisenbug
你应该包含Fabio提到的内容。我认为这样会使你的答案最好。 - Ziggy
哦,你说得对。我完全忘记了第一个循环。我会编辑我的答案,谢谢。 - Heisenbug

6
除了循环中的逻辑倒置(其他人已经提到),第三个内部循环是不必要的。只需将属性放在第二个内部循环中即可:
boardArrayTwo[x][k] = boardArray[x * 7 + k];

编辑: 我还应该提到,所有这些文字都不是好的实践方法,我在上面添加了一个(7)。我会重新编写代码如下:

#define arrlen(x) (sizeof(x)/sizeof((x)[0]))

for (int i = 0; i < arrlen(boardArray); ++i)
{
    boardArray[i] = i; 
}
int stride = arrlen(boardArrayTwo[0]);
for (int x = 0; x < arrlen(boardArrayTwo); ++x)
{
    for (int k = 0; k < stride; ++k)
    {
        boardArrayTwo[x][k] = boardArray[stride * x + k];
        cout << boardArrayTwo[x][k] << " " << endl;
    }
}

嘿,但问题在于0 <= 7会给他8个值。这对于他微小的数组来说太多了! - Ziggy
对的,他应该使用 x < 和 k <,而不是 x <= 等等。 - Fabio Ceconello

5

看起来你的目标数组是按行主序排列。你可以直接将源数组传送到目标数组中。

memcpy(boardArrayTwo, boardArray, 49 * sizeof(int));

如果您更喜欢使用更符合C++惯用语的方式:

std::copy(boardArray, boardArray + 49, reinterpret_cast<int*>(boardArrayTwo));

我讨厌强制类型转换。那么std::copy(&boardArray[0], &boardArray[49], &boardArrayTwo[0][0]);怎么样? - Robᵩ
@Rob,那也可以。我不太介意新的C++转换。它们在代码中很突出,因此您可以找到它们,并且它们给编译器捕获一些误用的机会。 - Blastfurnace

4

您在for循环中使用了i > 50。应该改为i < 49,所有的循环都要修改。

此外,这样做不起作用。您将所有boardArrayTwo[][]的值设为boardArray[49]。您应该像这样做:

for (int x = 0; x < 7; ++x)
{
    for (int k = 0; k < 7; ++k)
    {
        boardArrayTwo[x][k] = boardArray[7*x + k];
        cout << boardArrayTwo[x][k] << " " << endl;
    }
}

或者

int count = 0;

for (int x = 0; x < 7; ++x)
{
    for (int k = 0; k < 7; ++k)
    {
        boardArrayTwo[x][k] = boardArray[count];
        cout << boardArrayTwo[x][k] << " " << endl;
        count++;
    }
}

1

首先,在 for 循环的第二个条件中,它表示只要该条件为真,循环就会一直运行。因此,你应该在所有循环中使用 < 而不是 >=

其次,对于 n 的循环是多余的,不应该存在。你需要做的是遍历 xk,然后将从 boardArray 中相应的元素复制到 boardArrayTwo 中。

你可以选择以下其中之一:

int n = 0;
for (int x = 0; x < 7; ++x)
    for (int k = 0; k < 7; ++k)
    {
        boardArrayTwo[x][k] = boardArray[n];
        ++n;
    }

或者使用公式来计算适当的n

for (int x = 0; x < 7; ++x)
    for (int k = 0; k < 7; ++k)
        boardArrayTwo[x][k] = boardArray[x*7+k];

我写了 x*7+k,因为看起来 x 正在遍历数组的行,每行有 7 个元素,表示棋盘数组中的第 x*7+k 个元素代表了 [x][k] 在 boardArrayTwo 中的位置。

0

注意

for (int i = 0; i > 50; ++i)

如果将变量i初始化为0,则它将不会大于50,因此永远不会进入循环。

0
在你的每个循环中,你使用了大于或等于符号(>),而不是小于或等于符号(<) 。你还应该注意到,正如Fabio在上面指出的那样,第三个嵌套循环一遍又一遍地将boardArrayTwo[x][k]设置为0-49,共49次。你需要使用算术运算来操作x和k,使它们成为boardArray的索引,然后将该索引分配给boardArrayTwo[x][k]
此外,你正在使用包括0..7在内的8个位置。你的数组只有长度为7,因此实际上会得到一些垃圾值。
#include <iostream>
using std::cout;
using std::endl;

int main () {

    int boardArray[49];
    int boardArrayTwo[7][7];

for (int i = 0; i < 50; ++i)
{
    boardArray[i] = i; //fills the array with ints 0 - 48 to test
}
for (int x = 0; x < 7; ++x)
{
    for (int k = 0; k < 7; ++k)
    {
            boardArrayTwo[x][k] = boardArray[x*7 + k];
            cout << boardArrayTwo[x][k] << " " << endl;
    }
}

}

好运(除非我丢脸了),这个应该能解决问题!

编辑:特别感谢Fabio!


它不会正常工作。即使使用反向运算符,他仍然将所有boardArrayTwo[x][k]的值设置为boardArray[49] - flight

0
for(int i=0; i<49; i++)
b[i]=(i+1);

int p=0;
for(int i=0;i<7;i++){
        for(int j=0;j<7;j++)
        {a[i][j]=b[p];
        p++;}
        }

除了其他错误,第三个循环也让您的代码出错。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接