Я нахожусь в новичке 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 << "*";
}
Я знаю, что там много очистки, но я пытаюсь понять, как неправильно использовать аргумент%. Любые информационные ответы будут высоко оценены.
благодаря
Вы пытаетесь получить по модулю (остаток) percent
который объявлен/вычислен как double
. По модулю '%' символ требует, чтобы операнды были целыми числами, т.е.
op1 % op2
- как op1, так и op2 должны быть целыми числами. AFAIK не ловко крутит его, чтобы удвоить (как вы, вероятно, ожидали, что это произойдет). Вместо этого попробуйте использовать целочисленный тип/альтернативный метод.
Оператор %
modulo определен только для целых типов, а не для типов с плавающей запятой. Следовательно
percent % 1.0 < .5
не работает. Скорее всего, вы можете обойти это в этом случае:
percent - (unsigned) percent < .5
Преобразование в unsigned
избавляется от десятичной части. Вычитание этого из исходного двойника приведет только к десятичной части, которую вы, похоже, хотите.
Примечание: это не идеально и требует, чтобы percent
были положительными (или некоторые другие работы).
percent
слишком велик для целого типа unsigned
он переполнится, что приведет к неверному результату. Как общий ответ, использование fmod()
было бы лучшим решением.