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

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

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

溫馨提示

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

最新文檔

評論

0/150

提交評論