2013-10-23 79 views
3

該程序是用於計算學生標誌着頻率++ group((int)(value [i])/ 10);它有什麼作用..?用C

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.? */ 
} 
+0

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

預遞增價值是什麼呢?它調用UB。 – rightfold

+0

@沒有rightfold:關於它的未定義? – Claudiu

+0

@ShafikYaghmour:哦,真的。我或者錯過了那個,或者假設那只是爲了顯示 – Claudiu

回答

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數組之前,檢查輸入值是否在界限內或組索引是否在界限內。

+0

@ShafikYaghmour:當然,謝謝。修改以反映這一點。 – Claudiu

-1

在子表達

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

value[i]float類型的,將其除以10會給double值(後默認的提升)。但數組下標應該是整數類型,(int)用於將子表達式的返回值轉換爲整數。
在表達

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

前綴++被用於預增量數組元素group[(int)(value[i])/10)]

+2

它是pre increment.change它在你的answer.btw我沒有投下了這個。 – Gangadhar

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

讓分這

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

例如值[i]是51,作爲使用的是鑄造爲int會造成5。的group[5]

相關問題