以下代码是如何确认输入的号码是否在特定范围内的示例。
例如,如果我输入号码说n,则我想要增量计数器,该计数器说如果是:
1-1011-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 FREQUENCYNN");
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程序中会做什么: 组[(int)(value [i] 0.5)/10]
谢谢
检查组数组的索引:
[(int) (value[i]+0.5)/10]
这有效地使从控制台输入中扫描的值,添加.50,将总和除以10,然后转换为int。更好的问题是为什么完全这样做?
添加0.50是为了解决舍入。如果value[i]
在或高于0.50的Marign(例如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)。足够直截了当。杀死浮子的分数并制造您的int。
最后,假设输入实际上实际上在0.00到109.50之间,匹配组[]阵列中必需范围的计数器将被一个。
增加。底线,这是试图将输入值集中到组中并在适当范围内更新计数器更新的糟糕机制,并且一旦输入值为> 109.50。
让我们将其分解以理解它。
阅读 ++group[ (int) (value[i]+0.5)/10]
as:我想将组数组的索引增加1。哪个索引?它在某种程度上取决于用户输入的值(value [i])为什么要添加0.5?围绕浮动数。更具体地是为了获得该数字的ceil()为什么要除以10?因为您的小组的尺寸为10。
示例:用户进入11。值[i] = 11(float)11 0.5 = 11.5(浮点)11.5/10 = 1.15(浮点)Typecast 1.15 to int = 1(int) 组[1],增量组[1] by 1,表明11落入第1组,即10-19
另一个示例:用户进入9。值[i] = 9(float)9 0.5 = 9.5(浮点)9.5/10 = 0.95(浮点)打字0.95至int = 0(int) 组[0],增量组[0]以1为1,并表明9属于组0,即0-9
另一个示例:用户进入9.1。值[i] = 9.1(float)9.1 0.5 = 9.6(浮点)9.6/10 = 0.96(浮点)打字0.95至int = 1(int) 组[1],增量组[1] by 1,表明9.1属于第1组,即10-19
注意:根据代码,您的组为0-9、10-19 ...,而不是1-10,11-20
um类似的东西:
假设group[0] = 0->10, group[1] = 11->20, group[2] = 21->30..
以示例float: 10.3
在此处应用公式10.8/10 ~= 1
。因此,它在范围内 10-> 20 。
以另一个示例: 22.4
在那里应用公式(22.4 + 0.5)/10 ~= 22.9/10 = 2
。因此在20->30
范围内。等等。它将适用于high = 100
和low = 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
之间的值数量此代码是完全不安全的。如果输入值比计数器 * 10或负数更大,则将编写内存的随机字节。将此代码丢弃或将一些安全检查放入其中。
编辑
安全检查,忽略超出范围的输入值。
int g = (int) (value[i]+0.5) /10]
if (0 <= g && g < COUNT)
++group[g];