2014-12-17 2 views
0

자동차 대기열에 들어가는 차의 확률을 입력해야하는 "자동차 대기열"또는 "세차장"문제의 변형에 대해 작업하고 있습니다. 어떤 주어진 순간에 씻어 낸 다음, 얼마나 많은 차들이 세차 됐는지, 하루가 끝날 때 대기열에 얼마나 많은 차가 남았는지, 얼마나 많은 총 대기 시간이 있었는지를 출력합니다. 저는 C++에 대해 아직 아주 새롭고 지난 몇 개월 동안 광범위하게 사용 해왔습니다. 매우 가능성이 내 큐 구현 코드를 사용하여 catch하지 않은 오류가 있지만 오류가 주 믿습니다. 현재 모든 루프마다 출력을 추가 했으므로 코드를 실행 한 다음 볼 수 있습니다. 그것은 자동차를 받아 들인 후 곧바로 세탁을 마친 것으로 보입니다. 그런 다음 자동차가 없으면 세탁 및 대기 루프 사이를 교대로 전환합니다. 어떤 도움이라도 대단히 감사하겠습니다.자동차 세탁 대기열 문제

#include <assert> 
#include <iostream> 
#include <fstream> 
#include <ostream> 
#include <ctime> 
#include <cstdlib> 
using namespace std; 

class Node 
    { 
    private: 
    int item; 
Node * next; 
public: 
    Node(); 
    Node (const int& anItem); 
    Node (const int& anItem, Node * nextNodePtr); 
    void setItem (const int& anItem); 
    void setNext (Node * nextNodePtr); 
    int getItem(); 
    Node* getNext(); 
    }; 
class LinkedQueue 
    { 
    private: 
     Node* backPtr; 
     Node* frontPtr; 
    public: 
     bool isEmpty(); 
     bool enqueue(int& newEntry); 
     bool dequeue(); 
     int peekFront() const; 
     LinkedQueue(); 
     ~LinkedQueue(); 
     LinkedQueue(const LinkedQueue& aQueue); 
    }; 
int main() 
{ 
    srand(1); 
    int timeForWash; 
    int minute; 
    int timeEnteredQueue; 
    int carsWashed; 
    int totalQueueMin; 
    int timeLeftOnCar; 
    int probOfArrival; 
    int carsInQueue = 0; 

    LinkedQueue carQueue; 

    cout << "Enter time to wash one car:" << endl; 
    cin >> timeForWash; 
    cout << endl; 
    cout << "Enter probability of arrival per minute" << endl; 
    cin >> probOfArrival; 

    carsWashed = 0; 
    totalQueueMin = 0; 
    timeLeftOnCar = 0; 
    for (minute = 1; minute <= 20; ++minute) 
    { 
     if (rand()%100 <= probOfArrival) 
      { 
       carQueue.enqueue(minute); 
       carsInQueue++; 
       cout << "Queued" << endl; 
      } 

     if ((timeLeftOnCar == 0) && (!carQueue.isEmpty())) 
     { 
      timeEnteredQueue = carQueue.peekFront(); 
      carQueue.dequeue(); 
      totalQueueMin = totalQueueMin + (minute - timeEnteredQueue); 
      ++carsWashed; 
      carsInQueue--; 
      timeLeftOnCar = timeForWash; 
      cout << "Finish" << endl; 
      } 
      if (timeLeftOnCar =! 0) 
      { 
       timeLeftOnCar -= 1; 
       cout << "Washing" << endl; 
      } 
     if ((timeLeftOnCar == 0) && (carQueue.isEmpty())) 
     { 
      cout << "Waiting" << endl; 
     } 
    } 
    cout << carsWashed << endl; 
    cout << totalQueueMin << endl; 
    cout << carsInQueue << endl; 
    system("pause"); 
    return(0); 
    }; 
//Implementation 
Node:: Node() : next (nullptr) 
{ 
} // default 
Node:: Node (const int& anItem) : item(anItem), next(nullptr) 
{ 
} 

Node:: Node (const int& anItem, Node * nextNodePtr) : item(anItem), next(nextNodePtr) 
{ 
} 

void Node:: setItem (const int& anItem) 
{ 
    item = anItem; 
} 

void Node:: setNext (Node * nextNodePtr) 
{ 
    next = nextNodePtr; 
} 

int Node:: getItem() 
{ 
    return item; 
} 

Node * Node:: getNext() 
{ 
    return next; 
} 

bool LinkedQueue::enqueue(int& newEntry) 
    { 
    Node* newNodePtr = new Node(newEntry); 
    //Insert the new node 
    if (isEmpty()) 
    frontPtr = newNodePtr; // The queue was empty 
    else 
    backPtr->setNext(newNodePtr); // The queue was not empty 
    backPtr = newNodePtr; // New node is at back 
    return true; 
} // end enqueue 
bool LinkedQueue::dequeue() 
{ 
    bool result = false; 
    if (!isEmpty()) 
    { 
    // Queue is not empty; remove front 
    Node* nodeToDeletePtr = frontPtr; 
    if (frontPtr == backPtr) 
    { // Special case: one node in queue 
    frontPtr = nullptr; 
    backPtr = nullptr; 
    } 
    else 
    frontPtr = frontPtr->getNext(); 
    // Return deleted node to system 
    nodeToDeletePtr->setNext(nullptr); 
    delete nodeToDeletePtr; 
    nodeToDeletePtr = nullptr; 
    result = true; 
    } // end if 
    return result; 
} // end dequeue 
bool LinkedQueue:: isEmpty() 
{ 
    return (frontPtr == nullptr); 
} 
int LinkedQueue:: peekFront() const 
{ 
    return frontPtr->getItem(); 
} 
LinkedQueue::LinkedQueue() 
{ 
    frontPtr = nullptr; 
    backPtr = nullptr; 
} 
LinkedQueue::LinkedQueue(const LinkedQueue& aQueue) : 
frontPtr(aQueue.frontPtr) 
{ 
} // end copy constructor 
LinkedQueue::~LinkedQueue() 
{ 
} // end destructor 

답변

2

timeLeftOnCar =! 0는 항상 true 인 timeLeftOnCar = 1입니다 timeLeftOnCar = !0, 동일합니다.

timeLeftOnCar != 0 또는 timeLeftOnCar > 0을 원합니다.

+0

Sigh. 그것의 항상 가장 사소한 것들. 고맙습니다. 바로 그걸 정리 한 것 같아. – Drew

+0

@Drew 컴파일러의 경고 수준을 높이는 것이 좋습니다. 이 같은 것들을 대단히 도움이됩니다 (그들은 당신 자신의 코드에서 발견하는 것이 거의 불가능합니다). – molbdnilo