您的位置:首页 > 编程语言 > C语言/C++

C++primer plus第六版课后编程题答案12.5

2014-04-22 21:06 381 查看
myQueue.cpp

#include <iostream>
using namespace std;
class Customer
{
private:
long arrive;
int processtime;
public:
Customer(){arrive=processtime=0;};
void set(long when){
processtime=rand()%3+1;
arrive=when;
}
long when()const{
return arrive;
}
int ptime()
{
return processtime;
}
friend ostream&operator<<(ostream &os,const Customer &c)//用于检测
{
static int j=0;
os<<j++<<" arrive:"<<c.arrive<<" need time:"<<c.processtime<<endl;
return os;
}
};

typedef Customer Item;
class Queue{
struct Node{
Item items;
struct Node *next;
};
enum {Q_SIZE=10};
Node *front;
Node *rear;
int items;//当前队列人数
const int qsize;//队列最大值?const??一次性??
Queue(const Queue &q):qsize(0){ };
Queue &operator=(const Queue &q){return *this;};//???真看不太懂啊
public:
int s()
{return items;};
Queue(int qs=Q_SIZE):qsize(qs)
{
front=rear=nullptr;
items=0;
}
~Queue()
{
Node *temp;
while(front!=nullptr)
{
temp=front;
front=front->next;
delete temp;
}
}
bool isEmpty()const
{
return items==0;
}
bool isFull()const
{
return items==qsize;//qsize是这一个队列的最大长度
}
int queuecount()const
{
return items;
}
bool enQueue(const Item &it)
{
if(isFull())
//cout<<"The queue is full!"<<endl;
return false;
Node *add=new Node;
add->items=it;
add->next=nullptr;//这一句??//为后面作准备
items++;
if(front==nullptr)//如果在头部插入
{
front=add;
}
else
rear->next=add;
rear=add;//令rear指向最后一个元素
return true;
}
bool deQueue(Item &it)
{
if(front==nullptr)
//cout<<"The queue is empty!"<<endl;
return false;
it=front->items;
items--;//这里居然忘记写了,我去啊,难怪只会进不会出
Node *temp=front;
front=front->next;
delete temp;
if(items==0)
rear=nullptr;
return true;
}
friend ostream&operator<<(ostream &os,const Queue &q)
{
auto *p=q.front;//真神奇,用auto可以,用Node 居然会报错??
while(p++!=q.rear)
cout<<p->items;
return os;
}
};

main125.cpp
#include <iostream>
#include "myQueue.cpp"
#include <cstdlib>
#include <ctime>
using namespace std;
const int MIN_PER_HR=60;
bool newCustomer(double x)//每隔x次,rand()/RAND_max会有一次值<1
{
return rand()*x/RAND_MAX<1;
}
void main125()
{
srand(time(0));//初始化rand();
cout<<"Case Study:Bank of Heather Automatic Teller"<<endl;
cout<<"Enter maximum size of queue:";
int qs;
cin>>qs;
Queue line(qs);

cout<<"Enter the number of simulation hours:";
int hours;
cin>>hours;
long cyclelimit=MIN_PER_HR*hours;//循环的分钟数

cout<<"Enter the average number of customers per hour:";//一个小时来的人数
double perhour;
cin>>perhour;
double min_per_cust;
min_per_cust=MIN_PER_HR/perhour;//平均多少分钟来一个人

Item temp;
long turnaways=0;
long customers=0;
//long served=0;
long served=0;
long sum_line=0;
int wait_time=0;
long line_wait=0;

for(int cycle=0;cycle<cyclelimit;cycle++)//cycle每循环一次,代表过了一分钟
{
//line.s();
if(newCustomer(min_per_cust))
{
if(line.isFull())
turnaways++;//拒绝服务???//恩,应该就是拒绝服务的人数
else
{
customers++;//队列人数//应该是顾客人数+1而不是队列人数+1
temp.set(cycle);//cycle是到达时间
line.enQueue(temp);//这里的items++才是队列人数+1
//cout<<"after insert "<<line;//test

}

}
if(wait_time<=0&&!line.isEmpty())//用户处理完了业务
{
line.deQueue(temp);
//cout<<"after the delete"<<line;//test
wait_time=temp.ptime();//wait_time是该客户处理业务所用时间
line_wait+=cycle-temp.when();//cycle-temp.when();是该客户一共在队列中等了多久
//一开始wait_time初始化是0,然后进入这里之后,又重新设置了使其=processtime
//line_wait是该队列一共等了多久??哦,应该是所有客户的等待时间
//line_wait是客户等待总时间
served++;//服务人数+1
}

if(wait_time>0)//正在处理业务的处理时间-1,因为过了一分钟
wait_time--;//话说这wait_time是谁设置了?一直=0?
//wait_time=temp.ptime()这里随机设置了wait-time
sum_line+=line.queuecount();//sum_line又是神马东东??
//sum_line是队伍总长度,每分钟计算一次队伍长度
}

if(customers>0)
{
cout<<"customers accepted:"<<customers<<endl;
cout<<" customers served:"<<served<<endl;
cout<<" turnaways:"<<turnaways<<endl;
cout<<"average queue size:";
cout.precision(2);
cout.setf(ios_base::fixed,ios_base::floatfield);
cout<<(double)sum_line/cyclelimit<<endl;
cout<<"average wait time:"<<(double)line_wait/served<<" minutes"<<endl;
}
else
cout<<"No coustomer!"<<endl;
cout<<"Done!"<<endl;
system("pause");
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息