Недопустимые операнды типов 'double' и 'double' [duplicate]

0

Я нахожусь в новичке c++. В настоящее время мы работаем над проектом, который будет подсчитывать количество раз каждый символ алфавита в фразе, которую вводит пользователь. Программа выводит все на таблицу (слева направо: буква | количество вхождений |%, которое имеет конкретный символ от всей фразы | гистограмма, представляющая процент до ближайшего процента)

This is THE most pernicious,
puzzling programming project yet,
but at least we can work in pairs.
^D
A         5       6.4%   ******
B         1       1.3%   *
C         3       3.8%   ****
D         0       0.0%

И так далее.

Я запускаю ошибку с недопустимыми операндами типов double и double для двоичного оператора%

Я понимаю, что это связано с оператором% в моем коде, но я не совсем уверен, что понимаю, как я использую его неправильно и могу ли я получить какое-то объяснение.

Ниже приведена следующая функция:

void printchar ( const char s[], int length, double freq[], const char letters[ )
    int j = 0;
    int i = 0;
    double percent = freq[i]/length;
    for ( i = 0; i < 26; i++ )
    {
          cout << letters[i] << setw(5) << freq[i] << setw(5)
               << setprecision(1) << fixed << percent;
          if(percent % 1.0 < .5)
                cout << "*";
          for( j = 0; j <= percent; j++)
                cout << "*";
     }

Я знаю, что там много очистки, но я пытаюсь понять, как неправильно использовать аргумент%. Любые информационные ответы будут высоко оценены.

благодаря

  • 0
    Помимо ответов, обратите внимание, что процент должен рассчитываться для каждого символа, поэтому он должен находиться внутри цикла for.
Теги:
function
compiler-errors
operands

2 ответа

0

Вы пытаетесь получить по модулю (остаток) percent который объявлен/вычислен как double. По модулю '%' символ требует, чтобы операнды были целыми числами, т.е.

op1 % op2 - как op1, так и op2 должны быть целыми числами. AFAIK не ловко крутит его, чтобы удвоить (как вы, вероятно, ожидали, что это произойдет). Вместо этого попробуйте использовать целочисленный тип/альтернативный метод.

0

Оператор % modulo определен только для целых типов, а не для типов с плавающей запятой. Следовательно

percent % 1.0 < .5

не работает. Скорее всего, вы можете обойти это в этом случае:

percent - (unsigned) percent < .5

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

Примечание: это не идеально и требует, чтобы percent были положительными (или некоторые другие работы).

  • 0
    Помните, что если percent слишком велик для целого типа unsigned он переполнится, что приведет к неверному результату. Как общий ответ, использование fmod() было бы лучшим решением.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню