銀行業務系統等待隊列_第1頁
銀行業務系統等待隊列_第2頁
銀行業務系統等待隊列_第3頁
銀行業務系統等待隊列_第4頁
銀行業務系統等待隊列_第5頁
已閱讀5頁,還剩15頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

1、目錄一、 實驗問題描述-2二、 實驗需求分析-3三、 軟件概要設計-4四、 軟件詳細設計-5五、 編碼與調試分析-14六、 程序運行操作說明-15七、 測試結果-16八、 課程設計心得體會-18九、 自主學習參考文獻-19一、實驗問題描述:本課程設計的目的就是要達到能夠靈活運用程序設計基礎所講授內容,能夠針對一個需求比較明確的小型軟件,設計合理的解決方案,并能夠用編程語言轉化為可執行程序,以解決實際問題。進一步掌握開發一個小型實用軟件系統的基本步驟和方法、進一步培養良好的編程習慣、提升學習能力,熟練掌握數據結構中所學知識,并加以運用到實際軟件開發中去,掌握調試代碼的基本方法,通過調試找出BUG

2、出現的地方以及原因,并運用正確的方法進行DEBUG。設銀行有四個服務窗口,一個等待隊列, 每個窗口均可以辦理存款、取款、掛失、還貸業務,每種業務所需的服務時間不同,客戶到達銀行后,先到打號機上打號,號票上包括到達時間、編號和需要辦理的業務,然后在銀行內等候, 當任一服務窗口空閑時,處理等候客戶中排在最前面的客戶的業務。寫一個上述銀行業務的模擬系統,通過模擬方法求出客戶在銀行內逗留的平均時間和每個窗口辦理的客戶數及辦理的每種業務數?;疽螅好總€客戶到達銀行的時間和需要辦理的業務隨機產生,輸出一天客戶在銀行的平均逗留時間和每個窗口每天辦理的客戶數和每種業務數。 提高要求:設計圖形用戶界面,模擬中

3、國銀行真實的打號機操作界面,當用戶選擇一種業務后,要提示用戶排在前面的人數。測試數據:營業時間為8小時,其他模擬量自行設定。每個人在生活中都會隨時隨地的和銀行業務接觸,因而也造成了銀行工作人員的業務繁忙,同時大量的辦理業務客戶的出現也擾亂了銀行秩序。因此在實際生活中需要的前提下,誕生銀行業務辦理系統是必然的。每個客戶到達銀行后自行到打號機前打取自己的票號,從而就產生了一個銀行業務辦理等待隊列,每個客戶都根據自己的小票信息在銀行等待辦理自己的業務,從而有效地解決了客戶多引起的秩序混亂,當某個窗口空閑時,等待隊列中的最前一個客戶就到當前空閑的窗口辦理自己的業務,后面的客戶繼續等待,直到再一個空閑窗

4、口出現。通過對以上功能的實現,從而在實際生活中解決了人們日常生活中的銀行業務辦理需求,解決生活中的實際問題,方便人們的生活和工作,提高辦事效率和生活質量。二、實驗需求分析:2.1、軟件的基本功能銀行有四個服務窗口,一個等待隊列, 每個窗口均可以辦理存款、取款、掛失、還貸業務,每種業務所需的服務時間不同,客戶到達銀行后,先到打號機上打號,號票上包括到達時間、編號和需要辦理的業務,然后在銀行內等候, 當任一服務窗口空閑時,處理等候客戶中排在最前面的客戶的業務。銀行業務的模擬系統,通過模擬方法求出客戶在銀行內逗留的平均時間和每個窗口辦理的客戶數及辦理的每種業務數。設計圖形用戶界面,模擬中國銀行真實的

5、打號機操作界面,當用戶選擇一種業務后,要提示用戶排在前面的人數。2.2、程序執行時的輸入/輸出形式按照程序執行是的界面提示選擇操作順序,若需要執行銀行業務模擬,則在菜單選項中選擇執行,如果執行成功系統會提示模擬信息生成成功,否則會提示無可查信息;信息生成完成后選擇執行顯示客戶逗留時間,就可以輸出當天模擬情況下的總模擬人數,當天銀行下班為止總共辦理的客戶數量,和未辦理完業務的客戶數量,和客戶當天在銀行的平均逗留時間;選擇顯示各窗口業務統計信息可看到當天的四個窗口的業務辦理情況,分別辦理了那些業務和各種業務的總數;也可按窗口分別顯示四個窗口分別辦理了那些客戶的業務,以及他們的業務辦理信息;另外可以

6、手動選擇業務并產生相應的到達時間切輸出打號的信息。如果輸入值與要求不符合,則系統會提示輸入數據錯誤,并重新輸入或者結束程序。2.3、測試數據要求程序執行時按照既定的數據類型及大小分別輸入有效數據,若出現輸入數據與既定數據類型及大小不符合則輸出錯誤提示并選擇執行下一步。三、軟件概要設計:(1)抽象數據類型:根據題目的要求,考慮用隊列類型比較適合。ADT QueueData隊列中元素具有相同類型及先進先出特性,相鄰元素具有前驅和后繼關系Operation InitQueue前置條件:隊列不存在 輸入:無 功能:初始化隊列 輸出:無后置條件:創建一個空隊列DestroyQueue 前置條件:隊列已存

7、在 輸入:無功能:銷毀隊列輸出:無后置條件:釋放隊列所占用的存儲空間 EnQueue 前置條件:隊列已存在 輸入:元素值x 功能:入隊操作,在隊尾插入一個元素x 輸出:如果插入不成功,拋出異常 后置條件:如果插入成功,隊尾增加了一個元素 DeQueue 前置條件:隊列已存在 輸入:無 功能:出對操作,刪除對頭元素 輸出:如果刪除成功,返回被刪元素值,否則,拋出異常 后置條件:如果刪除成功,對頭減少了一個元素 GetQueue 前置條件:隊列已存在 輸入:無 功能:讀取當前的對頭元素輸出:若隊列不空,返回當前的對頭元素值后置條件:隊列不變 Empty 前置條件:隊列已存在 輸入:無 功能:判斷隊

8、列是否為空 輸出:如果隊列為空,返回1;否則,返回0 后置條件:隊列不變End ADT(2)主程序流程:開始輸入數據判斷是否是整型數輸入數據錯誤判斷是否打號無可查信息業務生成成功,請等待結束(3)模塊調用關系:本程序中函數包括:main函數,隊列操作相關函數;Personnel_Func(Ticket t2,int n,int s)函數,手動業務生成函數,可選擇要生成的業務同時產生一個到達時間和打票信息;Ticket_Produce_Function(Ticket t,int n)函數,自動生成客戶到達銀行時的打票信息,其中包括到達時間,小票編號,業務種類;Personnel_Distribu

9、tion_Func(int n,int flag)函數,業務辦理函數,等待隊列中的每個元素出對后通過時間的計算和窗口閑忙的判斷把客戶分配到各個窗口辦理業務;Business_statistic_Func(Windows win,int m)函數,統計各個窗口當天辦理的各種業務種類,以及各種業務的數量;Display_Business_Func(Windows win,int m,int n,int coordinate)函數,按窗口分別顯示各個窗口辦理了那些客戶的業務,以及數量;Make_waittime_Func(int n)函數,計算當天銀行中辦理業務的所有客戶在銀行的逗留時間,以及當天總

10、共辦理了多少客戶的業務和有多少客戶的業務在下班時還沒有辦理業務;Menu()函數,模擬輸出銀行業務辦理系統的打號菜單,并分類顯示各個窗口業務辦理情況。其函數調用關系如下:Mian() Menu()Personnel_Distribution_Func(int n,int flag)Make_waittime_Func(int n)Business_statistic_Func(Windows win,int m)Display_Business_Func(Windows win,int m,int n,int coordinate)Personnel_Func(Ticket t2,int n,

11、int s)Personnel_Distribution_Func(int n,int flag)Ticket_Produce_Function(Ticket t,int n)4詳細設計(1)實現概要設計的數據類型:采用隊列const int QueueSize = 1000;template <class T> /定義模板類BankBusinsesclass BankBusinsespublic:BankBusinses();void EnQueue();int GetQueue();void Personnel_Func(Ticket t2,int n,int s); /手動業

12、務生成函數int Ticket_Produce_Function(Ticket t,int n); /打號函數int Personnel_Distribution_Func(int n,int flag); /業務辦理函數intBusiness_statistic_Func(Windows win,int m); /業務統計函數voidDisplay_Business_Func(Windows win,int m,int n,int coordinate);/業務顯示函數voidMake_waittime_Func(int n); /等待時間函數intMenu(); /菜單函數Windows

13、win4; /窗口Ticket tQueueSize; /票Ticket t2QueueSize;private:string name; /業務名稱int businesstime; /辦理業務所需時間int alltime; /辦理所有業務的總時間int waittime; /等待時間double averagetime; /平均等待時間long *a,*b,*v;int dataQueueSize;Ticket data2QueueSize;int front,rear;(2)主程序以及其它模塊的算法描述:主函數具體代碼:int main()BankBusinses C;while(1)

14、 switch(C.Menu()case 1:srand(time(0);n=(rand()%(500-1)+1);for(i = 0;i < n;i+)C.ti.arrivaltime.hour = (rand()%(17-9)+9);C.ti.arrivaltime.minute = rand()%60;C.ti.arrivaltime.second = rand()%60;C.Ticket_Produce_Function(C.t,n);C.EnQueue();C.GetQueue();C.Personnel_Distribution_Func(n,0); break;case 2

15、:if(flag=0)cout<<"tt無可查詢信息 !n"elseC.Make_waittime_Func(n);break;case 3:if(flag=0)cout<<"tt無可查詢信息 !n"elseC.Business_statistic_Func(C.win,4);break;case 4:if(flag=0)cout<<"tt無可查詢信息 !n"elseC.Display_Business_Func(C.win,4,n,0);break;case 5:if(flag=0)cout<

16、;<"tt無可查詢信息 !n"elseC.Display_Business_Func(C.win,4,n,1);break;case 6:if(flag=0)cout<<"tt無可查詢信息 !n"elseC.Display_Business_Func(C.win,4,n,2);break;case 7:if(flag=0)cout<<"tt無可查詢信息 !n"elseC.Display_Business_Func(C.win,4,n,3);break;case 8:for(i=0;i<QueueSi

17、ze;i+)while(cin >>m,!cin.eof() if(!cin.good() cin.clear();cin.ignore();cout<<"tt輸入錯誤 !ntt請重新輸入!"Sleep(1000); else if(m!=0 && m!=1)Sleep(1000); else if(cin.good() && (m=0 | m=1) )if(m=0)tag=1;break;if(tag=1)break;C.Personnel_Func(C.t2,0,m);break;case 0: /如返回值為0則程

18、序結束cout << "ttOVER !n"exit(0); return 0;主函數的功能調用了各個實現函數。首先是調用菜單函數顯示出模擬菜單,提示用戶按照要求進行選擇操作,輸入有誤則會重新操作,否則進行下一個功能函數的調用,產生模擬客戶的基本業務信息,在信息隨機產生后就會調用核心函數把辦理業務的客戶根據實際情況分配到不同的窗口辦理自己的業務。調用時間計算函數確定客戶平均逗留時間和辦理客戶的人數。最后是清屏函數。直至用戶選擇退出。(3)其它模塊的算法描述打號函數功能:調用隨機函數產生客戶到達銀行的隨機時間和隨機業務,并通過冒泡法對所有時間排序,然后進入隊列等待

19、。int BankBusinses:Ticket_Produce_Function(Ticket t,int n)srand(time(0);n=(rand()%(500-1)+1);for(i = 0;i < n;i+) /產生客戶到達銀行的隨機時間C.ti.arrivaltime.hour = (rand()%(17-9)+9);C.ti.arrivaltime.minute = rand()%60;C.ti.arrivaltime.second = rand()%60;for(i = 0;i < n;i+)ti.number = i; /編號產生rear=(rear+1)%Q

20、ueueSize;datarear=ti.number;/產生的編號入隊sign = (rand()%(5-1)+1;ti.business = sign;/產生隨機客戶業務 處理客戶業務函數功能:調用打號函數對隊列中的元素分配到不同的窗口辦理業務。int BankBusinses:Personnel_Distribution_Func(int n,int flag)int c4 /作用是對應儲存四個窗口業務辦理結束的時間,在循環過程中后一個業務辦理結束時間將修改當前結束時間 Ticket_Produce_Function(t,n); /調用時間生成函數c0=a0+b0; /第一個窗口結束時間

21、初值為隊列中第一個客戶辦理業務的結束時間waittime=b0; /第一個客戶的逗留時間int *d;d=new int4; /動態申請長度為四的一維數組,用于存放被修改結束時間的窗口的序號, 判斷四個窗口中的結束時間是否大于下一個客戶辦理業務的開始時間, 如果小于則數組的dj中保存該窗口的序號,否則該地址存為-1, 判斷窗口序號保存數組dj中是否有被保存的窗口序號, 若有則結束,且記住該窗口序號;如果有窗口序號被修改,則繼續修改當前結束時間為下一個客戶的業務辦理結束時間, 窗口各種業務累計, 如果當前窗口序號全未被修改,即當前所有窗口均處于忙碌狀態,下一個客戶需等待, 找出當前所有正在辦理業

22、務的窗口中,結束時間最早的窗口;ck=ck+bi+1; /修改該窗口的結束時間,即下一個在等待的客戶到該窗口辦理業務, 窗口各種業務累計 窗口業務統計函數功能:統計各個窗口辦理業務的情況,人數以及各種業務種類。int BankBusinses:Business_statistic_Func(Windows win,int m) int i,n=0,allnum=0;for(i=0;i<4;i+)allnum=wini.withdrawals+wini.deposit+wini.reportloss+wini.borrowed;cout <<"tttt 窗口 &quo

23、t;<<i+1;cout <<endl;cout <<"取款人數"<<"t存款人數"<<"t掛失人數"<<"t還貸人數"<<"t辦理業務總數"cout<<wini.withdrawals<<"tt"<<wini.deposit<<"tt"<<wini.reportloss<<"tt"

24、<<wini.borrowed<<"tt"<<allnum;窗口業務顯示函數功能:顯示各個窗口當天的業務辦理情況。void BankBusinses:Display_Business_Func(Windows win,int m,int n,int coordinate)int j,flag=1;cout<<"tttt窗口"<<coordinate+1<<"辦理: "cout<<endl;for(j=0;j<n;j+)if(vj=coordina

25、te)cout<<j+1<<"號客戶 "<<"t"flag=0;if(flag=1)cout<<"tt該窗口當天沒有辦理業務 !n"等待時間函數功能:計算當天所有客戶在銀行的平均逗留時間,和當日總共辦理的客戶數,和未辦理完業務的客戶數。void BankBusinses:Make_waittime_Func(int n)flag=Personnel_Distribution_Func(n,flag);if(n-flag-1)!=0)cout<<"tt未辦理完業務的編

26、號: "<<flag+2<<" "<<n;aver=(waittime/(flag+1)/60.0;for(i=flag+2;i<n;i+)waittime2 +=3600*17-ai;averagetime=(waittime+waittime2)/n)/60.0;5、編碼與調試分析編碼與調試過程中遇到的問題及解決辦法:【問題一】:隨機產生的時間無序,等待隊列需按照有序等待。 解決辦法: 定義時間結構體類型的數組存儲時間,然后對時間進行排序并進入隊列。解決此問題的核心代碼:for(i = 0;i < n;i+)fo

27、r(j = i+1;j < n;j+)if(ti.arrivaltime.hour>tj.arrivaltime.hour)temp=ti.arrivaltime.hour;ti.arrivaltime.hour=tj.arrivaltime.hour;tj.arrivaltime.hour=temp;temp=ti.arrivaltime.minute;ti.arrivaltime.minute=tj.arrivaltime.minute;tj.arrivaltime.minute=temp;temp=ti.arrivaltime.second;ti.arrivaltime.se

28、cond=tj.arrivaltime.second;tj.arrivaltime.second=temp;for(i = 0;i < n;i+)for(j = i+1;j < n;j+)if(ti.arrivaltime.hour=tj.arrivaltime.hour && ti.arrivaltime.minute>tj.arrivaltime.minute)temp=ti.arrivaltime.minute;ti.arrivaltime.minute=tj.arrivaltime.minute;tj.arrivaltime.minute=temp;t

29、emp=ti.arrivaltime.second;ti.arrivaltime.second=tj.arrivaltime.second;tj.arrivaltime.second=temp;else continue;for(i = 0;i < n;i+)for(j = i+1;j < n;j+)if(ti.arrivaltime.hour=tj.arrivaltime.hour && ti.arrivaltime.minute=tj.arrivaltime.minute && ti.arrivaltime.second>tj.arriva

30、ltime.second)temp=ti.arrivaltime.second;ti.arrivaltime.second=tj.arrivaltime.second;tj.arrivaltime.second=temp;else continue;【問題二】:無法將隊列元素按照出對順序進行分配到各個窗口。解決辦法: 定義一個整型數組c4 作用是對應儲存四個窗口業務辦理結束的時間,在循環過程中后一個業務辦理結束時間將修改當前結束時間。隊列元素出對后,根據到達時間和辦理業務的時間可判斷出客戶離開銀行的時間。首先對數組c4進行初始化,找出數組中的最小元素,用對頭元素修改數組c4中的最小值。另動態申

31、請數組d4=-1,-1,-1,-1,用來保存數組c4中被修改的值的地址;如果每一個客戶的離開銀行時間都小于下一個客戶的到達時間,則下一個客戶就進入當前窗口辦理業務;如果離開時間大于下一個客戶的到達時間,則在c4中找出最小值,且用下一個客戶的離開時間修改當前值,同時用d4保存該地址。如果四個窗口均有人辦理業務,則客戶應在等待隊列中等待。其實現方法任然是找出窗口中辦理業務的客戶結束時間的最小值,同時判斷該窗口的閑忙情況,然后用下一個客戶的結束時間修改當前最小值,并保存地址?!締栴}三】:計算客戶在銀行的平均逗留時間問題。 解決方法: 客戶在銀行的平均逗留時間的計算分為兩種情況。第一種情況,當天隨機產生的客戶都辦理完了自己的業務,在這種情況下只需統計每個客戶在銀行的逗留時間之和再求平均值,即為平均逗留時間,計算方法為 (每個客戶開始辦理業務的時間到達銀行的時間+辦理業務所用時間)。第二種情況,當天隨機產生的客戶太多在下班時還有客戶沒有辦理業務,且在銀行停止營業時離開銀行;這種情況下的平均時間計算分為兩部分,它包括第一種情況下已經辦理完業務的客戶所

溫馨提示

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

評論

0/150

提交評論