2012-10-29 102 views
0

以下代码是如何确认输入的数字是否在特定范围内的示例。在C编程中会做什么:++ group [(int)(value [i] +0.5)/ 10]

例如,如果我输入数字说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程序:++组[(int)的(值[I] 0.5)/ 10]

由于

+1

如果数字是10.5,该怎么办?你的范围有差距。 – Alnitak

+0

你应该对答案投票,没有人会答复未来的答案。 –

回答

0

让我们来理解它吧。

阅读++group[ (int) (value[i]+0.5)/10] as: 我想增加组数组的索引。 哪个索引? 它在某种程度上取决于用户输入的值(值[i]) 为什么添加0.5到它? 四舍五入浮点数。更具体地采取该号码的ceil() 为什么用10除? 因为你的基团是尺寸为10

示例: 用户输入11 值[I] = 11(浮点) 11 + 0.5 = 11.5(浮点) 11.5/10 = 1.15(浮点) 类型转换1.15到int = 1(INT) ++组[1],[1]加1组和显示,11个落入第1组,即10 - 19

又如: 用户输入9. 值(漂移) 9 + 0.5 = 9.5(漂移) 9.5/10 = 0.95(漂移) 类型转换0.95到int = 0 (int) ++ group [0],将group [0]增加1,并且显示9落入组0,即0 - 9 (float) 9.6/10 = 0.96(float) typecast 0.95 to int = 1(int) ++ group [1],增量组[1] ]减1,并且显示9.1落在组1中,即10- 19

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

+0

so ++ group [1]实际上是递增存储在数组的位置1中的值?那么只有这样才有可能实现? – devnp

+0

是的,它'++组[1]'递增存储在数组的位置1的值。这不是唯一的选择。如果分解解决方案,看看组1中的1是如何计算的?这样做是因为用户给出的输入是这样的。如果输入是57,则步骤将是(57 + 0.5)/ 10 = 5.75 =>类型转换为int给出5,因此++组[5]将生效。即组50-59 – aakash

+0

我希望我回答你的问题。如果您有更多问题,请随时在此输入。 – aakash

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

+0

++组[(int)(value [i] +0.5)/ 10]中的(int)的用法是什么?转换为整数? – devnp

+0

++组又是什么? – devnp

+0

@ user1504633将double转换为整数。数组不接受双倍/浮点值作为下标 –

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)。直向前。从浮子上取下部分并制造你的int。最后,假设输入实际上是在0.00和仅仅小于109.50之间,与组[]数组中匹配必要范围的计数器将递增1。底线,这是一个糟糕的机制,试图将输入值聚类到组中并在适当的范围内更新计数器,并且只要输入值> 109.50就会窒息。

+0

的值,那么最好的办法是什么?我必须定义各种范围并逐一比较它们以将它们放在适当的范围内? – devnp

+0

@ user1504633只要值[]的*输入值**被**范围检查**,它们即将用于的内容(索引到已知固定的数组中),就可以使整个事物以书面形式工作)。边界检查他们*先前*使用它们。 – WhozCraig

+0

是的,比较一些阵列会好的,但如果范围会增加,那么会有问题。 – devnp

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或负值,则会写入随机字节的内存。把这些代码扔掉或者放一些安全检查。

EDIT

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

int g = (int) (value[i]+0.5) /10] 
if (0 <= g && g < COUNT) 
    ++group[g]; 
+0

任何有关改进或逻辑的建议? – devnp

+0

是的,忽略任何超出范围的值。看我的编辑。 –

相关问题