3

该程序用于计算学生的分数频率

float value[50];
int group[11] = {0};

for (i = 0; i < 50; i++) {

    scanf("%f",&value[i]); /* reading of values */

    ++group[(int)(value[i])/10)]; /* what does this line do.? */
}
4

3 回答 3

6

这一行:

++group[(int)(value[i]) / 10)];

是相同的:

int flooredValue = (int)value[i];   //e.g. 3.5 becomes 3; 12.6 becomes 12
int groupIndex = flooredValue / 10; //division discarding the remainder
group[groupIndex] += 1;

但这意味着什么?好吧,这就是它最终转换值的方式:

value[i]  |  groupIndex
----------+------------
3.5       |  0
12.6      |  1
18.6      |  1
23.1      |  2
57        |  5
94.6      |  9
100       |  10

所以它最终计算有多少标记落入每个 10 的桶中。从 0 到 9.9999 的分数落在“0”桶中,从 10 到 19.99999 的分数在“1”桶中,等等。但请注意以下几点:

value[i]   |  groupIndex
-----------+------------
-3.5       |  -3
155.6      |  15

就像现在一样,您的输入肯定会小于零或大于 100。如果发生这种情况,您将写入group. 这将导致非常不愉快的行为。group在索引到数组之前检查输入值是否在界限内或组索引是否在界限内。

于 2013-10-23T18:56:05.670 回答
1
 ++group[(int)(value[i])/10)];  

让我们分开这个

1. (int)(value[i])/10)

例如 value[i] 为 51,当您使用转换为 int 时,它将产生 5。

2. ++group[5]; // is same as group[5] += 1;

的预递增值group[5]

于 2013-10-23T18:58:25.193 回答
-1

在子表达式中

(int)(value[i])/10)

value[i]是 type float,将其除以10将给出double值(在默认提升之后)。但是数组下标应该是整数类型,(int)用于将子表达式的返回值强制转换为整数。
在表达

++group[(int)(value[i]) / 10)];   

前缀++用于预递增数组元素group[(int)(value[i])/10)]

于 2013-10-23T18:53:35.010 回答