數(shù)據(jù)結(jié)構(gòu)電話客戶服務(wù)模擬_第1頁
數(shù)據(jù)結(jié)構(gòu)電話客戶服務(wù)模擬_第2頁
數(shù)據(jù)結(jié)構(gòu)電話客戶服務(wù)模擬_第3頁
數(shù)據(jù)結(jié)構(gòu)電話客戶服務(wù)模擬_第4頁
數(shù)據(jù)結(jié)構(gòu)電話客戶服務(wù)模擬_第5頁
已閱讀5頁,還剩17頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

客戶效勞模擬問題描述一個(gè)模擬時(shí)鐘提供接聽效勞的時(shí)間〔以分鐘記〕,然后這個(gè)時(shí)鐘將循環(huán)的自增一〔分鐘〕直到到達(dá)指定時(shí)間為止。在時(shí)鐘的每個(gè)“時(shí)刻”,就會(huì)執(zhí)行一次檢查來看看當(dāng)前的效勞是否已經(jīng)完成了,如果是,這個(gè)從隊(duì)列中刪除,模擬效勞將從隊(duì)列中取出下一個(gè)〔如果有的話〕繼續(xù)開始。同時(shí)還需要執(zhí)行一個(gè)檢查來判斷是否有一個(gè)新的到達(dá)。如果是將其到達(dá)時(shí)間記錄下來,并為其產(chǎn)生一個(gè)隨機(jī)效勞時(shí)間,這個(gè)效勞時(shí)間也被記錄下來,然后這個(gè)被放入隊(duì)列中,當(dāng)客戶效勞人員空閑時(shí),按照先來先效勞的方式處理這個(gè)隊(duì)列。當(dāng)時(shí)鐘到達(dá)指定時(shí)間時(shí),不會(huì)再接聽新的,但是效勞將繼續(xù),直到隊(duì)列中所有都得到處理為止。當(dāng)完成上述功能以后,將記錄最正確方案,記錄客服人員信息,通過桶存儲(chǔ)方式來記錄和查詢信息。根本要求〔1〕程序需要的初始數(shù)據(jù)包括:客戶效勞人員的人數(shù),時(shí)間限制,的到達(dá)速率,平均效勞時(shí)間,客服人員編號(hào),客服人員姓名?!?〕程序產(chǎn)生的結(jié)果包括:處理的數(shù),每個(gè)的平均等待時(shí)間,效勞總時(shí)間,限制時(shí)間內(nèi)接聽數(shù)。三、工具/準(zhǔn)備工作在開始做課程設(shè)計(jì)工程前,應(yīng)回憶或復(fù)習(xí)相關(guān)內(nèi)容。需要一臺(tái)計(jì)算機(jī),期中安裝有VisualC++6.0、VisualC++2005、VisualC++2005Express、Dev-C++或MinGWDeveloperStudio之一的集成開發(fā)環(huán)境。分析與實(shí)現(xiàn)由于要計(jì)算客戶的等待時(shí)間,并且每個(gè)客戶都有接受效勞所需的時(shí)間,為實(shí)現(xiàn)這些功能,對(duì)客戶加上當(dāng)前接受效勞的時(shí)間,具體客戶結(jié)構(gòu)類型和效勞人員類型如下://效勞人員類型structTelephoneServerType{ charseverNumber[18]; //效勞人員編號(hào) charseverName[16]; //效勞人員姓名 boolisEmpty; //是否為空 intobjServerTotalTime;//效勞總時(shí)間 intobjTelephoneOfLimit;//限制時(shí)間內(nèi)接聽數(shù)};//客戶類型structCustomerType{unsignedintarrivalTime;//客戶到達(dá)時(shí)刻 unsignedintduration;//客戶接受效勞所需的時(shí)間 unsignedintcurServiceTime;//當(dāng)前接受效勞的時(shí)間};//效勞人員類型structServerType{ intserverTotalTime;//效勞總時(shí)間 inttelephoneOfLimit;//限制時(shí)間內(nèi)接聽數(shù)};為了模擬計(jì)時(shí),在客戶效勞模擬類中增加表示當(dāng)前時(shí)間的變量curTime,此處時(shí)間單位為分鐘,為更好地模擬,使用泊松隨機(jī)數(shù),為模擬客戶隨機(jī)打進(jìn),需要知道客戶到達(dá)率〔平均每分鐘打進(jìn)人數(shù)〕,為模擬客戶接受效勞的時(shí)間,需要知道平均效勞時(shí)間,為存儲(chǔ)效勞人員信息,需要?jiǎng)?chuàng)造一個(gè)文本,將基桶寫入文件中,具體客戶效勞模擬類聲明如下:template<intm,intb>TelephoneServer<m,b>::TelephoneServer()//操作結(jié)果:初始化效勞人員信息{ //初始化數(shù)據(jù)成員 curTime=0;//當(dāng)前時(shí)間初值為0 totalWaitingTime=0;//總等待時(shí)間初值為0numOfCalls=0;//處理的數(shù)初值為0//獲得模擬參數(shù) cout<<"輸入客戶人員的人數(shù)(請(qǐng)輸入數(shù)字):"; cin>>numOfCustomerServiceStaffs;//輸入客戶人員的人數(shù) cout<<"輸入時(shí)間限制(請(qǐng)輸入數(shù)字):"; cin>>limitTime;//不再接受新的時(shí)間 intcallsPerHour;//每小時(shí)數(shù) cout<<"輸入每小時(shí)數(shù)(請(qǐng)輸入數(shù)字):"; cin>>callsPerHour;//輸入每小時(shí)數(shù) arrivalRate=callsPerHour/60.0;//轉(zhuǎn)換為每分鐘數(shù) cout<<"輸入平均效勞時(shí)間(請(qǐng)輸入數(shù)字):"; cin>>averageServiceTime;//輸入平均效勞時(shí)間//分配動(dòng)態(tài)存儲(chǔ)空間 callsWaitingQueue=newLinkQueue<CustomerType>[numOfCustomerServiceStaffs];//為客服等待隊(duì)列數(shù)組分配存儲(chǔ)空間 customerServed=newCustomerType[numOfCustomerServiceStaffs];//為客服人員正在效勞的客戶分配存儲(chǔ)空間servers=newServerType[numOfCustomerServiceStaffs];//為效勞人員分配存儲(chǔ)空間//初始化客服人員正在效勞的客戶 for(inti=0;i<numOfCustomerServiceStaffs;i++) {//初始化每個(gè)客服人員正在效勞的客戶 customerServed[i].curServiceTime=customerServed[i].duration=0;//表示還沒有人接受效勞servers[i].serverTotalTime=servers[i].telephoneOfLimit=0;//表示還沒有工作 }//設(shè)置隨機(jī)數(shù)種子 SetRandSeed();//以當(dāng)前時(shí)間值為隨機(jī)數(shù)種子 ifstreamiFile("telph.dat"); //建立輸入文件 if(iFile.fail()) { //翻開文件失敗,表示不存在文件 ofstreamoFile("telph.dat"); //建立輸出文件 if(oFile.fail())throw("翻開文件失敗!"); //拋出異常 oFile.close(); //關(guān)閉文件 } else { //存在文件 iFile.close(); //關(guān)閉文件 } hashFile.open("telph.dat",ios::in|ios::out|ios::binary); //以讀寫方式翻開文件 if(hashFile.fail())throw("翻開文件失敗!"); //拋出異常 hashFile.seekg(0,ios::end); //定位到文件尾 intbucketNum=hashFile.tellg()/sizeof(BucketType); //桶數(shù) if(bucketNum<b) { //桶數(shù)不于基桶數(shù),說明文件不完整或已被破壞,應(yīng)初始化基桶 BucketTypebucket; intpos; //臨時(shí)變量 for(pos=0;pos<m;pos++) { //初始化基桶 bucket.records[pos].isEmpty=true; //空記錄 bucket.next=-1; //無溢出 } hashFile.clear(); //去除標(biāo)志 hashFile.seekg(0,ios::beg); //定位到文件頭 for(pos=0;pos<b;pos++) { //寫基桶到文件中 hashFile.write((char*)&bucket,sizeof(BucketType));//寫入基桶 } }}類TelephoneServer的Service〔〕輔助函數(shù)為客戶效勞人員效勞當(dāng)前的,如果當(dāng)前客戶接受效勞的時(shí)間還未到達(dá)客戶效勞所需的時(shí)間,那么繼續(xù)在為客戶提供效勞,否那么如有客戶在等待效勞,那么從等待隊(duì)列中取出新客戶進(jìn)行效勞,并更新總客戶等待時(shí)間,具體實(shí)現(xiàn)如下:template<intm,intb>voidTelephoneServer<m,b>::Service()//操作結(jié)果:效勞當(dāng)前〔如有〕{ for(inti=0;i<numOfCustomerServiceStaffs;i++) {//處理每個(gè)客服工作人員提供的效勞 if(customerServed[i].curServiceTime<customerServed[i].duration) {//未到達(dá)客戶接受效勞所需的時(shí)間,正在為客戶提供效勞 customerServed[i].curServiceTime++;//增加客戶接受效勞的時(shí)間 } else {//已到達(dá)客戶接受效勞所需的時(shí)間,為下一客戶提供效勞 if(!callsWaitingQueue[i].Empty()) {//有客戶在等待 callsWaitingQueue[i].OutQueue(customerServed[i]);//從等待隊(duì)列中取出新客戶進(jìn)行效勞 totalWaitingTime+=curTime-customerServed[i].arrivalTime;//更新總客戶等待時(shí)間 } } }}類TelephoneServer的CheckForNewCall〔〕輔助函數(shù)用于生成當(dāng)前時(shí)間打進(jìn)的人數(shù),對(duì)每個(gè)打進(jìn)的客戶,將其插入最短的客服等待隊(duì)列中,具體實(shí)現(xiàn)如下:template<intm,intb>voidTelephoneServer<m,b>::CheckForNewCall()//操作結(jié)果:檢查是否有新,如果有,那么將添加到隊(duì)列{ intcalls=GetPoissionRand(arrivalRate);//當(dāng)前打進(jìn)的人數(shù) for(inti=1;i<=calls;i++) {//第i個(gè) CustomerTypecustomer;//客戶customer.arrivalTime=curTime;//客戶到達(dá)時(shí)間 customer.duration=GetPoissionRand(averageServiceTime);//客戶接受效勞所需的時(shí)間 customer.curServiceTime=0;//當(dāng)前接受效勞的時(shí)間 intpos=MinLengthCallWaitingQueue();//最短客服等待隊(duì)列的位置callsWaitingQueue[pos].InQueue(customer);//客戶插入等待隊(duì)列 numOfCalls++;//處理的數(shù) }}類TelephoneServer的Display〔〕輔助函數(shù)用于在模擬的最后顯示處理的總數(shù)和每個(gè)的平均等待時(shí)間,具體實(shí)現(xiàn)如下:template<intm,intb>voidTelephoneServer<m,b>::Display()//操作結(jié)果:顯示模擬結(jié)果{ cout<<"處理的總數(shù):"<<numOfCalls<<endl; cout<<"平均等待時(shí)間:"<<GetTheAverageServiceTimet()<<endl<<endl;}類TelephoneServer的Run〔〕方法實(shí)現(xiàn)模擬客戶效勞,當(dāng)為到達(dá)時(shí)間限制時(shí),首先檢查是否有新,如果有,那么將添加到隊(duì)列,然后客戶效勞人員再對(duì)當(dāng)前客戶進(jìn)行效勞,最后增加時(shí)間;當(dāng)已到達(dá)時(shí)間限制時(shí),不再檢查是否有新,但客戶效勞人員還要對(duì)當(dāng)前客戶進(jìn)行效勞,并增加時(shí)間,具體實(shí)現(xiàn)如下:template<intm,intb>voidTelephoneServer<m,b>::Run()//操作結(jié)果:模擬客戶效勞{ while(curTime<limitTime) {//未到達(dá)時(shí)間限制,可檢查新 CheckForNewCall();//檢查是否有新,如果有,那么將添加到隊(duì)列 Service();//進(jìn)行效勞 curTime++;//增加時(shí)間 } while(MinLengthCallWaitingQueue()>0) {//在客服等待隊(duì)列中還有客戶在等待效勞 Service();//進(jìn)行效勞 curTime++;//增加時(shí)間 } Display();}類TelephoneServer中Hash(constcharseverNumber[18])輔助函數(shù)用于生成散列函數(shù)值,具體實(shí)現(xiàn)如下:template<intm,intb>longTelephoneServer<m,b>::Hash(constcharseverNumber[18])//操作結(jié)果:返回散列函數(shù)值{ longh=0; //散列函數(shù)值 for(intpos=0;pos<(int)strlen(severNumber);pos++) { //依次處理各數(shù)字字符 h=(h*10+severNumber[pos]-'0')%b; } returnh; //返回散列函數(shù)值}類TelephoneServer中LocateHelp(constBucketType&bucket,charseverNumber[18])輔助函數(shù)用于記錄效勞人員編號(hào)在桶中的位置,具體實(shí)現(xiàn)如下:template<intm,intb>intTelephoneServer<m,b>::LocateHelp(constBucketType&bucket,charseverNumber[18])//操作結(jié)果:返回效勞人員編號(hào)severNumber在桶bucket中的位置{ for(intpos=0;pos<m;pos++) { //依次比擬桶中各效勞人員信息存儲(chǔ)記錄 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])輔助函數(shù)用于定位效勞人員編號(hào)所在的桶,以及在桶中的位置和桶在文件中的位置,具體實(shí)現(xiàn)如下:template<intm,intb>voidTelephoneServer<m,b>::Locate(BucketType&bucket,long&offset, int&pos,charseverNumber[18])//操作結(jié)果:定位效勞人員編號(hào)severNumber所在的桶bucket,在桶中的位置pos,桶在文件// 中的位置位置offset{ longh=Hash(severNumber); //散列函數(shù)值 offset=sizeof(BucketType)*h; //桶在文件中的位置 hashFile.clear(); //去除標(biāo)志 hashFile.seekg(offset,ios::beg); //文件定位 hashFile.read((char*)&bucket,sizeof(BucketType)); //讀取基桶 pos=LocateHelp(bucket,severNumber); //定位效勞人員信息存儲(chǔ)記錄在桶中的位置 if(pos==-1)offset=bucket.next; //溢出桶的位置 while(pos==-1&&offset!=-1) { //繼續(xù)在溢出桶中查找 hashFile.clear(); //去除標(biāo)志 hashFile.seekg(offset,ios::beg); //文件定位 hashFile.read((char*)&bucket,sizeof(BucketType)); //讀到基桶 pos=LocateHelp(bucket,severNumber); //定位效勞人員信息存儲(chǔ)記錄在桶中的位置 if(pos==-1)offset=bucket.next; //后繼溢出桶的位置 }}類TelephoneServer中LocateEmptyRecordHelp(constBucketType&bucket)輔助函數(shù)用于獲得空記錄的位置,具體實(shí)現(xiàn)如下:template<intm,intb>intTelephoneServer<m,b>::LocateEmptyRecordHelp(constBucketType&bucket)//操作結(jié)果:返回空記錄位位置{ for(intpos=0;pos<m;pos++) { //依次比擬桶中各效勞人員信息存儲(chǔ)記錄 if(bucket.records[pos].isEmpty)returnpos; //定位成功 } return-1; //定位失敗}類TelephoneServer中LocateEmptyRecord(BucketType&bucket,long&offset,int&pos,charseverNumber[18])輔助函數(shù)用于效勞人員編號(hào)所在具有空記錄的桶,以及桶中空記錄的位置,和桶在文件中的位置,具體實(shí)現(xiàn)如下:template<intm,intb>voidTelephoneServer<m,b>::LocateEmptyRecord(BucketType&bucket,long&offset, int&pos,charseverNumber[18])//操作結(jié)果:定位效勞人員編號(hào)severNumber所在的具有空記錄的桶bucket,桶中的空記錄位置pos,桶// 在文件中的位置位置offset{ longh=Hash(severNumber); //散列函數(shù)值 offset=sizeof(BucketType)*h; //桶在文件中的位置 hashFile.clear(); //去除標(biāo)志 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) { //繼續(xù)在溢出桶中查找 hashFile.clear(); //去除標(biāo)志 hashFile.seekg(offset,ios::beg); //文件定位 hashFile.read((char*)&bucket,sizeof(BucketType)); //讀到基桶 pos=LocateEmptyRecordHelp(bucket); //定位桶中空記錄的位置 if(pos==-1)offset=bucket.next; //后繼溢出桶的位置 }}類TelephoneServer中Input()輔助函數(shù)用于輸入記錄并且將數(shù)據(jù)寫入通過桶寫入到文件中,具體實(shí)現(xiàn)如下:template<intm,intb>voidTelephoneServer<m,b>::Input()//操作結(jié)果:輸入記錄{ TelephoneServerTypetelph;//效勞人員信息存儲(chǔ)記錄 telph.isEmpty=false; //標(biāo)記 cout<<"輸入效勞人員編號(hào):"; cin>>telph.severNumber; cout<<"輸入效勞人員姓名:"; cin>>telph.severName;telph.objServerTotalTime=GetTheServerTotalTime();telph.objTelephoneOfLimit=GetTheTelephoneOfLimit(); BucketTypebucket; //桶 longoffset; //桶在文件中的相應(yīng)位置 intpos; //效勞人員信息存儲(chǔ)記錄在桶中的位置 Locate(bucket,offset,pos,telph.severNumber); //定位效勞人員信息存儲(chǔ)記錄的位置 if(pos!=-1) { //定位成功 cout<<"編號(hào)已在散列文件中!"<<endl; } else { //定位失敗 LocateEmptyRecord(bucket,offset,pos,telph.severNumber);//定位空記錄位置 if(pos!=-1) { //找到空記錄 bucket.records[pos]=telph; //將效勞人員信息存儲(chǔ)記錄賦值給bucket.records[pos] hashFile.clear(); //去除標(biāo)志 hashFile.seekg(offset,ios::beg); //定位文件 hashFile.write((char*)&bucket,sizeof(BucketType));//寫桶 } else { hashFile.clear(); //去除標(biāo)志 hashFile.seekg(0,ios::end); //定位到文件尾 bucket.next=hashFile.tellg(); //后繼溢出桶位置 hashFile.clear(); //去除標(biāo)志 hashFile.seekg(offset,ios::beg); //定位文件 hashFile.write((char*)&bucket,sizeof(BucketType));//寫桶 offset=bucket.next; //新溢出桶在文件中的位置 for(pos=1;pos<m;pos++) { //設(shè)置空記錄 bucket.records[pos].isEmpty=true; } pos=0; //效勞人員信息存儲(chǔ)記錄的位置 bucket.records[pos]=telph; //將效勞人員信息存儲(chǔ)記錄賦值給bucket.records[pos] hashFile.clear(); //去除標(biāo)志 hashFile.seekg(offset,ios::beg); //定位文件 hashFile.write((char*)&bucket,sizeof(BucketType));//寫桶 } }}類TelephoneServer中Serach()輔助函數(shù)用于查找客服人員的信息,通過輸入客服人員編號(hào)獲得其在文件中的位置并顯示在屏幕上,具體實(shí)現(xiàn)如下:template<intm,intb>voidTelephoneServer<m,b>::Serach()//操作結(jié)果:查找記錄{ charseverNumber[18]; //效勞人員編號(hào) cout<<"輸入效勞人員編號(hào):"; cin>>severNumber; BucketTypebucket; //桶 longoffset; //桶在文件中的相應(yīng)位置 intpos; //效勞人員信息存儲(chǔ)記錄在桶中的位置 Locate(bucket,offset,pos,severNumber);//定位效勞人員信息存儲(chǔ)記錄的=-1) if(pos==-1) { //定位失敗 cout<<"查找失敗!"<<endl; } else { hashFile.clear(); //去除標(biāo)志 hashFile.seekg(offset,ios::beg); //定位文件 hashFile.read((char*)&

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論