C++ 下面代码哪里出了问题?为什么运行结果和预期不一样?


#include<iostream>
using namespace std;
int main()
{
    int speed,limit,x;
    cin>>speed>>limit;
    if(speed>=limit*1.5)
    {
        x=(speed-limit)/limit*100;
        cout<<"Exceed "<<x<<"%.License Revoked"<<endl;
    }
    else if(speed>=limit*1.1)
    {
        x=(speed-limit)/limit*100;
        cout<<"Exceed "<<x<<"%.Ticket 200"<<endl;
    }
    else
    {
        cout<<"OK"<<endl;
    }
    return 0;
}

img

达到或超出本车道限速的10%则处200元罚款;若达到或超出50%,就要吊销驾驶证;若属于正常行驶,则输出“OK”。
输入110 100按理说应该输出else if里的语句,为什么变成OK?请问代码哪里不对?

1、if语句中,进行判断时,将limit x 1.1(1.5)转换成int型再进行比较
2、else if中应该改为speed>=limit x 1.1 && speed<=limit x 1.5吧
3、计算x的时候将数据转换为double类型再进行计算,否则结果为0
改正如下:


#include<iostream>
using namespace std;
int main()
{
    int speed, limit;
    double x;
    cin >> speed >> limit;
    if (speed >= (int)(limit * 1.5))
    {
        x = (double)(speed - limit) / limit * 100;
        cout << "Exceed " << x << "%.License Revoked" << endl;
    }
    else if (speed >= (int)(limit * 1.1) && speed <= (int)(limit * 1.5))
    {
        x = (double)(speed - limit) / limit * 100;
        cout << "Exceed " << x << "%.Ticket 200" << endl;
    }
    else
    {
        cout << "OK" << endl;
    }
    return 0;
}

整形数和浮点数比较会有问题,你可以将计算后的限速打印出来看下

这样就可以

#include<iostream>
using namespace std;
int main()
{
    double speed,limit,x;
    cin>>speed>>limit;
    if(speed*1.0>=limit*1.5)
    {
        x=(speed-limit)/limit*100;
        cout<<"Exceed "<<x<<"%.License Revoked"<<endl;
    }
    else if(speed*1.0<=limit*1.1)
    {
        x=(speed-limit)/limit*100;
        cout<<"Exceed "<<x<<"%.Ticket 200"<<endl;
    }
    else
    {
        cout<<"OK"<<endl;
    }
    return 0;
}

cout<<speed-limit*1.1<<endl;
得到 -1.42109e-14

建议改成if(speed/limit>=1.5)这种形式

#include<iostream>
using namespace std;
int main()
{
    double speed,limit,x;
    cin>>speed>>limit;
    if(speed/limit>=1.5)
    {
        x=(speed-limit)/limit*100;
        cout<<"Exceed "<<x<<"%.License Revoked"<<endl;
    }
    else if(speed/limit>=1.1)
    {
        x=(speed-limit)/limit*100;
        cout<<"Exceed "<<x<<"%.Ticket 200"<<endl;
    }
    else
    {
        cout<<"OK"<<endl;
    }
    return 0;
}

img

应该是else if(speed>=limit*1.1)这个有点问题,这里的1.1其实不是正正1.1,而是1.10000(中间好多个0)0089,其实是比1.1要大的,一般要设置一个阈值,比如0.000001,在这个误差之内的算相等