• ベストアンサー

C言語 初心者です。

以下のソースの中でわからないことがあります。 詳しく説明してもらえないでしょうか? よろしくお願いします。 #include <stdio.h> #define NUMBER 80 /* 人数の上限 */ int main(void) { int i,j; int num; int tensu[NUMBER]; int bunpu[11] = {0}; printf("人数を入力してください。:"); do{ scanf("%d",&num); if (num < 0 || num > NUMBER) printf("\a要【1以上%d以下】:", NUMBER); }while (num > 0 || num < NUMBER); puts("点数を入力してください。"); for (i = 0; i < num; i++){ printf("%2d番:", i + 1); do { scanf("%d",&tensu[i]); if (tensu[i] < 0 || tensu[i] > 100) printf("\a要 【0以上100以下】:"); }while (tensu[i] < 0 || tensu[i] > 100); bunpu[tensu[i] / 10]++; } 上記のソースの中の bunpu[tensu[i] / 10]++; の部分がどうなっているのかわかりません。 教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • otaks
  • ベストアンサー率33% (11/33)
回答No.3

0~9 10~19 20~29 30~39 40~49 50~59 60~69 70~79 80~89 90~99 100 上記の各点数領域に何人いるかを、 配列bunpuに格納したいようです。 (後で使うんでしょうね) bunpu[tensu[i] / 10]++; この式が実行された時には、まず tensu[i] / 10 が実行されます。 tensu[i] はint型、10もint型なので、評価値はint型になります。 よって、小数点以下切捨てです。 上の各領域に照らし合わせると、 tensu[i]     |  tensu[i] / 10 ------------------------------------------ 0~9      |  0 10~19    |  1 20~29    |  2 30~39    |  3 40~49    |  4 50~59    |  5 60~69    |  6 70~79    |  7 80~89    |  8 90~99    |  9 100       |  10 となります。 (tensu[i] / 10の値は 0 ~ 10 になるのでbunpuは要素数が 11個必要になるのですね。はじめ見たときには分かりませんでした) 例えば tensu[i] が 89 であれば、tensu[i] / 10 は 8 となり bunpu[tensu[i] / 10]++; は、bunpu[8]++; になります。 後は、bunpu[8]++; ですが、これは普通の変数をインクリメント しているのと同じように、bunpu[8] をインクリメントします。

hatenan114
質問者

お礼

丁寧な回答ありがとうございます。 すごくわかりやすいです。 またお願いいたします。

その他の回答 (2)

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.2

★配列部分として解説。 >bunpu[tensu[i] / 10]++;  ↑  上の1行を下の2行に書き換えると  n = (tensu[i] / 10); // 点数を10で割る(0,10,20,30点…を0,1,2,3…にして n へセット)  bunpu[ n ] += 1; // 分布(bunpu[11])の配列に +1 カウント  となります。  書き換えただけですので同じ処理です。n は一時変数。 ・これにより  bunpu[0] が 0~ 9点の人数  bunpu[1] が 10~19点の人数  bunpu[2] が 20~29点の人数  bunpu[3] が 30~39点の人数  bunpu[4] が 40~49点の人数  bunpu[5] が 50~59点の人数  bunpu[6] が 60~69点の人数  bunpu[7] が 70~79点の人数  bunpu[8] が 80~89点の人数  bunpu[9] が 90~99点の人数  bunpu[10] が 100点の人数  を表すようになります。 ・宣言で bunpu[11] となっているのは 100点の場合を考えてのことです。  do-while で 0以下や100以上をループしているため tensu[i] には 0~100 の数値が  安全に入っています。これを 10 で割ると 0~10 になります。この数を bunpu[] 配列の  添え字に使って +1 カウント・アップして人数を数えているのです。 ・以上。

hatenan114
質問者

お礼

回答有難うございます。 なんとなくわかった気がします。 もう一度解読してみます。 またよろしくお願いします。

  • maku_x
  • ベストアンサー率44% (164/371)
回答No.1

かいつまんで言いますと、(テストの)点数が、それぞれ 0~9点 10~19点 20~29点 30~39点 40~49点 50~59点 60~69点 70~79点 80~89点 90~99点 100点 の範囲の中に何人居るかということを数えているのです。

hatenan114
質問者

お礼

回答していただきありがとうございます。 またよろしくお願いします。

関連するQ&A