0

以下代码是如何确认输入的数字是否在特定范围内的示例。

例如,如果我输入数字说 N,那么我想要增量计数器,它表示它是否在以下范围内:

1-10 11-20 ... 91-100

Here is the code snip from one of the text book:


#define MAXVAL 50
#define COUNTER 11
main ()
{
float value[MAXVAL];
int i, low, high;
static group[COUNTER] = {0,0,0,0,0,0,0,0,0,0,0}

*/READING AND COUNTING*/

for(i=0; i<MAXVAL; i++)
{
/* READING OF VALUES*/

scanf("%f", &value[i]);

/* COUNTING FREQUENCY OF GROUPS */

++group[ (int) (value[i]+0.5)/10]  <<< I would like to understand how this will find if number is in specific ranges?

/* PRINTING OF FREQUENCY TABLE */

printf("\n");
printf(" GROUP RANGE FREQUENCY\N\N");

for(i=0; i< COUNTER; i++)
{
low = i*10;
if (i==10)
high =100;
else 
high=low + 9;
printf( " %2d %3dto%3d %d)\n", i+1, low,high,group[i]);

}

}

这在上面的 C 程序中会做什么: ++group[ (int) (value[i]+0.5)/10]

谢谢

4

4 回答 4

1

检查组数组的索引:

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

这有效地获取从控制台输入扫描的值,加上 0.50,将总和除以 10,然后转换为 int。更好的问题是为什么要这样做

加上 0.50 是为了考虑四舍五入。如果value[i]等于或高于 0.50 的余量(例如1.51, 2.50, 3.99等),这将强制它为下一个整数 ( 2.01, 3.00, 4.49)。

接下来,除以 10。这显然假设输入的值介于 0.00 和完全小于 109.50 之间。除以 10 可确保这些值介于 0.00 和 10.00 之间。一旦控制台输入大于 109.50 ,这当然不会起作用。

然后强制转换为 (int)。够直了。杀死浮点数的分数并制造您的整数。

最后,假设输入实际上介于 0.00 和完全小于 109.50 之间,匹配 group[] 数组中必要范围的计数器将加一。

归根结底,尝试将输入值分组并在适当范围内更新计数器是一种糟糕的机制,一旦输入值> 109.50,它就会阻塞。

于 2012-10-29T17:02:36.770 回答
0

嗯是这样的:

假设group[0] = 0->10, group[1] = 11->20, group[2] = 21->30.. 以浮动为例:10.3

在那里应用公式,10.8/10 ~= 1。因此它在10->20范围内。

再举一个例子:22.4

在那里应用公式,(22.4 + 0.5)/10 ~= 22.9/10 = 2。因此它在范围内20->30。等等。它适用于high = 100low = 0

于 2012-10-29T16:54:49.120 回答
0

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

  • 取浮点输入值value[i]
  • 将其四舍五入为 int(int) (value[i]+0.5)
  • 然后除以 10 得到一个组索引,然后
  • 将 1 添加++group[...]到它所属的组中。

换句话说,它正在计算介于 0..9、10..19、20..29、... 100..109、110..119 之间的值的数量

这段代码是完全不安全的。如果输入值大于 COUNTER * 10 或负数,则将写入随机字节的内存。扔掉这段代码或在其中进行一些安全检查。

编辑

安全检查,忽略超出范围的输入值。

int g = (int) (value[i]+0.5) /10]
if (0 <= g && g < COUNT)
  ++group[g];
于 2012-10-29T17:04:38.487 回答
0

让我们分解它以了解它。

++group[ (int) (value[i]+0.5)/10]作:我想将组数组的索引增加 1。哪个索引?它以某种方式取决于用户输入的值 (value[i]) 为什么要添加 0.5 呢?对浮点数进行四舍五入。更具体地说,取那个数字的 ceil() 为什么除以 10?因为你的小组是 10 人。

示例:用户输入 11。 value[i] = 11 (float) 11 + 0.5 = 11.5 (float) 11.5 / 10 = 1.15 (float) typecast 1.15 to int = 1 (int) ++group[1], 递增 group[ 1] 按 1 表示 11 属于第 1 组,即 10 - 19

另一个例子:用户输入 9。 value[i] = 9 (float) 9 + 0.5 = 9.5 (float) 9.5 / 10 = 0.95 (float) typecast 0.95 to int = 0 (int) ++group[0], 递增 group [0] 通过 1 表示 9 属于第 0 组,即 0 - 9

另一个例子:用户输入 9.1。value[i] = 9.1 (float) 9.1 + 0.5 = 9.6 (float) 9.6 / 10 = 0.96 (float) typecast 0.95 to int = 1 (int) ++group[1],将 group[1] 增加 1 并显示9.1 属于第 1 组,即 10 - 19

注意:根据代码,您的组是 0-9、10 - 19 ... 而不是 1 - 10、11 - 20

于 2012-10-29T17:11:59.653 回答