数据结构电话客户服务模拟.doc_第1页
数据结构电话客户服务模拟.doc_第2页
数据结构电话客户服务模拟.doc_第3页
数据结构电话客户服务模拟.doc_第4页
数据结构电话客户服务模拟.doc_第5页
免费预览已结束,剩余21页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

电话客户服务模拟1、 问题描述 一个模拟时钟提供接听电话服务的时间(以分钟记),然后这个时钟将循环的自增一(分钟)直到到达指定时间为止。在时钟的每个“时刻”,就会执行一次检查来看看当前电话的服务是否已经完成了,如果是,这个电话从电话队列中删除,模拟服务将从队列中取出下一个电话(如果有的话)继续开始。同时还需要执行一个检查来判断是否有一个新的电话到达。如果是将其到达时间记录下来,并为其产生一个随机服务时间,这个服务时间也被记录下来,然后这个电话被放入电话队列中,当客户服务人员空闲时,按照先来先服务的方式处理这个队列。当时钟到达指定时间时,不会再接听新的电话,但是服务将继续,直到电话队列中所有电话都得到处理为止。当完成上述功能以后,将记录最佳方案,记录客服人员信息,通过桶存储方式来记录和查询信息。2、 基本要求(1)程序需要的初始数据包括:客户服务人员的人数,时间限制,电话的到达速率,平均服务时间,客服人员编号,客服人员姓名。(2)程序产生的结果包括:处理的电话数,每个电话的平均等待时间,服务总时间,限制时间内接听电话数。三、工具 / 准备工作在开始做课程设计项目前,应回顾或复习相关内容。需要一台计算机,期中安装有Visual C+ 6.0、Visual C+ 2005、Visual C+ 2005 Express、Dev-C+或MinGW Developer Studio之一的集成开发环境。4、 分析与实现由于要计算客户的等待时间,并且每个客户都有接受服务所需的时间,为实现这些功能,对客户加上当前接受服务的时间,具体客户结构类型和服务人员类型如下:/ 服务人员类型struct TelephoneServerTypechar severNumber18;/ 服务人员编号char severName16;/ 服务人员姓名bool isEmpty; / 是否为空int objServerTotalTime; /服务总时间int objTelephoneOfLimit; /限制时间内接听电话数;/客户类型struct CustomerType unsigned int arrivalTime; /客户到达时刻unsigned int duration; /客户接受服务所需的时间unsigned int curServiceTime; /当前接受服务的时间;/服务人员类型struct ServerTypeint serverTotalTime; /服务总时间int telephoneOfLimit; /限制时间内接听电话数;为了模拟计时,在电话客户服务模拟类中增加表示当前时间的变量curTime,此处时间单位为分钟,为更好地模拟,使用泊松随机数,为模拟客户随机打进电话,需要知道客户到达率(平均每分钟打进电话人数),为模拟客户接受服务的时间,需要知道平均服务时间,为存储服务人员信息,需要创造一个文本,将基桶写入文件中,具体客户服务模拟类声明如下:template TelephoneServer:TelephoneServer()/ 操作结果: 初始化服务人员信息/初始化数据成员curTime=0; /当前时间初值为0totalWaitingTime=0; /总等待时间初值为0 numOfCalls=0; /处理的电话数初值为0 /获得模拟参数coutnumOfCustomerServiceStaffs; /输入客户人员的人数coutlimitTime; /不再接受新电话的时间int callsPerHour; /每小时电话数coutcallsPerHour; /输入每小时电话数arrivalRate=callsPerHour/60.0; /转换为每分钟电话数coutaverageServiceTime; /输入平均服务时间/分配动态存储空间callsWaitingQueue=new LinkQueuenumOfCustomerServiceStaffs; /为客服电话等待队列数组分配存储空间customerServed=new CustomerTypenumOfCustomerServiceStaffs; /为客服人员正在服务的客户分配存储空间 servers=new ServerTypenumOfCustomerServiceStaffs; /为服务人员分配存储空间/初始化客服人员正在服务的客户for(int i=0; inumOfCustomerServiceStaffs; i+) /初始化每个客服人员正在服务的客户customerServedi.curServiceTime=customerServedi.duration=0; /表示还没有人接受服务 serversi.serverTotalTime=serversi.telephoneOfLimit=0; /表示还没有工作/设置随机数种子SetRandSeed(); /以当前时间值为随机数种子ifstream iFile(telph.dat);/ 建立输入文件if (iFile.fail()/ 打开文件失败,表示不存在文件ofstream oFile(telph.dat);/ 建立输出文件if (oFile.fail() throw(打开文件失败!);/ 抛出异常 oFile.close();/ 关闭文件else/ 存在文件iFile.close();/ 关闭文件hashFile.open(telph.dat, ios:in|ios:out|ios:binary);/ 以读写方式打开文件if (hashFile.fail() throw(打开文件失败!);/ 抛出异常 hashFile.seekg(0, ios:end);/ 定位到文件尾int bucketNum = hashFile.tellg() / sizeof(BucketType);/ 桶数if (bucketNum b)/ 桶数不于基桶数,说明文件不完整或已被破坏, 应初始化基桶BucketType bucket;int pos;/ 临时变量for (pos = 0; pos m; pos+)/ 初始化基桶bucket.recordspos.isEmpty = true;/ 空记录bucket.next = -1;/ 无溢出hashFile.clear();/ 清除标志hashFile.seekg(0, ios:beg);/ 定位到文件头for (pos = 0; pos b; pos+)/ 写基桶到文件中hashFile.write(char *)&bucket, sizeof(BucketType);/ 写入基桶类TelephoneServer的Service()辅助函数为客户服务人员服务当前的电话,如果当前客户接受服务的时间还未到达客户服务所需的时间,则继续在为客户提供服务,否则如有客户在等待服务,则从等待队列中取出新客户进行服务,并更新总客户等待时间,具体实现如下:template void TelephoneServer:Service()/操作结果:服务当前电话(如有电话)for(int i=0;inumOfCustomerServiceStaffs;i+) /处理每个客服工作人员提供的服务if(customerServedi.curServiceTimecustomerServedi.duration) /未到达客户接受服务所需的时间,正在为客户提供服务customerServedi.curServiceTime+; /增加客户接受服务的时间else /已到达客户接受服务所需的时间,为下一客户提供服务if(!callsWaitingQueuei.Empty() /有客户在等待callsWaitingQueuei.OutQueue(customerServedi); /从等待队列中取出新客户进行服务totalWaitingTime+=curTime-customerServedi.arrivalTime; /更新总客户等待时间类TelephoneServer的CheckForNewCall()辅助函数用于生成当前时间打进电话的人数,对每个打进电话的客户,将其插入最短的客服电话等待队列中,具体实现如下:template void TelephoneServer:CheckForNewCall()/操作结果:检查是否有新电话,如果有,则将电话添加到电话队列int calls=GetPoissionRand(arrivalRate); /当前打进电话的人数for(int i=1;i=calls;i+) /第i个电话CustomerType customer; /客户 customer.arrivalTime=curTime; /客户到达时间customer.duration=GetPoissionRand(averageServiceTime); /客户接受服务所需的时间customer.curServiceTime=0; /当前接受服务的时间int pos=MinLengthCallWaitingQueue(); /最短客服电话等待队列的位置 callsWaitingQueuepos.InQueue(customer); /客户插入等待队列numOfCalls+; /处理的电话数类TelephoneServer的Display()辅助函数用于在模拟的最后显示处理的总电话数和每个电话的平均等待时间,具体实现如下:template void TelephoneServer:Display()/操作结果:显示模拟结果cout处理的总电话数:numOfCallsendl;cout平均等待时间:GetTheAverageServiceTimet()endlendl;类TelephoneServer的Run()方法实现模拟电话客户服务,当为到达时间限制时,首先检查是否有新电话,如果有,则将电话添加到电话队列,然后客户服务人员再对当前客户进行服务,最后增加时间;当已到达时间限制时,不再检查是否有新电话,但客户服务人员还要对当前客户进行服务,并增加时间,具体实现如下:template void TelephoneServer:Run()/操作结果:模拟电话客户服务 while(curTime0) /在客服电话等待队列中还有客户在等待服务Service(); /进行服务curTime+; /增加时间Display();类TelephoneServer中Hash(const char severNumber18)辅助函数用于生成散列函数值,具体实现如下:template long TelephoneServer:Hash(const char severNumber18)/ 操作结果: 返回散列函数值long h = 0;/ 散列函数值for (int pos = 0; pos (int)strlen(severNumber); pos+)/ 依次处理各数字字符h = (h * 10 + severNumberpos - 0) % b;return h;/ 返回散列函数值类TelephoneServer中LocateHelp(const BucketType &bucket, char severNumber18)辅助函数用于记录服务人员编号在桶中的位置,具体实现如下:template int TelephoneServer:LocateHelp(const BucketType &bucket, char severNumber18)/ 操作结果: 返回服务人员编号severNumber在桶bucket中的位置for (int pos = 0; pos m; pos+)/ 依次比较桶中各服务人员信息存储记录if (!bucket.recordspos.isEmpty &strcmp(bucket.recordspos.severNumber, severNumber) = 0) return pos; / 定位成功return -1;/ 定位失败类TelephoneServer中Locate(BucketType &bucket, long &offset,int &pos, char severNumber18)辅助函数用于定位服务人员编号所在的桶,以及在桶中的位置和桶在文件中的位置,具体实现如下:template void TelephoneServer:Locate(BucketType &bucket, long &offset, int &pos, char severNumber18)/ 操作结果: 定位服务人员编号severNumber所在的桶bucket, 在桶中的位置pos, 桶在文件/中的位置位置offsetlong h = Hash(severNumber);/ 散列函数值offset = sizeof(BucketType) * h;/ 桶在文件中的位置hashFile.clear();/ 清除标志hashFile.seekg(offset, ios:beg);/ 文件定位hashFile.read(char *)&bucket, sizeof(BucketType);/ 读取基桶pos = LocateHelp(bucket, severNumber);/ 定位服务人员信息存储记录在桶中的位置if (pos = -1) offset = bucket.next;/ 溢出桶的位置while (pos = -1 & offset != -1)/ 继续在溢出桶中查找hashFile.clear();/ 清除标志hashFile.seekg(offset, ios:beg);/ 文件定位hashFile.read(char *)&bucket, sizeof(BucketType);/ 读到基桶pos = LocateHelp(bucket, severNumber);/ 定位服务人员信息存储记录在桶中的位置if (pos = -1) offset = bucket.next;/ 后继溢出桶的位置类TelephoneServer中LocateEmptyRecordHelp(const BucketType &bucket)辅助函数用于获得空记录的位置,具体实现如下:template int TelephoneServer:LocateEmptyRecordHelp(const BucketType &bucket)/ 操作结果: 返回空记录位位置for (int pos = 0; pos m; pos+)/ 依次比较桶中各服务人员信息存储记录if (bucket.recordspos.isEmpty) return pos;/ 定位成功return -1;/ 定位失败类TelephoneServer中LocateEmptyRecord(BucketType &bucket, long &offset, int &pos, char severNumber18)辅助函数用于服务人员编号所在具有空记录的桶,以及桶中空记录的位置,和桶在文件中的位置,具体实现如下:template void TelephoneServer:LocateEmptyRecord(BucketType &bucket, long &offset, int &pos, char severNumber18)/ 操作结果: 定位服务人员编号severNumber所在的具有空记录的桶bucket, 桶中的空记录位置pos, 桶/在文件中的位置位置offsetlong h = Hash(severNumber);/ 散列函数值offset = sizeof(BucketType) * h;/ 桶在文件中的位置hashFile.clear();/ 清除标志hashFile.seekg(offset, ios:beg);/ 文件定位hashFile.read(char *)&bucket, sizeof(BucketType);/ 读到基桶pos = LocateEmptyRecordHelp(bucket);/ 定位桶中空记录的位置if (pos = -1) offset = bucket.next;/ 溢出桶的位置while (pos = -1 & offset != -1)/ 继续在溢出桶中查找hashFile.clear();/ 清除标志hashFile.seekg(offset, ios:beg);/ 文件定位hashFile.read(char *)&bucket, sizeof(BucketType);/ 读到基桶pos = LocateEmptyRecordHelp(bucket);/ 定位桶中空记录的位置if (pos = -1) offset = bucket.next;/ 后继溢出桶的位置类TelephoneServer中Input()辅助函数用于输入记录并且将数据写入通过桶写入到文件中,具体实现如下:template void TelephoneServer:Input()/ 操作结果: 输入记录TelephoneServerType telph; / 服务人员信息存储记录telph.isEmpty = false;/ 标记cout telph.severNumber;cout telph.severName; telph.objServerTotalTime=GetTheServerTotalTime(); telph.objTelephoneOfLimit=GetTheTelephoneOfLimit();BucketType bucket;/ 桶long offset;/ 桶在文件中的相应位置int pos;/ 服务人员信息存储记录在桶中的位置Locate(bucket, offset, pos, telph.severNumber);/ 定位服务人员信息存储记录的位置if (pos != -1) / 定位成功cout 编号已在散列文件中! endl;else/ 定位失败LocateEmptyRecord(bucket, offset, pos, telph.severNumber);/ 定位空记录位置if (pos != -1)/ 找到空记录bucket.recordspos = telph;/ 将服务人员信息存储记录赋值给bucket.recordsposhashFile.clear();/ 清除标志hashFile.seekg(offset, ios:beg);/ 定位文件hashFile.write(char *)&bucket, sizeof(BucketType);/ 写桶elsehashFile.clear();/ 清除标志hashFile.seekg(0, ios:end);/ 定位到文件尾bucket.next = hashFile.tellg();/ 后继溢出桶位置hashFile.clear();/ 清除标志hashFile.seekg(offset, ios:beg);/ 定位文件hashFile.write(char *)&bucket, sizeof(BucketType);/ 写桶offset = bucket.next;/ 新溢出桶在文件中的位置for (pos = 1; pos m; pos+)/ 设置空记录bucket.recordspos.isEmpty = true;pos = 0;/ 服务人员信息存储记录的位置bucket.recordspos = telph;/ 将服务人员信息存储记录赋值给bucket.recordsposhashFile.clear();/ 清除标志hashFile.seekg(offset, ios:beg);/ 定位文件hashFile.write(char *)&bucket, sizeof(BucketType);/ 写桶类TelephoneServer中Serach()辅助函数用于查找客服人员的信息,通过输入客服人员编号获得其在文件中的位置并显示在屏幕上,具体实现如下:template void TelephoneServer:Serach()/ 操作结果: 查找记录char severNumber18;/ 服务人员编号cout severNumber;BucketType bucket;/ 桶long offset;/ 桶在文件中的相应位置int pos;/ 服务人员信息存储记录在桶中的位置Locate(bucket, offset, pos, severNumber);/ 定位服务人员信息存储记录的= -1)if (pos = -1)/ 定位失败cout 查找失败! endl;elsehashFile.clear();/ 清除标志hashFile.seekg(offset, ios:beg);/ 定位文件hashFile.read(char *)&bucket, sizeof(BucketType);/ 读桶cout 服务人员编号: bucket.recordspos.severNumber endl;cout 服务人员姓名:

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论