0

试图运行我拥有的这段代码时我很头疼。我试图确定我输入的浮点值是否与浮点数相同。这是我的编码。

#include <iostream>
#include <string>

using namespace std;

int main()
{
    float x1, y1, x2, y2, x3, y3, percentage;
    string sym1, sym2;
    int count;

    cout<<"Enter the first fraction : ";

    do{
        cin>>x1>>sym1>>y1;

        if(x1 != float(x1) || sym1 != string(sym1) || y1 != float(y1))
        {
            cout<<"Please enter the correct fraction : ";
        }
        else if(sym1 != "/")
        {
        cout<<"Sorry. This is not a fraction. Please enter again : ";
        }
        else
        {
            break;
        }
    }while(x1 == float(x1) || sym1 == string(sym1) || y1 == float(y1));

    cout<<"Enter the second fraction : ";

    do{
        cin>>x2>>sym2>>y2;

        if(x2 != float(x2) || sym2 != string(sym2) || y2 != float(y2))
        {
            cout<<"Please enter the correct fraction : ";
        }
        else if(sym2 != "/")
        {
            cout<<"Sorry. This is not a fraction. Please enter again : ";
        }
        else
        {
            break;
        }
    }while(x2 == float(x2) || sym2 == string(sym2) || y2 == float(y2));

    x3 = x1 * x2;
    y3 = y1 * y2;

    percentage = (x3*100)/y3;

    cout<<x1<<"/"<<y1<<" and "<<x2<<"/"<<y2<<" is "<<x3<<"/"<<y3<<"\n";
    cout<<x3<<"/"<<y3<<" is "<<percentage<<"%";

    return 0;
}

我要更改的代码是这样的

    do{
        cin>>x1>>sym1>>y1;

        if(x1 != float(x1) || sym1 != string(sym1) || y1 != float(y1))
        {
            cout<<"Please enter the correct fraction : ";
        }
        else if(sym1 != "/")
        {
        cout<<"Sorry. This is not a fraction. Please enter again : ";
        }
        else
        {
            break;
        }
    }while(x1 == float(x1) || sym1 == string(sym1) || y1 == float(y1));

似乎当我输入 4 / 6 或任何其他相关的分数格式时,它读取正确。同样适用于 4 * 6,它打印出预期的输出。但是当我输入 / 6 或 6 / a 时,它进入逻辑错误,一个无限循环。它就像在 if 语句和 while 语句中的数据转换中的某个地方是错误的。还是因为使用的数据类型错误?我无法追踪问题可能是什么。有没有关于如何做到这一点的解决方案?请帮忙。先谢谢各位兄弟姐妹了。

4

1 回答 1

1

这些比较中的任何一个都无法返回 false。

if(x1 != float(x1) || sym1 != string(sym1) || y1 != float(y1))
{
    cout<<"Please enter the correct fraction : ";
}

x1并且y1是浮点数,将它们转换为浮点数不会以任何方式改变它们的值。std::string比较运算符也比较字符串的内容,所以这个比较也总是返回 true 。

您正在使用与循环条件相同的语句,这会导致无限循环。尝试只if(sym1 != "/")对这两个条件都使用(更好的是:只评估一次比较,并将结果存储在布尔值中。当您稍后更改某些内容而忘记在任何地方进行更改时,执行两次会导致错误)。

有关如何operator>>工作的更多详细信息,请参阅例如cppreference

引用:

直到 C++11:

如果提取失败(例如,如果在需要数字的地方输入了一个字母),则值保持不变并设置失败位。

从 C++11 开始:

如果提取失败,则将零写入 value 并设置 failbit。如果提取导致值太大或太小而无法容纳在值中,则写入 std::numeric_limits::max() 或 std::numeric_limits::min() 并设置故障位标志。

于 2013-09-24T05:42:17.250 回答