2012-10-29 29 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

是的,忽略任何超出範圍的值。看我的編輯。 –

相關問題