銀行業(yè)務(wù)模擬課程設(shè)計報告_第1頁
銀行業(yè)務(wù)模擬課程設(shè)計報告_第2頁
銀行業(yè)務(wù)模擬課程設(shè)計報告_第3頁
銀行業(yè)務(wù)模擬課程設(shè)計報告_第4頁
銀行業(yè)務(wù)模擬課程設(shè)計報告_第5頁
已閱讀5頁,還剩26頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、安徽新華學(xué)院數(shù)據(jù)結(jié)構(gòu)課程設(shè)計報告 題目:銀行業(yè)務(wù)模擬系統(tǒng) 學(xué)院:信息工程學(xué)院 專業(yè):信息管理與信息系統(tǒng) 班級:12級信管1班 姓名:楊丹丹 學(xué)號:1242152137 指導(dǎo)教師:李明 設(shè)計時間:2013.12.122013.12.30課程設(shè)計任務(wù)書一、目的  鞏固和加深對數(shù)據(jù)結(jié)構(gòu)的理解,通過上機實驗、調(diào)試程序,加深對課本知識的理解,最終使學(xué)生能夠熟練應(yīng)用數(shù)據(jù)結(jié)構(gòu)的知識寫程序。 (1)通過本課程的學(xué)習(xí),能熟練掌握幾種基本數(shù)據(jù)結(jié)構(gòu)的基本操作。 (2)能針對給定題目,選擇相應(yīng)的數(shù)據(jù)結(jié)構(gòu),分析并設(shè)計算法,進(jìn)而給出問題的正確求解過程并編寫代碼實現(xiàn)。 二、要求 1.

2、客戶業(yè)務(wù)分為兩種:第一種是申請從銀行得到一筆資金,即取款或借款;第二種是向銀行投入一筆資金,即存款或還款。 2.銀行有兩個服務(wù)窗口,相應(yīng)地有兩個隊列??蛻舻竭_(dá)銀行后先排第一個隊。處理每個客戶業(yè)務(wù)時,如果屬于第一種,且申請額超出銀行現(xiàn)存資金總額而得不到滿足時,則立即排入第二個隊等候,直至滿足時才離開銀行, 否則業(yè)務(wù)處理完后立即離開銀行。 3. 每接待完一個第二種業(yè)務(wù)的客戶,則順序檢查和處理第二個隊列中的客戶,對能滿足的申請者予以滿足,不能滿足者重新排到第二個隊列的隊尾。 4.假設(shè)檢查不需要時間,在此檢查過程中,一旦銀行資金總額少于或等于剛才第一個

3、隊列中最后一個客戶(第二種業(yè)務(wù))被接待之前的數(shù)額,或者本次已將第二個隊列檢查或處理了一遍,就停止檢查(因為此時已不可能還有滿足者),轉(zhuǎn)而繼續(xù)接待第一個隊列的客戶。  5. 任何時刻都只開一個窗口,營業(yè)時間結(jié)束時所有客戶立即離開銀行。通過離散的模擬方法求出客戶在銀行內(nèi)逗留的平均時間三、設(shè)計期限日 期內(nèi) 容12.12-12.16選取參考書,查閱有關(guān)文獻(xiàn)資料,完成資料搜集和系統(tǒng)分析工作。12.16-12.22創(chuàng)建相關(guān)數(shù)據(jù)結(jié)構(gòu),錄入源程序。12.22-12.26調(diào)試程序并記錄調(diào)試中的問題,初步完成課程設(shè)計報告。12.26-12.31上交課程設(shè)計報告打印版和電子版的論文程序

4、前 言課程設(shè)計是實踐性教學(xué)中的一個重要環(huán)節(jié),它以某一課程為基礎(chǔ),可以涉及和課程相關(guān)的各個方面,是一門獨立于課程之外的特殊課程。課程設(shè)計是讓同學(xué)們對所學(xué)的課程更全面的學(xué)習(xí)和應(yīng)用,理解和掌握課程的相關(guān)知識。數(shù)據(jù)結(jié)構(gòu)是一門重要的專業(yè)基礎(chǔ)課,是計算機理論和應(yīng)用的核心基礎(chǔ)課程。 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計,要求學(xué)生在數(shù)據(jù)結(jié)構(gòu)的邏輯特性和物理表示、數(shù)據(jù)結(jié)構(gòu)的選擇和應(yīng)用、算法的設(shè)計及其實現(xiàn)等方面,加深對課程基本內(nèi)容的理解。同時,在程序設(shè)計方法以及上機操作等基本技能和科學(xué)作風(fēng)方面受到比較系統(tǒng)和嚴(yán)格的訓(xùn)練。 在這次的課程設(shè)計中我選擇的題目是銀行業(yè)務(wù)模擬系統(tǒng)。一般某個銀行在某個地區(qū)營業(yè)前,都要進(jìn)行市場調(diào)

5、查與分析。通過調(diào)查,分析開多少個窗口使效率最高,而且不會產(chǎn)生較大的冗余。做此項調(diào)查通常要花費大量的人力物力,因此我借助計算機系統(tǒng)產(chǎn)生的隨機數(shù)(時間間隔,每個客戶辦理的款數(shù)以及處理時間)對銀行客戶的離散事件進(jìn)行預(yù)測,通過銀行業(yè)務(wù)模擬系統(tǒng)計算出客戶在銀行逗留的總時間并計算出客戶在銀行的平均逗留時間。通過計算機模擬的方法減少實際調(diào)查的勞動量,資金及時間耗費,輕松的得到高效的方法。目 錄第1章 需求分析1第2章 總體設(shè)計 2 2.1.設(shè)計原理 2 2.2.設(shè)計方案及流程 2 2.3.系統(tǒng)分析 2 2.4.銀行業(yè)務(wù)模擬程序流程圖 3 2.5.本程序包含三個模塊 4 2.6.函數(shù)調(diào)用關(guān)系 5 2.7.設(shè)定

6、客戶信息隊列的抽象數(shù)據(jù)類型定義6第3章 詳細(xì)設(shè)計7第 4章 編碼與調(diào)試20 4.1調(diào)試程序過程遇到的問題及解決的方法20 4.2.調(diào)試過程20第 5章 總結(jié) 24參考文獻(xiàn) 25附錄26 第1章 需求分析項目背景隨著我國經(jīng)濟的高速發(fā)展人民生活水平日益提高,銀行在人民的日常生活中扮演著越來越重要的角色,相應(yīng)的人民對各銀行軟件的需求也日益迫切,針對這種情況我們小組在收集了大量的信息后,結(jié)合自己所學(xué)的知識,編寫了這個系統(tǒng)。但由于我們目前的水平有限,未能順利的運行出這個系統(tǒng),至于其可行性,還有待于進(jìn)一步的探討和加工整改。問題描述客戶業(yè)務(wù)分為兩種。第一種是申請從銀行得到一筆資金,即取款或借款。第二種是向銀

7、行投入一筆資金,即存款或還款。銀行有兩個服務(wù)窗口,相應(yīng)地有兩個隊列??蛻舻竭_(dá)銀行后先排第一個隊。處理每個客戶業(yè)務(wù)時,如果居于第一種,且申請額超出銀行現(xiàn)存資金總額順得不到滿足,則立刻排入第二個隊等候,直至滿足時才離開銀行;否則業(yè)務(wù)處理完后立刻離開銀行。每接待完一個第二種業(yè)務(wù)的客戶,則順序檢查相處理(如果可能)第二個隊列中的客廣,對能滿足的申請者予以滿足,不能滿足者重新排列第二個隊列的隊尾。注意,在此檢查過程中,一旦銀行資金總額少于或等于剛才第一個隊列中最后一個客戶(第二種業(yè)務(wù))被接待之前的數(shù)額,或者本次已將第二個隊列檢查或處理了一遍,就停止被盜(因為此時已不可能還有能滿足者)轉(zhuǎn)而繼續(xù)接待第一個隊

8、列的客戶。任何時刻都只開一個窗口。假設(shè)檢查不需要時間。營業(yè)時間結(jié)束時所有存戶立即離開銀行。 寫一個上述銀行業(yè)務(wù)的事件驅(qū)動模擬系統(tǒng),通過模擬方法求出客戶在銀行內(nèi)逗留的平均時間。測試數(shù)據(jù)一天營業(yè)開始時銀行擁有的款額為10000(元)營業(yè)時間為600(分鐘)。其他模擬參量自定。注意測定兩種極端的情況:一是兩個到達(dá)事件之間的間隔時間很短,而客戶的交易時間很長,另一個恰好相反,設(shè)置兩個到達(dá)事件的間隔時間很長,而客戶的交易時間很短。 實現(xiàn)提示 事件有兩類;到達(dá)銀行和離開銀行。韌始時銀行現(xiàn)存資金總額為total。開始營業(yè)后的第個事件是客戶到達(dá),營業(yè)時間從0到closetime。到達(dá)事件發(fā)生時隨機地設(shè)置此客戶

9、的交易時間相距下一到達(dá)事件之間的時間間隔。每個客戶要辦理的款額也是隨機確定的,用負(fù)值和正值分別表示第一類相第二類業(yè)務(wù)。變量total、closetime以及上述兩個隨機量的上下界均文互地從終端讀入,作為模擬參數(shù)。 兩個隊列和一個事件表均要用動態(tài)存儲結(jié)構(gòu)實現(xiàn)。注意弄清應(yīng)該在什么條件下設(shè)置離開事件,以及第二個隊列甩怎樣的存儲結(jié)構(gòu)實現(xiàn)時可以獲得較高的效率。注意:事件表是按時間順序有序的。 第2章 總體設(shè)計2.1.設(shè)計原理: 為了計算平均時間,就要掌握每個客戶到達(dá)銀行和離開銀行這兩個時刻,后者減去前者即為每個客戶在銀行逗留的時間。所有客戶逗留時間的總和被一天內(nèi)進(jìn)入銀行的客戶數(shù)除便是所求的平均時間。 事

10、件的主要信息是事件類型和事件發(fā)生的時刻,算法中要處理的事件有兩類:一類是客戶到達(dá)的時間,另一類是客戶離開的時間。前一類事件發(fā)生的時刻隨客戶到來自然形成,后一類事件發(fā)生時刻則由客戶事務(wù)所需時間 和等待所耗時間而定。由于驅(qū)動程序是按時間發(fā)生時刻的先后順序進(jìn)行,則事件表應(yīng)該是有序表,其主要操作是插入和刪除事件。2.2.設(shè)計方案及流程 由于在實際的銀行中,客戶到達(dá)的時刻及其辦理事務(wù)所需時間都是隨機的,在模擬程序中可用隨機數(shù)代替,不失一般性。假設(shè)第一個客戶進(jìn)門的時刻為0,即是模擬程序處理的第一個事件,之后每個客戶到達(dá)的時刻在前一個客戶到達(dá)時設(shè)定。因此在客戶到達(dá)事件發(fā)生時需先產(chǎn)生兩個隨機數(shù):其一為此時刻到

11、達(dá)的客戶辦理事務(wù)所需時間durtime;其二為下一個客戶將到達(dá)的時間間隔intertime,假設(shè)當(dāng)前事件發(fā)生的時刻為occurtime,則下一個客戶到達(dá)事件發(fā)生的時刻為occurtime+intertime。由此應(yīng)產(chǎn)生一個新的客戶到達(dá)時間插入表;剛到達(dá)的客戶則應(yīng)插入到當(dāng)前所含元素最少的隊列中;若該隊列在插入前為空,則還應(yīng)產(chǎn)生一個客戶離開事件插入事件表。 客戶離開時間的處理比較簡單。首先計算該客戶在銀行逗留的時間,然后從隊列中刪除該客戶后查看隊列是否為空,若不空則設(shè)定一個新的隊頭客戶離開事件。2.3系統(tǒng)分析1銀行業(yè)務(wù)模擬程序的主要處理對象是“事件”,事件的主要信息是事件的類型和事件的發(fā)生時刻。算

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

13、隊頭客戶都存在一個將要驅(qū)動的客戶離開事件。因此在任何時刻即將發(fā)生的事伯只有4種可能:1)新的客戶到達(dá);2)隊列1隊頭客戶辦完業(yè)務(wù)離開;3)隊列1取款客戶由于得不到滿足而轉(zhuǎn)至隊列2;4)隊列2隊頭客戶辦完業(yè)務(wù)離開; 3. 為了使編寫的程序具有通用性,在編程序時將銀行的營業(yè)時間、初始存款客戶辦理業(yè)務(wù)的最長時間及兩個客戶到達(dá)的最大時間間隔都設(shè)置成程序運行時動態(tài)輸入,但是客戶辦理業(yè)務(wù)的時間和兩個客戶到達(dá)的時間間隔用隨機函數(shù)產(chǎn)生的隨機數(shù)表示。這樣可以對程序進(jìn)行理性的分析,從而實現(xiàn)真正離散事件的模擬。4. 測試數(shù)據(jù)。 客戶的存取款金額,不大于5000元客戶辦理業(yè)務(wù)所要時間,不大于20分鐘下個客戶到達(dá)的時間

14、間隔,不大于30分鐘當(dāng)然,系統(tǒng)的模擬性能完全不受這些規(guī)定的限制,用戶完全可以根據(jù)實際需要作簡單的修改和調(diào)整而且以上各模擬量均由隨機函數(shù)給出,符合離散事件要求第1次:完成程序的主框架設(shè)計,進(jìn)行調(diào)試,驗證其正確性;第2次:詳細(xì)設(shè)計,進(jìn)行調(diào)試,驗證其正確性;第3次:進(jìn)行整體調(diào)試,運行程序,對運行結(jié)果進(jìn)行分析,完成實驗報告。2.4 銀行業(yè)務(wù)模擬程序流程圖(如圖1)結(jié)束進(jìn)入隊列1排隊服務(wù)并離開能否滿足客戶服務(wù)并離開進(jìn)隊2等待接待1個存款業(yè)務(wù)順序檢查隊2能否滿足取隊頭隊頭是否存在時間到?開始客戶到達(dá) 否 否 是 是 否 (圖 1)2.5 本程序包含三個模塊主程序模塊:void main() 輸出主界面;選

15、擇操作:進(jìn)入銀行業(yè)務(wù)模擬系統(tǒng)退出程序;While(進(jìn)入銀行業(yè)務(wù)模擬窗口)OpenForDay();進(jìn)行初始化操作;輸出格式控制; 銀行業(yè)務(wù)模擬: while(有要處理的事件時) /有事件可處理 DeQueue1(); /隊列1出隊列,并用en返回值 if(客戶到達(dá)) CustomerArrived(); /處理客戶到達(dá)事件 else CustomerDeparture(); /處理客戶離開事件 /計算出客戶的平均逗留時間并輸出返回主界面: 選擇操作:繼續(xù)進(jìn)行業(yè)務(wù)模擬退出程序; If(選擇的是退出)退出程序;客戶到達(dá)事件處理模塊實現(xiàn)客戶信息隊列的抽象數(shù)據(jù)類型客戶離開事件處理模塊實現(xiàn)有序事件鏈表的

16、抽象數(shù)據(jù)類型2.6 函數(shù)調(diào)用關(guān)系如圖2所示:主函數(shù)調(diào)用客戶到達(dá)事件處理模塊調(diào)用客戶到達(dá)事件處理模塊 (圖 2) 2.7 設(shè)定客戶信息隊列的抽象數(shù)據(jù)類型定義:ADT LinkQueue 數(shù)據(jù)對象: D=ai|aiQueueElem,i=1,2,n, n0數(shù)據(jù)關(guān)系: R1=<ai-1,ai>|ai-1,aiQueueElem ,i=2,3, ,n 基本操作:InitQueue(&Q)操作結(jié)果:構(gòu)造一個空隊列。destroyqueue(&Q)初始條件:隊列已存在。操作結(jié)果:銷毀隊列,此隊列不再存在。EnQueue(&Q,en )初始條件:隊列已存在。操作結(jié)果:新元

17、素en入隊列。DeQueue(&Q,&en)初始條件:隊列已存在。操作結(jié)果:隊頭元素出隊列,并以en返回其值。QueueLength(Q)初始條件:隊列已存在。操作結(jié)果:返回隊列中元素的個數(shù),即隊列長度。 ADT LinkQueue 第3章 詳細(xì)設(shè)計 1 源文件中所包含的頭文件#include<stdio.h> #include<stdlib.h>#include <time.h>#include<iostream.h>2 宏定義#define MONEY 5000 /個人業(yè)務(wù)值,交易額上限 #define OK 1 #defin

18、e ERROR 0 #define OVERFLOW -2 typedef int status;3 定義的結(jié)構(gòu)體typedef struct int arrivetime; /到達(dá)時間 int OccurTime; /事件發(fā)生時間 int NType; /事件類型,0表示到達(dá)事件,1表示離開事件。同時用1表示存款,2表示取款。 int duration; /辦理業(yè)務(wù)時間 long int money;/交易金額Event,ElemType1;typedef struct /等待隊列元素 int arrivetime; /到達(dá)時間 int duration; /辦理業(yè)務(wù)時間 long int

19、money; /交易金額wait,ElemType2;typedef struct QNode1 ElemType1 data; struct QNode1 *next;QNode1,*Queue1;typedef struct QNode2 ElemType2 data; struct QNode2 *next;QNode2,*Queue2;typedef struct Queue1 front; Queue1 rear;LinkQueue1;typedef struct Queue2 front; Queue2 rear;LinkQueue2;4 全局變量long int total_mo

20、ney; /銀行現(xiàn)存資金總額int total_time; /客戶逗留總時間int use_time;/每個顧客所用時間int money;/每個顧客辦理的款數(shù)int closetime;/銀行營業(yè)時間int INTERTIME; /下一用戶到達(dá)的時間間隔int DURATION; /辦理業(yè)務(wù)所需時間int number; /辦理業(yè)務(wù)的次序int time1; /系統(tǒng)現(xiàn)在時間LinkQueue1 Q1;LinkQueue2 Q2;Event en; /事件wait en1; /列表2元素5 初始化隊列1status InitQueue1()Q1.front=Q1.rear=(Queue1)ma

21、lloc(sizeof(QNode1); if(!Q1.front)exit(OVERFLOW); Q1.front->next=NULL; return OK;6 初始化隊列2status InitQueue2()Q2.front=Q2.rear=(Queue2)malloc(sizeof(QNode2); if(!Q2.front)exit(OVERFLOW); Q2.front->next=NULL; return OK;7 銷毀隊列1status destroyqueue1()while(Q1.front) Q1.rear=Q1.front->next; free(Q

22、1.front); Q1.front=Q1.rear; return OK;8 銷毀隊列2status destroyqueue2()while(Q2.front) Q2.rear=Q2.front->next; free(Q2.front); Q2.front=Q2.rear; return OK;9 隊列1入隊列status EnQueue1() Queue1 p,r,r1; p=(Queue1)malloc(sizeof(QNode1); if(!p)exit(OVERFLOW); p->data.arrivetime=en.arrivetime; p->data.Oc

23、curTime=en.OccurTime; p->data.NType=en.NType; p->data.duration=en.duration; p->data.money=en.money; r=Q1.front->next; while(r)if(p->data.arrivetime < r->data.arrivetime) if(r=Q1.front->next) p->next=r; Q1.front->next=p; elser1->next=p; p->next=r; r1=r;r=r->next

24、;if(!r) if(Q1.front->next=NULL) Q1.front->next=p; Q1.rear=p; Q1.rear->next=NULL; Else p->next=NULL; Q1.rear->next=p; Q1.rear=p; return OK;10 隊列2入隊列status EnQueue2() Queue2 p; p=(Queue2)malloc(sizeof(QNode2); if(!p)exit(OVERFLOW); p->data.arrivetime=en1.arrivetime; p->data.durati

25、on=en1.duration; p->data.money=en1.money; p->next=NULL; Q2.rear->next=p; Q2.rear=p; return OK;11 若隊列1不空,則刪除Q1的隊頭元素,并用en返回其值status DeQueue1() Queue1 p; if(Q1.front=Q1.rear) return ERROR; p=Q1.front->next; en.arrivetime=p->data.arrivetime; en.OccurTime=p->data.OccurTime; en.NType=p-&

26、gt;data.NType; en.duration=p->data.duration; en.money=p->data.money; Q1.front->next=p->next; if(Q1.rear=p) Q1.rear=Q1.front; /只有一個人時 free(p); return OK;12 若隊列2不空,則刪除Q2的隊頭元素,并用en1返回其值status DeQueue2() Queue2 p;if(Q2.front=Q2.rear)return ERROR; p=Q2.front->next; en1.arrivetime=p->dat

27、a.arrivetime; en1.duration=p->data.duration; en1.money=p->data.money; Q2.front->next=p->next; if(Q2.rear=p) Q2.rear=Q2.front; /只有一個人時 free(p);return OK;13 營業(yè)時間結(jié)束,全部客戶離開銀行void free_system() destroyqueue1(); destroyqueue2(); 14 產(chǎn)生隨機數(shù)status rand_ar(int *intertime,long int *money, int *durat

28、ion,int *NType)*intertime=rand()%INTERTIME+1; /下個客戶到達(dá)的時間間隔,不大于INTERTIME *money=rand()%MONEY+1; /每個顧客辦理的款數(shù),不大于MONEY *duration=rand()%DURATION+1; /客戶辦理業(yè)務(wù)所要時間,不大于DURATION *NType=rand()%2; /事件類型分為0和1兩種 return OK;15 初始化操作void OpenForDay() printf(" 請輸入銀行的初始存款:"); scanf("%d",&total_

29、money); printf(" 請輸入銀行的營業(yè)時間(分鐘):"); scanf("%d",&closetime); printf(" 請輸入最大到達(dá)時間間隔(分鐘):"); scanf("%d",&INTERTIME); printf(" 請輸入最大的處理時間(分鐘):"); scanf("%d",&DURATION); total_time=0; /客戶逗留總時間(初始值) number=0; /辦理業(yè)務(wù)的次序(初始值) InitQueue1()

30、; /初始化隊列1 InitQueue2(); /初始化隊列2 en.arrivetime=0; /到達(dá)時間 en.OccurTime=0; /事件發(fā)生時間 en.NType=0; /事件類型,暫時值en.money=0; /交易金額,暫時值en.duration=0; /辦理業(yè)務(wù)時間,暫時值EnQueue1(); /事件進(jìn)隊列16 查找上一離開事件的發(fā)生時間int find_leave() Queue1 p;int i=0;p=Q1.front->next;while(p!=NULL) if(p->data.NType!=0) i=p->data.OccurTime; p=

31、p->next; return i;17 處理客戶到達(dá)事件void CustomerArrived()int intertime;int i;time1=en.OccurTime;rand_ar(&intertime,&(en.money), &(en.duration),&(en.NType);/設(shè)置一離開事件插入事件表en.NType+; /0變1,1變2i=find_leave(); /查找上一離開事件的發(fā)生時間if(i=0) /第一位顧客 en.OccurTime=en.arrivetime+en.duration; else if(i>=e

32、n.arrivetime)/本事件到達(dá)時上一事件還未離開 en.OccurTime=i+en.duration;/則此事件的離開時間=上一事件的離開時間+本事件處理時間 else /上一事件離開之后,本事件才到達(dá) en.OccurTime=en.arrivetime+en.duration;/則此事件的離開時間=本事件到達(dá)時間+本事件處理時間 EnQueue1(); /設(shè)置下一用戶到達(dá)事件插入隊列1 en.arrivetime=en.arrivetime+intertime; /下一客戶到達(dá)時間 en.OccurTime=en.arrivetime; en.NType=0; /暫時值 en.m

33、oney=0; /暫時值 en.duration=0; /暫時值 EnQueue1();18 返回隊列2的長度int getlong_q2() int i=0; Queue2 p; p=Q2.front->next; while(p) i+; p=p->next; return i;19順序檢查隊列2是否有滿足條件者status check_q2() int i,j,z=0; i=getlong_q2(); /用i返回隊列2長度 for(j=1;j<=i;j+) DeQueue2(); /隊列2出隊,用en1返回其值 if(en1.money<=total_money)

34、/若隊列2出隊元素的要交易的金額<=銀行現(xiàn)存金額,則可以辦理 if(time1>closetime) printf("-tt%dtt%dtt%dtt%dt%dn",z,use_time,number,z, (en1.arrivetime),en1.money); Else time1=time1+en1.duration; /更新系統(tǒng)當(dāng)前時間 use_time=time1-en1.arrivetime; total_time+=use_time; /更新逗留時間 total_money-=en1.money; /更新資金總額 number+; /更新實現(xiàn)交易的客

35、戶數(shù) printf("%ldtt%dtt%dtt%dtt%dt-%dn",total_money,use_time,number,time1,(en1.arrivetime),(en1.money); else /若隊列2出隊元素的要交易的金額>銀行現(xiàn)存金額,不能辦理if(time1>closetime) printf("-tt%dtt%dtt%dtt%dt%dn",z,use_time, number,z,(en1.arrivetime),en1.money); else EnQueue2(); /繼續(xù)插入隊列2的隊尾,繼續(xù)等待 retur

36、n OK;20 隊列1離開事件減duration(辦理業(yè)務(wù)時間) int cut_duration(int e) /e即形參辦理業(yè)務(wù)的時間 Queue1 p,q,r; ElemType1 en; p=Q1.front->next; r=Q1.front; if(p) if(p->data.NType!=0) q=p->next; r->next=q; /刪除結(jié)點 en.arrivetime=p->data.arrivetime; /到達(dá)時間 en.OccurTime=p->data.OccurTime-e; /事件發(fā)生時間 en.NType=p->da

37、ta.NType; /事件類型 en.duration=p->data.duration; /辦理業(yè)務(wù)時間 en.money=p->data.money; /數(shù)額 free(p); EnQueue1(); return OK;21 處理客戶離開事件void CustomerDeparture() int i; i=en.NType; /業(yè)務(wù)類型,1表示存款,2表示取款 time1=en.OccurTime-en.duration; if(i=OK) /是否是辦理存款 if(en.OccurTime>closetime) /營業(yè)結(jié)束,全部客戶離開銀行 free_system()

38、; else /營業(yè)時間沒有結(jié)束,繼續(xù)辦理 use_time=en.OccurTime-en.arrivetime; total_time+=use_time; /更新逗留的總時間 total_money=total_money+en.money;/更新資金總額 number+; /更新服務(wù)的客戶數(shù) time1=en.OccurTime; /更新系統(tǒng)當(dāng)前時間 printf("%ldtt%dtt%dtt%dtt%dt%dn",total_money, use_time,number,en.OccurTime,en.arrivetime,en.money); check_q2(

39、); /檢查隊列2是否有滿足條件者 else /辦理取款 if(en.money>total_money) /辦理取款,當(dāng)申請金額不能滿足時,離開隊列1進(jìn)入隊列2等待 cut_duration(en.duration);/從隊列1中刪除該結(jié)點 en1.arrivetime=en.arrivetime; en1.duration=en.duration; en1.money=en.money; EnQueue2(); /進(jìn)入隊列2繼續(xù)等待 else /辦理取款,當(dāng)能滿足所申請金額時進(jìn)行隊列1 if(en.OccurTime>closetime)/營業(yè)結(jié)束,全部客戶離開銀行 free_

40、system(); else use_time=en.OccurTime-en.arrivetime;/顧客所用時間=事件發(fā)生時間-事件到達(dá)時間 total_time+=use_time;/更新逗留的總時間 total_money-=en.money; /更新資金總額 time1=en.OccurTime; /更新系統(tǒng)當(dāng)前時間 number+; /更新客戶總數(shù) printf("%ldtt%dtt%dtt%dtt%dt-%dn",total_money,use_time,number,en.OccurTime,en.arrivetime,en.money); 22主函數(shù)voi

41、d main() int n;printf("=n"); printf(" 歡迎使用銀行業(yè)務(wù)模擬系統(tǒng) n" printf("-"); printf(" 姓名:楊丹丹 n "); printf(" 學(xué)號: 1242152137n "); printf(" 班級:12信管1班 n "); printf("=n"); printf("請選擇開始或退出:n" );printf("1.進(jìn)入銀行業(yè)務(wù)模擬系統(tǒng)n");printf(

42、"0.退出程序n"); scanf("%d",&n); while(n=1) OpenForDay(); /初始化操作 printf("-n"); printf("Total_moneytuse_timetnumberten.OccurTimeten.arrivetimetmoneyn"); while(Q1.front) DeQueue1(); /隊列1出隊列,并用en返回值 if(en.NType=0)/en.NType等于0表示客戶到達(dá),1表示客戶離開 CustomerArrived(); /處理客戶

43、到達(dá)事件 else CustomerDeparture(); /處理客戶離開事件,業(yè)務(wù)類型en.NType等于1表示存款,2表示取款 printf("1.營業(yè)結(jié)束后銀行現(xiàn)存資金總額(元): %ldn",total_money) ; printf("2.營業(yè)時間內(nèi)實現(xiàn)交易的客戶數(shù)(人): %dn",number);printf("3.客戶在銀行逗留的總時間(分鐘): %dn",total_time); printf("4.客戶在銀行的平均逗留時間(分鐘): %fn",(float)total_time/(float)

44、number); printf("-"); printf("以上為模擬結(jié)果!請繼續(xù)選擇繼續(xù)或退出:n" );printf("1.繼續(xù)模擬n");printf("0.退出程序n"); scanf("%d",&n);if(n=0) printf(" 謝謝使用本系統(tǒng),再見!" ); break; 第 4章 編碼與調(diào)試4.1.調(diào)試程序過程遇到的問題及解決的方法 首先是對指針初始化的問題,一些指針如果不先申請一個新變量就會報錯,即使是直接把這個指針賦值為空也要現(xiàn)為其申請一個新的

45、空間。其次就是對循環(huán)退出條件的選擇,有幾次發(fā)現(xiàn)模擬過程出現(xiàn)了停止現(xiàn)象,此時發(fā)現(xiàn)問題就可以對循環(huán)體進(jìn)行調(diào)試,一般只要對循環(huán)體內(nèi)加上一些認(rèn)為的輸出判斷它的執(zhí)行情況就可以比較方便的發(fā)現(xiàn)和解決問題。4.2.調(diào)試過程1、進(jìn)入演示程序后,即顯示文本方式的主界面窗口,如圖3:(圖 3)2. 程序測試結(jié)果 在此程序中我通過宏定義語句#define MONEY 5000設(shè)置了個人業(yè)務(wù)值的交易上限。但系統(tǒng)的模擬性能完全不受這些規(guī)定的限制,可以通過改變此上限來隨機產(chǎn)生不同范圍的交易額。用戶完全可以根據(jù)實際需要作簡單的修改和調(diào)整。而且時間間隔,每個客戶辦理的款數(shù)以及處理時間這些模擬量均由隨機函數(shù)給出,符合離散事件要求

46、。為了測試程序的健壯性,可以輸入不同的數(shù)據(jù)進(jìn)行測試。我測試的第一組數(shù)據(jù)是: 銀行初始存款:10000元 營業(yè)時間:480分鐘(即8小時)兩個客戶到達(dá)的最大時間間隔:30分鐘最大處理時間:20分鐘3.進(jìn)入演示程序后,即顯示文本方式的主界面窗口,如圖4: (圖 4) 進(jìn)一步按回車鍵,即出現(xiàn)如下圖5的界面: (圖5)即成為了死循環(huán),不能行通。進(jìn)一步的對程序進(jìn)行整改,調(diào)試,又運行出如下圖6的界面(圖 6 )此次運行的程序中,沒有進(jìn)入模擬系統(tǒng),但也沒形成死循環(huán),原因是主函數(shù)沒有調(diào)用模擬系統(tǒng)的子函數(shù)。最終,此次的課程設(shè)計以失敗告終。再運行一次,出現(xiàn)如下圖7界面: (圖 7)進(jìn)一步按回車鍵出現(xiàn)如下圖8的界面: (圖 8)第 5章 總結(jié)5.1心得體會這是我第一次做課程設(shè)計,當(dāng)初聽老師說要做課程設(shè)計時,而且得知做設(shè)計的要求時,就覺得這會是一個很具有挑戰(zhàn)性的問題。于是就自己著手收集了一些相關(guān)課程設(shè)計的題目,綜合和這些題目以及自己的水平,最終確定了這個選題。當(dāng)明確自己要做課程設(shè)計的題目時,充滿了好奇心,以前只是一味的學(xué)習(xí)書本的知識,這次要理論結(jié)合實際的去做一個系統(tǒng)程序,有壓力也有動力。編輯好自己的設(shè)計任務(wù)書,結(jié)合設(shè)計的要求,腦海中開始尋找合適的數(shù)據(jù)結(jié)構(gòu)來解決這個問題。看了從互聯(lián)網(wǎng)

溫馨提示

  • 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

提交評論