【问题标题】:Comparing Doubles and Chars in C++比较 C++ 中的双精度和字符
【发布时间】:2014-02-26 14:01:00
【问题描述】:

我正在尝试用 C++ 编写一个简单的程序,它读取未指定数量的标记,然后一旦用户输入字符“q”,程序必须计算并显示平均标记。但是我遇到了一些麻烦。我采用的方法是将每个值保存为双精度值,我想将双精度值与字符 'q' 进行比较,如果它们是相同的字符,则结束循环,计算并显示平均值。

但是我认为标记的char 值'q' 和double 值之间的比较似乎无法比较。当我使用整数值作为标记但似乎没有加倍时,这对我有用。任何帮助,将不胜感激。

代码如下:

int main()
{
    cout << "Please enter any number of marks. Enter 'q' to stop." << endl;
    double total = 0;
    int counter = 0;
    bool repeat = true;
    do
    {
        double mark;
        cin >> mark;

        if (mark != 'q')
        {
            total += mark;
            counter++;
        }
        else
        {
            repeat = false;
        }

    }
    while (repeat == true);

    double average = total/counter;
    cout << "Average: " << average << endl;

    return 0;
}

【问题讨论】:

  • 确实不是我的首选解决方案,但您可以在阅读标记之前执行if (std::cin.peek() == 'q')
  • 酷,谢谢。如果这不是您的首选解决方案,您会推荐什么?
  • @chris 我认为您应该将其发布为答案,这种情况是此方法存在的目的(istream::peek)。
  • 先读取字符串,与q比较。如果不是q,则将字符串转换为double。 atof(aString.c_str())
  • @Cthulhu,它很快,但它错过了很多可能的捕获错误的机会。例如,前导空格(包括剩余的换行符)不会被丢弃,并且输入 quick 将被视为 q。阅读字符串确实可能是确保你得到你想要的东西的最好方法。

标签: c++ char double


【解决方案1】:

您需要将标记变量更改为字符串,然后将其与“q”进行比较,否则尝试将其解析为数字。

否则整个代码没有多大意义,因为 ASCII 中的 'q' 是 113,我猜这是一个可能的值

【讨论】:

  • 我意识到这一点,但我在想一个介于 0 和 100 之间的标记。无论如何,你会建议我如何解析一个数字?
  • @JamesAllingham, std::stod 如果你有的话。
  • 你需要先做一些健全性测试,但一般来说,你可以使用“atoi(str.c_str());”
  • 请注意,“atoi”将返回数字,直到解析失败,例如“100Rg32”将返回100
【解决方案2】:

Typecast double to int 然后比较,它必须工作,因为它比较字符的 ASCII 值

代码如下:

 int main()
{
cout << "Please enter any number of marks. Enter 'q' to stop." << endl;
double total = 0;
int counter = 0;
bool repeat = true;
do
{
    double mark;
    cin >> mark;

    if ((int)mark != 'q')
    {
        total += mark;
        counter++;
    }
    else
    {
        repeat = false;
    }

}
while (repeat == true);

double average = total/counter;
cout << "Average: " << average << endl;

return 0;
}

【讨论】:

    【解决方案3】:

    您不能将 double 类型转换为 char。您可能需要使用将字符串 (char*) 转换为双精度的其他 c++ 库函数。有不同的方法可以做到这一点。 试试这个:

    #include <iostream>
    #include <sstream>
    using namespace std;
    int main()
    {
        cout << "Please enter any number of marks. Enter 'q' to stop." << endl;
        double total = 0;
        int counter = 0;
        bool repeat = true;
        do
        {
            char userinput[8];
            cin >> userinput;
    
    
        std::stringstream ss;
        double mark;
    
            if (userinput[0] != 'q')
            {
                ss << userinput;
                ss >> mark;
                total += mark;
                counter++;
            }
            else
            {
                repeat = false;
            }
    
        }
        while (repeat == true);
    
        double average = total/counter;
        cout << "total : " << total  << " count : " << counter << endl;
        cout << "Average: " << average << endl;
    
        return 0;
    }
    

    【讨论】:

    • 谢谢,我用过stringstream,效果很好。
    【解决方案4】:

    你做错了。如果您尝试将cinchar 转换为double 变量,则输入char 将保留在输入缓冲区中,而double 变量将保持不变。所以这会以无限循环结束。

    如果您真的希望用户输入char 来结束输入,您需要将整个输入放在一个字符串变量中。检查q 的字符串。如果不存在,请使用 atof() 将其转换为双精度。

    【讨论】:

      猜你喜欢
      • 2015-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-05
      • 1970-01-01
      • 1970-01-01
      • 2023-03-11
      相关资源
      最近更新 更多