2016-09-10 2 views
-3

Мне нужна помощь, чтобы четко понять этот код, пожалуйста, помогите. Я не могу понять, как эта программа отслеживает количество чисел в массиве ответов. Я не понимаю, что происходит в цикле for и особенно этой строки ++ frequency [response [answer]];Нужна помощь в понимании этого кода C (массив)

#include<stdio.h> 
    #define RESPONSE_SIZE 40 
    #define FREQUENCY_SIZE 11 

    int main(void) 
    { 
     int answer; /* counter to loop through 40 responses */ 
     int rating; /* counter to loop through frequencies 1-10 */ 

     /* initialize frequency counters to 0 */ 

     int frequency[FREQUENCY_SIZE] = {0}; 

     /* place the survey responses in the responses array */ 

     int responses[RESPONSE_SIZE] = {1,2,6,4,8,5,9,7,8,10,1,6,3,8,6,10,3,8,2,7,6,5,7,6,8,6,7,5,6,6,5,6,7,5,6,4,8,6,8,10}; 

     /* for each answer, select value of an element of array responses 
     and use that value as subscript in array frequency to determine element to increment */ 

     for(answer = 0 ; answer < RESPONSE_SIZE; answer++){ 
      ++frequency[responses[answer]]; 
     } 

     printf("%s%17s\n", "Rating", "Frequency"); 

     /* output the frequencies in a tabular format */ 
     for(rating = 1; rating < FREQUENCY_SIZE; rating++){ 
      printf("%6d%17d\n", rating, frequency[rating]); 
     } 

     return 0; 
    } 
+0

Любой C учебник должен объяснить доступа к массиву , Этот код просто использует значение из одного массива в качестве индекса в другое. Комментарий в значительной степени говорит об этом. Может или не имеет смысла. – Robert

ответ

0

++frequency[responses[answer]] является плотным способом написания

int r = response[answer]; 
frequency[r] = frequency[r] + 1; 

с оговоркой, что frequency[r] вычисляется один раз.

Таким образом, если answer равен 0, то responses[answer] равен 1, поэтому мы добавим 1 к frequency[1].

Редактировать

В следующей таблице показано, что происходит frequency через петлю (старое значение => новое значение):

answer response[answer] frequency[response[answer]] 
------ ---------------- --------------------------- 
    0     1   frequency[1]: 0 => 1 
    1     2   frequency[2]: 0 => 1 
    2     6   frequency[6]: 0 => 1 
    3     4   frequency[4]: 0 => 1 
    ...     ...   ... 
    10     1   frequency[1]: 1 => 2 

т.д.

+0

int ответы [RESPONSE_SIZE] = {1,2,6,4,8,5,9,7,8,10,1,6,3,8,6,10,3,8,2,7,6, 5,7,6,8,6,7,5,6,6,5,6,7,5,6,4,8,6,8,10}; если ответ равен 0, тогда ответы [ответ] равны 1, поэтому мы добавляем 1 к частоте [1]. Позже мы снова сталкиваемся с номером 1 в 10-й позиции ответов. Итак, если ответ равен 10, тогда ответы [ответ] равны 1, поэтому снова добавляем 1 к частоте [1]. Таким образом, значение в частоте индекса [1] становится равным 2? правильно ? – Shateel

+0

@Shateel: см. Мое редактирование. –

+0

Понятно! Спасибо, ты классный! – Shateel

0
for(answer = 0 ; answer < RESPONSE_SIZE; answer++){ 
    ++frequency[responses[answer]];  // <--- 
} 

Это выше цикл просто подсчитывает количество раз число появляющихся в массиве responses и хранится в индексе этого числа в массиве frequency. Эта линия делает, что в первом цикле -

++frequency[responses[answer]]; 

Таким образом, он увеличивает значение по индексу responses[answer] массива frequency.

Скажем, responses[answer] имеет значение 1, тогда значение по индексу 1 массива frequency увеличивается.

Второй for цикл предназначен для вывода, как указано.