C言語のプログラムでおかしな動作をするのですが教えて頂けないでしょうか?
VisualStudio2008使用しています。
問題は、サイコロを200回振ってその出た目の数の個数分*を表示するプログラムです。
サイコロの目はランダムで出しています。
次のプログラムは正常に動作するものです。
/*
#include <stdio.h>
#include<stdlib.h>
#include<time.h>
#define N 200
int DICE(int min,int max);
int main()
{
int n,i,j;
int y[7]={0};
srand((unsigned int)time(NULL));
for(i=0;i<N;i++){
n=DICE(1,6);
y[n]++;
}
for(i=1;i<7;i++){
printf(" %2d: ",i);
for(j=0;j<y[i];j++){
printf("*");
}
printf("\n");
}
return 0;
}
int DICE(int min,int max)
{
return min+(int)(rand()*(max-min+1.0)/(1.0+RAND_MAX));
}
*/
次のプログラムが問題で、授業で先生が配列にはstaticをおまじないとしてつけないと暴走すると言われたので、つけて見ると明らかに間違ってると思われるプログラムで動作するのですが原因を教えて頂けないでしょうか?
以下問題のプログラム!
配列の前にstaticをつけたら、添え字をいくつにしても正常に動作します。普通は添え自分しか領域って確保されないですよね???
/*
#include <stdio.h>
#include<stdlib.h>
#include<time.h>
#define N 200
int DICE(int min,int max);
int main()
{
int n,i,j;
//以下が問題の配列宣言
static int y[2]={0};
srand((unsigned int)time(NULL));
for(i=0;i<N;i++){
n=DICE(1,6);
y[n]++;
}
for(i=1;i<7;i++){
printf(" %2d: ",i);
for(j=0;j<y[i];j++){
printf("*");
}
printf("\n");
}
return 0;
}
int DICE(int min,int max)
{
return min+(int)(rand()*(max-min+1.0)/(1.0+RAND_MAX));
}
質問の意味が正確に伝わらなかった場合は補足しますので、ご回答よろしくお願いします。
補足
わかりやすい説明で、ほぼ理解することができました。 i i+1 j j<i+1 処理 --------------------------- 0 1 0 true *を表示 ←(1) 0 1 1 false for(j)を抜ける(そして改行) for(i)でiを++する。 1 2 0 true *を表示 ←(2) 1 2 1 true *を表示 1 2 2 false for(j)を抜ける(そして改行) ・ ・ ・ わからない点があるのですが、←矢印で 示している部分になります。 (1)では、初期値がi=0 , j=0なので *は一つだけ表示されるのはわかります。 (2)で、「1 2 0 true *を表示」の部分において j=0となっていますが、「0 1 1 false for(j)を抜ける」になるとjはインクリメントされ、 初期値が j=1となり、j=0にはならなく、*が表示されないと 思われます。 何故「0」があるのかを教えて頂けませんか。