数据结构电话客户服务模拟Word文档格式.docx
- 文档编号:22526783
- 上传时间:2023-02-04
- 格式:DOCX
- 页数:19
- 大小:94.10KB
数据结构电话客户服务模拟Word文档格式.docx
《数据结构电话客户服务模拟Word文档格式.docx》由会员分享,可在线阅读,更多相关《数据结构电话客户服务模拟Word文档格式.docx(19页珍藏版)》请在冰豆网上搜索。
unsignedintarrivalTime;
//客户到达时刻
unsignedintduration;
//客户接受服务所需的时间
unsignedintcurServiceTime;
//当前接受服务的时间
//服务人员类型
structServerType
intserverTotalTime;
inttelephoneOfLimit;
为了模拟计时,在电话客户服务模拟类中增加表示当前时间的变量curTime,此处时间单位为分钟,为更好地模拟,使用泊松随机数,为模拟客户随机打进电话,需要知道客户到达率(平均每分钟打进电话人数),为模拟客户接受服务的时间,需要知道平均服务时间,为存储服务人员信息,需要创造一个文本,将基桶写入文件中,具体客户服务模拟类声明如下:
template<
intm,intb>
TelephoneServer<
m,b>
:
TelephoneServer()
//操作结果:
初始化服务人员信息
//初始化数据成员
curTime=0;
//当前时间初值为0
totalWaitingTime=0;
//总等待时间初值为0
numOfCalls=0;
//处理的电话数初值为0
//获得模拟参数
cout<
<
"
输入客户人员的人数(请输入数字):
;
cin>
>
numOfCustomerServiceStaffs;
//输入客户人员的人数
输入时间限制(请输入数字):
limitTime;
//不再接受新电话的时间
intcallsPerHour;
//每小时电话数
输入每小时电话数(请输入数字):
callsPerHour;
//输入每小时电话数
arrivalRate=callsPerHour/60.0;
//转换为每分钟电话数
输入平均服务时间(请输入数字):
averageServiceTime;
//输入平均服务时间
//分配动态存储空间
callsWaitingQueue=newLinkQueue<
CustomerType>
[numOfCustomerServiceStaffs];
//为客服电话等待队列数组分配存储空间
customerServed=newCustomerType[numOfCustomerServiceStaffs];
//为客服人员正在服务的客户分配存储空间
servers=newServerType[numOfCustomerServiceStaffs];
//为服务人员分配存储空间
//初始化客服人员正在服务的客户
for(inti=0;
i<
i++)
{//初始化每个客服人员正在服务的客户
customerServed[i].curServiceTime=customerServed[i].duration=0;
//表示还没有人接受服务
servers[i].serverTotalTime=servers[i].telephoneOfLimit=0;
//表示还没有工作
}
//设置随机数种子
SetRandSeed();
//以当前时间值为随机数种子
ifstreamiFile("
telph.dat"
);
//建立输入文件
if(i())
{//打开文件失败,表示不存在文件
ofstreamoFile("
//建立输出文件
if(o())throw("
打开文件失败!
//抛出异常
o();
//关闭文件
else
{//存在文件
i();
hash("
ios:
in|ios:
out|ios:
binary);
//以读写方式打开文件
if(hash())throw("
hash(0,ios:
end);
//定位到文件尾
intbucketNum=hash()/sizeof(BucketType);
//桶数
if(bucketNum<
b)
{//桶数不于基桶数,说明文件不完整或已被破坏,应初始化基桶
BucketTypebucket;
intpos;
//临时变量
for(pos=0;
pos<
m;
pos++)
{//初始化基桶
bucket.records[pos].isEmpty=true;
//空记录
bucket.next=-1;
//无溢出
}
hash();
//清除标志
hash(0,ios:
beg);
//定位到文件头
b;
{//写基桶到文件中
hash((char*)&
bucket,sizeof(BucketType));
//写入基桶
}
类TelephoneServer的Service()辅助函数为客户服务人员服务当前的电话,如果当前客户接受服务的时间还未到达客户服务所需的时间,则继续在为客户提供服务,否则如有客户在等待服务,则从等待队列中取出新客户进行服务,并更新总客户等待时间,具体实现如下:
voidTelephoneServer<
Service()
//操作结果:
服务当前电话(如有电话)
i<
i++)
{//处理每个客服工作人员提供的服务
if(customerServed[i].curServiceTime<
customerServed[i].duration)
{//未到达客户接受服务所需的时间,正在为客户提供服务
customerServed[i].curServiceTime++;
//增加客户接受服务的时间
else
{//已到达客户接受服务所需的时间,为下一客户提供服务
if(!
callsWaitingQueue[i].Empty())
{//有客户在等待
callsWaitingQueue[i].OutQueue(customerServed[i]);
//从等待队列中取出新客户进行服务
totalWaitingTime+=curTime-customerServed[i].arrivalTime;
//更新总客户等待时间
}
类TelephoneServer的CheckForNewCall()辅助函数用于生成当前时间打进电话的人数,对每个打进电话的客户,将其插入最短的客服电话等待队列中,具体实现如下:
CheckForNewCall()
检查是否有新电话,如果有,则将电话添加到电话队列
intcalls=GetPoissionRand(arrivalRate);
//当前打进电话的人数
for(inti=1;
=calls;
{//第i个电话
CustomerTypecustomer;
//客户
customer.arrivalTime=curTime;
//客户到达时间
customer.duration=GetPoissionRand(averageServiceTime);
customer.curServiceTime=0;
intpos=MinLengthCallWaitingQueue();
//最短客服电话等待队列的位置
callsWaitingQueue[pos].InQueue(customer);
//客户插入等待队列
numOfCalls++;
//处理的电话数
类TelephoneServer的Display()辅助函数用于在模拟的最后显示处理的总电话数和每个电话的平均等待时间,具体实现如下:
Display()
显示模拟结果
处理的总电话数:
numOfCalls<
endl;
平均等待时间:
GetTheAverageServiceTimet()<
endl<
类TelephoneServer的Run()方法实现模拟电话客户服务,当为到达时间限制时,首先检查是否有新电话,如果有,则将电话添加到电话队列,然后客户服务人员再对当前客户进行服务,最后增加时间;
当已到达时间限制时,不再检查是否有新电话,但客户服务人员还要对当前客户进行服务,并增加时间,具体实现如下:
Run()
模拟电话客户服务
while(curTime<
limitTime)
{//未到达时间限制,可检查新电话
CheckForNewCall();
//检查是否有新电话,如果有,则将电话添加到电话队列
Service();
//进行服务
curTime++;
//增加时间
while(MinLengthCallWaitingQueue()>
0)
{//在客服电话等待队列中还有客户在等待服务
Display();
类TelephoneServer中Hash(constcharseverNumber[18])辅助函数用于生成散列函数值,具体实现如下:
longTelephoneServer<
Hash(constcharseverNumber[18])
返回散列函数值
longh=0;
//散列函数值
for(intpos=0;
(int)strlen(severNumber);
{//依次处理各数字字符
h=(h*10+severNumber[pos]-'
0'
)%b;
returnh;
//返回散列函数值
类TelephoneServer中LocateHelp(constBucketType&
bucket,charseverNumber[18])辅助函数用于记录服务人员编号在桶中的位置,具体实现如下:
intTelephoneServer<
LocateHelp(constBucketType&
bucket,charseverNumber[18])
返回服务人员编号severNumber在桶bucket中的位置
{//依次比较桶中各服务人员信息存储记录
if(!
bucket.records[pos].isEmpty&
&
strcmp(bucket.records[pos].severNumber,severNumber)==0)returnpos;
//定位成功
return-1;
//定位失败
类TelephoneServer中Locate(BucketType&
bucket,long&
offset,int&
pos,charseverNumber[18])辅助函数用于定位服务人员编号所在的桶,以及在桶中的位置和桶在文件中的位置,具体实现如下:
Locate(BucketType&
offset,
int&
pos,charseverNumber[18])
定位服务人员编号severNumber所在的桶bucket,在桶中的位置pos,桶在文件
//中的位置位置offset
longh=Hash(severNumber);
//散列函数值
offset=sizeof(BucketType)*h;
//桶在文件中的位置
hash();
//清除标志
hash(offset,ios:
//文件定位
hash((char*)&
//读取基桶
pos=LocateHelp(bucket,severNumber);
//定位服务人员信息存储记录在桶中的位置
if(pos==-1)offset=bucket.next;
//溢出桶的位置
while(pos==-1&
offset!
=-1)
{//继续在溢出桶中查找
//清除标志
hash(offset,ios:
//文件定位
hash((char*)&
//读到基桶
pos=LocateHelp(bucket,severNumber);
//定位服务人员信息存储记录在桶中的位置
if(pos==-1)offset=bucket.next;
//后继溢出桶的位置
类TelephoneServer中LocateEmptyRecordHelp(constBucketType&
bucket)辅助函数用于获得空记录的位置,具体实现如下:
LocateEmptyRecordHelp(constBucketType&
bucket)
返回空记录位位置
if(bucket.records[pos].isEmpty)returnpos;
//定位失败
类TelephoneServer中LocateEmptyRecord(BucketType&
offset,int&
pos,charseverNumber[18])辅助函数用于服务人员编号所在具有空记录的桶,以及桶中空记录的位置,和桶在文件中的位置,具体实现如下:
LocateEmptyRecord(BucketType&
定位服务人员编号severNumber所在的具有空记录的桶bucket,桶中的空记录位置pos,桶
//在文件中的位置位置offset
pos=LocateEmptyRecordHelp(bucket);
//定位桶中空记录的位置
pos=LocateEmptyRecordHelp(bucket);
//定位桶中空记录的位置
类TelephoneServer中Input()辅助函数用于输入记录并且将数据写入通过桶写入到文件中,具体实现如下:
Input()
输入记录
TelephoneServerTypetelph;
//服务人员信息存储记录
telph.isEmpty=false;
//标记
cout<
"
输入服务人员编号:
cin>
telph.severNumber;
输入服务人员姓名:
telph.severName;
telph.objServerTotalTime=GetTheServerTotalTime();
telph.objTelephoneOfLimit=GetTheTelephoneOfLimit();
BucketTypebucket;
//桶
longoffset;
//桶在文件中的相应位置
intpos;
//服务人员信息存储记录在桶中的位置
Locate(bucket,offset,pos,telph.severNumber);
//定位服务人员信息存储记录的位置
if(pos!
=-1)
{//定位成功
cout<
编号已在散列文件中!
<
endl;
{//定位失败
LocateEmptyRecord(bucket,offset,pos,telph.severNumber);
//定位空记录位置
if(pos!
{//找到空记录
bucket.records[pos]=telph;
//将服务人员信息存储记录赋值给bucket.records[pos]
hash();
hash(offset,ios:
//定位文件
//写桶
{
hash(0,ios:
//定位到文件尾
bucket.next=hash();
//后继溢出桶位置
offset=bucket.next;
//新溢出桶在文件中的位置
for(pos=1;
{//设置空记录
bucket.records[pos].isEmpty=true;
pos=0;
//服务人员信息存储记录的位置
bucket.records[
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 电话 客户 服务 模拟