【问题标题】:Invalid operands of types 'double' and 'double' [duplicate]“double”和“double”类型的无效操作数[重复]
【发布时间】:2014-11-19 00:26:25
【问题描述】:

我正在上初学者的 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 << "*";
     }

我知道有很多清理工作要做,但我想弄清楚我是如何错误地使用 % 操作数的。任何内容丰富的回复将不胜感激。

谢谢

【问题讨论】:

  • 除了给出的答案之外,请注意必须为每个字符计算百分比,因此它需要在 for 循环内。

标签: c++ function compiler-errors operands


【解决方案1】:

您正在尝试使用声明/计算为 doublepercent 获得模(余数)。模 '%' 符号要求操作数是整数,即

op1 % op2 - op1 和 op2 都需要是整数。 AFAIK 它并没有巧妙地将其舍入翻倍(正如您可能期望的那样)。尝试使用整数类型/替代方法。

【讨论】:

    【解决方案2】:

    % 模运算符只为整数类型定义,不为浮点类型定义。因此

    percent % 1.0 < .5
    

    不起作用。在这种情况下,您很可能可以通过以下方式解决它:

    percent - (unsigned) percent < .5
    

    unsigned 的转换去掉了小数部分。从原始双精度数中减去它只会导致您似乎想要的小数部分。

    注意:这并不完美,需要percent 是积极的(或更多工作)。

    【讨论】:

    • 请注意,如果percent 对于unsigned 整数类型来说太大,则会溢出,导致结果不正确。作为一般答案,using fmod() 将是一个更好的解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-24
    • 1970-01-01
    • 2018-10-25
    • 1970-01-01
    相关资源
    最近更新 更多