みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

C言語 初心者です。

以下のソースの中でわからないことがあります。
詳しく説明してもらえないでしょうか?
よろしくお願いします。

#include<stdio.h>

#defineNUMBER80/* 人数の上限 */

int main(void)
{
int i,j;
int num;
inttensu[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]++;

の部分がどうなっているのかわかりません。
教えてください。

投稿日時 - 2007-08-04 17:48:26

QNo.3227307

困ってます

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

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] をインクリメントします。

投稿日時 - 2007-08-05 01:05:37

お礼

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

投稿日時 - 2007-08-05 13:17:49

ANo.3

このQ&Aは役に立ちましたか?

4人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.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 カウント・アップして人数を数えているのです。
・以上。

投稿日時 - 2007-08-04 19:46:18

お礼

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

投稿日時 - 2007-08-05 13:19:07

ANo.1

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

投稿日時 - 2007-08-04 19:12:54

お礼

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

投稿日時 - 2007-08-05 13:20:08