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

chapter12test6

2015-06-14 09:07 253 查看
这个题目花了我好久,后来参考了别人的终于明白了

queue.h

#ifndef QUEUE_H_

#define QUEUE_H_

class customer

{

private:
long arrive;
int protime;

public:
customer(){ arrive = protime =0; }
void set(long when);
long when()const{ return arrive; }
int ptime()const { return protime; }

};

typedef customer Item;

class queue

{

private:
struct node{ Item item; struct node *next; };
enum{ size = 10};
node *front;
node *rear;
int items;
int const qsize;
queue(const queue &q) :qsize(0){}
queue &operator=(const queue&q){ return *this; }

public:
queue(int qs = size);
~queue();
bool isempty()const;
bool isfull()const;
int cout()const;
bool enqu(const Item &item);
bool dequ(Item &item);

};

#endif

queue.cpp

#include<iostream>

#include"queue.h"

#include<cstdlib>

queue::queue(int qs) :qsize(qs)

{
front = rear = nullptr;
items = 0;

}

queue::~queue()

{
node *temp;
while (front != nullptr)
{
temp = front; front = temp->next; delete front;
}

}

bool queue::isempty()const

{
return items == 0;

}

bool queue::isfull()const

{
return items == size;

}

int queue::cout()const

{
return items;

}

bool queue::enqu(const Item &item)

{
if (isfull())
return false;
node *add = new node;
add->item = item;
add->next = nullptr;
items++;
if (front == nullptr)
front = add;
else
rear->next = add;
rear = add;
return true;

}

bool queue::dequ(Item &item)

{
if (isempty())
return false;
item = front->item;
items--;
node *temp = front;
front = front->next;
delete temp;
if (rear == nullptr)
rear = nullptr;
return true;

}

void customer::set(long when)

{
protime = std::rand() % 3 + 1;
arrive = when;

}

user.cpp

#include<iostream>

#include<cstdlib>

#include"queue.h"

#include<ctime>

int const MIN = 60;

bool newcome(double x);

using namespace std;

int main()

{

using std::ios_base;
std::srand(std::time(0));

cout << "Case study :Bank of Heather automatic Teller.\n";
cout << "Enter maximum of queue :";
int qs;
cin >> qs;
queue line1(qs);
queue line2(qs);
cout << "Enter the simulation hour :";
int hour;
cin >> hour;
long cyclet = hour*MIN;
Item temp;
long turnaway = 0;
long customer = 0;
long served = 0;
long sum_line1 = 0; long sum_line2 = 0;
int wait_time1 = 0; int wait_time2 = 0;
double line_wait = 0;

cout << "Enter the average number of people per hour :";
double perhour;
while (cin >> perhour)
{
double percost = MIN / perhour;
for (int cycle = 0; cycle < cyclet; cycle++)
{
if (newcome(percost))        //customer come in line1;
{
if (line1.isfull()&&line2.isfull())
turnaway++;
else
{
customer++;
temp.set(cycle);
if (sum_line1 >= sum_line2)
line1.enqu(temp);
else
line2.enqu(temp);
}
}

if (wait_time1 <= 0 && !line1.isempty())      //customer get out line2
{
line1.dequ(temp);
wait_time1 = temp.ptime();
line_wait = line_wait + (cycle - temp.when());
served++;
}
if (wait_time2 <= 0 && !line2.isempty())      //customer get out line2
{
line2.dequ(temp);
wait_time2 = temp.ptime();
line_wait = line_wait + (cycle - temp.when());
served++;
}
if (wait_time1 > 0)
wait_time1--;
sum_line1 = sum_line1 + line1.cout();
if (wait_time2 > 0)
wait_time2--;
sum_line2 = sum_line2 + line2.cout();
}

double wait_mean;
wait_mean = (double)line_wait / served;
if (wait_mean < 1.0)
break;
else
{
line_wait = 0; wait_time1 = 0; wait_time2 = 0; sum_line1 = 0; sum_line2 = 0;
turnaway = 0; customer = 0; served = 0;
cout << "Enter the average number of people per hour :";
}
}
if (customer > 0)
{
cout << "Costomers accepted :" << customer << endl;
cout << "Customers served :" << served << endl;
cout << "Customers turnaway :" << turnaway << endl;
cout << "Average queue size :";
cout.precision(2);
cout.setf(ios_base::fixed, ios_base::floatfield);
cout << (double)(sum_line1 + sum_line2) / cyclet << endl;
cout << "Average wait time :";
cout << (double)line_wait / served << endl;
}
else
cout << "No customers .\n";
cout << "Done !";
return 0;
}

bool newcome(double x)

{
return (std::rand()*x / RAND_MAX < 1);

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c++