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

下載本文檔

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

文檔簡介

1、<p>  本科生課程設(shè)計報告書</p><p>  題  目 一個銀行業(yè)務(wù)模擬的程序 </p><p>  姓  名  </p><p>  學  號     </p><p>  學  院    信息工程學院 

2、 </p><p>  ?! I(yè)    計算機  </p><p>  指導教師    </p><p>  完成日期: 2009-6-25</p><p><b>  銀行業(yè)務(wù)模擬</b></p&

3、gt;<p><b>  一、需求分析</b></p><p><b>  1程序問題描寫:</b></p><p>  本程序為銀行客戶業(yè)務(wù)模擬, 其業(yè)務(wù)模擬分為兩種: 第一功能是申請從銀行得到一筆資金,即取款或借款。第二功能是向銀行投入一筆資金,即存款或還款。銀行有兩個服務(wù)窗口,相應(yīng)地有兩個隊列。</p><

4、p>  2程序具體實現(xiàn)的功能:</p><p>  1)第一功能: 客戶到達銀行后先排第一個隊。處理每個客戶業(yè)務(wù)時,且申請額超出銀 行現(xiàn)存資金總額而得不到滿足,則立刻排入第二個隊等候,直至滿足時才離開銀行;否則業(yè)務(wù)處理完后立刻離開銀行。每接待完一個第二種業(yè)務(wù)的客戶,則順序檢查和處理(如果可能)第二個隊列中的客戶,對能滿足的申請者予以滿足,不能滿足者重新排到第二個隊列的隊尾。</p><p

5、>  2)第二種功能: 如果在此檢查過程中,一旦銀行資金總額小于或等于剛才第一個隊列 中最后一個客戶(第二種業(yè)務(wù))被接待之前的數(shù)額,或者本次已將第二個隊列檢查或處理了一遍,就停止檢查(因為此時已不可能還有能滿足者)轉(zhuǎn)而繼續(xù)接待第一個隊列的客戶。任何時刻都只開一個窗口。假設(shè)檢查不需要時間。營業(yè)時間結(jié)束時所有客戶立即離開銀行。</p><p>  3)該程序要求實現(xiàn)銀行業(yè)務(wù)的事件驅(qū)動模擬系統(tǒng),通過模擬方法求

6、出客戶在銀行內(nèi)逗留的平均時間。</p><p>  3. 演示程序以用戶與計算機交互方式執(zhí)行,即在計算機終端上顯示"提示信息" 之后,由用戶在鍵盤上輸入演示程序中規(guī)定的運算命令;相應(yīng)的輸入數(shù)據(jù)(濾去輸入中的非法字符)和運算結(jié)果顯示在其后。</p><p><b>  4.數(shù)據(jù)測試</b></p><p>  一天營

7、業(yè)開始時銀行擁有的款額為10000(元),營業(yè)時間為600(分鐘)。其他模擬參</p><p>  量自定,注意測定兩種極端的情況:一是兩個到達事件之間的間隔時間很短,而客戶的交易時間很長,另一個恰好相反,設(shè)置兩個到達事件的間隔時間很長,而客戶的交易時間很短。</p><p>  注: 測試數(shù)據(jù)均由程序隨機產(chǎn)生。運行數(shù)據(jù)將在后面使用說明中給出</p><p><

8、;b>  二、概要設(shè)計</b></p><p><b>  1基本要求:</b></p><p>  用動態(tài)存儲結(jié)構(gòu)以及隊列來實現(xiàn)</p><p><b>  2所需的數(shù)據(jù)類型</b></p><p>  為實現(xiàn)上述程序功能,應(yīng)以需要定義單鏈表的抽象數(shù)據(jù)類型以及隊列集合并還需要用到

9、結(jié)構(gòu)體。為此,需要兩個抽象數(shù)據(jù)類型:單鏈表和隊列還有結(jié)構(gòu)體聲明。</p><p>  (1)單鏈表的抽象數(shù)據(jù)類型定義為:</p><p>  關(guān)于線性表的鏈表存儲結(jié)構(gòu)的本質(zhì)是:在邏輯上相鄰的兩個數(shù)據(jù)元素ai-1, ai,在存儲地址中可以不相鄰,既地址不連續(xù)。不同的教材的表示基本是一致的。</p><p>  typedef struct LNode</p&g

10、t;<p>  { ElemType data; /* 數(shù)據(jù)子域 */</p><p>  struct LNode *next; /* 指針子域 */</p><p>  }LNode; /* 結(jié)點結(jié)構(gòu)類型 */</p>&l

11、t;p> ?。?)隊列的抽象數(shù)據(jù)類型定義為:</p><p><b>  用單鏈表表示的隊列</b></p><p>  typedef struct QNode </p><p>  { QElemType data;</p><p>  struct QNode *next;</p>

12、<p>  }QNode,*QueuePtr;</p><p>  typedef struct{</p><p>  QueuePtr front;//頭指針</p><p>  QueuePtr rear;//尾指針</p><p>  }LinkQueue;</p><p>  InitQueue(Li

13、nkQueue &Q)</p><p>  操作結(jié)果:構(gòu)造一個空的隊列。</p><p>  DestroyQueue (LinkQueue &Q)</p><p>  初始條件:隊列Q已存在。</p><p>  操作結(jié)果:銷毀隊列Q。</p><p>  QueueLength(LinkQueu

14、e Q)</p><p>  初始條件:隊列已存在。</p><p>  操作結(jié)果:返回隊列的長度。</p><p>  QueueEmpty(LinkQueue Q)</p><p>  初始條件:隊列已存在。</p><p>  操作結(jié)果:隊列為空表,則返回True,否則返回 False。</p>

15、<p>  ClearQueue(LinkQueue Q)</p><p>  初始條件:隊列已存在。</p><p><b>  操作結(jié)果:清空隊列</b></p><p>  EnQueue(LinkQueue *Q,int x);</p><p>  初始條件:隊列已存在。</p>&l

16、t;p>  操作結(jié)果:插入元素為x的新的對尾元素 </p><p>  DeleteQueue(LinkQueue *Q,int e)</p><p>  初始條件:隊列已存在。</p><p>  操作結(jié)果:刪除對頭元素,用e返回。</p><p> ?。?)定義結(jié)構(gòu)體的一般格式:</p><p>  stru

17、ct 結(jié)構(gòu)體類型名</p><p>  { 類型名1 變量名1; //數(shù)據(jù)子域</p><p>  類型名2 變量名2;……</p><p>  類型名n 變量名n;</p><p><b>  };</b></p><p>  其中struct是保留字

18、。結(jié)構(gòu)體類型名由用戶自己命名。在使用時必須聲明一個具體的結(jié)構(gòu)體類型的變量,聲明創(chuàng)建一個結(jié)構(gòu)體變量的方法是:</p><p>  struct 結(jié)構(gòu)體類型名 結(jié)構(gòu)體變量名;</p><p><b>  4程序包括三個模塊</b></p><p><b>  1)主函數(shù)模塊</b></p><p>

19、;<b>  main()</b></p><p><b>  {</b></p><p><b>  初始化:</b></p><p>  while("命令"!="退出")</p><p><b>  {</b>

20、</p><p><b>  建立事件;</b></p><p><b>  接受命令;</b></p><p><b>  處理命令;</b></p><p><b>  }</b></p><p><b>  }<

21、;/b></p><p>  2)動態(tài)存儲結(jié)構(gòu)模塊</p><p>  第一部分:外部變量聲明</p><p>  第二部分: 隊列結(jié)構(gòu)體以及鏈表建立</p><p><b>  3)函數(shù)模塊:</b></p><p>  5 三個模塊的圖形關(guān)系:</p><p>&

22、lt;b>  三詳細設(shè)計</b></p><p><b>  [1]原代碼:</b></p><p>  1 **************所需要的文件庫********************************************</p><p>  #include <iostream> //

23、C++T頭文件庫</p><p>  #include <string> //字符頭文件庫</p><p>  #include <time.h> //時間文件庫</p><p>  #include"stdlib.h" //隨機函數(shù)文件庫</p><p> 

24、 #include"stdio.h" //頭文件庫</p><p>  #include"math.h" //函數(shù)文件庫</p><p>  #define max_arrivetime 10//定義隨機數(shù)</p><p>  using namespace std;</p><

25、;p>  2 ***********動態(tài)存儲模塊*************************************************</p><p>  //************************外部變量***************************************</p><p>  int close_time=600;//營業(yè)結(jié)束時間&l

26、t;/p><p>  int totle_time;//客戶呆在銀行的總時間</p><p>  int totle_money=0;//初始時銀行資金總額</p><p>  int arrivetime;//兩個事件到達的時間間隔上限</p><p>  int dealtime=10;//客戶之間交易時間的上限</p><

27、;p>  int slovetime;//交易解決的時間</p><p>  int currentTime=0;//當前時間</p><p>  int clientnum=0;//客戶序列號</p><p>  int totle_people;//客戶總數(shù)</p><p>  int currenttime;//處理當前時間<

28、;/p><p>  //****************客戶變量***********************************************</p><p>  struct clientdeal{</p><p>  char name[50];//客戶名</p><p>  double deposit ;//存取款金

29、額</p><p>  int sloveTime;//處理需要的時間</p><p>  int arriveTime;//到達時間,距開業(yè)的分鐘數(shù)</p><p>  int grap;//與前一個客戶的間隔時間</p><p>  int waitTime;//總的等待時間</p><p>  i

30、nt num; //用戶號</p><p><b>  };</b></p><p>  typedef struct Node{ //建立單鏈表</p><p>  clientdeal data;</p><p>  Node *next;</p><p>  }Lin

31、kNode,*LinkList;</p><p>  typedef struct //單鏈表表示的隊列</p><p><b>  {</b></p><p>  Node *front; //隊頭</p><p>  Node *rear; //隊尾</p>&l

32、t;p>  }LinkQueue,*Queue;</p><p>  3 **************函數(shù)模塊*************************************************</p><p>  //***************各種函數(shù)源代碼******************************************</p>

33、<p>  void InitList(LinkList *L); //建立單鏈表連,分配空間</p><p>  int InitQueue(LinkQueue *Q);//初始化隊列</p><p>  int Empty(LinkQueue* Q); //判斷隊列是否為空,為空返回1,不為空返回0。</p><p>  int EnterQue

34、ue(LinkQueue *Q,clientdeal x);//將客戶進行入隊。</p><p>  clientdeal DeleteQueue(LinkQueue *Q); //出隊函數(shù)。</p><p>  LinkList input() ; //輸入事件表信息</p><p>  LinkNode *F

35、ind(LinkList head, char name[]); //尋找,定位客戶在事件表中的位置。</p><p>  void Queuetwo(LinkList L,LinkQueue *Q,int money) ; //對第二個隊的客戶進行業(yè)務(wù)處理。</p><p>  void dealwith(LinkNode *L,LinkQueue *P,LinkQueue *Q)

36、;//交易處理</p><p>  void output(LinkList L); //輸出最后結(jié)果。</p><p>  //**************函數(shù)模塊*****************************************************</p><p>  //---------------------

37、-------建 立 單 鏈 表 --------------------——----</p><p>  void InitList(LinkList *L) { //建立單鏈表連,分配空間</p><p>  *L=(LinkList )malloc(sizeof(Node));</p><p>  (*L)->next=0;<

38、;/p><p><b>  }</b></p><p>  //--------------------隊列初始化函數(shù)---------------------------------------</p><p>  int InitQueue(LinkQueue *Q)//初始化隊列</p><p><b>  

39、{</b></p><p>  Q->front=(LinkNode *)malloc(sizeof(LinkNode));</p><p>  if(Q->front!=NULL)</p><p><b>  {</b></p><p>  Q->rear=Q->front;<

40、/p><p>  Q->front->next=NULL;</p><p>  return(1);</p><p><b>  }</b></p><p>  else return(0);</p><p><b>  }</b></p><p&

41、gt;  //-----------------------判空函數(shù)------------------------------------------</p><p>  int Empty(LinkQueue* Q) //判斷隊列是否為空,為空返回1,不為空返回0。</p><p><b>  {</b></p><p>  

42、if(Q->front==Q->rear)</p><p><b>  return 1;</b></p><p><b>  else </b></p><p><b>  return 0;</b></p><p><b>  }</b>&

43、lt;/p><p>  //----------------------入隊函數(shù)-------------------------------------------</p><p>  int EnterQueue(LinkQueue *Q,clientdeal x)//將客戶進行入隊。</p><p><b>  { </b></p&g

44、t;<p>  /* 將數(shù)據(jù)元素x插入到隊列Q中 */</p><p>  Node *NewNode;</p><p>  NewNode=(LinkNode *)malloc(sizeof(LinkNode)); </p><p><b>  //申請新結(jié)點。</b></p><p>  i

45、f(NewNode!=NULL)</p><p><b>  {</b></p><p>  NewNode->data=x;</p><p>  NewNode->next=NULL;</p><p>  Q->rear->next=NewNode;</p><p>  

46、Q->rear=NewNode;</p><p>  return 1 ;</p><p><b>  }</b></p><p>  else return(0); /* 溢出!*/</p><p><b>  }</b></p><p>  //------

47、--------------------出隊函數(shù)-----------------------------------------</p><p>  clientdeal DeleteQueue(LinkQueue *Q) //出隊函數(shù)。</p><p><b>  { </b></p><p>  /* 將隊列Q的

48、隊頭元素出隊,并存放到x所指的存儲空間中 */</p><p><b>  Node *p;</b></p><p>  clientdeal M;</p><p>  if(Q->front==Q->rear)</p><p><b>  return M;</b></p>

49、<p>  p=Q->front->next;</p><p>  Q->front->next=p->next; /* 隊頭元素p出隊 */</p><p>  if(Q->rear==p) /* 如果隊中只有一個元素p,則p出隊后成為空隊 */</p><p>  Q->rear=Q->front

50、; </p><p>  M=p->data;</p><p>  free(p); /* 釋放存儲空間 */</p><p>  return(M);</p><p><b>  }</b></p><p>  //----------------輸入事件表信息函數(shù)--------

51、---------------------------------</p><p>  LinkList input() //輸入事件表信息</p><p><b>  {</b></p><p>  cout<<"**************** 建立事件表 ******

52、******************\n\n\n";</p><p>  int i;//定義i</p><p>  currenttime=0;//當前時間初始值為0</p><p>  LinkList head;//建立頭指針</p><p>  clientdeal temp;//聲名客戶信息</p><

53、p>  LinkNode *p;//建立鏈表</p><p>  LinkNode *rear;//建立隊尾指針</p><p>  InitList(&head);//建立隊列</p><p>  rear=head;//隊空</p><p>  cout<<"客戶之間交易時間的上限"<

54、<dealtime<<"分鐘"<<endl;</p><p>  cout<<"****** 早上六點開業(yè) ********\n";</p><p>  system("pause");//任意鍵開始</p><p>  srand((unsigned)time(

55、NULL));//產(chǎn)生隨機時間種子</p><p>  for(i=0;;i++){</p><p>  cout<<"*******************************\n";</p><p><b>  //產(chǎn)生事件間隔</b></p><p>  arrivetime+

56、=rand()%max_arrivetime;//隨機兩個事件到達的時間間隔上限</p><p>  currenttime +=arrivetime ;//兩個事件到達的時間間隔上限給當前時間</p><p>  if(currenttime<=close_time)</p><p><b>  {</b></p><

57、;p>  temp.grap =arrivetime ;</p><p>  temp.arriveTime = currentTime;</p><p>  clientnum=i+1;//客戶序列號</p><p>  cout<<"過了 "<<arrivetime <<" 分鐘"

58、<<endl;</p><p>  cout<<"開業(yè)后 "<< currenttime <<" 分鐘 , 第"<<clientnum <<"客戶到達"<<endl;</p><p>  //產(chǎn)生業(yè)務(wù)解決所需時間</p><p

59、>  slovetime=rand()%dealtime;</p><p>  temp.sloveTime = slovetime;</p><p>  cout<<"處理該客戶業(yè)務(wù)需要 "<< slovetime <<"分鐘"<<endl;</p><p><b&

60、gt;  //輸入用戶名</b></p><p>  cout<<"******** 請輸入該客戶的其他信息 ************"<<endl;</p><p>  cout<<"客戶名(exit表退出):"; </p><p>  cin>>temp.nam

61、e;</p><p>  if (strcmp(temp.name , "exit") == 0) break;</p><p>  //產(chǎn)生存取款金額,并輸出</p><p>  double money;</p><p>  cout<<"輸入錢數(shù):"<<endl;</

62、p><p>  cin>>money; //產(chǎn)生用戶所要辦理的錢</p><p>  temp.deposit = money;</p><p>  cout<<"需要辦理的業(yè)務(wù):"<<endl;</p><p>  if (money > 0 ) cout<< te

63、mp.name <<"請求辦理存款 "<<money<<" 元"<<endl;//如果錢數(shù)大于0則請求辦理存款,否則請求辦理取款</p><p>  else cout<< temp.name <<" 請求辦理取款 "<<fabs(money)<<"

64、 元"<<endl;</p><p><b>  //鏈入鏈表</b></p><p>  p = (LinkNode*) malloc(sizeof(LinkNode));//輸入下一個客戶業(yè)務(wù)辦理</p><p>  p->data = temp;</p><p>  p->next

65、 = NULL;</p><p>  rear->next = p;</p><p><b>  rear = p;</b></p><p>  system("pause");</p><p><b>  }</b></p><p><b&g

66、t;  else </b></p><p><b>  {</b></p><p>  cout<<"*******************************\n";</p><p>  cout<<"————時間已到停止辦理—————"<<endl

67、;</p><p>  cout<<"*******************************\n";</p><p>  cout<<"*******************************\n";</p><p>  cout<<"***********一天的辦理

68、客戶業(yè)務(wù)記錄表****************"<<endl;</p><p>  cout<<"****************************************************\n";</p><p><b>  break;</b></p><p><b&g

69、t;  }</b></p><p><b>  }</b></p><p>  return(head);</p><p>  } //輸出一天之內(nèi)的營業(yè)信息。</p><p><b>  }</b></p><p>  //-----

70、-----------定位客戶在事件表中的位置函數(shù)-------------------------------</p><p>  LinkNode *Find(LinkList head, char name[]){ //尋找,定位客戶在事件表中的位置。</p><p>  LinkNode* p;</p><p>  p=head->ne

71、xt;</p><p>  while( p != NULL){</p><p>  if ( strcmp(p->data.name,name)==0) </p><p>  return p; //返回值為指向該客戶地址的指針。</p><p>  p = p->next;

72、</p><p><b>  } </b></p><p>  return NULL; //如果沒有找到,返回空</p><p><b>  } </b></p><p>  //------------------第二隊業(yè)務(wù)處理

73、------------------------------------------</p><p>  void Queuetwo(LinkList L,LinkQueue *Q,int money) //對第二個隊的客戶進行業(yè)務(wù)處理。</p><p><b>  {</b></p><p>  clientdeal M;<

74、/p><p>  LinkList s;</p><p>  while(!Empty(Q)&&money<totle_money)//第二個隊不空且現(xiàn)在的錢比該客戶上次取的時候錢多。</p><p><b>  { </b></p><p>  M=DeleteQueue(Q);</p>

75、<p>  if(totle_money>=fabs(M.deposit))</p><p><b>  {</b></p><p>  totle_money+=M.deposit;</p><p>  s=Find(L,M.name); //定位該客戶在事件表中的位置。</p><

76、p>  if(M.arriveTime>currentTime)</p><p><b>  { </b></p><p>  s->data.arriveTime=currentTime;</p><p>  s->data.waitTime=M.sloveTime;

77、 //計算客戶在銀行內(nèi)的停留時間和當前時間。</p><p>  currentTime=M.arriveTime+M.sloveTime;</p><p>  cout<<"*******************************\n";</p><p>  cout<<"第"<<

78、M.num<<"客戶"<<endl;</p><p>  cout<<"用戶名為"<<M.name<<endl;</p><p>  cout<<"到達"<<s->data.arriveTime<<"分鐘"&l

79、t;<endl;</p><p>  cout<<"停留"<<s->data.waitTime<<"分鐘"<<endl;</p><p>  cout<<currentTime<<"分鐘離開"<<endl;</p><

80、;p>  cout<<"*******************************\n";</p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>

81、  s->data.arriveTime=currentTime;</p><p>  s->data.waitTime=currentTime-M.arriveTime+M.sloveTime;</p><p>  currentTime=currentTime+M.sloveTime;</p><p>  cout<<"****

82、***************************\n";</p><p>  cout<<"第"<<M.num<<"客戶"<<endl;</p><p>  cout<<"用戶名為"<<M.name<<endl;</p>

83、<p>  cout<<"到達"<<s->data.arriveTime<<"分鐘"<<endl;</p><p>  cout<<"停留"<<s->data.waitTime<<"分鐘"<<endl;</p

84、><p>  cout<<currentTime<<"分鐘離開"<<endl;</p><p>  cout<<"*******************************\n";</p><p><b>  }</b></p><p&

85、gt;<b>  }</b></p><p><b>  else</b></p><p><b>  { </b></p><p>  EnterQueue(Q,M); //若錢仍不夠該客戶需求,則該客戶繼續(xù)留在第二隊。</p><p>  cout<<&qu

86、ot;第"<<clientnum<<"客戶"<<"繼續(xù)留在第二隊"<<endl;</p><p><b>  }</b></p><p>  }//while結(jié)束。</p><p><b>  }</b></p>

87、<p>  //-------------------------交易處理函數(shù)-------------------------------------</p><p>  void dealwith(LinkNode *L,LinkQueue *P,LinkQueue *Q)//交易處理</p><p><b>  {</b></p>&

88、lt;p>  LinkNode *s,*n;</p><p><b>  s=L;</b></p><p>  currentTime=0;</p><p>  clientnum=1;//辦理第一個客戶</p><p>  totle_people=0;//初始時客戶總數(shù)</p><p>

89、;  totle_money=10000;//初始時銀行資金總額</p><p>  int money=0;</p><p>  clientdeal M;</p><p>  while(s->next!=NULL)</p><p><b>  { </b></p><p>  tot

90、le_people++;</p><p>  EnterQueue(P,s->next->data); //統(tǒng)計事件表內(nèi)的信息,并且將它們?nèi)氲谝魂牎?lt;/p><p>  s=s->next;</p><p><b>  }</b></p><p><b>  s=L;</b&

91、gt;</p><p>  n=s->next;</p><p>  while(!Empty(P)&&currentTime<close_time) //若第一隊內(nèi)的等待人數(shù)不為零且未到關(guān)門時間,則執(zhí)行下面語句。</p><p><b>  { </b></p><p>  M=Dele

92、teQueue(P); //隊頭元素出隊,準備接受業(yè)務(wù)處理。</p><p>  if(M.deposit>0) //存款或者還款業(yè)務(wù)。</p><p><b>  {</b></p><p>  money=totle_money;</p><p

93、>  totle_money += M.deposit;</p><p>  s=Find(L,M.name); //找到元素在事件表中的位置。</p><p>  if(M.arriveTime>currentTime) //計算等待時間以及當前時間。 </p><p><b>  {</b><

94、;/p><p>  s->data.arriveTime=currentTime;</p><p>  s->data.waitTime=M.sloveTime;</p><p>  currentTime=M.arriveTime+M.sloveTime;</p><p>  cout<<"**********

95、*********************\n";</p><p>  cout<<"第"<<clientnum<<"客戶"<<"到達"<<s->data.arriveTime<<"分鐘"<<endl;</p><

96、p>  cout<<"第"<<clientnum<<"客戶"<<"停留"<<s->data.waitTime<<"分鐘"<<endl;</p><p>  cout<<currentTime<<"分鐘離開b

97、ank"<<endl;</p><p>  cout<<"*******************************\n";</p><p><b>  }</b></p><p><b>  else</b></p><p><b&

98、gt;  {</b></p><p>  s->data.arriveTime=currentTime;</p><p>  s->data.waitTime=currentTime-M.arriveTime+M.sloveTime;</p><p>  currentTime=currentTime+M.sloveTime;</p&g

99、t;<p>  cout<<"*******************************\n";</p><p>  cout<<"第"<<clientnum<<"客戶"<<"到達"<<s->data.arriveTime<<

100、"分鐘"<<endl;</p><p>  cout<<"第"<<clientnum<<"客戶"<<"停留"<<s->data.waitTime<<"分鐘"<<endl;</p><p> 

101、 cout<<currentTime<<"分鐘離開bank"<<endl;</p><p>  cout<<"*******************************\n";</p><p><b>  }</b></p><p>  if(!Emp

102、ty(Q)) </p><p><b>  {</b></p><p>  cout<<"準備處理第二隊中人的業(yè)務(wù)"<<endl; //如果第二隊中的人數(shù)不為零,則準備處理第二隊中人的業(yè)</p><p>  Queuetwo(L,Q,money);</

103、p><p><b>  }}</b></p><p>  else //取款或者貸款業(yè)務(wù)。</p><p><b>  {</b></p><p>  if(totle_money>fabs(M.deposit))

104、 //看錢是否夠取走。夠則取,不夠則入第二隊。 </p><p>  {totle_money+=M.deposit;</p><p>  s=Find(L,M.name);</p><p>  s->data.waitTime=M.sloveTime;</p><p>  currentTime=M.arrive

105、Time+M.sloveTime;</p><p>  cout<<"*******************************\n";</p><p>  cout<<"第"<<clientnum<<"客戶"<<"到達"<<s-&g

106、t;data.arriveTime<<"分鐘"<<endl;</p><p>  cout<<"第"<<clientnum<<"客戶"<<"停留"<<s->data.waitTime<<"分鐘"<<en

107、dl;</p><p>  cout<<currentTime<<"分鐘離開"<<endl;</p><p>  cout<<"*******************************\n";</p><p><b>  }</b></p>

108、;<p><b>  else </b></p><p><b>  { </b></p><p>  M.num=clientnum;</p><p>  EnterQueue(Q,M); //所取的錢數(shù)太多,不夠取出。入第二隊。 </p><p>  cout<

109、<"第"<<clientnum<<"客戶"<<"繼續(xù)留在第二隊"<<endl;</p><p><b>  }</b></p><p>  } //else結(jié)束。</p><p>  clientnum++;</p&g

110、t;<p>  }//while結(jié)束。</p><p>  }//dealwith結(jié)束。</p><p>  //--------------------輸出函數(shù)-------------------------------------------</p><p>  void output(LinkList L)

111、 //輸出最后結(jié)果。</p><p><b>  {</b></p><p>  totle_time=0;</p><p>  LinkList s;</p><p><b>  s=L;</b></p><p>  while(s->next!=0)</p&

112、gt;<p>  { //計算客戶在銀行內(nèi)呆的總時間。</p><p>  totle_time+=s->next->data.waitTime;</p><p>  s=s->next;</p><p><b>  }</b></p><p>  float

113、m=static_cast<float>(totle_time)/static_cast<float>(totle_people);//數(shù)值類型轉(zhuǎn)換。</p><p>  cout<<"***************一天之內(nèi)的營業(yè)信息如下*****************"<<endl;</p><p>  cout<

114、;<"顧客呆的總時間為 "<<totle_time<<endl;</p><p>  cout<<"一天之內(nèi)來的總顧客人數(shù)為 "<<totle_people<<endl;</p><p>  cout<<"顧客呆的平均時間為 "<<m<

115、;<endl;</p><p><b>  }</b></p><p>  4 ***********主函數(shù)****************************************</p><p>  #include"bank.h"//----所需要頭文件</p><p>  #inc

116、lude <iostream>//所需要C++頭文件</p><p>  #include"stdio.h"</p><p>  using namespace std;</p><p>  //----------------------main()函數(shù)-----------------——————----------</p&

117、gt;<p>  void main()</p><p><b>  { </b></p><p>  printf(" ********************************************\n");</p><p>  printf(" 歡迎進入銀行模擬系統(tǒng)\n");&

118、lt;/p><p>  printf(" ********************************************\n");</p><p>  printf("1.開始模擬 0.退出\n");</p><p><b>  int n;</b></p><p>  sc

119、anf("%d",&n);</p><p>  while(n==1)</p><p><b>  {</b></p><p>  cout<<"開始進行業(yè)務(wù)辦理------"<<endl; //程序開始。</p><p>  cout&l

120、t;<"銀行每天營業(yè)初始資金為10000元. 每日營業(yè)時間為600分鐘."<<endl;</p><p>  LinkList L; </p><p>  LinkQueue P,Q; //P為第一個隊列,Q為第二個隊列.</p><p&

121、gt;  InitQueue(&P); //隊列初始化。cout<<"After Init(P)"<<endl;</p><p>  InitQueue(&Q); //隊列初始化。cout<<"After Init(Q)"<<endl;</p><p&g

122、t;  L=input(); //建成事件表.函數(shù)返回值為事件表的首地址.</p><p>  dealwith(L,&P,&Q);//處理客戶請求.首先將客戶排入第一隊.</p><p>  output(L);</p><p><b>  }</b></p><p><b>  }</

123、b></p><p>  [2]各程序之間調(diào)用關(guān)系如下 :</p><p><b>  ,</b></p><p> ?。?</p><p><b>  .</b></p><p><b>  四、調(diào)試分析</b&g

124、t;</p><p>  1. 由于對隊列以及單鏈表的算法推敲不足,導致一些小錯誤出現(xiàn)以及對題目不太理解導致算法錯誤和調(diào)試結(jié)果的不正確;經(jīng)過老師的幫助和不斷閱讀題目,最后設(shè)計出正確的代碼。</p><p>  2. 剛開始時曾忽略了一些變量參數(shù)的標識"*",使調(diào)試程序時費時不少。今后應(yīng)多注意確定參數(shù)的變量和外部變量屬性的區(qū)分和標識。</p><p&

125、gt;  3. 程序的模塊劃分比較合理,且盡可能將指針的操作封裝在動態(tài)存儲和函數(shù)的兩個模塊中,致使主函數(shù)模塊的調(diào)試比較順利。反之,如此劃分的模塊并非完全合理,因為在實現(xiàn)隊列操作的編碼中仍然需要判別指針是否為空。</p><p>  4. 算法的時空分析</p><p>  1)由于程序采用單鏈表建立隊列,并增設(shè)頭指針和尾指針兩個標識,各種操作的算法時間復雜度比較合理。InitList,

126、InitQueue ,Empty, EnterQueue和clientdeal DeleteQueue算法的時間復雜度是O(l); input,output,Queuetwo和LinkNode Find定位客戶在事件表中的位置則是O(n)的;dealwith交易處理函數(shù)為O(n* n)n為鏈表長度。</p><p><b>  注:各種函數(shù)</b></p><p> 

127、 void InitList(LinkList *L);//建立單鏈表連,分配空間int InitQueue(LinkQueue *Q);//初始化隊列</p><p>  int Empty(LinkQueue* Q);//判斷隊列是否為空,為空返回1,不為空返回0。</p><p>  int EnterQueue(LinkQueue *Q,clientdeal x);//將客戶進行入

128、隊。</p><p>  clientdeal DeleteQueue(LinkQueue *Q); //出隊函數(shù)。</p><p>  LinkList input() ; //輸入事件表信息</p><p>  LinkNode *Find(LinkList head, char name[]); //尋找,定位客戶在事件表中的位置。

129、</p><p>  void Queuetwo(LinkList L,LinkQueue *Q,int money) ; //對第二個隊的客戶進行業(yè)務(wù)處理。</p><p>  void dealwith(LinkNode L,LinkQueue P,LinkQueue Q);//交易處理</p><p>  void output(LinkList L);//輸

130、出最后結(jié)果。</p><p>  2)表實現(xiàn)的隊列各種操作的時間復雜度分析如下:</p><p>  [1] 建立單鏈表連InitList函數(shù)由于申請空間時一個一個申請不需要太多的時間,因此時間復雜度為O(1),空間復雜度為S(1)同理InitQueue初始化隊列的時間復雜度為O(1),空間復雜度為S(1)</p><p>  [2] 入隊EnterQueue函數(shù)和

131、clientdeal DeleteQueue出隊函數(shù)由于隊列特點為先進先出,有因為在隊尾進,隊頭出所以時間復雜度為O(1),空間復雜度為S(0;,判斷隊列是否為空Empty時間復雜度為O(1),空間復雜度為S(0)。</p><p>  [3] 輸入事件表信息input函數(shù)雖然用建立單鏈表連方法建立事件表,但又利用FOR語句實現(xiàn)操作,所以由分析可得時間復雜度為O(n) ,空間復雜度為S(n);對于output,Q

132、ueuetwo和LinkNode Find定位客戶在事件表中的位置的函數(shù)由于都需要先一個一個判斷是否滿足函數(shù)所規(guī)定的要求,應(yīng)用WHILE語句因此需要一個一個判斷所以時間復雜度為O(n); 空間復雜度為S(0).</p><p>  [4] dealwith交易處理函數(shù)先要一個一個處理,同時有調(diào)用LinkNode Find函數(shù)以及Queuetwo函數(shù)又要逐步判斷是否為空隊,空間復雜度較為復雜,經(jīng)過分析時間復雜度為O

133、(n* n) ,空間復雜度為S(n+n)。</p><p>  5. 本實習作業(yè)采用數(shù)據(jù)抽象(c++)的程序設(shè)計方法,將程序劃分為三個層次結(jié)構(gòu);主程序模塊,動態(tài)存儲結(jié)構(gòu)模塊,函數(shù)模塊。使得設(shè)計時思路清晰,實現(xiàn)時調(diào)試順利。各模塊具有較好的可重用性。經(jīng)過本次實驗充分得到了一次良好的程序設(shè)計訓練,而且獲得到學多知識例如srand((unsigned) time(&t)) 用來設(shè)置隨機時間的種子,一般與rand

134、()結(jié)合使用;以及system含義以及用法等等也進一步掌握了隊列和鏈表的應(yīng)用。</p><p><b>  五、用戶手冊</b></p><p>  1.本程序的運行環(huán)繞為XP下的程序名為“bank.cpp”,運行環(huán)境為Microsoft Visual 6.0 C++。</p><p>  2進入演示程序后即顯示的用戶界面;</p>

135、<p>  *************************************************************************</p><p>  歡迎進入銀行模擬系統(tǒng)</p><p>  *************************************************************************</

136、p><p>  1 開始模擬 0退出</p><p><b>  1 </b></p><p>  開始進行業(yè)務(wù)辦理--------------</p><p>  銀行每天營業(yè)初始資金為10000元,每日營業(yè)時間為600分鐘</p><p>  **************** 建立事件表 ***

溫馨提示

  • 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)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論