2017-11-24 9 views
-2

Ich versuche, eine Kundenlinie zu simulieren, die Kundennummer, Wartezeiten usw. zeigen. Ich habe drei Benutzereingaben: Max Simulationszeit, max Intervall zwischen Kundeneinträgen und max Servicezeit.Simulieren einer Kundenlinie mit verknüpften Liste in C++

schließlich, würde Ich mag eine Ausgabe erzeugen, die wie so aussieht:

Line simulation output

hier ist mein Code sofar, aber im nur in der Lage, die Minuten zu generieren, aber nicht den Rest des Ausgangs.

#include "stdafx.h" 
#include <iostream> 
using namespace std; 


class Node { 
public: 
    Node() {}; 
    Node(int, int, int) {}; 
    //Node(int,int, int){} 
    void SetCustEntryMinute(int custNum, int entryMinute, int servTimeRem) { 

     entryMin = entryMinute; 
     custNo = custNum; 
     serviceTimeRemain = servTimeRem; 
     next = NULL; 
    } 
    void SetNext(Node* aNext) { next = aNext; } 
    int CustEntryMinute() { return entryMin; } 
    int CustNum() { return custNo; } 
    int ServTmRm() { return serviceTimeRemain; } 
    Node* Next() { return next; } 

    int custNo; 
    int entryMin; 
    int serviceTimeRemain; 
    Node* next; 
}; 


//List class 
class List { 
public: 
    List() { /*head = NULL; tail = NULL; */}; 
    //void Print(); 
    void enqueue(int custNum, int entryMinute, int servTimeRem); 
    void dequeue(); 
    Node *getHead() { return head; }; 
    Node* head; 
    Node *tail; 
}; 



/* Append a node to the linked list*/ 
void List::enqueue(int custNum, int entryMinute, int servTimeRem) 
{ 

    // Create a new node 
    Node* newNode = new Node(custNum, entryMinute, servTimeRem); 

    // Create a temp pointer 
    if (tail) 
    { 
     tail->next = newNode; 
    } 
    else 
    { 
     head = newNode; 
    } 
    tail = newNode; 

} 



/* Serve a node from the list*/ 
void List::dequeue() { 

    // Create a temp pointer 
    Node *tmp = head; 
    //head = head->Next(); 

    // No nodes 
    if (tmp == NULL) 
    { 
     //nothing to delete 
     return; 
    } 
    if (head == tail)//only one node 
    { 
     head = NULL; 
     tail = NULL; 
    } 
    else 
    { 
     head = head->next; 
    } 
    delete tmp; 
} 



int main() 
{ 
    List list; 
    int serviceTimeMax; 
    int maxInterval; 
    int timeCount = 0; 
    int timeMax; 
    int entryMinute = 0; 

    cout << "Enter max time: "; 
    cin >> timeMax; 

    cout << "Enter max interval between two services: "; 
    cin >> maxInterval; 

    cout << "Enter max service time: "; 
    cin >> serviceTimeMax; 

    int custNum = 1; 
    Node* personAhead = NULL; 
    cout << "Minute \tCustomer\t Entry\t Service Time\t Wait time\t Minutes remaining\n"; 
    cout << "Number \tNumber \tMinute\t Remaining\t Remaining\t until service is completed\n\n"; 
    int nextJobTime = 1; 
    for (int i = 1; i < timeMax + 1; i++) { 
     if (i == nextJobTime) 
     { 
      list.enqueue(custNum, i, rand() % serviceTimeMax); 
       nextJobTime = i + rand() % maxInterval; 
     } 
     Node *head = new Node; 
     while (head != NULL) { 
      if (head->serviceTimeRemain == 0) 
      { 
       list.dequeue(); 
       head = list.getHead(); 
      } 

      Node *p = head; 
      int wait_time = 0; 
      cout << i << "\n"; 
      while (p != NULL) 
      { 
       wait_time += p->serviceTimeRemain; 
       cout << "\t" << p->custNo << "\t" << p->entryMin << "\t" << wait_time << "\t" << wait_time + p->serviceTimeRemain << "\n"; 
       p->serviceTimeRemain--; 
      } 
     } 


    } 


    system("pause"); 
    return 0; 
} 

Zu diesem Zeitpunkt wird nur die vom Benutzer eingegebene Zeit generiert.

+1

Da dies wie eine Aufgabe aussieht, werde ich den folgenden Rat geben. Versuchen Sie, den Code in einem Debugger auszuführen. Einzelschritt das Programm. Folgt der reale Programmablauf Ihrem beabsichtigten Fluss? Überprüfen Sie die Variablen, haben sie den richtigen Wert? – Johan

+0

'#include" stdafx.h "' ist ein Zeichen, dass Visual Studio verwendet wird. Visual Studio verfügt über einen der besten, wenn nicht sogar den besten verfügbaren Debugger. Lernen Sie, es zu benutzen, oder Sie sind dazu verdammt, viel, viel zu viel Zeit mit Ihren Aufgaben zu verbringen. – user4581301

+0

Sie haben etwas überschüssigen Code eingegeben, den Sie weggelassen haben könnten. Sie können dies hilfreich finden: https://stackoverflow.com/help/mcve –

Antwort

1

Sie sind in einer Endlos-Schleife

while (p != NULL) 
{ 
    wait_time += p->serviceTimeRemain; 
    cout << "\t" << p->custNo << "\t" << p->entryMin << "\t" << wait_time << "\t" << wait_time + p->serviceTimeRemain << "\n"; 
    p->serviceTimeRemain--; 
} 

An keiner Stelle stecken Sie ändern Sie p, was bedeutet, werden Sie nie die while-Schleife verlassen.

+0

alter p in welcher Weise? Meinst du den Zeiger erhöhen oder einem anderen Zeiger zuweisen? – Manny

+0

@Manny Sie verarbeiten fortwährend denselben Link. Sie müssen "p" zum nächsten Link in der Liste vorrücken. – user4581301

+0

Zum nächsten Knoten in der Liste wechseln. 'p = p-> next;' –

Verwandte Themen