版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、<p><b> 數(shù)據(jù)結(jié)構(gòu)</b></p><p><b> 課程設(shè)計報告</b></p><p><b> 銀行業(yè)務(wù)模擬</b></p><p><b> 需求分析</b></p><p> 客戶的業(yè)務(wù)分為兩種:第一種是申請從銀行得到
2、一筆資金,即取款或借款;第二種是向銀行中投入一筆資金,即存款或還款。銀行有兩個服務(wù)窗口,相應(yīng)地有兩個隊列??蛻舻竭_銀行后先排第一個隊。處理每個客戶業(yè)務(wù)時,如果屬于第一種,且申請額超出銀行現(xiàn)存資金總額而得不到滿足,則立刻排入第二個隊等候,直至滿足時才離開銀行;否則業(yè)務(wù)處理完后立刻離開銀行。每接待完一個第二種業(yè)務(wù)的客戶,則順序檢查和處理(如果可能)第二個隊列中的客戶,對能滿足的申請者予以滿足,不能滿足者重新排到第二個隊列的隊尾。注意,在此檢
3、查過程中,一旦銀行資金總額少于或等于剛才第一個隊列中最后一個客戶(第二種業(yè)務(wù))被接待之前的數(shù)額,或者本次已將第二個隊列檢查或處理了一遍,就停止檢查(因為此時已不可能還有能滿足者)轉(zhuǎn)而繼續(xù)接待第一個隊列的客戶。任何時刻都只開一個窗口。假設(shè)檢查不需要時間。營業(yè)時間結(jié)束時所有客戶立刻離開銀行。</p><p> 要求:寫一個上述銀行業(yè)務(wù)的事件驅(qū)動模擬系統(tǒng),模擬出并輸出系統(tǒng)處理所有客戶的流程,并計算出所有客戶在銀行內(nèi)逗
4、留的平均時間。</p><p><b> 2.設(shè)計</b></p><p><b> 2.1設(shè)計思想</b></p><p> 本問題主要需要處理兩個交易隊列(fq,sq)和一個事件隊列(eq)。當有客戶來交易時,讓客戶先進隊列一fq,然后讓事件隊列eq記下客戶隨機產(chǎn)生的到達時間,如果客戶辦理存款,則更新銀行的資金并
5、且記下客戶隨機產(chǎn)生的逗留時間,辦理完后讓事件隊列記錄客戶的離開時間,然后從隊列一中刪除該客戶的結(jié)點;如果客戶辦理取款,當銀行此刻的金額可以滿足該客戶,則更新銀行的資金并且記下客戶隨機產(chǎn)生的逗留時間,辦理完后讓事件隊列記錄客戶的離開時間,然后從隊列一中刪除該客戶的結(jié)點,當銀行此刻的金額不能夠滿足該客戶,則將該客戶轉(zhuǎn)移到隊列二等待,直到下一個辦理存款的客戶辦理完存款后,從隊列二的頭結(jié)點開始搜索,看看有沒有可以滿足其取款的客戶,如果隊列二的頭
6、結(jié)點客戶能滿足,則為其辦理取款,然后從隊列二中刪除該節(jié)點,并讓事件隊列記錄該客戶的離開時間,如果隊列二的頭結(jié)點客戶仍然不能滿足,則搜索下一個客戶直到將隊列二搜索完。等到銀行的營業(yè)時間到了后,輸出事件隊列,需要辦理兩種業(yè)務(wù)的顧客數(shù),已成功辦理兩種業(yè)務(wù)的顧客數(shù),兩種業(yè)務(wù)的成功辦理率,客戶在銀行內(nèi)的平均逗留時間和下班時銀行所剩余的資金總額。</p><p><b> 實現(xiàn):</b></p&
7、gt;<p><b> 輸入:</b></p><p> 用戶需要在程序運行開始時輸入以下數(shù)據(jù):</p><p> 銀行初始資金total;</p><p> 銀行營業(yè)時間closetime;</p><p> 客戶交易時間上下界dealmaxtime和dealmintime,用于給隨機數(shù)產(chǎn)生函數(shù)
8、傳遞參數(shù),產(chǎn)生一個介于這兩個值之間的值;</p><p> 客戶到達時間間隔上界arrivemaxtime arrivemintime,用于給隨機數(shù)產(chǎn)生函數(shù)傳遞參數(shù),產(chǎn)生一個介于這兩個值之間的值;</p><p> 交易額的最大上限dealMaxMoney.用于給隨機函產(chǎn)生函數(shù)參數(shù),產(chǎn)生一個介于-dealMaxMoney和dealMaxMoney之間的值,作為顧客到銀行辦理業(yè)務(wù)的交易額
9、,。</p><p><b> 輸出:</b></p><p> 本程序用dos界面模擬輸出整個銀行業(yè)務(wù)辦理及排隊的結(jié)果,最后給出一下數(shù)據(jù):</p><p> 分別列出需要辦理兩種業(yè)務(wù)的顧客數(shù);</p><p> 分別列出已成功辦理兩種業(yè)務(wù)的顧客數(shù);</p><p> 分別列出兩種業(yè)務(wù)的
10、成功辦理率;</p><p> 客戶在銀行內(nèi)的平均逗留時間;</p><p> 下班時銀行所剩余的資金總額。</p><p><b> 數(shù)據(jù)結(jié)構(gòu)設(shè)計:</b></p><p><b> 結(jié)構(gòu)體的定義如下:</b></p><p> struct service<
11、;/p><p><b> {</b></p><p> int num; //客戶號</p><p> string type; //到達或離開</p><p> int beginTime;//到達時間</p><p> int endTime;//離開時間</p><
12、p> int money; //正數(shù)為存款,負數(shù)為取款</p><p> service* next;//指針域</p><p><b> };</b></p><p> 隊列的抽象數(shù)據(jù)類型定義如下:</p><p> ADT Queue{</p><p> 數(shù)據(jù)對象:D={ a
13、i | ai∈ElemSet, i=1,2,...,n, n≥0 }</p><p> 數(shù)據(jù)關(guān)系:R1={ <ai-1, ai>|ai-1, ai∈D, i=2,...,n }</p><p><b> 基本操作:</b></p><p> void init_Q(Queue &Q);</p><
14、p> 操作結(jié)果:構(gòu)造空隊列Q</p><p> int Q_empty(Queue Q);</p><p> 初始條件:隊列Q存在</p><p> 操作結(jié)果:若Q為空隊列,則返回TRUE,否則FALSE</p><p> int Q_length(Queue Q);</p><p> 初始條件:隊列
15、Q存在</p><p> 操作結(jié)果:返回隊列Q的元素個數(shù),即隊列長度</p><p> int gethead_Q(Queue Q);</p><p> 初始條件:隊列Q存在</p><p> 操作結(jié)果:返回隊列Q的隊頭元素</p><p> void en_Q(Queue &Q,int e);<
16、;/p><p> 初始條件:隊列Q存在</p><p> 操作結(jié)果:插入元素e為Q的新的隊尾元素。</p><p> void de_Q(Queue &Q,int &e);</p><p> 初始條件:隊列Q存在</p><p> 操作結(jié)果:刪除Q的隊頭元素。</p><p&g
17、t; }ADT Queue</p><p><b> 算法設(shè)計</b></p><p><b> 隊列類型</b></p><p> typedef struct QNode</p><p> {//隊列節(jié)點類型 </p><p> int data;
18、</p><p> struct QNode *next;</p><p> }QNode,*PQNode;</p><p> typedef struct {</p><p> PQNode front;//隊頭指針</p><p> PQNode rear;//隊尾指針</p>
19、<p><b> }Queue;</b></p><p> 隊列的基本操作設(shè)置如下:</p><p> void init_Q(Queue &Q);</p><p> //初始化,構(gòu)造空隊列Q(Q.front=Q.rear)</p><p> int Q_empty(Queue Q);<
20、;/p><p><b> //若隊列Q存在</b></p><p> //若Q為空隊列,則返回TRUE,否則FALSE</p><p> int Q_length(Queue Q);</p><p><b> //若隊列Q存在</b></p><p> //返回隊列Q的
21、元素個數(shù),即隊列長度</p><p> int gethead_Q(Queue Q);</p><p><b> //若隊列Q存在</b></p><p> //返回隊列Q的隊頭元素</p><p> void en_Q(Queue &Q,int e);</p><p><b
22、> //若隊列Q存在</b></p><p> //插入元素e為Q的新的隊尾元素。</p><p> void de_Q(Queue &Q,int &e);</p><p><b> //若隊列Q存在</b></p><p> //刪除Q的隊頭元素。</p>&l
23、t;p><b> 其中操作算法:</b></p><p> void init_Q(Queue &Q)</p><p><b> {</b></p><p> //初始化,構(gòu)造空隊列Q(Q.front=Q.rear)</p><p> Q.front=Q.rear=(PQNo
24、de)malloc(sizeof(QNode));</p><p> if(!Q.front)exit(-1);</p><p><b> } </b></p><p> int Q_empty(Queue Q)</p><p><b> {</b></p><p>
25、<b> //若隊列Q存在</b></p><p> //若Q為空隊列,則返回TRUE,否則FALSE</p><p> if(Q.front==Q.rear)return 1;</p><p> else return 0;</p><p><b> }</b></p>&
26、lt;p> int gethead_Q(Queue Q)</p><p><b> {</b></p><p><b> //若隊列Q存在</b></p><p> //返回隊列Q的隊頭元素</p><p> if(!Q_empty(Q))return Q.front->nex
27、t->data;</p><p> else return 0;</p><p><b> }</b></p><p> int Q_length(Queue Q)</p><p><b> {</b></p><p><b> //若隊列Q存在&l
28、t;/b></p><p> //返回隊列Q的元素個數(shù),即隊列長度</p><p> int count=0;</p><p> PQNode p=Q.front;</p><p> while(p!=Q.rear)</p><p><b> {</b></p>&l
29、t;p><b> count++;</b></p><p> p=p->next;</p><p><b> }</b></p><p> return count;</p><p><b> }</b></p><p> voi
30、d en_Q(Queue &Q,int e)</p><p><b> {</b></p><p><b> //若隊列Q存在</b></p><p> //插入元素e為Q的新的隊尾元素。</p><p> PQNode p=(PQNode)malloc(sizeof(QNode))
31、;</p><p> if(!p)exit(-1);</p><p> p->data=e;p->next=NULL;</p><p> Q.rear->next=p;</p><p><b> Q.rear=p;</b></p><p><b> }<
32、;/b></p><p> void de_Q(Queue &Q,int &e)</p><p><b> {</b></p><p><b> //若隊列Q存在</b></p><p> //刪除Q的隊頭元素</p><p><b>
33、 PQNode p;</b></p><p> if(Q.front==Q.rear)return ;</p><p> p=Q.front->next;</p><p> e=p->data;</p><p> Q.front->next=p->next;</p><p>
34、; if(Q.rear==p)Q.rear=Q.front;</p><p><b> free(p);</b></p><p><b> }</b></p><p><b> 隊列掃描算法</b></p><p><b> 偽代碼:</b>&l
35、t;/p><p><b> {</b></p><p> if(!empry(fq)&& fq.head->money<0)</p><p> //如果隊列一不空,而且隊頭客戶辦理第二種業(yè)務(wù)</p><p><b> {</b></p><p>
36、; //1.可以辦,完成離開(即銀行現(xiàn)金足夠取)</p><p> //2.不可以辦,排隊2等候</p><p><b> }</b></p><p><b> else </b></p><p> //存款 ,第一種業(yè)務(wù) </p><p> if(!empt
37、y(fq) && temped= searchAndDel(sq,total)))</p><p><b> //當交易時間到</b></p><p><b> {</b></p><p> //辦理該業(yè)務(wù),并開始掃描第二隊列,看是否能滿足//第二隊列需要</p><p>
38、<b> }</b></p><p> if(currentime==next_arrtime )</p><p><b> {</b></p><p> //當當前時間等于即將到來的顧客到來時間,初始化//該顧客節(jié)點,并設(shè)置下一顧客到達時間</p><p><b> }&l
39、t;/b></p><p><b> }</b></p><p><b> 其他函數(shù)算法</b></p><p> int rand_num(int max,int min)//隨機數(shù)生成</p><p><b> {</b></p><
40、p> //根據(jù)傳進的max和min,生成介于max和min的一個//整數(shù)</p><p> randomize();</p><p> RandSeed=Now();</p><p> return ( random(100000) % (max - min + 1) +min );</p><p><b> }
41、</b></p><p><b> 2.2設(shè)計表示</b></p><p><b> 函數(shù)調(diào)用關(guān)系圖</b></p><p><b> Main()</b></p><p><b> Arrive()</b></p>&l
42、t;p> putMoney() getMoney()</p><p> searchAndDeal()</p><p> findAndDeal()</p><p><b> 詳細設(shè)計</b></p><p> int main()//主函數(shù)</p><p><b>
43、; { </b></p><p> printf(" *******************************************************************\n");</p><p> printf(" ******************************************************
44、*************\n");</p><p> printf(" *******************************************************************\n");</p><p> printf(" **************** 學(xué)院:計算機學(xué)院
45、*************\n");</p><p> printf(" **************** *************\n");</p><p> printf(" **************** 專業(yè):計算機科學(xué)與技術(shù) ***
46、**********\n");</p><p> printf(" **************** *************\n");</p><p> printf(" **************** 班級191113
47、 *************\n");</p><p> printf(" **************** *************\n");</p><p> printf(" **************** 姓名:黃建釗
48、 *************\n");</p><p> printf(" **************** *************\n");</p><p> printf(" **************** 學(xué)號:20111000611
49、 *************\n");</p><p> printf(" **************** *************\n");</p><p> printf(" ****************
50、 *************\n");</p><p> printf(" **************** 歡迎進入銀行業(yè)務(wù)模擬系統(tǒng) *************\n");</p><p> printf(" ****************
51、 *************\n"); </p><p> printf(" *******************************************************************\n");</p><p> printf(" ****************
52、***************************************************\n");</p><p> printf(" *******************************************************************\n");</p><p> printf("\n")
53、;</p><p> printf("\n");</p><p> printf("\n");</p><p> printf("請按任意鍵繼續(xù)......\n");</p><p><b> getch();</b></p><p&
54、gt;<b> int i;</b></p><p> for(i=0;i<=14;i++)</p><p> printf("\n");</p><p> printf(" **********************************************************\n&qu
55、ot;);</p><p> printf(" **********************************************************\n");</p><p> printf(" *********** ***************\n");</
56、p><p> printf(" *********** 0.退出 1.進入模擬系統(tǒng) ***************\n");</p><p> printf(" *********** ***************\n");</p><p>
57、printf(" **********************************************************\n");</p><p> printf(" **********************************************************\n");</p><p> printf(&qu
58、ot; ************************ 請選擇服務(wù) ********************\n");</p><p> int n,t1=0,t2=0,t3=0,t4=0,m=0;</p><p> scanf("%d",&n);</p><p> while(n==1)</p>&l
59、t;p><b> {</b></p><p> srand(time(NULL)); //初始化隨機函數(shù)</p><p> printf("請輸入銀行的初始存款:\n");</p><p> scanf("%d",&total);</p><p> prin
60、tf("請輸入銀行的營業(yè)時間:\n");</p><p> scanf("%d",&closeTime);</p><p> printf("請輸入最大到達時間間隔:\n"); </p><p> scanf("%d",&arriveMaxTime);</p&
61、gt;<p> printf("請輸入最小到達時間間隔:\n"); </p><p> scanf("%d",&arriveMinTime);</p><p> printf("請輸入最大的處理時間:\n");</p><p> scanf("%d",&am
62、p;dealMaxTime);</p><p> printf("請輸入最小的處理時間:\n");</p><p> scanf("%d",&dealMinTime);</p><p> printf("請輸入交易額的最大上限:\n");</p><p> scanf
63、("%d",&dealMaxMoney);</p><p><b> }</b></p><p> void arrive()//"到達"函數(shù),隨機產(chǎn)生顧客,進入隊列一產(chǎn)生到達事件 進入事件隊列</p><p><b> {</b></p><p&g
64、t; push(fq,(rand()% (2*dealMaxMoney) -dealMaxMoney)); //隨機產(chǎn)生顧客加入第一隊列</p><p> back(fq)->beginTime = currentTime;//當前時間為客戶的到達時間</p><p> back(fq)->num = number;//客戶號為客戶序列號</p><
65、p> push(eq,(back(fq)->money)); //將產(chǎn)生事件加入事件隊列</p><p> back(eq)->beginTime = currentTime;</p><p> back(eq)->type = "到達";</p><p> back(eq)->num = number;&l
66、t;/p><p><b> ++number;</b></p><p><b> }</b></p><p> void putMoney()//"存款"函數(shù)</p><p><b> { </b></p><p> total
67、 += front(fq)->money; //更新資金總額</p><p> push(eq,front(fq)->money); //加入事件隊列 </p><p> back(eq)->type = "離開";</p><p> back(eq)->num = front(fq)->num;</p&
68、gt;<p> back(eq)->endTime = (front(fq)->beginTime + rand()%(dealMaxTime-dealMinTime +1)+dealMinTime);//離開時間為到達時間加上隨機產(chǎn)生的介于最大處理時間和最小處理時間的處理時間</p><p> ++counter; //更新客戶總數(shù)</p><p> to
69、talTime += (back(eq)->endTime - front(fq)->beginTime); //更新逗留時間</p><p> pop(fq); //刪除第一隊列第一個業(yè)務(wù)</p><p> currentTimeOfDeal = back(eq)->endTime;//交易時間為客戶的離開時間</p><p> state
70、 =0;//窗口沒有交易需要處理</p><p><b> }</b></p><p> void getMoney()//"取款"函數(shù)</p><p><b> {</b></p><p> if( (-fq.head->money) > total )//
71、資金短缺 加入第二隊列 </p><p><b> {</b></p><p> push( sq,front(fq)->money );</p><p> back(sq)->beginTime = front(fq)->beginTime;</p><p> back(sq)->num
72、 = front(fq)->num;</p><p><b> pop(fq);</b></p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p
73、> total += back(fq)->money;//更新資金總額</p><p> push(eq,front(fq)->money); //加入事件隊列 </p><p> back(eq)->type = "離開";</p><p> back(eq)->num = front(fq)->nu
74、m;</p><p> back(eq)->endTime = (front(fq)->beginTime +rand()%(dealMaxTime-dealMinTime +1)+dealMinTime);//客戶的離開時間為客戶的到達時間加上隨機產(chǎn)生的介于最大處理時間和最小處理時間的處理時間</p><p> back(eq)->beginTime = 0;<
75、;/p><p> currentTimeOfDeal = back(eq)->endTime;//交易時間為客戶的離開時間</p><p> ++counter; //更新客戶總數(shù) </p><p> totalTime += ( back(eq)->endTime - back(fq)->beginTime ); //更新逗留時間</p&
76、gt;<p> pop(fq); //刪除第一隊列第一個業(yè)務(wù)</p><p> state =0;//窗口沒有交易需要處理</p><p><b> }</b></p><p><b> }</b></p><p> service* searchAndDeal(queue
77、&q,int m)//"搜索"函數(shù),在對列中尋找可處理元素</p><p><b> {</b></p><p> service* sign = q. head; //標記頭節(jié)點</p><p> service* temp;</p><p> while(q. head!=NULL
78、 )</p><p><b> {</b></p><p> if((-(q. head->money)) <m)//隊首元素可以處理</p><p><b> {</b></p><p> if(q. head==q.rear)</p><p><
79、;b> {</b></p><p> temp = q. head;</p><p> q. head = q. rear = NULL;</p><p> return temp;</p><p><b> }</b></p><p> else//隊首元素出列&l
80、t;/p><p><b> {</b></p><p> temp = q. head; </p><p> q. head = q. head->next; // 首節(jié)點后移一位,返回原首節(jié)點</p><p> return temp;</p><p><b> }<
81、/b></p><p><b> }</b></p><p> else//隊首元首不能被處理</p><p><b> {</b></p><p> if(q. head == q. rear){}</p><p> else//首節(jié)點移到隊列尾部</
82、p><p><b> {</b></p><p> q. rear->next = q. head; </p><p> q. rear = q. rear->next;</p><p> q. head =q. head->next;</p><p> q. rear-&
83、gt;next = NULL;</p><p><b> }</b></p><p><b> }</b></p><p> if(q. head == sign)//隊列循環(huán)一周時停止</p><p> return NULL;</p><p><b>
84、 }</b></p><p> return NULL;</p><p><b> }</b></p><p> service* temped ;</p><p> int randomTemp;//</p><p> void findAndDeal()//"處
85、理"函數(shù),在對列中尋找可處理元素,對其進行處理</p><p><b> {</b></p><p> while( (temped= searchAndDeal(sq,total))&&temped!=NULL ) //查找可處理取款</p><p><b> {</b></p&
86、gt;<p> total += temped->money; //更新資金總額</p><p> push(eq,temped->money); //加入事件隊列 </p><p> back(eq)->type = "離開";</p><p> back(eq)->num = temped->
87、;num;</p><p> randomTemp = rand()%(dealMaxTime-dealMinTime +1)+dealMinTime;//處理時間為隨機產(chǎn)生的介于最大處理時間和最小處理時間之間的處理時間</p><p> back(eq)->endTime = currentTime + randomTemp ;//客戶離開時間為當前時間加上處理時間</p
88、><p> currentTimeOfDeal += randomTemp;//更新交易時間</p><p> ++counter; //更新客戶總數(shù)</p><p> totalTime += ( back(eq)->endTime - temped->beginTime ); //更新逗留時間 </p><p> dele
89、te temped; //刪除節(jié)點</p><p> temped = NULL;</p><p><b> }</b></p><p> state = 0;</p><p><b> }</b></p><p><b> 調(diào)試分析</b>&
90、lt;/p><p> 1.在處理顧客的第一種業(yè)務(wù)(從銀行取出一筆錢)時,我沒有特殊處理,僅是和處理第二種一樣,即是等到該顧客交易時間結(jié)束時才開始判斷,如果不夠取進入第二隊列等候。但題目中有“如果屬于第一種,且申請額超出銀行現(xiàn)存資金總額而得不到滿足,則立刻排入第2個隊等候,直至滿足時才離開銀行,否則業(yè)務(wù)處理完后立刻離開銀行”。想想這也是符合實際。于是改算法的判斷為以下算法:</p><p>&
91、lt;b> 偽代碼:</b></p><p><b> {</b></p><p> if(!empry(fq)&& fq.head->money<0)</p><p> //如果隊列一不空,而且隊頭客戶辦理第二種業(yè)務(wù)</p><p><b> {<
92、/b></p><p> //1.可以辦,完成離開(即銀行現(xiàn)金足夠取)</p><p> //2.不可以辦,排隊2等候</p><p><b> }</b></p><p><b> else </b></p><p> //存款 ,第一種業(yè)務(wù) </
93、p><p> if(!empty(fq) && temped= searchAndDel(sq,total)))</p><p><b> //當交易時間到</b></p><p><b> {</b></p><p> //辦理該業(yè)務(wù),并開始掃描第二隊列,看是否能滿足//第
94、二隊列需要</p><p><b> }</b></p><p> if(currentime==next_arrtime )</p><p><b> {</b></p><p> //當當前時間等于即將到來的顧客到來時間,初始化//該顧客節(jié)點,并設(shè)置下一顧客到達時間</p>
95、;<p><b> }</b></p><p><b> }</b></p><p> 對于計算客戶在銀行內(nèi)的平均逗留時間,一直不成功,后經(jīng)老師指導(dǎo),平均逗留時間算法思想如下:已成功交易的客戶,逗留時間為他的離開時間和到達時間之差,直到銀行營業(yè)結(jié)束,沒有成功交易的客戶的逗留時間不算入內(nèi),總的逗留時間為每個成功交易的客戶的逗留時
96、間之和,平均逗留時間為總的逗留時間除以成功交易的客戶數(shù)。</p><p><b> 用戶手冊</b></p><p> 用戶按任意鍵繼續(xù),則會出現(xiàn)如下主界面:</p><p> 用戶選擇1開始模擬。按提示輸入相應(yīng)的數(shù)據(jù)設(shè)置,就能得到想要的模擬結(jié)果。退出選擇0.</p><p> 對用戶輸入要求如下:</p&
97、gt;<p> 銀行開始的資金總額應(yīng)該大于零。</p><p> 銀行開始的資金總額應(yīng)該大于零。</p><p> 銀行的營業(yè)時間必須小于1440分鐘(24小時)。</p><p> 最大到達時間間隔必須小于營業(yè)時間。</p><p> 最小到達時間間隔必須介于零和最大到達時間之間。</p><p&
98、gt; 最大處理時間必須小于營業(yè)時間。</p><p> 最小處理時間必須介于零和最大處理時間之間。</p><p> 最大交易額應(yīng)該小于銀行開始時的資金總額且小于程序設(shè)置的50000。</p><p> 如果輸入不符合上述要求,程序會提示用戶哪里輸入出錯,可以再次輸入。每個輸入數(shù)據(jù)都有3次機會。當三次輸入都錯的時候,程序停止運行,按任意鍵退出。</p
99、><p> 現(xiàn)給出最小處理時間出錯時的三種提示截圖:</p><p> 5.測試數(shù)據(jù)及測試結(jié)果</p><p> 正確輸入并開始模擬運行:</p><p><b> 輸入一般數(shù)據(jù):</b></p><p> 銀行初始資金total=5000</p><p> 銀行營
100、業(yè)時間closetime=50</p><p> 客戶到達時間間隔上界arrivemaxtime=5和arrivemintime=3</p><p> 客戶交易時間上界dealmaxtime=8和dealmintime=4</p><p><b> 源程序清單</b></p><p> //銀行業(yè)務(wù)模擬系統(tǒng)<
101、;/p><p> #include <iostream></p><p> #include <string></p><p> #include <conio.h></p><p> #include <time.h></p><p> using namespa
102、ce std;</p><p> struct service</p><p><b> {</b></p><p> int num; //客戶號</p><p> string type; //到達或離開</p><p> int beginTime;//到達時間</p>
103、<p> int endTime;//離開時間</p><p> int money; //正數(shù)為存款,負數(shù)為取款</p><p> service* next;//指針域</p><p><b> };</b></p><p> struct queue //隊列</p><
104、p><b> {</b></p><p> service* head;//隊列頭指針</p><p> service* rear;//隊列尾指針</p><p><b> };</b></p><p> int total; //初始時銀行現(xiàn)存資金總額</p>&l
105、t;p> int closeTime; //營業(yè)結(jié)束時間</p><p> int arriveMaxTime; //兩個到達事件之間的間隔上限</p><p> int arriveMinTime; //兩個到達事件之間的間隔下限</p><p> int dealMaxTime; //客戶之間交易的時間上限</p><p>
106、 int dealMinTime; //客戶之間交易的時間下限</p><p> int dealMaxMoney ; //交易額上限</p><p> int ndn=0;//需要存款的人數(shù)</p><p> int nwn=0;//需要取款的人數(shù)</p><p> int sdn=0;//成功存款的人數(shù)</p>&
107、lt;p> int swn=0;//成功取款的人數(shù)</p><p> int currentTime = 0; //當前時間</p><p> int totalTime = 0; //客戶逗留總時間</p><p> int counter = 0; //客戶總數(shù)</p><p> int number = 1; //初始客
108、戶序列號</p><p> bool state =1; //用于判斷是否有窗口在處理</p><p> int currentTimeOfDeal = 0;//交易時間</p><p> int thearriveMaxTime = 0;//最大到達時間</p><p> queue eq; //事件隊列</p>&l
109、t;p> queue fq; //隊列一</p><p> queue sq; //對列二</p><p><b> //初始化三個隊列</b></p><p> service* front(queue &q)//返回隊首元素</p><p><b> {</b></
110、p><p> return q. head;</p><p><b> }</b></p><p> service* back(queue &q)//返回隊尾元素</p><p><b> {</b></p><p> return q. rear;</
111、p><p><b> }</b></p><p> void push(queue &q,int d)//入隊列函數(shù),插入元素d為隊列q的新的隊尾元素</p><p><b> {</b></p><p> service* temp = new service;</p>
112、<p> temp->money = d;</p><p> temp->next = NULL;</p><p> if(q.head==NULL)//隊列為空,初始化</p><p><b> {</b></p><p> q. head = temp;</p><
113、p> q. rear = temp;</p><p><b> }</b></p><p> else//隊列不為空,插入元素d</p><p><b> {</b></p><p> q. rear->next = temp;</p><p> q.
114、 rear = q.rear->next;</p><p><b> }</b></p><p><b> }</b></p><p> void pop(queue &q)// 若隊列不空,出對列函數(shù)</p><p><b> {</b></p&g
115、t;<p> service* temp;</p><p> temp = q. head;</p><p> if(q. head->next==NULL )//對列只有一個元素</p><p> q.head = q. rear =NULL;</p><p><b> else</b>&
116、lt;/p><p> q. head=q. head->next;</p><p> delete temp;</p><p><b> }</b></p><p> void arrive()//"到達"函數(shù),隨機產(chǎn)生顧客,進入隊列一產(chǎn)生到達事件 進入事件隊列</p><
117、;p><b> {</b></p><p> push(fq,(rand()% (2*dealMaxMoney) -dealMaxMoney)); //隨機產(chǎn)生顧客加入第一隊列</p><p> back(fq)->beginTime = currentTime;//當前時間為客戶的到達時間</p><p> back(f
118、q)->num = number;//客戶號為客戶序列號</p><p> push(eq,(back(fq)->money)); //將產(chǎn)生事件加入事件隊列</p><p> back(eq)->beginTime = currentTime;</p><p> back(eq)->type = "到達";<
119、/p><p> back(eq)->num = number;</p><p><b> ++number;</b></p><p><b> }</b></p><p> void putMoney()//"存款"函數(shù)</p><p><
120、b> { </b></p><p> total += front(fq)->money; //更新資金總額</p><p> push(eq,front(fq)->money); //加入事件隊列 </p><p> back(eq)->type = "離開";</p><p>
121、; back(eq)->num = front(fq)->num;</p><p> back(eq)->endTime = (front(fq)->beginTime + rand()%(dealMaxTime-dealMinTime +1)+dealMinTime);//離開時間為到達時間加上隨機產(chǎn)生的介于最大處理時間和最小處理時間的處理時間</p><p>
122、; ++counter; //更新客戶總數(shù)</p><p> totalTime += (back(eq)->endTime - front(fq)->beginTime); //更新逗留時間</p><p> pop(fq); //刪除第一隊列第一個業(yè)務(wù)</p><p> currentTimeOfDeal = back(eq)->end
123、Time;//交易時間為客戶的離開時間</p><p> state =0;//窗口沒有交易需要處理</p><p><b> }</b></p><p> void getMoney()//"取款"函數(shù)</p><p><b> {</b></p><
124、;p> if( (-fq.head->money) > total )//資金短缺 加入第二隊列 </p><p><b> {</b></p><p> push( sq,front(fq)->money );</p><p> back(sq)->beginTime = front(fq)->be
125、ginTime;</p><p> back(sq)->num = front(fq)->num;</p><p><b> pop(fq);</b></p><p><b> }</b></p><p><b> else</b></p>&
126、lt;p><b> {</b></p><p> total += back(fq)->money;//更新資金總額</p><p> push(eq,front(fq)->money); //加入事件隊列 </p><p> back(eq)->type = "離開";</p>
127、<p> back(eq)->num = front(fq)->num;</p><p> back(eq)->endTime = (front(fq)->beginTime +rand()%(dealMaxTime-dealMinTime +1)+dealMinTime);//客戶的離開時間為客戶的到達時間加上隨機產(chǎn)生的介于最大處理時間和最小處理時間的處理時間</p
128、><p> back(eq)->beginTime = 0;</p><p> currentTimeOfDeal = back(eq)->endTime;//交易時間為客戶的離開時間</p><p> ++counter; //更新客戶總數(shù) </p><p> totalTime += ( back(eq)->endT
129、ime - back(fq)->beginTime ); //更新逗留時間</p><p> pop(fq); //刪除第一隊列第一個業(yè)務(wù)</p><p> state =0;//窗口沒有交易需要處理</p><p><b> }</b></p><p><b> }</b></
130、p><p> service* searchAndDeal(queue &q,int m)//"搜索"函數(shù),在對列中尋找可處理元素</p><p><b> {</b></p><p> service* sign = q. head; //標記頭節(jié)點</p><p> service*
131、temp;</p><p> while(q. head!=NULL )</p><p><b> {</b></p><p> if((-(q. head->money)) <m)//隊首元素可以處理</p><p><b> {</b></p><p&g
132、t; if(q. head==q.rear)</p><p><b> {</b></p><p> temp = q. head;</p><p> q. head = q. rear = NULL;</p><p> return temp;</p><p><b> }
133、</b></p><p> else//隊首元素出列</p><p><b> {</b></p><p> temp = q. head; </p><p> q. head = q. head->next; // 首節(jié)點后移一位,返回原首節(jié)點</p><p> re
134、turn temp;</p><p><b> }</b></p><p><b> }</b></p><p> else//隊首元首不能被處理</p><p><b> {</b></p><p> if(q. head == q. rea
135、r){}</p><p> else//首節(jié)點移到隊列尾部</p><p><b> {</b></p><p> q. rear->next = q. head; </p><p> q. rear = q. rear->next;</p><p> q. head =q.
136、 head->next;</p><p> q. rear->next = NULL;</p><p><b> }</b></p><p><b> }</b></p><p> if(q. head == sign)//隊列循環(huán)一周時停止</p><p&g
137、t; return NULL;</p><p><b> }</b></p><p> return NULL;</p><p><b> }</b></p><p> service* temped ;</p><p> int randomTemp;//<
溫馨提示
- 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. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計報告---銀行業(yè)務(wù)模擬
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計報告-銀行業(yè)務(wù)模擬
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計---一個銀行業(yè)務(wù)模擬的程序
- 銀行業(yè)務(wù)模擬課程設(shè)計
- 銀行業(yè)務(wù)模擬系統(tǒng)課程設(shè)計
- 銀行業(yè)務(wù)活動的模擬課程設(shè)計
- 銀行業(yè)務(wù)活動的模擬課程設(shè)計
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計---銀行模擬系統(tǒng)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(銀行模擬系統(tǒng))
- 投資銀行業(yè)務(wù)-結(jié)構(gòu)融資
- 《銀行業(yè)務(wù)模擬實訓(xùn)》課程的改革方案
- 銀行業(yè)務(wù)分析報告
- 私人銀行業(yè)務(wù)淺析
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計--電梯模擬
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計--數(shù)據(jù)結(jié)構(gòu)課程設(shè)計----huffman編碼
- 人民幣國際化對銀行業(yè)務(wù)影響研究——基于qs銀行業(yè)務(wù)數(shù)據(jù)分析
- 臺州銀行電子銀行業(yè)務(wù)章程
- 2009公司銀行業(yè)務(wù)試題
- 數(shù)據(jù)結(jié)構(gòu)約瑟夫環(huán)模擬課程設(shè)計
- 銀行業(yè)務(wù)外包研究.pdf
評論
0/150
提交評論