2009-05-20 5 views
2

Я беру класс C#, и мне нужна помощь в понимании следующего кода.Нужна помощь в понимании кода

Код имеет массив, который представляет ответы на опрос, со значениями с 1 по 10.

Выходной сигнал отображает данные рейтинги и частоту, сколько раз была выбрана величина.

Следующий код из моей книги, но я изменил его только на базовый пример.

int[] responses = { 3, 2, 5, 6, 3, 5 , 4, 5, 5, 5}; 
int[] frequency = new int[7]; 


for (int answer = 0; answer < responses.Length; answer++) 
    ++frequency[responses[answer]]; 

for (int rating = 1; rating < frequency.Length; rating++) 
    Console.WriteLine(rating + ", " + frequency[rating]); 

Console.Read(); 

Как работает линия ++frequency[responses[answer]];? Если посмотреть на это, если я возьму reponses[answer] в первый раз через цикл, это будет responses[0], который будет 3, правильно? Здесь я смущаюсь, что делает эта часть линии ++frequency?

ответ

2

Он добавляет один к частоте в этом месте в массиве.

Например, частота в позиции 3 (из вашего примера) будет увеличена на единицу после выполнения этой линии.

EDIT: Таким образом, более подробно, когда answer = 0, ответы [0] = 3, поэтому частота [3] добавляется к ней.

++ также может быть очень легко в конце команды. Другими словами,

++frequency[responses[answer]]; 


одно и то же (в данном случае), как с помощью

frequency[responses[answer]]++; 
0

Это означает увеличить значение на частоте [3]. Где 3 - результат возврата ответов [ответ]. Аналогичным образом следующая итерация увеличивала бы значение на частоте [2].

5
frequency[responses[answer]] = frequency[responses[answer]] + 1; 

EDIT: Я думаю, что это довольно неясно, как написать это. Как личное предпочтение, я не люблю использовать унарные операции (++ x, x ++ и т. Д.) Для элементов с большим количеством индексов.

+0

Отсутствует кронштейн. – mwjackson

+0

исправил это, спасибо. – CookieOfFortune

2

Давайте разбить его: Как вы отмечаете, на первых ответы пропусков [ответ] будет вычисляться «3»

Так что это то выглядит ++ частота [3]

++ увеличивает значение массива по индексу 3 на 1

Прост достаточно?

Я также должен указать, что применение ++ до массива, а не после его выполнения, как выполняется инкремент (хотя это не влияет на результаты этого кода).

Например:

int n = 2; 
int j = ++n; 
int k = n++; 

Что у и к?

j будет 3, а k также будет 3. Это связано с тем, что если вы поместите ++ раньше, он сначала оценивает его.Если вы поместите его в конце, он оценит его после остальной части выражения.

1

Если это помогает, подумайте о ++ частоте [] как «frequency = frequency + 1».

Если оператор ++ приходит перед переменной, то приращение применяется до выполнения оператора. Если после этого появляется ++, тогда выполняется оператор, а затем переменная увеличивается.

В этом случае это не имеет значения, так как приращение до или после не влияет на логику.

Поскольку «ответы [ответ]» оценивается числом, эта строка кода увеличивает значение частоты в этом индексе массива. Таким образом, первый раз, ответ равен 0, поэтому ответы [ответ] равно 3, поэтому частота [3] становится увеличиваться на 1. В следующий раз частота [2] увеличивается и т. Д. И т. Д. и т. д.

1

частота - это массив, в котором все элементы инициализируются до 0 (значение по умолчанию для int). Строка ++frequency[responses[answer]] будет увеличивать частотный элемент, на который указывает целое число, найденное в responses[answer]. Помещая ++ перед частотой, элемент массива будет увеличен до того, как будет возвращено результирующее значение.

Вы можете read more about the ++ operator here.

0

Оператор ++ в C# при применении к целому числу будет увеличивать его на единицу.

Конкретная линия, на которую вы смотрите, частота представляет собой массив целых чисел с 7 элементами. Что-то путано, потому что, как вы объяснили это в своем коде, казалось бы, этот код сломался бы с любым значением в массиве ответов выше 6.

Эта проблема в сторону, в основном она увеличивает каждый индекс массива это доступ. Таким образом, в вашем примере ответы [0] будут равны 3. Таким образом, эта строка найдет значение частоты [3] и увеличит ее на 1. Так как целые массивы инициализируются всеми значениями в нуле, то после первой итерации частота [3 ] будет 1. Тогда, если бы в вашем массиве ответов было еще 3, частота [3] снова будет увеличена (т. е. ответы [4]).

Надеюсь, это вам поможет.

0

Цель фрагмента кода заключается в определении количества раз, когда каждый ответ появляется в массиве ответов. Итак, для вашего примера, частота [3] должна быть 5, частота [5] должна быть 5 и т. Д.

Итак, строка, которую вы запрашиваете, берет текущий элемент из массива ответов и увеличивает значение в частотном массиве на 1, чтобы указать, что конкретное значение наблюдалось в ответах.

После выполнения всего фрагмента кода частотный массив содержит количество раз, в течение которого каждый элемент от 0 до 7 наблюдался в массиве ответов.

1

В таких случаях часто бывает полезно переписать код при его прохождении.

Когда ответ = 0

  • ++ частота [отзывы [0]]
  • ++ частота [3], так как ответы [0] = 3
  • частота теперь выглядит следующим образом {0, 0 , 0, 1, 0, 0, 0}

Когда ответ = 1

  • ++ частота [Respo NSES [1]]
  • ++ частота [2], так как ответы [1] = 2
  • частота теперь выглядит следующим образом {0, 0, 1, 1, 0, 0, 0}

И скоро.

0

Он использует частотный массив, чтобы подсчитать, сколько раз каждый ответ был введен. Вы могли есть счетчик для каждого ответа:

int numberOfOnes = 0; 
int numberOfTwos = 0; 
// Etc... 

Но это было бы некрасиво программирование и не так легко и эффективно. Использование частотного массива позволяет не использовать блок if/else if или коммутатор и упрощает чтение кода.

Другое дело об этом частотном массиве.

int[] frequency = new int[7]; 

Это инициализирует все целые числа в массиве до 0, поэтому вы можете просто начать с приращением его вместо того, чтобы видеть, был ли это первый раз для этого конкретного ответа, а затем инициализировать его с 1 или что-то это природа.

Удачи всем, что вы C# у вас впереди.

Смежные вопросы