【问题标题】:C++ Array Sum Values Around Coordinate围绕坐标的 C++ 数组和值
【发布时间】:2026-01-26 18:00:01
【问题描述】:

我在对下面给出的坐标周围的多维数组的值求和时遇到了一些困难。我的索引位置逻辑有问题。任何想法都会非常有帮助,如果需要更多信息,请随时问我。

#include <iostream>
#include <ctime>


using namespace std;

int main()
{
srand(time(0));

int displayArray[11][11];

    cout<<"\t\t\t\t\t\t\t\t\t\t\t\t\tColumn\n\n";
    for(int column=1;column<10;column++)
    {
        cout<<"\t "<<column;
    }
    cout<<"\n\n";
    //fill array with random numbers

    for(int i=0;i<9;i++)
    {
        for(int m=0;m<9;m++)
        {
            displayArray[i][m]=rand()%10;
        }
    }

    cout<<"\n\n\n";

    //main data printout

    for(int k=0;k<9;k++)
    {
        cout<<"Row "<<k+1<<"\t ";

    for(int l=0;l<9;l++)
    {
        cout<<displayArray[k][l]<<"\t";
    }
    cout<<endl<<endl;
    }

    cout<<"\n\n";

    int row=0, column=0;
    cout<<"What array cell would you like to see? (Press enter after each entry)\n";
    cout<<"Row = ";
    cin>>row;
    cout<<"Column = ";
    cin>>column;
    cout<<"\nThe number "<<displayArray[row-1][column-1]<<" is in cell "<<row<<","<<column;

    int coord1=displayArray[row-2][column+2],
        coord2=displayArray[row+2][column+2],
        coord3=displayArray[row-2][column-2],
        coord4=displayArray[row-2][column+2],
        coord5=displayArray[row-2][column+2],
        coord6=displayArray[row-2][column+2],
        coord7=displayArray[row-2][column+2],
        coord8=displayArray[row-2][column+2];

    int sum=coord1+coord2+coord3+coord4+coord5+coord6+coord7+coord8;

    cout<<"\n\nThe sum of the cells surrounding "<<row<<","<<column<<" is "<<sum;

    cin.get();
    cin.get();


return 0;
}

【问题讨论】:

  • 究竟是什么问题?

标签: c++ visual-c++ multidimensional-array indexing


【解决方案1】:

您的问题可能是您使用 row/column -2 和 row/column +2 作为相邻方向,这是不正确的。如果 (row-1, col-1) 是您当前的单元格,那么您需要 row/col -2 和 row/col +0。

int coord1=displayArray[row-2][column-2],
    coord2=displayArray[row-2][column-1],
    coord3=displayArray[row-2][column],
    coord4=displayArray[row-1][column-2],
    coord5=displayArray[row-1][column],
    coord6=displayArray[row][column-2],
    coord7=displayArray[row][column-1],
    coord8=displayArray[row][column];
int sum=coord1+coord2+coord3+coord4+coord5+coord6+coord7+coord8;

但是,这可以通过更多的编程方式完成:

int sum = 0;
for (int x=row-2; x<=row; x++) {
    for (int y=column-2; y<=column; y++) {
        if ((x != row-1) || (y != column-1)) { //Avoids "center" cell (self)
            sum += displayArray[x][y]
        }
    }
}

【讨论】:

    【解决方案2】:

    您的错误是将基于 0 的索引转换为基于 1 的索引。数组是基于 0 的。您让他们输入基于 1 的行。然后你想在它周围添加 8 个数字。如果他们输入了基于 0 的数字并输入了 N,那么您需要为每一行/列求和 [n-1]、n 和 n+1。要处理基于 0 的问题,您需要执行 n-2、n-1 和 n。但是你正在做 n-2 和 n+2。您也没有在靠近右侧的任何地方计算行的中间。

    最好的做法甚至不是那样做数学。就是读入行号/列号,然后立即减1,以0为基数,从此以0为基数处理。

    【讨论】:

      【解决方案3】:

      所以如果我理解正确的话,用户输入一个行号和列号,对应于位于displayArray[row-1][column-1]中的值

      因此,该单元格周围的坐标应该是。

      displayArray[row][column]
      displayArray[row-1][column]
      displayArray[row-2][column]
      displayArray[row][column-1]
      displayArray[row-2][column-1]
      displayArray[row][column-2]
      displayArray[row-1][column-2]
      displayArray[row-2][column-2]
      

      我不确定您使用坐标的确切原因,但这是您的问题。

      此外,如果用户选择数组边界上的单元格,您还需要确保程序不会崩溃。 eg: 如果你尝试在单元格(0,0)周围搜索坐标,程序在尝试加载displayArray[-1][-1]的值时会崩溃

      【讨论】:

      • 谢谢,您建议如何防止崩溃?
      • 最简单的方法是使用 if 语句。首先将所有坐标声明为等于 0,然后在为其赋值之前使用 if 语句。例如:if (column &gt;= 2 &amp;&amp; row &gt;= 2) { //assign coordinate values} 然后你需要更多的 if 语句来捕获列是否大于 2,而不是行等。老实说,代码返工会很好(Southpaw Hare 提供了一个很好的例子),但你可以这样做这个也是。
      • 感谢您的建议。
      • 没问题!祝你编码好运:)