數(shù)據(jù)結(jié)構(gòu)課程設(shè)計銀行業(yè)務(wù)模擬_第1頁
已閱讀1頁,還剩24頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論