銀行模擬系統(tǒng)實驗報告_第1頁
銀行模擬系統(tǒng)實驗報告_第2頁
銀行模擬系統(tǒng)實驗報告_第3頁
銀行模擬系統(tǒng)實驗報告_第4頁
銀行模擬系統(tǒng)實驗報告_第5頁
已閱讀5頁,還剩2頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

銀行模擬系統(tǒng)的設計與實現(xiàn)姓名:學號:班級:計科二班計算機與信息技術學院綜合性、設計性實驗報告專業(yè):計算機科學與技術年級/班級:計科二班2011—2012學年第一學期課程名稱數(shù)據(jù)結構指導教師王歲花本組成員學號姓名成員姓名:彭濤學號:1008114150實驗地點215機房實驗時間7,8,9周下午5-6節(jié)項目名稱銀行模擬系統(tǒng)的設計與實現(xiàn)實驗類型綜合性/設計性一、實驗目的1)通過實驗掌握對離散事件模擬的認識;2)進一步理解隊列的實現(xiàn)與應用;3)對鏈表的操作有更深層次的理解;該實驗涉及到線性表的建立、插入、刪除等操作,涉及到了隊列的建立、插入、刪除,涉及到了離散事件的應用思想,還涉及到了排序的概念。完成這個實驗對線性表、隊列及C語言編程等多方面的知識將是一個很好的利用,對離散事件也將有一個初步的認識。二、實驗儀器或設備裝有VisualC++6.0的計算機一臺三、總體設計(設計原理、設計方案及流程等)■實驗問題描述:假設某銀行有四個窗口對外接待客戶,從早晨銀行開門起不斷有客戶進入銀行。由于每個窗口在某個時刻只能接待一個客戶,因此在客戶人數(shù)眾多時需在每個窗口前順次排隊,對于剛進入銀行的客戶,如果某個窗口的業(yè)務員正空閑,則可上前辦理業(yè)務,反之,若四個窗口均有客戶所占,他便會排在人數(shù)最少的隊伍后面?,F(xiàn)在需要編制程序以模擬銀行的這種業(yè)務活動并計算一天中客戶在銀行逗留的平均時間?!鲈O計原理:根據(jù)前幾章所學習的與鏈表、隊列等相關的知識,了解到鏈表與隊列的特點,聯(lián)系實際,對題目思考可知:動態(tài)鏈表可以進行動態(tài)分配與存儲,還可以在鏈表中適合的位置進行刪除和插入操作;多個相同類型的數(shù)據(jù)類型可將其放在一個數(shù)組中;結構體類型的數(shù)據(jù)可以有多個域,存放不同的數(shù)據(jù)信息;隊列是一種先進后出的線性表,只允許在表的一端進行插入而在另一端進行刪除,和日常生活中的排隊是一樣的;在一天的營業(yè)過程中,銀行的工作流程,包含開門事件、客戶到達對客戶業(yè)務進行辦理、關門時間到的時候關門事件;而對顧客來說,辦理業(yè)務需要排隊等候(如果銀行里辦理業(yè)務的人比較多的話)、辦理業(yè)務、辦理完之后離開;時間是貫穿所有動作發(fā)生的線索,動作只有兩種:到達和離開;由此想到可以建立一個以時間先后順序來連接動作的事件鏈表,將各個事件發(fā)生的時間及類型(到達或離開)作為鏈表結點中的數(shù)據(jù)內(nèi)容?!鲈O計方案:對銀行的業(yè)務辦理流程進行深入了解,思考程序的基本框架;根據(jù)生活實際,先將主函數(shù)編寫出來,主函數(shù)中應包含銀行開門事件,顧客到達事件和離開事件;編寫出各個事件的算法;用初始化的事件鏈表將各個事件聯(lián)系起來;對編號的算法進行程序化;然后上機對程序進行編譯、調(diào)試,直到程序可以正確運行?!鲈O計流程■仔細分析課題,得出解決該課題的基本思路:1:鏈表是解決該事件的關鍵,從對鏈表的建立到鏈表中元素的刪除并分析,就完成了問題的解決。銀行開門后,對各項數(shù)據(jù)進行初始化,向鏈表中插入第一個數(shù)據(jù)元素,接著進行對客戶到達事件和離開事件的處理(客戶到達時,客戶計數(shù)器增加,窗口隊列插入,相應數(shù)據(jù)插入事件鏈表;客戶離開時,計時計數(shù)器增加,窗口隊列的刪除,相應的數(shù)據(jù)插入事件鏈表)。其中,客戶的離開與到達的處理先后順序是有鏈表中的元素決定,即先刪除鏈表的第一個元素,然后分析屬于到達事件則執(zhí)行到達事件相應操作,若為離開事件則執(zhí)行離開事件相應操作2:對編寫該程序所需的隊列數(shù)組和事件鏈表(鏈表中的元素應以時間的先后順序鏈接)的基本結構進行定義,設計出基本的程序框架,使程序在自己的腦子中有一個清晰的輪廓3:編寫出主函數(shù),是銀行的各種操作(開門事件、辦理業(yè)務事件)及客戶的各種操作(到達事件和離開事件)都能在主函數(shù)中得以體現(xiàn);需要注意的是主函數(shù)中還應包含程序中所需的相關數(shù)據(jù)的輸入操作4:將主函數(shù)中的各個子函數(shù)的算法進行程序化,然后再對函數(shù)進行細節(jié)方面的處理(程序的聲明等)。對完成的程序進行調(diào)試,若出現(xiàn)錯誤則進行修改,若無錯則輸入多組數(shù)據(jù)進行執(zhí)行,驗證程序的完整性與健壯四、實驗步驟(包括主要步驟、代碼分析等)■主要步驟:(1)打開VisualC++6.0新建一個C++SourceFile,文件名為“銀行模擬系統(tǒng)”,保存在G:\數(shù)據(jù)結構'數(shù)據(jù)結構實驗文件夾中。(2)輸入該程序所需的代碼。(3)編譯、鏈接,出現(xiàn)錯誤。(4)對錯誤進行修改,再次編譯、鏈接,無錯誤后,執(zhí)行,得出,如下圖所示的執(zhí)行結果:■代碼分析:1:首先分析主函數(shù)前面的程序,頭文件的聲明,各種變量的定義;#include〃stdio.h#includemalloc.h#include〃math.h〃#include〃stdlib.h〃intCks=4;//銀行辦理業(yè)務的窗口數(shù),默認值為:4;最大值不超過20;intQu;//客戶隊列數(shù)Qu=CksintKhjg=5;//兩相鄰到達客戶的時間間隔最大值,默認值為:5intBlsj=30;//每個客戶辦理業(yè)務的時間最大值,默認值為:30typedefstruct//定義事件的元素類型ElemType為結構體類型(intOccurTime;//事件發(fā)生時刻intNType;//事件類型,Qu表示到達事件,0至Qu-1表示Qu個窗口的離開事件}Event,ElemType;//事件類型,有序鏈表LinkList的數(shù)據(jù)元素類型typedefstructLNode〃定義事件表的結點類型(ElemTypedata;structLNode*next;}LNode,*LinkList;typedefLinkListEventList;//事件鏈表類型,定義為有序鏈表typedefstruct〃定義客戶隊列的元素類型(intArrivalTime;//到達時刻intDuration;//辦理事務所需時間}QElemType;//定義QElemType(隊列的數(shù)據(jù)元素類型)為結構體類型;typedefstructQNode〃定義客戶隊列的結點類型(QElemTypedata;structQNode*next;}QNode,*Queue;typedefstruct(Queuehead;Queuetail;}LinkQueue;LinkQueue*q;//Qu個客戶隊列EventListev;//事件表Eventen;//事件Eventet;//臨時變量QElemTypecustomer;//客戶記錄intTotalTime=0,CustomerNum=0;//累計客戶逗留時間,客戶數(shù)(初值為0)intCloseTime;//銀行營業(yè)時間(單位是分)2:再分析主函數(shù),主函數(shù)中包含了程序所需的數(shù)據(jù)的輸入,接著是隨機種子的接受(為了后面的程序中隨機數(shù)的產(chǎn)生),緊接著是開門事件函數(shù),然后是對事件鏈表中的元素進行刪除,然后對所刪除結點中的數(shù)據(jù)進行分析,若該結點的信息屬于客戶到達事件則處理到達事件,反之則處理離開事件;最后是函數(shù)結果的輸出;voidmain()(printf("請輸入銀行營業(yè)時間長度(單位:分)CloseTime=");scanf(〃%d〃,&CloseTime);printf("請輸入銀行辦理業(yè)務所開窗口數(shù)Cks=");scanf("%d",&Cks);printf("請輸入客戶辦理業(yè)務的最長時間Blsj=");scanf("%d",&Blsj);printf("請輸入兩個相鄰客戶到達銀行的時間間隔的最大值Khjg=");scanf("%d",&Khjg);Qu=Cks;//給Qu賦值為窗口數(shù)CksBank_Simulation();//模擬銀行業(yè)務}3:接下來,是程序中的子函數(shù):cmp比較函數(shù),將事件(到達或離開)的發(fā)生時間進行比較,不同結果返回不同的返回值,用于對鏈表中事件的插入;intcmp(Eventa,Eventb)(//依事件a的發(fā)生時刻<、二或>事件b的發(fā)生時刻分別返回-1、0或1if(a.OccurTime==b.OccurTime)return0;elsereturn(a.OccurTime-b.OccurTime)/abs(a.OccurTime-b.OccurTime);}4:OpenForDay銀行開門事件的函數(shù),設置計數(shù)器與計時器,初始化時間表與隊列數(shù)組,將第一個客戶的相關信息結點插入鏈表中;voidOpenForDay()//模擬銀行開門的動作,即初始化操作(inti;InitList(ev);//初始化事件鏈表為空en.OccurTime=0;//設定第一個客戶到達事件en.NType=0;//客戶到達事件Insert_EventList(ev,en);//插入事件q=(LinkQueue*)malloc((Qu+1)*sizeof(LinkQueue));//為隊列申請Qu+1個隊頭指針,第0個不用for(i=1;i<Qu+1;++i)//置空隊列InitQueue(q[i]);}5:CustomerArrived客戶到達事件函數(shù),客戶數(shù)加一,產(chǎn)生隨機數(shù)(辦理業(yè)務時間,下一個客戶到達時間),由隨機數(shù)可得到下一個客戶的到達事件,插入時間表(到達時間小于關門時間),并將該結點插入最小隊列中,若該隊列中只有一個客戶(即辦理業(yè)務不需要等候),將該客戶的離開事件也插入鏈表中;voidCustomerArrived()(//處理客戶到達事件QElemTypef;intdurtime,intertime,i;++CustomerNum;Random(durtime,intertime);//生成隨機數(shù)//printf("%d%d\n”,durtime,intertime);et.OccurTime二en.OccurTime+intertime;//下一客戶到達時刻。et.NType=0;//隊列中只有一個客戶到達事件//printf("%d%d\n”,et.NType,et.OccurTime);if(et.OccurTime<CloseTime)//銀行尚未關門,插入事件表Insert_EventList(ev,et);i=Minimum(q);//求長度最短隊列的序號,等長為最小的序號f.ArrivalTime二en.OccurTime;f.Duration=durtime;EnQueue(q[i],f);if(QueueLength(q[i])==1)(et.OccurTime二en.OccurTime+durtime;et.NType二i;Insert_EventList(ev,et);//設定第i隊列的一個離開事件并插入事件表}}6:CustomerDeparture客戶離開事件函數(shù),將該客戶所在隊列的第一個元素(該客戶)刪掉,計時器增加,然后分析該隊列,若隊列不為空,則下一個客戶要開始業(yè)務辦理,由由下一個客戶的元素信息可得出該客戶的離去事件,將該事件插入事件鏈表中;voidCustomerDeparture()(//處理客戶離開事件,en.NTyPe!=0inti;i=en.NType;DelQueue(q[i],customer);//刪除第i隊列的排頭客戶TotalTime+=en.OccurTime-customer.ArrivalTime;//累計客戶逗留時間if(!QueueEmpty(q[i]))(//設定第i隊列的一個離開事件并插入事件表GetHead_q(q[i],customer);et.OccurTime二en.OccurTime+customer.Duration;et.NType二i;Insert_EventList(ev,et);}}7:接下來的一些函數(shù)是一些比較簡單的子函數(shù),如判斷一個隊列、鏈表是否為空,求隊列的長度,求長度最小的隊列,鏈表、隊列的初始化等,在此不做詳細分析;8:最后再分析一下Orderinsert事件鏈表的插入函數(shù),先將一個指針指向鏈表頭結點,接著將你所要插入事件的發(fā)生時間和鏈表中的事件的時間依次比較,直至找到合適位置。比較的結果若事件大于鏈表中的事件,應將指針向后移,若指針后移后無結點,直接將該事件插在鏈尾,若比較事件時間小于鏈表中的事件時間,則將該事件結點插入鏈表事件前。五、結果分析與總結?結果分析:不同的數(shù)據(jù)輸入得到的程序結果輸入也不同,如增加

溫馨提示

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

最新文檔

評論

0/150

提交評論