【问题标题】:Car simulator - Infinite loop汽车模拟器 - 无限循环
【发布时间】:2015-11-24 03:08:51
【问题描述】:

我正在创建一个汽车模拟器程序,运行它时出现无限循环。我加了一个休息;在while循环结束时,但它只显示里程:1 - 燃料水平:15。我还注意到在无限循环中,燃料水平没有改变它只是保持在15。我查看了我的代码并试图调试它,但我似乎找不到它。任何帮助是极大的赞赏。谢谢你

更新:它现在运行良好。燃油油位从 15 开始下降,但里程从 1 开始增加到 15,这是不正确的,有什么想法吗?
里程表可以存储的最大里程为 999,999 英里。当超过此数量时,里程表会将当前里程重置为 0。
每行驶 **24 英里
,它应该将 FuelGauge 对象的当前燃料量减少 1 加仑。 (该车的燃油经济性为每加仑 24 英里。)
模拟给汽车加满燃料,然后运行一个循环来增加里程表,直到汽车用完燃料。在每次循环迭代期间,打印汽车的当前里程和燃料量。

        //While loop and display 
        while (fuelG.getCurrentAmtFuel() > 0)
        {
            odm.incrementCurrentMileage();
            cout << "Mileage: " << odm.getCurrentAmtMiles() << endl;
            cout << "Fuel Level: " << fuelG.getCurrentAmtFuel() << " gallons" << endl;
            break;
        }

虽然现在是循环:

while (fuelG.getCurrentAmtFuel() > 0)
    {
        odm.incrementCurrentMileage();
        cout << "Mileage: " << odm.getCurrentAmtMiles() << endl;
        cout << "Fuel Level: " << fuelG.getCurrentAmtFuel() << " gallons" << endl;
        fuelG.decrementFuelTank();
    }

    //FuelGauge.h
    #ifndef FUELGAUGE_H
    #define FUELGAUGE_H
    using namespace std;
    class FuelGauge
    {
        private:
            int currentAmtFuel; //Holds current amount of fuel 

        public:
            FuelGauge (int gallons) // Current amount of fuel in gallons 
            {
                currentAmtFuel = gallons;
            }

            FuelGauge(); //Constructor 

            int getCurrentAmtFuel () //Gets the current amount of fuel and returns it 
            {
                return currentAmtFuel;
            }

            void incrementFuelTank() //Increments the fuel tank 
            {
                if (currentAmtFuel < 15)
                {
                    currentAmtFuel++;
                }
            }

            void decrementFuelTank() //Decrements the fuel tank 
            {
                if (currentAmtFuel > 0)
                {
                    currentAmtFuel--;
                }
            }
    };

    #endif

//Odometer.h
#include "FuelGauge.h"


#ifndef ODOMETER_H
#define ODOMETER_H
class Odometer
{
    private:
        int currentAmtMiles; //Holds current amount of miles 
        FuelGauge *fuelG; //Creates fuelG under FuelGauge
        //FuelGauge *f;

    public:
        Odometer(int miles, FuelGauge *f) //odometer function 
        {
            currentAmtMiles = miles;
            fuelG = f;
        }

        int getCurrentAmtMiles () //Function to get the amount of miles 
        {
            return currentAmtMiles;
        }

        void incrementCurrentMileage() //Increment mileage function 
        {
            if(currentAmtMiles < 999999)
            {
                currentAmtMiles++;
            }
            else 
                currentAmtMiles = 0;
        }


};

#endif

【问题讨论】:

  • 您可以使用调试器单步执行以查看卡住的位置。另外,请尝试发布一个 minimal 示例。
  • 您的工作流程中是否有任何减少 FuelGauge::currentAmtFuel 的内容?我看不到任何执行此操作的代码。因此,currentAmtFuel 永远不会达到 0,并导致无限循环。
  • 你永远不会调用decrementFuelTank(),所以它永远不会为0。

标签: c++ class infinite-loop


【解决方案1】:

函数Odometer::incrementCurrentMileage() 不会减少FuelGuage 中的燃料。我假设您希望它调用fuelG-&gt;decrementFuelTank)

【讨论】:

    【解决方案2】:

    这个循环:

    while (fuelG.getCurrentAmtFuel() > 0) {
        odm.incrementCurrentMileage(); cout << "Mileage: " << odm.getCurrentAmtMiles() << endl;
        cout << "Fuel Level: " << fuelG.getCurrentAmtFuel() << " gallons" << endl; 
        break;
    }
    

    应该是:

    while (fuelG.getCurrentAmtFuel() > 0) {
        odm.incrementCurrentMileage(); cout << "Mileage: " << odm.getCurrentAmtMiles() << endl;
        cout << "Fuel Level: " << fuelG.getCurrentAmtFuel() << " gallons" << endl; 
        fuelG.decrementFuelTank();
    }
    

    如果减少油箱是有意义的。否则,只需使用 if 语句:

    if (fuelG.getCurrentAmtFuel() > 0) {
        odm.incrementCurrentMileage(); cout << "Mileage: " << odm.getCurrentAmtMiles() << endl;
        cout << "Fuel Level: " << fuelG.getCurrentAmtFuel() << " gallons" << endl; 
    }
    

    否则永远不允许退出循环本身,因为fuelG.getCurrentAmtFuel() 将继续大于0

    【讨论】:

    • 好的,它现在显示燃油油位下降,但里程从 1 开始到 15。这部分不正确,任何想法为什么?
    • @s.marie,你希望它是什么?
    • 里程表可以存储的最大里程为 999,999 英里。当超过此数量时,里程表会将当前里程重置为 0。每行驶 24 英里,它应该将 FuelGauge 对象的当前燃油量减少 1 加仑。 (汽车的燃油经济性为每加仑 24 英里。)模拟给汽车加满燃油,然后运行一个循环来增加里程表,直到汽车用完燃油。在每次循环迭代期间,打印汽车的当前里程和燃料量。
    • 太明显了,我错过了。你没有把这些细节放在问题中是对的。
    猜你喜欢
    • 2013-05-05
    • 2020-01-23
    • 2012-11-09
    • 1970-01-01
    • 2021-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-21
    相关资源
    最近更新 更多