#c #arrays
#c #массивы
Вопрос:
// кто-нибудь может сказать мне, что и где я делаю неправильно с подсчетом специальных предложений.
int countSpecials(int arr[], int sizeof_array, int K)
{
int f = floor(sizeof_array/K), count = 0;
int pr =0; // to find how many times prop == f
int prop; // to campare with f
// Your code here
for(int i = 0 ; i < sizeof_array; i ){
prop = 0;
for(int j = 0 ; j < sizeof_array; j ){
if(arr[i] == arr[j])
prop ;
}
if(prop == f)
pr ;
}
if(prop == 1)
count = 0;
else if(prop >1)
count = f;
return count;
}
Комментарии:
1. что должен делать код, что он делает вместо этого? Почему вы думаете, что что-то не так?
2.
std::map
кажется лучше, если вы хотите подсчитать частоты.3. Как правило, если наилучшими именами для переменных, которые вы можете придумать, являются «f», «pr» и «prop», и вам нужны комментарии, чтобы объяснить себе, для чего они хороши, вы на самом деле не знаете, для чего они хороши.
4. Ваша функция возвращает либо 0, либо
floor(sizeof_array/K)
, и выбор зависит только от последней итерации цикла.5. @molbdnilo Учитывая
your code here
комментарий, у меня ужасное ощущение, что эти имена переменных не были выбраны постером.
Ответ №1:
В показанном коде есть ряд очевидных проблем.
int f = floor(sizeof_array/K);
Оба sizeof_array
и K
являются целыми числами. Итак, это целочисленное деление, а в C результатом целочисленного деления является целое число, а остаток выбрасывается.. Преобразование целого числа в значение с плавающей запятой для его передачи floor()
всегда преобразует целое число. floor()
всегда получает целое число, абсолютно ничего не делает, и результат преобразуется обратно в целое число. Это не дает абсолютно ничего полезного. Это совершенно не нужно использовать floor()
в первую очередь. int f=sizeof_array/K;
будет работать одинаково хорошо.
for(int i = 0 ; i < sizeof_array; i ){
prop = 0;
for(int j = 0 ; j < sizeof_array; j ){
if(arr[i] == arr[j])
prop ;
}
Цель этой логики, по-видимому, состоит в том, чтобы найти повторяющиеся значения в массиве. Причина этого несколько неясна, но эта логика кажется явно ошибочной.
Рассмотрим массив только с одним значением: arr[]={5};
. Приведенная выше логика найдет дубликат, когда i
равно 0 и j
равно 0. Как внутренний, так и внешний цикл for повторяются по всему массиву. Единственное сравнение выполняется с обоими i
и j
и 0, что обнаруживает повторяющееся значение. После, разве вы не согласны с тем, что с i
и j
равны 0 arr[i]
и arr[j]
равны друг другу? У нас должен быть дубликат!
Рассмотрим массив, содержащий всего три значения: arr[]={5, 1, 5}
. Внешний for
цикл будет начинаться с i
0 . Когда j
есть оба 0
и 2
, приведенная выше логика найдет дубликат.
Но когда i
достигает значения 2
, и начинается внутренний цикл, и j
0
снова и 2
снова это будет еще один дубликат. Теперь здесь есть четыре дубликата. И, конечно же, 1
является дубликатом самого себя. Итак, в этом массиве из трех значений, по моим подсчетам, мы только что нашли пять дубликатов.
Общая цель поиска дубликатов в показанной программе кажется несколько неясной, но очевидно, что основная логика имеет недостатки, и ее необходимо соответствующим образом исправить. Здесь, похоже, «что-то не так с подсчетом специальных предложений».