2015-11-23 3 views
0

Я создаю программу симулятора автомобиля, и я получаю бесконечный цикл, когда я запускаю его. Я добавил перерыв; в конце цикла while, но затем он просто отображает пробег: 1 - Уровень топлива: 15. Я также заметил, что в бесконечном цикле уровень топлива не меняется, он просто остается на 15. Я просмотрел свой код и попытались отладить его, но я не могу найти его. Любая помощь приветствуется. СпасибоСимулятор автомобиля - Бесконечная петля

UPDATE: теперь он работает хорошо. Уровень топлива снижается с 15, но пробег начинается с 1 и увеличивается до 15, что неверно, любые идеи почему?
Максимальный пробег, который может хранить одометр, составляет 999,999 миль. Когда эта сумма будет превышена, одометр сбрасывает текущий пробег на 0.
Он должен уменьшить текущее количество топлива FuelGauge на 1 галлон за каждые ** 24 миль, пройденных
. (Экономия топлива автомобиля составляет 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 
+0

Вы можете пройти через отладчик, чтобы увидеть, где он застрял. Кроме того, пожалуйста, попробуйте указать * минимальный * пример. – tadman

+1

Есть ли что-нибудь, что уменьшает «FuelGauge :: currentAmtFuel», который используется в вашем рабочем процессе? Я не вижу никакого кода, который это делает. Таким образом, 'currentAmtFuel' никогда не достигает 0 и приводит к бесконечному циклу. –

+3

Вы никогда не называете 'decmentFuelTank()', поэтому он никогда не доходит до 0. – adamdc78

ответ

3

Функция Odometer::incrementCurrentMileage() не делает ничего, чтобы уменьшить топливо в FuelGuage. Я предполагаю, что вы хотите, чтобы он позвонил fuelG->decrementFuelTank).

0

Этот цикл:

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.

+0

Хорошо, теперь он показывает уровень топлива, уменьшающийся, но пробег начинается с 1 и переходит к 15. Эта часть неверна, почему-то идеи? –

+0

@ s.marie, что вы ожидаете от этого? – SergeyA

+0

Максимальный пробег, который может хранить одометр, составляет 999,999 миль. Когда эта сумма превышена, одометр сбрасывает текущий пробег на 0. Он должен уменьшить текущее количество топлива FuelGauge на 1 галлон на каждые 24 мили. (Экономия топлива автомобиля составляет 24 мили на галлон.) Имитировать заполнение автомобиля топливом, а затем запустить петлю, которая увеличивает одометр до тех пор, пока в машине не будет топлива. Во время каждой итерации цикла напечатайте текущий пробег автомобиля и количество топлива. –

Смежные вопросы