Очереди C ++: как зациклить, чтобы отобразить правильное время начала и время ожидания автомойки - PullRequest
1 голос
/ 13 октября 2019

Для этой симуляции мойки ваша программа считывает время прибытия автомобиля через входной файл. Общее время мойки автомобиля составляет 3 минуты. Другая машина не может идти в мойку во время мойки, что увеличивает время ожидания. Если автомобиль отходит на 3-й минуте, следующий автомобиль должен сесть на 4-й минуте, если он уже прибыл.

Я уже пытался прочитать файл сразу, а затем создать еще один цикл, но это не сработало. Я перепробовал много вещей, думаю, у меня проблема только с тем, как зациклить программу.

#include <iostream>
#include <cassert>
#include <fstream>
#include <queue>
#include <cstdlib>
    using namespace std;
class averager {
private:
    int cnt;
    int sum;
public:
    averager(){
        cnt=0;
        sum=0;
    }
    void plus_next_number(int value)
    {
        cnt++;
        sum+=value;
    }
    double average_time()
    {
        assert(cnt>0);
        return (sum/cnt);
    }
    int how_many_cars()
    {
        return cnt;
    }
};
class Washmachine {
private:
    int time_for_wash;
    int time_left;

public:
    Washmachine(int n) {
        time_for_wash = n;
        time_left = 0;

    }

    bool is_busy() {
       return (time_left > 0);
    }

    void startWashing() {
       if(!is_busy()) {
           time_left = time_for_wash;
       }

    }

void one_second(){
        if(is_busy()) {
            --time_left;
        }
    }


};



int main() {
    queue<int> waitQueue;
    int carArrival;
    averager cal;
    ifstream infile;
    ofstream arrivalrec;
    arrivalrec.open("arrival_time.txt");
    arrivalrec << "Car Number  " << "Arrival Time  " << "Car Wash Start Time  " << "Departure Time  "
               << "Wait Time  "
               << "Total Time  " << endl
               << endl;

    int  maxWaitTime;   // maxWaitTime initially 0:00
    int totalWaitTime;           // total time customers wait
    int endTime = 540;      // times for the simulation
    int totalServiceTime;
    int startTime;
    int carNum = 0;         // number of cars washed in study
    int washTime = 3;                       // fixed time for a wash in minutes
    int DeptTime;
    int TotalTime;
    int timeleft=0;
    int waitTime;
    int temp;
    int sw;
    Washmachine carwashing(washTime);



    infile.open("input.txt");

   for (int startTime=0;startTime<=endTime;startTime++){

        infile>>temp;
        waitQueue.push(temp);
        if((!carwashing.is_busy())&&(!waitQueue.empty())) {
           carArrival=waitQueue.front();
            waitQueue.pop();
            waitTime=temp-carArrival;
            cal.plus_next_number(temp-carArrival);
            carwashing.startWashing();
        }
        carwashing.one_second();


        if (maxWaitTime<waitTime)
            maxWaitTime=waitTime;
        // add waiting time for customer to totalWaitTime.
        totalWaitTime+=waitTime;
        totalServiceTime+=washTime;
        startTime=temp+waitTime;
        TotalTime=washTime+waitTime;

        DeptTime=startTime +washTime;
        // increment the number of customers served
        carNum++;
        // set washAvailable to false since equipment back in service


        // output the summary data for the simulation include number of cars
        // washed, average customer waiting time and pct of time wash operates

        arrivalrec << carNum << "              " << temp << "                   " <<startTime
                   << "                  " << DeptTime << "              " <<
                   waitTime << "                " << TotalTime << endl
                   << endl << endl;


    }
    arrivalrec << "Maximum customer waiting time for a car wash is "
                << "14 minutes" << endl;
    arrivalrec << "Percentage of time car wash operates is 57 "
               //<< ((totalServiceTime / endTime) * 100.0)
               << '%' << endl;
    arrivalrec << "Number of customers remaining at " << endTime
               << " is 8"<<endl; //<< waitQueue.size() << endl;
    arrivalrec<<"\nCars washed were: "<<carNum<<endl;
    arrivalrec<<"\nThe average waiting time is: "<<cal.average_time()<<endl;
    int car_denied=0;
    while(!waitQueue.empty())
    {
        waitQueue.pop();
        car_denied++;
    }
    arrivalrec<<"\nThe number of denied cars is: 2 "<<endl;
    arrivalrec<<endl;
    return 0;
}
Car Arrival 0  car start 0 car depart 3 wait time 0 total time 3
            3            4            7           1            4
            10           10           13          0            3
            11           14           17          3            6

1 Ответ

0 голосов
/ 14 октября 2019

Пожалуйста, попробуйте следующий цикл для основной функции симуляции мойки автомобилей. Вместо зацикливания на startTime, цикл использует симуляцию runTime. Все события, такие как постановка машины в очередь, запуск и документирование процесса мойки, а также подсчет waitTime выполняются в следующих условиях:

    infile.open("input.txt");
    infile >> temp;
    carNum = 1;

    for (runTime=1;runTime<=endTime;runTime++){

        if (runTime == temp) {
            waitQueue.push(temp);
            infile >> temp;
        }
        if((!carwashing.is_busy())&&(!waitQueue.empty())) {
            carArrival=waitQueue.front();
            waitQueue.pop();
            startTime = runTime;
            waitTime=startTime-carArrival;
            totalWaitTime = waitTime;
            TotalTime = washTime + waitTime;
            cal.plus_next_number(startTime-carArrival);
            carwashing.startWashing();
        }
        else
        {
            waitTime++;
        }
        if (carwashing.is_busy())
            carwashing.one_second();

        if ((!carwashing.is_busy())&&(startTime >= DeptTime)) {
            DeptTime = startTime + washTime;
            totalServiceTime += washTime;
            arrivalrec << carNum << "              " << carArrival << "                   " << startTime
                << "                  " << DeptTime << "              " <<
                totalWaitTime << "                " << TotalTime << endl
                << endl << endl;
            carNum++;
        }
    }

Обратите внимание, что чтение файла первой машины выполненовне цикла.

Я также добавил переменную runTime и некоторую инициализацию к вашему объявлению:

    queue<int> waitQueue;
    int carArrival = 0;
    averager cal;
    ifstream infile;
    ofstream arrivalrec;
    arrivalrec.open("arrival_time.txt");
    arrivalrec << "Car Number  " << "Arrival Time  " << "Car Wash Start Time  " << "Departure Time  "
                << "Wait Time  "
                << "Total Time  " << endl
                << endl;

    int  maxWaitTime = 0;   // maxWaitTime initially 0:00
    int totalWaitTime = 0;           // total time customers wait
    int endTime = 75;      // times for the simulation
    int totalServiceTime = 0;
    int startTime = 0;
    int carNum = 0;         // number of cars washed in study
    int washTime = 3;                       // fixed time for a wash in minutes
    int DeptTime = 0;
    int TotalTime = 0;
    int timeleft=0;
    int waitTime=0;
    int temp;
    int sw;
    int runTime;
    Washmachine carwashing(washTime);

Я получил желаемый вывод из вашего другого поста :

Output

Надеюсь, это вам поможет?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...