2017-01-09 47 views
0

在我的程序即时通讯尝试添加我的2D数组的一个子部分的值,从9乘9矩阵的3乘3的小方块。我选择这个小盒子的行和列的百分比除以3(模数3)。 (这意味着它需要像[0] [0],[0] [3]等等) 这样的单元格,我希望这些单元格是框的右上角,然后再添加2行和列以使其适用于如果我们从[0] [0]开始,我们将添加[0-2] [0-2](3乘3箱)。我通过函数来​​计算(作为使用函数的练习)。问题在于程序似乎只从该小框中获取第一个单元格的值,并且当我尝试在该小框的其余部分上循环并添加它们的值时,它不会正确地(或在所有) 我想知道如果我的参数是错误的,或者即时通讯给功能错误的参数。 任何帮助,将不胜感激。传入一个函数的一部分我的矩阵(二维数组)

//------------including section----------- 
#include <iostream> 
#include <cstdlib> 
//------------using section--------------- 
using std::cin; 
using std::cout; 
using std::endl; 
//-----our constants and variables--------- 
const int N=3; //initializing our rows and cols as constants 
int counter=0, arr[N*N][N*N]; 
int sumofrow=0, sumofcol=0,sumsquare=0; 
//-------prototypes---------------- 
void READ_MATRIX(int arr[][N*N]); 
bool issquare(int arr[][N*N],int row, int col); 
//-------main------------- 
int main() 
{ 
    //calling on the function to input our matrix 
    READ_MATRIX(arr); 

    //checking what functions returned 
    if(counter==0) 
     cout<<1; 
    else 
     cout <<0; 
    return EXIT_SUCCESS; 
} 
//-----functions-------- 
//----readmatrix------ 
void READ_MATRIX(int arr[][N*N]) 
{ 
    for (int row=0; row<N*N; row++) 
     for (int col=0; col<N*N; col++) { 
      cin >> arr[row][col]; 
      if (row%3==0&&col%3==0) 
       issquare(arr, row, col); 
     } 
} 
//---------issquare------------- 
bool issquare(int arr[][N*N],int row, int col) 
{ 
    sumsquare=0; 
    for (int r=0;r<3;r++) //trying to loop on values of array 
     for (int c=0;c<3;c++)//trying to loop { 
      //r+row(because row is passed into the function at 0,3,6) 
      //same for col. 
      sumsquare+=arr[r+row][c+col]; // this is where it goes wrong 
     } 
    //checking to see if sum reached a certain value.. 
    if (sumsquare==45) 
     return true; 
    else { 
     counter++; 
     return false; 
    } 
} 

回答

1

在接受它们之前,您正在添加值。例如,当功能READ_MATRIX()中的row = 0col = 0在您接受该3x3框下的所有值之前调用issquare()。如果您已将所有值初始化为零,则唯一对您的总和起作用的值是第一个值,即arr[0][0]

您需要做的是触发issquare()功能row = 2,4,8col = 2,4,8。在函数issquare()内部,将数组索引为arr[row-r][col-c]

+0

这是伟大的!我意识到它只是输出该小盒子中的第一个数字,但我会做出这些改变!谢谢老兄,非常感谢。 –

+1

我不认为在相同函数内将读数与属性测量('issquare')结合是一个好主意(除非这些属性对于读取更多数据很重要,这在这里不适用)。因此,应该避免这种概念混乱(阅读和测量)。 – Walter

0

您的函数issquared正在您的数组的第一个元素上调用。

>>> 0 % 3 
0 

所以你试图访问数组以外的值。 澄清:他们尚未初始化,所以他们不属于刚刚还没有(这是一个过度简化,这个问题是关于内存分配,我不知道你是否已经开始了)

更改行:

if (row%3==0&&col%3==0) 

要:

if ((row != 0 && col != 0) && (row%3 == 0 && col%3 == 0)) 

此外,我会建议做最后一个元素类似的检查只是为了确保你的小盒子在矩阵的边界内。

+1

是的,这是非常有意义的,导致我的二维数组的其余部分仍然没有初始化。谢谢!如果我改变了这一点,那么我将永远无法检查以0 0开头的2d数组的左上角!但我明白你的意思和你的帮助是赞赏! –

1

错误是issquare()被称为之前它使用的值已被分配/读取。在致电issquare()时,在该功能中使用的所有值中,只有arr[row][col]是已知的。

你要做的是首先完全读取数据,只有然后看看他们的属性。

+0

啊!你想说的是,当例如当row = 0和col = 0被传入时,只有cell [0] [0]中的值被定义,并且rest仍然没有被定义/初始化?谢谢!!这就说得通了 !! –

相关问题