反思与研讨:
银行排队系统的实现,利用了一个STL库中的向量,使得问题变得简单,因老师不要求实现vip用户,因此没有该功能,但实现也并不困难,利用向量可以在任意位置插入的性质,若有vip用户到达,可以直接插队到前一个vip用户的后方。
因为许多地方未用函数,所以此代码写得较为复杂,且在写代码前并未画流程图,因此花了许多时间,下次应多注意该问题。
银行排队系统的实现,利用了一个STL库中的向量,使得问题变得简单,因老师不要求实现vip用户,因此没有该功能,但实现也并不困难,利用向量可以在任意位置插入的性质,若有vip用户到达,可以直接插队到前一个vip用户的后方。
因为许多地方未用函数,所以此代码写得较为复杂,且在写代码前并未画流程图,因此花了许多时间,下次应多注意该问题。
// 银行模拟程序.cpp: 定义控制台应用程序的入口点。
//
//Geeksun 2018.04.01
//Customer.h
#pragma once
class Customer
{
public:
Customer(int cost,int arrive);
~Customer();
int get_cost_time() { return cost_time; };
int get_arrive_time() { return arrive_time; };
int get_indexcounter() { return index_counter; };
private:
int cost_time;
int arrive_time;
int index_counter;
};
*************************************
//Customer.cpp
#include "stdafx.h"
#include "customer.h"
Customer::Customer(int cost, int arrive):cost_time(cost),arrive_time(arrive)
{
}
Customer::~Customer()
{
}
**************************************
//main.cpp
#include "stdafx.h"
#include <iostream>
#include <stdlib.h>
#include <ctime>
#include <vector>
#include "customer.h"
#define end_time 1000 //该银行的工作总时间
using namespace std;
int last_time = 0;//记录最后一个人的到达时间
int index = 0;
struct Counter
{
bool isfull;
int arrive_time;
int cost_time;
}counter[4] = { {false,0,0},{ false,0,0 },{ false,0,0 },{ false,0,0 } };
void bank_service(vector<Customer>& vector_wait,struct Counter* p);
int search_last(struct Counter* p);
int check_workcounter(struct Counter* p);
int main()
{
vector<Customer> wait_vector;
bank_service(wait_vector,counter);
getchar();
getchar();
return 0;
}
int check_workcounter(struct Counter* p)
{
int count = 0;
for (int i = 0;i < 4;i++)
{
if (p[i].isfull == true)
{
count++;
}
}
return count;
}
int search_last(struct Counter* p)//记录柜台中最早结束顾客的具体时间
{
int last_overtime = 999999999;
index = 0;
for (int i = 0;i < 4;i++)
{
if (counter[i].arrive_time + counter[i].cost_time <= last_overtime&&counter[i].isfull == true)
{
last_overtime = counter[i].arrive_time + counter[i].cost_time;
index = i;
}
}
return last_overtime;
}
void bank_service(vector<Customer>& vector_wait, struct Counter* p)
{
static int num = 0;//记录总人数
static int sum_time = 0;//记录工作总时间
int last_overtime; //柜台中顾客最先结束的时间
bool is_full = false;//柜台是否都为满
int count = 0;
srand((unsigned)time(NULL));
while (1)
{
num++;
if (vector_wait.size() == 0)//如果队列中没有顾客排队
{
Customer temp_customer(rand() % 10, last_time + rand() % 4);
if (temp_customer.get_arrive_time() + temp_customer.get_cost_time() > end_time)//超过10000分钟直接跳出
{
while (check_workcounter(counter) != 0)
{
last_overtime = search_last(counter);
cout << "时间为" << search_last(counter) << "时,一位顾客离开了" << index << "号柜台" << endl;
counter[index].isfull = false;
}
cout << "今天接客" << num - 1 << "个人" << endl;
cout << "平均服务时间为" << sum_time / (num - 1) << endl;
cout << "下班了!!!!" << endl;
return;
}
sum_time += temp_customer.get_cost_time();
count = check_workcounter(counter);
while (temp_customer.get_arrive_time() >= search_last(counter)&&count != 0)
{
cout << "时间为" << search_last(counter) << "时,一位顾客离开了" << index << "号柜台" << endl;
counter[index].isfull = false;
is_full = false;
count--;
}
if (is_full == false)//如果柜台有空位
{
for (int i = 0;i < 4;i++)//让新顾客直接进入一个空柜台
{
if (counter[i].isfull == false)
{
counter[i].isfull = true;
counter[i].arrive_time = temp_customer.get_arrive_time();
counter[i].cost_time = temp_customer.get_cost_time();
last_time = counter[i].arrive_time;
cout << "时间为" << temp_customer.get_arrive_time() << "时,有一位顾客到达了,并直接进入了" << i << "号柜台" << endl;
break;
}
}
int count = 0; //检查柜台是否都为满
count = check_workcounter(counter);
if (count == 4)
{
is_full = true;
}
}
else
{
last_overtime = search_last(counter);
if (temp_customer.get_arrive_time() >= last_overtime)
{
cout << "时间为" << last_overtime << "时,有一位顾客离开了" << index << "号柜台" << endl;
counter[index].arrive_time = temp_customer.get_arrive_time();
counter[index].cost_time = temp_customer.get_cost_time();
last_time = counter[index].arrive_time;
cout << "时间为" << temp_customer.get_arrive_time() << "时,有一位顾客直接进入了" << index << "号柜台" << endl;
}
else
{
vector_wait.push_back(temp_customer);
last_time = counter[index].arrive_time;
cout << "时间为" << temp_customer.get_arrive_time() << "时,有一位顾客进入了队列" << endl;
}
}
}
else//如果队列中有顾客排队
{
Customer temp_customer(rand() % 27, last_time + rand() % 4);
sum_time += temp_customer.get_cost_time();
last_overtime = search_last(counter);
while(temp_customer.get_arrive_time() >= last_overtime&& vector_wait.size() != 0)
{
last_overtime = search_last(counter);
cout << "时间为" << counter[index].arrive_time + counter[index].cost_time << "时,有一位顾客离开了" << index << "号柜台" << endl;
cout << "时间为" << counter[index].arrive_time + counter[index].cost_time << "时,有一位顾客从队列中进入了" << index << "号柜台" << endl;
counter[index].arrive_time = vector_wait[0].get_arrive_time();
counter[index].cost_time = vector_wait[0].get_cost_time();
vector_wait.erase(vector_wait.begin());
last_overtime = search_last(counter);
}
if(temp_customer.get_arrive_time() + temp_customer.get_cost_time() <= end_time && temp_customer.get_arrive_time() < last_overtime)
{
vector_wait.push_back(temp_customer);
last_time = temp_customer.get_arrive_time();
cout << "时间为" << temp_customer.get_arrive_time() << "时,有一位顾客进入了队列" << endl;
}
}
}
}