數(shù)據(jù)結構課程設計報告---銀行業(yè)務模擬_第1頁
已閱讀1頁,還剩11頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、<p>  數(shù)據(jù)結構課程設計報告</p><p><b>  學院:XX</b></p><p><b>  專業(yè):XX</b></p><p><b>  學生:XX</b></p><p><b>  學號:XX</b></p>

2、<p><b>  一. 問題描述</b></p><p>  題目內容:銀行業(yè)務模擬</p><p>  基本要求:設某銀行有N個窗口,可同時為N位顧客辦理業(yè)務。當顧客進門時,若有窗口空閑,則可立刻辦理業(yè)務,否則需要依次排隊等候。一旦有顧客業(yè)務辦理完畢,派在隊頭的顧客便可開始辦理業(yè)務。若銀行每天連續(xù)營業(yè)T小時,求一天內顧客在銀行內的平均逗留時間,顧客排隊

3、等候辦理業(yè)務的隊列長度平均值,營業(yè)時間到點后仍需完成服務的收尾工作時間。</p><p>  測試數(shù)據(jù):服務窗口數(shù)目N及營業(yè)時間有擁護設定,第一個顧客進門的時刻為0,之后每個顧客的進門時刻在前一個顧客進門時設定。即在進門事件發(fā)生時隨即產(chǎn)生兩個隨機數(shù)(durtime,intertime),durtime為進門顧客辦理業(yè)務所需的服務時間(簡稱辦理時間);intertime為下一個顧客將到達的時間間隔(簡稱時間間隔)。

4、R為由隨機數(shù)發(fā)生器產(chǎn)生的隨機數(shù),顧客辦理時間和顧客之間的時間間隔不妨假設與R有關,可以由下式確定:</p><p>  durtime=15+R%50</p><p>  intertime=2+R%10</p><p>  確定的方法與實際越吻合,模擬的結果越接近現(xiàn)實的情況。</p><p><b>  二. 需求分析</b

5、></p><p>  程序模擬銀行排隊現(xiàn)象。當給定窗口數(shù)及營業(yè)時間后,由隨機數(shù)確定顧客辦理業(yè)務及進門間隔時間,可求出一天內顧客在銀行平均逗留時間,平均對長及關門后收尾工作的時間。</p><p>  本程序由用戶讀入的數(shù)據(jù)僅為窗口數(shù)及營業(yè)時間,營業(yè)的時間以分鐘計,窗口數(shù)及關門時間均為整型,且均大于等于1。</p><p>  運行本程序后,得到結果為顧客數(shù)、

6、平均等候時間、平均隊長和收尾工作的時間。仿真程序運行后屏幕輸出結果應包括如下各項的模擬結果數(shù)據(jù):</p><p>  Number of customer: CustomerNum</p><p>  Average time: Totaltime/CustomerNum</p><p>  Average queuele

7、ngth: Totallength/CustomerNum</p><p>  Addition time: t-CloseTime</p><p><b>  三. 程序模塊</b></p><p>  本程序包括4個模塊:</p><p><b>  主程序模塊;&l

8、t;/b></p><p>  實現(xiàn)隊抽象數(shù)據(jù)類型的隊模塊;</p><p>  實現(xiàn)鏈表抽象數(shù)據(jù)類型的鏈表模塊;</p><p>  事項銀行事件抽象數(shù)據(jù)類型的銀行事件模塊。</p><p>  各模塊之間的調用關系如圖所示。</p><p><b>  主程序模塊</b></p&g

9、t;<p><b>  銀行事件模塊</b></p><p>  隊列模塊 鏈表模塊</p><p><b>  函數(shù)調用關系圖:</b></p><p><b>  main</b></p><p>  CustomerA

10、rrived OpenForday CustomerDeparture</p><p>  EnQueue OrderInsert DeQueue QueueEmpty OrderInsert</p><p>  MakeNode MakeNode</p&g

11、t;<p>  InitQueue OrderInsert InitList</p><p><b>  四. 源程序</b></p><p>  #include<stdio.h> </p><p>  #include<stdlib.h></p><p>  #

12、include <time.h></p><p>  #include<iostream></p><p>  #define MONEY 5000 //個人業(yè)務值,交易額上限 </p><p>  #define OK 1 //離開事件1:辦理存款</p><p>  #define ERROR

13、 0 </p><p>  #define OVERFLOW -2 </p><p>  typedef int status;</p><p>  typedef struct{//隊列1元素</p><p>  int arrivetime; //到達時間 </p><p>  int OccurTime

14、; //事件發(fā)生時間 </p><p>  int NType; //事件類型,0表示到達事件,1表示離開事件。同時用1表示存款,2表示取款。</p><p>  int duration; //辦理業(yè)務時間</p><p>  long int money;//交易金額</p><p>  }Event,ElemType1;</p&g

15、t;<p>  typedef struct{ //隊列2元素</p><p>  int arrivetime; //到達時間</p><p>  int duration; //辦理業(yè)務時間</p><p>  long int money; //交易金額</p><p>  }wait,ElemType2;</p&

16、gt;<p>  typedef struct QNode1{//隊列1結點類型</p><p>  ElemType1 data;</p><p>  struct QNode1 *next;</p><p>  }QNode1,*Queue1;</p><p>  typedef struct QNode2{ //隊列2結點

17、類型</p><p>  ElemType2 data;</p><p>  struct QNode2 *next;</p><p>  }QNode2,*Queue2;</p><p>  typedef struct{//鏈隊列類型</p><p>  Queue1 front; //隊頭</p

18、><p>  Queue1 rear; //隊尾</p><p>  }LinkQueue1;</p><p>  typedef struct{ //鏈隊列類型</p><p>  Queue2 front; //隊頭</p><p>  Queue2 rear; //隊尾</p>&l

19、t;p>  }LinkQueue2;</p><p><b>  //全局變量</b></p><p>  long int total_money; //銀行現(xiàn)存資金總額</p><p>  int total_time; //客戶逗留總時間</p><p>  int use_time;//每個顧客所用時間

20、</p><p>  int money;//每個顧客辦理的款數(shù)</p><p>  int closetime;//銀行營業(yè)時間</p><p>  int INTERTIME; //下一用戶到達的時間間隔</p><p>  int DURATION; //辦理業(yè)務所需時間</p><p>  int number

21、; //辦理業(yè)務的次序</p><p>  int time1; //系統(tǒng)現(xiàn)在時間</p><p>  LinkQueue1 Q1;</p><p>  LinkQueue2 Q2;</p><p>  Event en; //事件</p><p>  wait en1; //列表2元素</p

22、><p><b>  //初始化隊列1</b></p><p>  status InitQueue1()</p><p>  { Q1.front=Q1.rear=(Queue1)malloc(sizeof(QNode1));</p><p>  if(!Q1.front)exit(OVERFLOW);</p&

23、gt;<p>  Q1.front->next=NULL;</p><p>  return OK; }//初始化隊列2</p><p>  status InitQueue2()</p><p>  { Q2.front=Q2.rear=(Queue2)malloc(sizeof(QNode2));</p><p>

24、;  if(!Q2.front)exit(OVERFLOW);</p><p>  Q2.front->next=NULL;</p><p>  return OK; }</p><p><b>  //銷毀隊列1</b></p><p>  status destroyqueue1()</p>

25、<p>  { while(Q1.front)</p><p>  { Q1.rear=Q1.front->next;</p><p>  free(Q1.front);</p><p>  Q1.front=Q1.rear; }</p><p>  return OK; }</p><p&

26、gt;<b>  //銷毀隊列2</b></p><p>  status destroyqueue2()</p><p>  { while(Q2.front)</p><p>  { Q2.rear=Q2.front->next;</p><p>  free(Q2.front);</p>&

27、lt;p>  Q2.front=Q2.rear; }</p><p>  return OK; }</p><p><b>  //隊列1入隊列</b></p><p>  status EnQueue1()</p><p>  { Queue1 p,r,r1;</p><p&g

28、t;  p=(Queue1)malloc(sizeof(QNode1));</p><p>  if(!p)exit(OVERFLOW);</p><p>  p->data.arrivetime=en.arrivetime;</p><p>  p->data.OccurTime=en.OccurTime;</p><p>  

29、p->data.NType=en.NType;</p><p>  p->data.duration=en.duration;</p><p>  p->data.money=en.money;</p><p>  r=Q1.front->next;</p><p><b>  while(r)</b&

30、gt;</p><p>  { if(p->data.arrivetime < r->data.arrivetime)</p><p>  { if(r==Q1.front->next)</p><p>  {p->next=r;</p><p>  Q1.front->next=p; }<

31、;/p><p>  else{r1->next=p;</p><p>  p->next=r; } }</p><p>  r1=r;r=r->next; }</p><p><b>  if(!r)</b></p><p>  { if(Q1.front-

32、>next==NULL)</p><p>  { Q1.front->next=p;</p><p>  Q1.rear=p;</p><p>  Q1.rear->next=NULL; }</p><p>  else{ p->next=NULL;</p><p>  Q1.rea

33、r->next=p;</p><p>  Q1.rear=p; } }</p><p>  return OK; }</p><p><b>  //隊列2入隊列</b></p><p>  status EnQueue2()</p><p>  { Queue2 p;</

34、p><p>  p=(Queue2)malloc(sizeof(QNode2));</p><p>  if(!p)exit(OVERFLOW);</p><p>  p->data.arrivetime=en1.arrivetime;</p><p>  p->data.duration=en1.duration;</p>

35、;<p>  p->data.money=en1.money;</p><p>  p->next=NULL;</p><p>  Q2.rear->next=p;</p><p>  Q2.rear=p;</p><p>  return OK; }</p><p>  //若隊列

36、1不空,則刪除Q1的隊頭元素,并用en返回其值</p><p>  status DeQueue1()</p><p>  { Queue1 p;</p><p>  if(Q1.front==Q1.rear) return ERROR;</p><p>  p=Q1.front->next;</p><p>

37、  en.arrivetime=p->data.arrivetime;</p><p>  en.OccurTime=p->data.OccurTime;</p><p>  en.NType=p->data.NType;</p><p>  en.duration=p->data.duration;</p><p>

38、  en.money=p->data.money;</p><p>  Q1.front->next=p->next;</p><p>  if(Q1.rear==p) Q1.rear=Q1.front; //只有一個人時</p><p><b>  free(p);</b></p><p>  r

39、eturn OK; }</p><p>  //若隊列2不空,則刪除Q2的隊頭元素,并用en1返回其值</p><p>  status DeQueue2()</p><p>  { Queue2 p;</p><p>  if(Q2.front==Q2.rear)return ERROR;</p><p> 

40、 p=Q2.front->next;</p><p>  en1.arrivetime=p->data.arrivetime;</p><p>  en1.duration=p->data.duration;</p><p>  en1.money=p->data.money;</p><p>  Q2.front-&

41、gt;next=p->next;</p><p>  if(Q2.rear==p) Q2.rear=Q2.front; //只有一個人時</p><p><b>  free(p);</b></p><p>  return OK; }</p><p>  //營業(yè)時間結束,全部客戶離開銀行</p>

42、;<p>  void free_system()</p><p>  { destroyqueue1();</p><p>  destroyqueue2(); }</p><p><b>  //產(chǎn)生隨機數(shù)</b></p><p>  status rand_ar(int *intertim

43、e,long int *money, int *duration,int *NType)</p><p>  { *intertime=rand()%INTERTIME+1; //下個客戶到達的時間間隔,不大于INTERTIME</p><p>  *money=rand()%MONEY+1; //每個顧客辦理的款數(shù),不大于MONEY</p>&l

44、t;p>  *duration=rand()%DURATION+1; //客戶辦理業(yè)務所要時間,不大于DURATION</p><p>  *NType=rand()%2; //事件類型分為0和1兩種</p><p>  return OK; }</p><p>  void OpenForDay() { //初始化操作</p>

45、<p>  printf(" 請輸入銀行的初始存款:");</p><p>  scanf("%d",&total_money);</p><p>  printf(" 請輸入銀行的營業(yè)時間(分鐘):");</p><p>  scanf("%d",&clo

46、setime);</p><p>  printf(" 請輸入最大到達時間間隔(分鐘):");</p><p>  scanf("%d",&INTERTIME);</p><p>  printf(" 請輸入最大的處理時間(分鐘):");</p><p>  scanf(&q

47、uot;%d",&DURATION);</p><p>  total_time=0; //客戶逗留總時間(初始值)</p><p>  number=0; //辦理業(yè)務的次序(初始值)</p><p>  InitQueue1(); //初始化隊列1</p><p>  InitQueue2();

48、 //初始化隊列2</p><p>  en.arrivetime=0; //到達時間</p><p>  en.OccurTime=0; //事件發(fā)生時間</p><p>  en.NType=0; //事件類型,暫時值</p><p>  en.money=0; //交易金額,暫時值</p><

49、p>  en.duration=0; //辦理業(yè)務時間,暫時值</p><p>  EnQueue1(); //事件進隊列 }</p><p>  //查找上一離開事件的發(fā)生時間</p><p>  int find_leave()</p><p>  { Queue1 p;</p><p>

50、;<b>  int i=0;</b></p><p>  p=Q1.front->next;</p><p>  while(p!=NULL)</p><p>  { if(p->data.NType!=0)</p><p>  i=p->data.OccurTime;</p><

51、;p>  p=p->next; }</p><p>  return i; }</p><p>  void CustomerArrived()</p><p>  { int intertime;</p><p><b>  int i;</b></p><p>  

52、time1=en.OccurTime;</p><p>  rand_ar(&intertime,&(en.money), &(en.duration),&(en.NType));//設置一離開事件插入事件表</p><p>  en.NType++; //0變1,1變2</p><p>  i=find_leave(); //查

53、找上一離開事件的發(fā)生時間</p><p>  if(i==0) //第一位顧客</p><p>  en.OccurTime=en.arrivetime+en.duration;</p><p><b>  else</b></p><p>  if(i>=en.arrivetime)//本事件到達時上一事件還未離

54、開</p><p>  en.OccurTime=i+en.duration; //則此事件的離開時間=上一事件的離開時間+本事件處理時間</p><p>  else //上一事件離開之后,本事件才到達</p><p>  en.OccurTime=en.arrivetime+en.duration;//則此事件的離開時間=本事件到達

55、時間+本事件處理時間</p><p>  EnQueue1(); //設置下一用戶到達事件插入隊列1 </p><p>  en.arrivetime=en.arrivetime+intertime; //下一客戶到達時間</p><p>  en.OccurTime=en.arrivetime;</p><p&

56、gt;  en.NType=0; //暫時值 </p><p>  en.money=0; //暫時值</p><p>  en.duration=0; //暫時值</p><p>  EnQueue1(); }</p><p>  //返回隊列2的長度</p><p>  int QueueLen

57、gth_q2()</p><p>  { int i=0;</p><p><b>  Queue2 p;</b></p><p>  p=Q2.front->next;</p><p><b>  while(p)</b></p><p><b>  {

58、 i++;</b></p><p>  p=p->next; }</p><p>  return i; }</p><p>  //順序檢查隊列2是否有滿足條件者</p><p>  status check_q2() </p><p>  { int i,j,z=0; <

59、/p><p>  i=QueueLength_q2(); //用i返回隊列2長度</p><p>  for(j=1;j<=i;j++) </p><p>  { DeQueue2(); //隊列2出隊,用en1返回其值</p><p>  if(en1.money<=total_money) //若隊列2出隊元

60、素的要交易的金額<=銀行現(xiàn)存金額,則可以辦理{ if(time1>closetime) { printf("--\t\t%d\t\t%d\t\t%d\t\t%d\t%d\n",z,use_time,number,z,(en1.arrivetime),en1.money); }</p><p><b>  else{</b></p><

61、;p>  time1=time1+en1.duration; //更新系統(tǒng)當前時間</p><p>  use_time=time1-en1.arrivetime; </p><p>  total_time+=use_time; //更新逗留時間</p><p>  total_money-=en1.money; //更新資金總額</p

62、><p>  number++; //更新實現(xiàn)交易的客戶數(shù) printf("%ld\t\t%d\t\t%d\t\t%d\t\t%d\t-%d\n",total_money,use_time,number,time1,(en1.arrivetime),(en1.money)); } }</p><p>  else { //若隊列2出隊

63、元素的要交易的金額>銀行現(xiàn)存金額,不能辦理</p><p>  if(time1>closetime) { printf("--\t\t%d\t\t%d\t\t%d\t\t%d\t%d\n",z,use_time,number,z,(en1.arrivetime),en1.money); }</p><p>  else{ En

64、Queue2(); //繼續(xù)插入隊列2的隊尾,繼續(xù)等待 } } }</p><p>  return OK; }</p><p>  //隊列1離開事件減duration(辦理業(yè)務時間) </p><p>  int cut_duration(int e) //e即形參辦理業(yè)務的時間 </p><p>  { Que

65、ue1 p,q,r;</p><p>  ElemType1 en; </p><p>  p=Q1.front->next; </p><p>  r=Q1.front;</p><p><b>  if(p) </b></p><p>  {if(p->data.NTy

66、pe!=0) </p><p>  { q=p->next;</p><p>  r->next=q; //刪除結點 </p><p>  en.arrivetime=p->data.arrivetime; //到達時間</p><p>  en.OccurTime=p->data.OccurTime-

67、e; //事件發(fā)生時間</p><p>  en.NType=p->data.NType; //事件類型</p><p>  en.duration=p->data.duration; //辦理業(yè)務時間</p><p>  en.money=p->data.money; //數(shù)額</p><p>

68、<b>  free(p);</b></p><p>  EnQueue1(); } }</p><p>  return OK; }</p><p>  void CustomerDeparture() { int i;</p><p>  i=en.NType; //業(yè)務類型,1表示存

69、款,2表示取款</p><p>  time1=en.OccurTime-en.duration;</p><p>  if(i==OK) //是否是辦理存款</p><p>  { if(en.OccurTime>closetime) //營業(yè)結束,全部客戶離開銀行</p><p>  free_system(); &l

70、t;/p><p>  else //營業(yè)時間沒有結束,繼續(xù)辦理 </p><p>  { use_time=en.OccurTime-en.arrivetime;</p><p>  total_time+=use_time; //更新逗留的總時間</p><p>  total_money=total_money+en.mon

71、ey; //更新資金總額</p><p>  number++; //更新服務的客戶數(shù)</p><p>  time1=en.OccurTime; //更新系統(tǒng)當前時間 printf("%ld\t\t%d\t\t%d\t\t%d\t\t%d\t%d\n",total_money,use_time,number,en.Occur

72、Time,en.arrivetime,en.money); </p><p>  check_q2(); //檢查隊列2是否有滿足條件者 } }</p><p>  else //辦理取款</p><p>  { if(en.money>total_money) //辦理取款,當申請金額不能滿足時,離開隊列1進入隊列2等待</p

73、><p>  { cut_duration(en.duration);//從隊列1中刪除該結點</p><p>  en1.arrivetime=en.arrivetime;</p><p>  en1.duration=en.duration;</p><p>  en1.money=en.money;</p><p>

74、;  EnQueue2(); //進入隊列2繼續(xù)等待 } </p><p>  else //辦理取款,當能滿足所申請金額時進行隊列1</p><p>  { if(en.OccurTime>closetime) //營業(yè)結束,全部客戶離開銀行</p><p>  free_system(); </p><p>&

75、lt;b>  else </b></p><p>  { use_time=en.OccurTime-en.arrivetime;//顧客所用時間=事件發(fā)生時間-事件到達時間 </p><p>  total_time+=use_time; //更新逗留的總時間</p><p>  total_money-=en.money; //更

76、新資金總額 </p><p>  time1=en.OccurTime; //更新系統(tǒng)當前時間</p><p>  number++; //更新客戶總數(shù) printf("%ld\t\t%d\t\t%d\t\t%d\t\t%d\t-%d\n",total_money,use_time,number,en.OccurTime,en.

77、arrivetime,en.money); } } } } </p><p>  void main() </p><p>  { cout<<"======================================"<<endl; </p><p>  cout<&l

78、t;"--------------歡迎使用銀行業(yè)務模擬系統(tǒng)-------------- "<<endl; </p><p>  cout<<"-----------------------------------------------------------------"<<endl; </p><p>

79、  cout<<"-----------------------姓名:鐘永平----------------------- "<<endl; </p><p>  cout<<"************學號: 200905030325 **************"<<endl; </p><p&g

80、t;  cout<<"---------------------班級:計科3班----------------------"<<endl; </p><p>  cout<<"===================================== "<<endl; </p><p>  co

81、ut<<"請選擇開始或退出:"<<endl;</p><p>  cout<<"1.開始銀行業(yè)務模擬系統(tǒng)"<<endl;</p><p>  cout<<"0.退出程序"<<endl;</p><p><b>  int n;

82、</b></p><p><b>  cin>>n;</b></p><p>  while(n==1)</p><p>  { OpenForDay(); //初始化操作 </p><p>  cout<<"----------------------

83、-----------------------------------------------------"<<endl; </p><p>  cout<<"Total_money\tuse_time\tnumber\ten.OccurTime\ten.arrivetime\tmoney"<<endl; </p><p

84、>  while(Q1.front) </p><p>  { DeQueue1(); //隊列1出隊列,并用en返回值 </p><p>  if(en.NType==0) //en.NType等于0表示客戶到達,1表示客戶離開</p><p>  CustomerArrived(); //處理客戶到達事件 </p&

85、gt;<p><b>  else </b></p><p>  CustomerDeparture(); //處理客戶離開事件,業(yè)務類型en.NType等于1表示存款,2表示取款 }</p><p>  printf("1.營業(yè)結束后銀行現(xiàn)存資金總額(元): %ld\n",total_money) ; </p

86、><p>  printf("2.營業(yè)時間內實現(xiàn)交易的客戶數(shù)(人): %d\n",number);</p><p>  printf("3.客戶在銀行逗留的總時間(分鐘): %d\n",total_time); </p><p>  printf("4.客戶在銀行的平均逗留時間(分鐘): %f\n"

87、,(float)total_time/(float)number); </p><p>  cout<<" ----------------------------------------------------"<<endl; </p><p>  cout<<"以上為模擬結果!請繼續(xù)選擇繼續(xù)或退出:"&

88、lt;<endl;</p><p>  cout<<"1.繼續(xù)模擬"<<endl;</p><p>  cout<<"0.退出程序"<<endl;</p><p><b>  int n;</b></p><p><b&g

89、t;  cin>>n;</b></p><p><b>  if(n==0) </b></p><p>  { cout<<" 謝謝使用本系統(tǒng),再見!"<<endl; </p><p>  break; } } }</p><p>

90、<b>  五.實驗結果</b></p><p><b>  六.心得體會</b></p><p>  感謝老師給予這次學習的機會,在本次實驗里我結合隊列和鏈表的操作實現(xiàn)了簡單銀行業(yè)務模擬,雖然還不是很完善,但以后我會繼續(xù)提高。經(jīng)過這次編程我學習了很多,體會到了編程的嚴謹,編程過程中哪怕有一點點錯誤也會導致整個程序的錯誤。經(jīng)過本次編程也發(fā)現(xiàn)了編程

溫馨提示

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

評論

0/150

提交評論