銀行業(yè)務(wù)模擬系統(tǒng)的實現(xiàn)_第1頁
銀行業(yè)務(wù)模擬系統(tǒng)的實現(xiàn)_第2頁
銀行業(yè)務(wù)模擬系統(tǒng)的實現(xiàn)_第3頁
銀行業(yè)務(wù)模擬系統(tǒng)的實現(xiàn)_第4頁
銀行業(yè)務(wù)模擬系統(tǒng)的實現(xiàn)_第5頁
已閱讀5頁,還剩11頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、程序設(shè)計與算法綜合訓(xùn)練設(shè)計報告3學(xué)號:E11514064 姓名:汪泓章 年級: 大一 專 業(yè):計科項目名稱:銀行業(yè)務(wù)模擬系統(tǒng)的設(shè)計與實現(xiàn) 完成日期:2016年7月1日1需求分析 (1) 問題描述:假設(shè)某銀行有四個窗口對外接待客戶,從早晨銀行開門起不斷有客戶進入銀行。由于每個窗口在某個時刻只能接待一個客戶,因此在客戶人數(shù)眾多時需在每個窗口前順次排隊,對于剛進入銀行的客戶,如果某個窗口的業(yè)務(wù)員正空閑,則可上前辦理業(yè)務(wù),反之,若四個窗口均有客戶所占,他便會排在人數(shù)最少的隊伍后面?,F(xiàn)在需要編制程序以模擬銀行的這種業(yè)務(wù)活動并計算一天中客戶在銀行逗留的平均時間。  (2)基本要求1)初

2、始化(OpenForDay),模擬銀行開門時各數(shù)據(jù)結(jié)構(gòu)的狀態(tài)。2)事件驅(qū)動(EventDrived), 對客戶到達(dá)和離開事件做相應(yīng)處理。3)下班處理(CloseForDay),模擬銀行關(guān)門時的動作,統(tǒng)計客戶平均逗留時間。4)按照題意要求獨立進行設(shè)計,設(shè)計結(jié)束后按要求寫出設(shè)計報告。輸入的形式和輸入值的范圍:規(guī)定銀行一天的營業(yè)時間為480分鐘。輸出的形式:所有顧客業(yè)務(wù)辦理的總時間;辦理業(yè)務(wù)的總顧客數(shù);平均每人辦理時間程序所能達(dá)到的功能:通過隊列的知識完成離散時間模擬,即已知窗口數(shù)和一天的營業(yè)時間可以求得平均每人辦理的時間。2概要設(shè)計 總體設(shè)計思想:為了計算這個平均的逗留時間,自然需要知道

3、每個客戶到達(dá)銀行和離開銀行這兩個時刻,后者減去前者即為每個客戶在銀行的逗留時間。所有客戶逗留時間的總和被一天內(nèi)進入銀行的客戶數(shù)除便是所求的平均時間。稱客戶到達(dá)銀行和離開銀行這兩個時間發(fā)生的事情為“事件”,則整個模擬程序?qū)词录南群箜樞蜻M行處理。這樣一種程序稱做事件驅(qū)動模擬。下面是上述銀行客戶的離散事件驅(qū)動的模擬算法(1) 數(shù)據(jù)結(jié)構(gòu)和程序模塊:                    &#

4、160;                               下面是模擬程序中需要的數(shù)據(jù)結(jié)構(gòu)及其操作。 a模擬算法的主要處理對象是“事件”,事件的主要信息是事件的類型和事件的發(fā)生時刻。算法中處理的事件有兩類:一類是客戶到達(dá)事件;另一類是客戶離開事件。前一類事件發(fā)生的時刻隨

5、客戶的到來自然形成;后一類事件發(fā)生的時刻由客戶辦理業(yè)務(wù)所需時間和等待時間而定。由于程序驅(qū)動是按事件發(fā)生時刻的先后順序進行的,所以事件表應(yīng)是有序表,其主要操作是插入和刪除事件,用一個單鏈表表示。 b模擬程序中需要的另一數(shù)據(jù)結(jié)構(gòu)是表示客戶排隊的隊列,由于假設(shè)銀行有4個窗口,因此程序中需要4個隊列,隊列中有關(guān)客戶的信息是客戶到達(dá)的時刻和客戶辦理業(yè)務(wù)所需要的時間。每個隊列中的隊頭客戶即為正在窗口辦理事務(wù)的客戶,他辦完業(yè)務(wù)離開隊列的時刻就是即將發(fā)生的客戶離開事件的時刻,這就是說,對每個隊頭客戶都存在一個將要驅(qū)動的客戶離開事件。因此在任何時刻即將發(fā)生的事伯只有5種可能:1)新的客戶到達(dá);2)1號

6、窗口的客戶離開;3)2號窗口的客戶離開;4)3號窗口的客戶離開;5)4號窗口的客戶離開; 從以上分析可知,在模擬程序中只需要兩種數(shù)據(jù)結(jié)構(gòu):有序鏈表和隊列。 程序中用到的頭文件、類型定義及主要的函數(shù)原型如下: #include"stdio.h" #include"malloc.h" #include"time.h" #include"stdlib.h"    int OccurTime; /

7、0;事件發(fā)生時刻 int NType; / 事件類型,Qu表示到達(dá)事件,0至Qu-1表示Qu個窗口的離開事件  Event,ElemType; / 事件類型,有序鏈表LinkList的數(shù)據(jù)元素類型 typedef struct LNode  /定義事件表的結(jié)點類型    ElemType data   struct LNode *next;  &#

8、160;LNode, *LinkList;  typedef LinkList EventList; / 事件鏈表類型,定義為有序鏈表 typedef struct  /定義客戶隊列的元素類型      int ArrivalTime; / 到達(dá)時刻    int Duration; / 辦理事務(wù)所需時間  

9、QElemType; / 定義QElemType(隊列的數(shù)據(jù)元素類型)為結(jié)構(gòu)體類型; typedef struct QNode  /定義客戶隊列的結(jié)點類型    QElemType data   struct QNode *next;   QNode, *Queue;  typedef  struct  Queue h

10、ead; Queue tail; LinkQueue; LinkQueue  qQu+1; / Qu個客戶隊列 void OpenForDay(); /模擬銀行開門的動作,即初始化操作  void CustomerArrived() / 處理客戶到達(dá)事件 void CustomerDeparture() / 處理客戶離開事件      &

11、#160;   (2)各模塊之間的調(diào)用與設(shè)計a 主程序模塊:void main()輸出主界面:選擇操作:進入銀行模擬系統(tǒng)/退出程序;While(進入銀行業(yè)務(wù)模擬窗口)OpenForDay();進入初始化操作;輸出格式控制;銀行業(yè)務(wù)模擬:While(有要處理的時間時)DeQueuel();If(客戶到達(dá))CustomerArrived();ElseCustomerDeparture();計算出客戶的平均逗留時間并輸出   b 函數(shù)調(diào)用關(guān)系圖        &

12、#160;                                3. 詳細(xì)設(shè)計void OpenForDay() /模擬銀行開門的動作,即初始化操作       int 

13、i;   InitList(ev); / 初始化事件鏈表為空   en.OccurTime=0; / 設(shè)定第一個客戶到達(dá)事件    en.NType=0; /  客戶到達(dá)事件    Insert_EventList(ev, en);/插入事件   q=(LinkQueue*)malloc(Qu+1)*sizeof(LinkQueue);/為隊列申請

14、Qu+1個隊頭指針,第0個不用    for(i=1;i<Qu+1;+i) / 置空隊列     InitQueue(qi);   void CustomerArrived()   / 處理客戶到達(dá)事件    QElemType f;    int durtime,intertime,i; &

15、#160;  +CustomerNum;   Random(durtime,intertime); / 生成隨機數(shù)    /printf("%d  %dn",durtime,intertime);    et.OccurTime=en.OccurTime+intertime; / 下一客戶到達(dá)時刻    et.NType=0; /

16、0;隊列中只有一個客戶到達(dá)事件     /printf("%d  %dn",et.NType,et.OccurTime);    if(et.OccurTime<CloseTime) / 銀行尚未關(guān)門,插入事件表     Insert_EventList(ev,et);    i=Minimum(q); / 求長度最短隊列的序號,等

17、長為最小的序號    f.ArrivalTime=en.OccurTime;    f.Duration=durtime;    EnQueue(qi,f);    if(QueueLength(qi)=1)         et.OccurTime=en.OccurTime+durtime;    

18、0; et.NType=i;      Insert_EventList(ev,et); / 設(shè)定第i隊列的一個離開事件并插入事件表       void CustomerDeparture()   / 處理客戶離開事件,en.NTyPe!=0    int i;    i=en.NType;

19、60;                                                 

20、60;DelQueue(qi,customer); / 刪除第i隊列的排頭客戶   TotalTime+=en.OccurTime-customer.ArrivalTime; / 累計客戶逗留時間    if(!QueueEmpty(qi)     / 設(shè)定第i隊列的一個離開事件并插入事件表      GetHead_q(qi,customer); 

21、0;    et.OccurTime=en.OccurTime+customer.Duration;      et.NType=i;      Insert_EventList(ev,et);       void Bank_Simulation()      int i; &

22、#160;  OpenForDay( ); / 初始化    while(!ListEmpty(ev)          /output_ev(ev);      /for(i=1;i<QU+1;i+) output_q(qi);   /getchar();/為觀察執(zhí)行結(jié)果用  Ge

23、thead(ev,en); /printf("事件%d %dn ",en.NType,en.OccurTime);       if(en.NType=0)        CustomerArrived(); / 處理客戶到達(dá)事件      else CustomerDeparture(); /&#

24、160;處理客戶離開事件     / 計算并輸出平均逗留時間    printf("顧客總數(shù):%d, 所有顧客共耗時:%d分鐘, 平均每人耗時: %d分鐘n",CustomerNum,TotalTime,TotalTime/CustomerNum);  4. 測試與分析利用隨機產(chǎn)生的種子進行事件的模擬,即到達(dá)時間和辦理業(yè)務(wù)的時間都是隨機產(chǎn)生。如果事件尚未到達(dá)下班時間,則將其插入到空隊列或者是人數(shù)(元素)最少的隊列,通過檢驗,算

25、出在不同的服務(wù)窗口數(shù)下的等待時間以及服務(wù)時間,基本上實現(xiàn)了銀行事件的模擬。5. 總結(jié)該實驗涉及到線性表的建立、插入、刪除等操作,涉及到了隊列的建立、插入、刪除,涉及到了離散事件的應(yīng)用思想,還涉及到了排序的概念。完成這個實驗對線性表、隊列及C語言編程等多方面的知識將是一個很好的利用,對離散事件也將有一個初步的認(rèn)識。通過本次實驗,提高了自已調(diào)試程序的能力。充分體會到了在程序執(zhí)行時的提示性輸出的重要性。6. 附錄源程序清單: #define OK 1#define TRUE 1#define FALSE 0#define ERROR 0#define INFEASIBLE -1#define OVE

26、RFLOW -2typedef int Status;/-銀行排隊模擬/事件和事件表typedef struct QCuEventint OccurTime;int NType;struct QCuEvent *next;QCuEvent, *EventList;/窗口前隊列元素typedef struct QCuElemint ArrivalTime;int Duration;struct QCuElem *next;QCuElem,*QEptr;/窗口指針typedef struct QEptr front;QEptr rear;QCustomerp,*QCupp;/主要操作函數(shù)Statu

27、s OpenForDay(EventList &ev, QCuEvent en, QCupp &q);/開門Status CustomerArrived(EventList &ev, QCupp &q, QCuEvent en);/顧客到達(dá)Status CustomerDeparture(EventList &ev, QCupp &q, QCuEvent en);/顧客離開void CloseForDay();/基本操作函數(shù)Status OrderInser(EventList &ev, QCuEvent en);/按時間順序插入事件到事

28、件表int QLength(QCustomerp qn);/求窗口隊列長度int MinCuQueue(QCupp q);/求隊最短的窗口Status DelFirstEvent(EventList &ev);/刪除事件表中的第一個事件Status InitCuQueue(QCustomerp &qn);/初始化窗口隊列Status EnCuQueue(QCustomerp &qn,QEptr Q);/進入隊列Status DeCuQueue(QCustomerp &qn,QCuElem &Q);/刪除隊列中的元素Status GetQHead(QCus

29、tomerp qn,QCuElem &Q);/獲得隊列中的第一個元素Status DestoryQueue(QCustomerp qn);/銷毀隊列void Ptint_QStatus(QCustomerp QCu);/打印隊列長度void Bank_SimulationFunc();void test(char str);#include <stdio.h>#include <stdlib.h>#include <time.h>int i=0,e=0,counter=0;int TotalTime=0,CustomerNum=0;/累計客戶逗留時間

30、,客戶數(shù)int CloseTime;/關(guān)門時間int windowsnum = 0;/主函數(shù)void main() EventList ev; / 事件表QCuEvent en; QCupp QCu = NULL;OpenForDay(ev, en, QCu);while (ev->next)en.NType = ev->next->NType;en.OccurTime = ev->next->OccurTime;DelFirstEvent(ev);if (en.NType = 0)CustomerArrived(ev, QCu, en);elseCustomer

31、Departure(ev, QCu, en);Ptint_QStatus(QCu);CloseForDay();/主要功能子函數(shù)Status OpenForDay(EventList &ev, QCuEvent en, QCupp &q)int temp = 0;printf("請輸入隨機數(shù)種子(或輸入0使用隨機種子):");scanf("%d",&temp);if (temp=0) srand(unsigned)time(NULL);else srand(temp);printf("請輸入營業(yè)時間(單位:分鐘):&qu

32、ot;);scanf("%d",&temp);CloseTime = temp;TotalTime = 0;CustomerNum = 0;en.OccurTime = 0;en.NType = 0;en.next = NULL;ev = (EventList) malloc(sizeof(QCuEvent);ev->next = NULL;OrderInser(ev, en);printf("請輸入辦理業(yè)務(wù)的窗口數(shù)(至少1個):");scanf("%d",&windowsnum);q = (QCustomerp

33、 *) malloc(windowsnum+1)*sizeof(QCustomerp);for (int i=1;i<=windowsnum;i+)InitCuQueue(qi);return OK;Status CustomerArrived(EventList &ev, QCupp &q, QCuEvent en)test("顧客到達(dá)處理<<<<<<<<");CustomerNum +;/ 產(chǎn)生隨機數(shù)/srand(54);int durtime = rand()%30+1;int intertime

34、= rand()%5+1; / 插入到達(dá)事件表QCuEvent enTemp;int t = en.OccurTime + intertime;enTemp.OccurTime = t;enTemp.NType = 0;enTemp.next = NULL;if (t < CloseTime)OrderInser(ev, enTemp);printf("時間%dn",t);/ 插入最短隊QEptr Q;Q = (QEptr) malloc(sizeof(QCuElem);Q->ArrivalTime = en.OccurTime;Q->Duration =

35、 durtime;Q->next = NULL;int i = MinCuQueue(q);EnCuQueue(qi,Q); / 插入離開事件enTemp.OccurTime = en.OccurTime + durtime;enTemp.NType = i;enTemp.next = NULL;if(QLength(qi) = 1)OrderInser(ev, enTemp);return OK;Status CustomerDeparture(EventList &ev, QCupp &q, QCuEvent en)test(">>>>

36、;>>>>顧客離開處理");int i = en.NType;printf("離開時間%dn",en.OccurTime);if(en.OccurTime>CloseTime)DestoryQueue(qi);elseQCuElem customer;DeCuQueue(qi,customer);/ 客戶逗留時間TotalTime += en.OccurTime - customer.ArrivalTime;printf("總時間為%dn",TotalTime);if (qi.front->next)GetQ

37、Head(qi,customer);QCuEvent enTemp;enTemp.OccurTime = en.OccurTime + customer.Duration;enTemp.NType = i;OrderInser(ev, enTemp);return OK;void CloseForDay()printf("*n");printf("*n");printf("* 所有顧客業(yè)務(wù)辦理總時間:%d分鐘n", TotalTime);printf("* 業(yè)務(wù)辦理顧客數(shù):%dn", CustomerNum);pr

38、intf("* 平均每人辦理時間:%fn",(float)TotalTime/(float)CustomerNum);printf("*n");printf("*n");/功能實現(xiàn)子函數(shù)Status OrderInser(EventList &ev, QCuEvent en)EventList entemp,qtemp;entemp = (EventList) malloc(sizeof(QCuEvent);entemp->OccurTime = en.OccurTime;entemp->NType = en.NT

39、ype;entemp->next = NULL;if (!ev->next)ev->next = entemp;return OK;qtemp = ev;while(qtemp->next&&qtemp->next->OccurTime < en.OccurTime)qtemp = qtemp->next;entemp->next = qtemp->next;qtemp->next = entemp;return OK;int QLength(QCustomerp qn) QEptr qtemp;int i=0;qtemp = qn.front->next;while(qtemp)qtemp =

溫馨提示

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

評論

0/150

提交評論