还剩33页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
电话客户服务模拟
一、问题描述一个模拟时钟提供接听电话服务的时间(以分钟记),然后这个时钟将循环的自增一(分钟)直到到达指定时间为止在时钟的每个“时刻”,就会执行一次检查来看看当前电话的服务是否已经完成了,如果是,这个电话从电话队列中删除,模拟服务将从队列中取出下一个电话(如果有的话)继续开始同时还需要执行一个检查来判断是否有一个新的电话到达如果是将其到达时间记录下来,并为其产生一个随机服务时间,这个服务时间也被记录下来,然后这个电话被放入电话队列中,当客户服务人员空闲时,按照先来先服务的方式处理这个队列当时钟到达指定时间时,不会再接听新的电话,但是服务将继续,直到电话队列中所有电话都得到处理为止当完成上述功能以后,将记录最佳方案,记录客服人员信息,通过桶存储方式来记录和查询信息
二、基本要求()程序需要的初始数据包括客户服务人员的人数,时间限1制,电话的到达速率,平均服务时间,客服人员编号,客服人员姓名()程序产生的结果包括处理的电话数,每个电话的平均等2待时间,服务总时间,限制时间内接听电话数
三、工具/准备工作在开始做课程设计项目前,应回顾或复习相关内容需要一台计算机,期中安装有、、Visual C++
6.0Visual C++2005队列〃当前int calls=GetPoissionRandarrivalRate;打进电话的人数forint i=l;i=calls;i++{〃第个电话i〃客CustomerType customer;户customer.arrivalTime=curTime;//客户到达时间customer.duration=GetPoissionRandaverageServiceTime;〃客户接受服务所需的时间customer.curServiceTime=0;〃当前接受服务的时间int pos=MinLengthCallWaitingQueue;〃最短客服电话等待队列的位置callsWaitingQueue[pos].InQueuecustomer;//客户插入等待队列numOfCalls++;//处理的电话数类的辅助函数用于在模拟的最后显示处理TelephoneServer Display的总电话数和每个电话的平均等待时间,具体实现如下template intm,int bvoidTelephoneServerm,b::Display〃操作结果显示模拟结果处理的总电话数:cout vv”vvnumOfCalls vVendl;cout«n平均等待时||:,,GetTheAverageServiceTimet«endl«endl;H类的方法实现模拟电话客户服务,当为到达TelephoneServer Run时间限制时,首先检查是否有新电话,如果有,则将电话添加到电话队列,然后客户服务人员再对当前客户进行服务,最后增加时间;当已到达时间限制时,不再检查是否有新电话,但客户服务人员还要对当前客户进行服务,并增加时间,具体实现如下template intm,int bvoidTelephoneServerm,b::Run〃操作结果模拟电话客户服务whilecurTimelimitTime〃未到达时间限制,可检查新电话〃检查是否有CheckForNewCallO;新电话,如果有,则将电话添加到电话队列〃进行服务Service;〃增加时间curTime++;whileMinLengthCallWaitingQueueO{〃在客服电话等待队列中还有客户在等待服务〃进行服务Service;curTime++;〃增加时间Display;类中辅助函数TelephoneServer Hashconst char severNumber
[18]用于生成散列函数值,具体实现如下template intm,int blongTelephoneServerm,b::Hashconstchar severNumber
[18]//操作结果返回散列函数值//散列函数值long h=0;for int pos=0;posintstrlenseverNumber;pos++{//依次处理各数字字符h=h*10+severNumber[pos]-0%b;//返回散列函数值return h;类中TelephoneServer LocateHelpconst BucketType bucketchar9辅助函数用于记录服务人员编号在桶中的位置,具体实现severNumber
[18]如下template intm,int bintTelephoneServerm,b::LocateHelpconstBucketType bucket,char severNumber
[18]//操作结果返回服务人员编号在桶中的位置severNumber bucketfor int pos=0;posm;pos++{〃依次比较桶中各服务人员信息存储记录if!bucket.records[pos].isEmpty strcmpbucketrecords[pos].severNumber9定位成功severNumber==0return pos;//return-1;//定位失败类中TelephoneServer LocateBucketType bucket long offset,int9辅助函数用于定位服务人员编号所在的桶,pos,char severNumber
[18]以及在桶中的位置和桶在文件中的位置,具体实现如下template intm,int bvoidTelephoneServerm,b::LocateBucketType bucketlong5offset9int pos,char severNumber
[18]//操作结果定位服务人员编号所在的桶severNumber bucket,在桶中的位置桶在文件pos,//中的位置位置offsetlong h=HashseverNumber;//散列函数值offset=sizeofBucketType*h;//桶在文件中的位置hashFile.clear;//清除标志hashFile.seekgoffset ios::beg;//文件定位9读取基hashFile.readchar*bucket sizeofBucketType;//pos=LocateHelpbucket severNumber;//定9位服务人员信息存储记录在桶中的位置//溢出桶的位置if pos==-1offset=bucket.next;while pos==-1offset!=-1{//继续在溢出桶中查找//清除标志hashFile.clear;//文件定位hashFile.seekgoffset ios::beg;9读hashFile.readchar*bucket,sizeofBucketType;//到基桶pos=LocateHelpbucket^severNumber;//定位服务人员信息存储记录在桶中的位置//后继溢出桶的if pos==-1offset=bucketnext;位置类中TelephoneServer LocateEmptyRecordHelpconst辅助函数用于获得空记录的位置,具体实现如BucketType bucket下template intm,int bintTelephoneServerm,b::LocateEmptyRecordHelpconstBucketType bucket//操作结果返回空记录位位置forint pos=0;posm;pos++{//依次比较桶中各服务人员信息存储记录//定位成功if bucket.records[pos].isEmpty returnpos;//定位失败return-1;类中TelephoneServer LocateEmptyRecordBucketType辅助函数用bucket,long offset,int pos,char severNumber
[18]于服务人员编号所在具有空记录的桶,以及桶中空记录的位置,和桶在文件中的位置,具体实现如下:template intm,int bvoidTelephoneServerm,b::LocateEmptyRecordBucketTypebucket long offset99int pos,char severNumber
[18]//操作结果定位服务人员编号所在的具有空记severNumber录的桶桶中的空记录位置桶bucket,pos,//在文件中的位置位置offset//散long h=HashseverNumber;列函数值offset=sizeofBucketType*h;//桶在文件中的位置hashFile.clearQ;//清除标志hashFile.seekgoffset9ios::beg;//文件定位读至基hashFile.readchar*bucket sizeofBucketType;//119//定位桶pos=LocateEmpty RecordHelpbucket;中空记录的位置if pos==-1offset=bucket.next;//溢出桶的位置while pos==-1offset!=-1//继续在溢出桶中查找hashFile.clear;//清除标志hashFile.seekgoffset ios::beg;9//文件定位读hashFile.readchar*bucket sizeofBucketiype;//9到基桶pos=LocateEmpty RecordHelpbucket;//定位桶中空记录的位置//后继溢出桶的if pos==-1offset=bucket.next;位置类中辅助函数用于输入记录并且将数TelephoneServer Input据写入通过桶写入到文件中,具体实现如下:template intm,int bvoidTelephoneServerm b::Input//操作结果输入记录TelephoneServerType telph;//服务人员信息存储记录//标记telph.isEmpty=false;”输入服务人员编号:“;cout«cin»telph.severNumber;”输入服务人员姓名:“;cout«cin»telph.severName;telph.objServerTotalTime=GetTheServerTotalTime;telph.objTelephoneOfLimit=GetTheTelephoneOfLimit;//桶BucketType bucket;//桶在文件中的longoffset;相应位置//服务人员信息int pos;存储记录在桶中的位置//定位服务人员信Locatebucket offset,pos,telph.severNumber;9息存储记录的位置if pos!=-1{//定位成功编号已在散列文件中!cout«vv endl;else{//定位失败LocateEmptyRecordbucket,offset,pos,定位空记录位置telph.severNumber;//if pos!=-1{//找到空记录//将服务人bucket.records[pos]=telph;员信息存储记录赋值给bucket.records[pos]hashFile.clearQ;//清除标志hashFile.seekgoffset,ios::beg;//定位文件hashFile.writechar*bucket sizeofBucketType;//9写桶else//清除标志hashFile.clearQ;//定位到文件hashFile.seekgO,ios::end;bucket.next=hashFile.tellgO;//后继溢出Visual C++2005Express、Dev・C++或MinGW DeveloperStudio之一的集成开发环境
四、分析与实现由于要计算客户的等待时间,并且每个客户都有接受服务所需的时间,为实现这些功能,对客户加上当前接受服务的时间,具体客户结构类型和服务人员类型如下//服务人员类型struct TelephoneServerTypecharseverNumber
[18];//服务人员编号char severName
[16];//服务人员姓名bool isEmpty;//是否为空int objServerTotalTime;〃服务总时间int objTelephoneOfLimit;〃限制时间内接听电话数;〃客户类型struct CustomerType〃客户到达时unsigned intarrivalTime;unsigned intduration;〃客户接受服桶位置hashFile.clear;//清除标志hashFile.seekgoffset ios::beg;//定位文件9hashFile.writechar*bucket,sizeofBucketiype;//写桶//新溢出桶在文offset=bucket.next;件中的位置for pos=1;posm;pos++{//设置空记录//服务人员信息pos=0;bucket.records[pos].isEmpty=true;存储记录的位置bucket.records[pos]=telph;//将服务人hashFile.clear;//清除标志//定位文件hashFile.seekgoffset ios::beg;9员信息存储记录赋值给bucket.records[pos]hashFile.writechar*bucket,sizeofBucketType;//写桶类中辅助函数用于查找客服人员的信息,TelephoneServer Serach通过输入客服人员编号获得其在文件中的位置并显示在屏幕上,具体实现如下template intm,int bvoidTelephoneServerm,b::Serach//服务人员编号charseverNumber
[18];//操作结果查找记录”输入服务人员编号:;cout«//桶BucketTypebucket;longoffset;//桶在文件中的相应位置//服务人员信息存储记录在桶intpos;cin»severNumber;中的位置定位服务人员信息存储Locatebucket,offset,pos,severNumber;//记录的=-1if pos==-1{//定位失败查找失败!”cout«vv endl;elsehashFile.clear;//清除标志hashFile.seekgoffset,ios::beg;//定位文件读hashFile.readchar*bucket,sizeofBucketType;//桶”服务人员编号”cout«cout«”服务人员bucket.records[pos].severNumber«endl;服务总时间”cout«bucket.records[pos].severName«endl;bucket.records[pos].objServerTotalTime«endl;”限制时间内接听电话数”«cout«bucket.records[pos].objTelephoneOfLimit«endl;类中辅助函数用于处理客服人员信息,TelephoneServer ServerRun通过获得相应的信息,从而链接文本中的桶,具体实现如下:template intm,int bvoidTelephoneServerm,b::ServerRun//操作结果处理服务人员信息int select;//临时变量do.输入信息.查找信息.退出cout vv123vvendl;输入选择:;cout«//输入选择cin»select;//跳过当前行的其while GetCharQ!=\n;switch select它字符case1://输入记录Input;break;case2:Serach;//查找记录break;}while select!=3;
五、测试与结论测试时,假设时间限制为(分钟),每600小时电话数为平60,均服务时间为(分钟),对不同客服人员人数进1行模拟如下:D输电务话间小虹人请请厂、艮代字II「FTT理数里子给小场息待娜入数数爵每等天簿又入矍入人入理均平日D输电务入语话间人忌数数字翅待继萧每主簿又数史程平的等否入子勘入入人人理罪均平小均息日待继员语人番每平务刖型的等限话否入入娜时间人人理宇数职工子娜均寸入数数韭簿又入情型泮务△星信星M3o.(输入信息.查找仁息.退出23输入选捍请人入自自副人查务选服出心F及、入欠选人人出退服费息翦选服人人石曾心信员员服变选息服变人人人服总时息艳息员员限入选人编姓间委人翦内息雨息官信总时服人二入选员员编姓服继任间内服入息员扁限入费支号入入键暂名则入洋务蓍入欠4®出退接入务务务务务务员口舒员制欠间号人务Wit名务务务员制爵接出不展间展Ml忌综合可知,当有个客服人员是比较恰当的,故开始记录客服人员信31B.■1-1,1,
1.1-1JZ;JT/T.VRD2:3:0^1:1:1:2:{/
1.23424323::5R2:22:2343451:^^nJQS7:^sn93m2100----.1d3=JQ11RIH-R■■
16.-0302B::0::tf:1698::0XX■216::0服D轮话间六字少人限时乂多小场忌待、主有每平的星等算人人、月人入理均的入0输话间数数0人限时簿字忌待又入数里继需每平否子入人人入理均曰平n/^^53^1801:■■16::0::0X是否继续<>y/n
六、课程设计总结主要是对于信息记录的扩展首先是计算最佳服务方式需要的客服人员人数;当接近平均等待时间为(分钟)时,此时开始记录客服人员1信息,信息内容有客服人员编号和姓名该功能是通过桶存储方式写入到文本中,然后以客服人员编号为比较信息在存储文本里查找和写入另外还有就是计算客服人员的客服人员服务总时间和在限制时间内接听电话数,并且将该数据加入到服务人员类型里面,然后通过函数传递的方式传递,然后写入桶中,在查找信息的时候随其他信息输出在完成该功能的过程中,我是在桶一文件中声明了两个类,但是在传递数据的时候有错误,就是在其中一个类中是正确的数据,但是我是把该数据加入到加入到客户类型里,然后通过该结构变量调用,但是传递到另一个类中的数据就是乱码,我也不知道怎么回事通过自己手动编写这个项目,体会到自己的要学的还很多,另外就是熟悉了以前所不熟悉的一些知识,比如结构的使用,还有链表的使用等等,我相信多动手会让我收获更多务所需的时间〃当前接受服unsigned intcurServiceTime;务的时间;〃服务人员类型struct ServerType〃服务总时间int serverTotalTime;〃限制时间内接听int telephoneOfLimit;电话数;为了模拟计时,在电话客户服务模拟类中增加表示当前时间的变量此处时间单位为分钟,为更好地模拟,使用泊curTime,松随机数,为模拟客户随机打进电话,需要知道客户到达率(平均每分钟打进电话人数),为模拟客户接受服务的时间,需要知道平均服务时间,为存储服务人员信息,需要创造一个文本,将基桶写入文件中,具体客户服务模拟类声明如下template intm,int bTelephoneServerm,b::TelephoneServer//操作结果初始化服务人员信息〃初始化数据成员curTime=O;〃当前时间初值为0〃总等待时间totalWaitingTime=0;初值为0numOfCalls=0;〃处理的电话数初值为0〃获得模拟参数输入客户人员的人数(请输入数字):;coutvv”cin»numOfCustomerServiceStaffs;//输入客户人员的人数”输入时间限制(请输入数字):;cout«cin»limitTime;〃不再接受新电话的时间int callsPerHour;〃每小时电话数输入每小时电话数(请输入数字):“;coutvv”cin»callsPerHour;〃输入每小时电话数arrivalRate=callsPerHour/
60.0;//转换为每分钟电话数输入平均服务时间(请输入数字):“;coutvv”cin»averageServiceTime;//输入平均服务时间〃分配动态存储空间calls WaitingQueue=newLinkQueueCustomerType[numOfCustomerServiceStaffs];〃为客服电话等待队列数组分配存储空间customerServed=newCustomerType[numOfCustomerServiceStaffs];〃为客服人员正在服务的客户分配存储空间servers=new ServerType[numOfCustomerServiceStaffs];〃为服务人员分配存储空间〃初始化客服人员正在服务的客户forint i=0;inumOfCustomerServiceStaffs;i++{〃初始化每个客服人员正在服务的客户customerServed[i].curServiceTime=customerServed[i].duration=0;〃表示还没有人接受服务servers[i].serverTotalTime=servers[i].telephoneOfLimit=0;〃表示还没有工作〃设置随机数种子SetRandSeedQ;〃以当前时间值为随机数种子ifstream iFilentelph.datn;//建立输入文件if iFile.fail{//打开文件失败,表示不存在文件ofstream oFilef,telph.datn;//建立输出文件打开文件失败!”;//抛出异常if oFile.fail throw//关闭文件oFile.close;else{//存在文件//关闭文件iFile.close;hashFile.openntelph.dat,\ios::in|ios::out|ios::binary;//以读写方式打开文件打开文件失败!”;//抛出异常ifhashFile.failthrow//定位到文件尾hashFile.seekgO ios::end;桶int bucketNum=hashFile.tellgO/sizeofBucketType;//if bucketNumb基桶//桶数不于基桶数,说明文件不完整或已被破坏,应初始化BucketTypebucket;//临时变量intpos;for pos=0;posm;pos++〃初始化基桶bucket.records[pos].isEmpty=true;//空记录//无溢出bucket.next=-1;//清除标志hashFile.clearQ;//定位到文件头hashFile.seekg0ios::beg;9for pos=0;posb;pos++{//写基桶到文件中hashFile.writechar*bucket,sizeofBucketType;//写入基桶类的辅助函数为客户服务人员服务TelephoneServer Service当前的电话,如果当前客户接受服务的时间还未到达客户服务所需的时间,则继续在为客户提供服务,否则如有客户在等待服务,则从等待队列中取出新客户进行服务,并更新总客户等待时间,具体实现如下template intm,int bvoidTelephoneServerm,b::Service〃操作结果服务当前电话如有电话forint i=0;inumOfCustomerServiceStaffs;i++{〃处理每个客服工作人员提供的服务ifcustomerServed[i].curServiceTimecustomerServed[i].duration{〃未到达客户接受服务所需的时间,正在为客户提供服务customerServed[i].curServiceTime++;//增加客户接受服务的时间}else〃已到达客户接受服务所需的时间,为下一客户提供服务if!callsWaitmgQueue[i].Empty〃有客户在等待〃从等待队列中calls WaitingQueue[i].OutQueuecustomerServed[i];取出新客户进行服务totalWaitingTime+=curTime-customerServed[i].arrivalTime;〃更新总客户等待时间类的辅助函数用于生成当前TelephoneServer CheckForNewCall时间打进电话的人数,对每个打进电话的客户,将其插入最短的客服电话等待队列中,具体实现如下template intm,int bvoidTelephoneServerm,b::CheckForNewCall〃操作结果检查是否有新电话,如果有,则将电话添加到电话。
个人认证
优秀文档
获得点赞 0