2017-01-09 13 views
0

私のプログラムでは、私の2次元配列の下位部分の値を追加しようとしています。私は行と列の3%(モジュラス3)で小さなボックスを選択しています。 (0 [0]、[0] [3]などのようなセルを使用することを意味する) これはボックスの右上に配置して、私たちが[0] [0]で開始した場合、[0-2] [0-2](3x3ボックス)を追加します。私はそれを関数を使って計算しています(関数を使う練習として)。問題は、プログラムがその小さなボックスから最初のセルの値だけを取り込むように見えることです。その小さなボックスの残りの部分をループしてその値を追加しようとすると、値が正しく取得されませんすべて) 私のパラメータが間違っているかどうか、あるいは関数に間違ったパラメータを与えているかどうかを知りたい。 ご協力いただければ幸いです。私の行列(2次元配列)の一部に関数を渡す

//------------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

thats great !!その小さな箱に最初の数字だけを出力していることに気がついたが、私はそれらの変更を行うだろう!!ありがとう、非常に感謝します。 –

+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

私の2次元アレイの残りの部分がまだ初期化されていないので、完璧な意味合いがあります。ありがとう!私がそれを変更すると、私は決して0で始まる2次元配列の左上隅をチェックすることができません!しかし、私はあなたが何を意味したのか理解しています。 –

1

は、の前にと呼ばれ、使用される値は割り当てられている/読み込まれています。 issquare()の呼び出しでは、その関数で使用されるすべての値のうち、arr[row][col]のみが未知です。あなたがしなければならない何

最初が完全にデータを読み、そのプロパティでのみその後、見ることです。

+0

ああ!あなたが言うことは、例えばrow = 0とcol = 0が渡されたときに、cell [0] [0]のその値だけが定義され、restがまだ定義/初期化されていない場合です。ありがとう!!それは理にかなっている !! –