main函数文件代码test.cpp:
#include <iostream>
#include "qc.h"
bool newcustomer(double x);
#include <time.h>
void main()
{
using namespace std;
/*Item item1;
Item item2;
Item item3;
Item item4;
Item item5;*/
//cout<<"当前客户到达的时间: "<<item1.when()<<endl;
//cout<<"当前客户办理业务的时间: "<<item1.ptime()<<endl;
/*Queue q;
q.enqueue(item1);
cout<<"当前队列长度: "<<q.queuecount()<<endl;
q.enqueue(item2);
cout<<"当前队列长度: "<<q.queuecount()<<endl;
q.enqueue(item3);
cout<<"当前队列长度: "<<q.queuecount()<<endl;
q.enqueue(item4);
cout<<"当前队列长度: "<<q.queuecount()<<endl;
q.dequeue(item5);
cout<<"当前队列长度: "<<q.queuecount()<<endl;
q.dequeue(item5);
cout<<"当前队列长度: "<<q.queuecount()<<endl;
q.dequeue(item5);
cout<<"当前队列长度: "<<q.queuecount()<<endl;
q.dequeue(item5);
cout<<"当前队列长度: "<<q.queuecount()<<endl;
q.dequeue(item5);
cout<<"当前队列长度: "<<q.queuecount()<<endl;*/
srand(time(0));
cout<<"请输入队列的最大长度: ";
int maxqueue;
cin>>maxqueue;
Queue q(maxqueue);
cout<<"请输入程序模拟的持续时间(单位为小时): ";
int fortime;
cin>>fortime;
cout<<"请输入平均每小时的客户数: ";
int cperh;
cin>>cperh;
int turnaway = 0; //队满时离开的客户
int customer =0; //排队了的客户
int served = 0; //处理过业务的客户
int waittime = 0; //柜台等待时间
Item temp;
char ch;
while(cout<<"输入q停止循环多次模拟!\n" && cin>>ch && 'q' != ch)
{
turnaway = 0; //队满时离开的客户
customer =0; //排队了的客户
served = 0; //处理过业务的客户
waittime = 0; //柜台等待时间
for(int i=0;i<fortime * 60;i++)
{
if(newcustomer(60/cperh))
{
if(q.isfull())
{
//cout<<"队列满,不能排队!客户 "<<turnaway+1<<" 离开\n";
turnaway++;
cout<<"客户离开,当前队列长度: "<<q.queuecount()<<endl;
}
else
{
//cout<<"客户 "<<customer+1<<" 排队中\n";
temp.set(i);
q.enqueue(temp);
cout<<"客户排队中,当前队列长度: "<<q.queuecount()<<endl;
customer++;
}
}
if(waittime<=0 && !q.isempty())
{
q.dequeue(temp);
waittime = temp.ptime();
cout<<"客户 "<<served+1<<" 业务处理完毕,耗时 "<<waittime<<" 分钟.\n";
cout<<"业务处理完毕,当前队列长度: "<<q.queuecount()<<endl;
served++;
}
if(waittime>0)
{
if(1==waittime)cout<<"客户"<<served+1<<"业务处理中...\n";
cout<<"业务处理中...,当前队列长度: "<<q.queuecount()<<endl;
waittime--;
}
}
if(customer>0)
{
if(customer<served)cout<<"出错了!\n";
else
{
cout<<"\n排队了的客户数: "<<customer<<endl;
cout<<"模拟结束后处理了业务的客户数: "<<served<<endl;
cout<<"没排上队离开的客户数: "<<turnaway<<endl;
}
}
}
}
bool newcustomer(double x)
{
//x为客户到来的平均时间
return (rand()*x /RAND_MAX <1);
}
队列模拟类头文件qc.h:
class Customer
{
private:
long arrive;//进入队列的时间
int processtime;//服务处理的时间
public:
Customer(){arrive=processtime=0;}
void set(long when);//设置处理时间
long when()const{return arrive;}
int ptime()const{return processtime;}
};
typedef Customer Item;
class Queue
{
enum {Q_SIZE = 10};
struct Node{Item item;struct Node * next;};
private:
Node * front;
Node * rear;
int curitem;//当前队列长度
const int maxqsize;//队列最大长度
public:
Queue(int qs = Q_SIZE);
~Queue();
bool isempty()const;
bool isfull()const;
int queuecount()const;
bool enqueue(const Item & item);
bool dequeue(Item & item);
};
队列模拟类源文件qc.cpp:
#include "qc.h"
#include <iostream>
#include <stdlib.h>
void Customer::set(long when)
{
using namespace std;
processtime = rand()%3+1;
arrive = when;
}
Queue::Queue(int qs):maxqsize(qs)
{
front = rear = NULL;
curitem = 0;
}
Queue::~Queue()
{
}
bool Queue::isempty()const
{
return curitem == 0;
}
bool Queue::isfull()const
{
return curitem == maxqsize;
}
int Queue::queuecount()const
{
return curitem;
}
bool Queue::enqueue(const Item & item)
{
if(isfull())
{
std::cout<<"队列已满!入队失败\n";
return false;
}
Node * p = new Node;
if(!p)
{
std::cout<<"创建结点失败,入队失败!\n";
return false;
}
using std::cout;
p->item = item;
p->next = NULL;
if(!front)
front = p;
else
rear->next = p;
rear = p;
curitem++;
return true;
}
bool Queue::dequeue(Item & item)
{
if(isempty())
{
std::cout<<"队列空!出队失败!\n";
return false;
}
Node * p = front;
if(front == rear)rear=NULL;
front = p->next;
item = p->item;
delete p;
curitem--;
return true;
}
如有疑问,请留言。