Подсчет специальных предложений

#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 является дубликатом самого себя. Итак, в этом массиве из трех значений, по моим подсчетам, мы только что нашли пять дубликатов.

Общая цель поиска дубликатов в показанной программе кажется несколько неясной, но очевидно, что основная логика имеет недостатки, и ее необходимо соответствующим образом исправить. Здесь, похоже, «что-то не так с подсчетом специальных предложений».