2011-07-09 6 views
0

次のプログラムは、(CINからの読み取り)、次の入力をFEADです:なぜ我々は配列でシンクしていない何かの中にいるのですか?

1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 

出力は驚くべきことである:

1 1 1 2 2 1 1 1 1 1 1 1 1 1 1 1 

#include<iostream> 
using namespace std; 
int main() 
{ 
    int arey[3][3]; 
    int i,j; 
    for(j=0;j<=3;j++) 
    { 
     for(i=0;i<=3;i++) 
     { 
      cin>>arey[j][i]; 
     } 
    } 
    arey[0][0]=1; 
    arey[3][3]=1; 
    i=0,j=0; 
    for(j=0;j<=3;j++) 
    { 
     for(i=0;i<=3;i++) 
     { 
      cout<<arey[j][i]; 
     } 
    } 
    return 0; 
} 

誰かが私は同じ出力を得るために変更すべきかを説明することができます入力?

+1

あなたの質問が何であるかは明確ではありません。 – Mat

+0

@Mat:Qはなぜプログラムが目的の出力を出力しないのかと思いますが、@ Melik4は問題の前提を明確に示しています。 –

答えて

1

配列は0ベースのインデックスを使用するので、あなたの

int arey[3][3];

のためのインデックスの有効範囲だから、厳密に<であるためにあなたのforループで条件を変更する0 <= i < 30 <= j < 3

を必要としています<=

+0

私たちがこれにコードを変更すると、bshieldsはExtremeループになります。 – Melik4

+0

あなたはそれが何を意味するのか分かりませんが、入力データを見てみると、ループのインデックスが正しく、配列の宣言が間違っているようです。あなたは16の入力値を持っているので、あなたの配列を4x4として宣言する必要があります。ループインデックスだけを残しておくことができます(これを書くもっと一般的な方法は 'i <= 3'ではなく' i <4'です) – bshields

+0

ohhhhhhhhhhh!ごめんなさい!間違いがありました...ありがとう... – Melik4

6

マトリックスは3x3または4x4ですか?

あなたは3×3を作成したが、ループは4つの要素のために実行します。また、更新[3] [3]

基本的にはあなたのインデックスオーバーフロー、あなたは、マトリックス内の異なるセルを上書きします。

更新は:あなたの入力、使用をcheecked:int arey[4][4];

+0

はい。私は3x3を意味する...そして私は16の数を意味する。 – Melik4

+0

3 * 3 == 9個。あなたが16を望むなら、4 * 4が必要です。 – Mat

+0

私たちは16個の数字しか必要としないので、[4] * [4]に変更すると25個の数字を入力する必要があります。 – Melik4

1

私は本当に私はあなたの質問を理解してないと思うが、これは間違っている:

int arey[3][3]; 
... 
for(j=0;j<=3;j++) // <= invalid 
... 
array[3][3]=1; // out of bounds 

arey3*3配列です。 arey[3][?]にアクセスすることはできませんが、範囲外です。有効なインデックスは0..2です。

アレイの境界を超えて書いたら、プログラムの動作は未定義になります。

関連する問題