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

下載本文檔

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

文檔簡(jiǎn)介

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

2、 </p><p>  ?! I(yè)    計(jì)算機(jī)  </p><p>  指導(dǎo)教師    </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àn)殂y行客戶業(yè)務(wù)模擬, 其業(yè)務(wù)模擬分為兩種: 第一功能是申請(qǐng)從銀行得到一筆資金,即取款或借款。第二功能是向銀行投入一筆資金,即存款或還款。銀行有兩個(gè)服務(wù)窗口,相應(yīng)地有兩個(gè)隊(duì)列。</p><

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

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

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

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

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

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

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

11、t;p> ?。?)隊(duì)列的抽象數(shù)據(jù)類型定義為:</p><p><b>  用單鏈表表示的隊(duì)列</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)造一個(gè)空的隊(duì)列。</p><p>  DestroyQueue (LinkQueue &Q)</p><p>  初始條件:隊(duì)列Q已存在。</p><p>  操作結(jié)果:銷毀隊(duì)列Q。</p><p>  QueueLength(LinkQueu

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

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

16、t;p>  操作結(jié)果:插入元素為x的新的對(duì)尾元素 </p><p>  DeleteQueue(LinkQueue *Q,int e)</p><p>  初始條件:隊(duì)列已存在。</p><p>  操作結(jié)果:刪除對(duì)頭元素,用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)體類型名由用戶自己命名。在使用時(shí)必須聲明一個(gè)具體的結(jié)構(gòu)體類型的變量,聲明創(chuàng)建一個(gè)結(jié)構(gòu)體變量的方法是:</p><p>  struct 結(jié)構(gòu)體類型名 結(jié)構(gòu)體變量名;</p><p><b>  4程序包括三個(gè)模塊</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)動(dòng)態(tài)存儲(chǔ)結(jié)構(gòu)模塊</p><p>  第一部分:外部變量聲明</p><p>  第二部分: 隊(duì)列結(jié)構(gòu)體以及鏈表建立</p><p><b>  3)函數(shù)模塊:</b></p><p>  5 三個(gè)模塊的圖形關(guān)系:</p><p>&

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

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

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

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

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

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

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

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

30、nt num; //用戶號(hào)</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 //單鏈表表示的隊(duì)列</p><p><b>  {</b></p><p>  Node *front; //隊(duì)頭</p><p>  Node *rear; //隊(duì)尾</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);//初始化隊(duì)列</p><p>  int Empty(LinkQueue* Q); //判斷隊(duì)列是否為空,為空返回1,不為空返回0。</p><p>  int EnterQue

34、ue(LinkQueue *Q,clientdeal x);//將客戶進(jìn)行入隊(duì)。</p><p>  clientdeal DeleteQueue(LinkQueue *Q); //出隊(duì)函數(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) ; //對(duì)第二個(gè)隊(duì)的客戶進(jìn)行業(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>  //--------------------隊(duì)列初始化函數(shù)---------------------------------------</p><p>  int InitQueue(LinkQueue *Q)//初始化隊(duì)列</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) //判斷隊(duì)列是否為空,為空返回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>  //----------------------入隊(duì)函數(shù)-------------------------------------------</p><p>  int EnterQueue(LinkQueue *Q,clientdeal x)//將客戶進(jìn)行入隊(duì)。</p><p><b>  { </b></p&g

44、t;<p>  /* 將數(shù)據(jù)元素x插入到隊(duì)列Q中 */</p><p>  Node *NewNode;</p><p>  NewNode=(LinkNode *)malloc(sizeof(LinkNode)); </p><p><b>  //申請(qǐng)新結(jié)點(diǎn)。</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、--------------------出隊(duì)函數(shù)-----------------------------------------</p><p>  clientdeal DeleteQueue(LinkQueue *Q) //出隊(duì)函數(shù)。</p><p><b>  { </b></p><p>  /* 將隊(duì)列Q的

48、隊(duì)頭元素出隊(duì),并存放到x所指的存儲(chǔ)空間中 */</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; /* 隊(duì)頭元素p出隊(duì) */</p><p>  if(Q->rear==p) /* 如果隊(duì)中只有一個(gè)元素p,則p出隊(duì)后成為空隊(duì) */</p><p>  Q->rear=Q->front

50、; </p><p>  M=p->data;</p><p>  free(p); /* 釋放存儲(chǔ)空間 */</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;//當(dāng)前時(shí)間初始值為0</p><p>  LinkList head;//建立頭指針</p><p>  clientdeal temp;//聲名客戶信息</p><

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

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

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

56、=rand()%max_arrivetime;//隨機(jī)兩個(gè)事件到達(dá)的時(shí)間間隔上限</p><p>  currenttime +=arrivetime ;//兩個(gè)事件到達(dá)的時(shí)間間隔上限給當(dāng)前時(shí)間</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;//客戶序列號(hào)</p><p>  cout<<"過(guò)了 "<<arrivetime <<" 分鐘"

58、<<endl;</p><p>  cout<<"開業(yè)后 "<< currenttime <<" 分鐘 , 第"<<clientnum <<"客戶到達(dá)"<<endl;</p><p>  //產(chǎn)生業(yè)務(wù)解決所需時(shí)間</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<<"******** 請(qǐng)輸入該客戶的其他信息 ************"<<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 <<"請(qǐng)求辦理存款 "<<money<<" 元"<<endl;//如果錢數(shù)大于0則請(qǐng)求辦理存款,否則請(qǐng)求辦理取款</p><p>  else cout<< temp.name <<" 請(qǐng)求辦理取款 "<<fabs(money)<<"

64、 元"<<endl;</p><p><b>  //鏈入鏈表</b></p><p>  p = (LinkNode*) malloc(sizeof(LinkNode));//輸入下一個(gè)客戶業(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<<"————時(shí)間已到停止辦理—————"<<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íng)業(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>  //------------------第二隊(duì)業(yè)務(wù)處理

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

74、/p><p>  LinkList s;</p><p>  while(!Empty(Q)&&money<totle_money)//第二個(gè)隊(duì)不空且現(xiàn)在的錢比該客戶上次取的時(shí)候錢多。</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、 //計(jì)算客戶在銀行內(nèi)的停留時(shí)間和當(dāng)前時(shí)間。</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<<"到達(dá)"<<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<<"到達(dá)"<<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ù)留在第二隊(duì)。</p><p>  cout<<&qu

86、ot;第"<<clientnum<<"客戶"<<"繼續(xù)留在第二隊(duì)"<<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;//辦理第一個(gè)客戶</p><p>  totle_people=0;//初始時(shí)客戶總數(shù)</p><p>

89、;  totle_money=10000;//初始時(shí)銀行資金總額</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)計(jì)事件表內(nèi)的信息,并且將它們?nèi)氲谝魂?duì)。</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) //若第一隊(duì)內(nèi)的等待人數(shù)不為零且未到關(guān)門時(shí)間,則執(zhí)行下面語(yǔ)句。</p><p><b>  { </b></p><p>  M=Dele

92、teQueue(P); //隊(duì)頭元素出隊(duì),準(zhǔn)備接受業(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) //計(jì)算等待時(shí)間以及當(dāng)前時(shí)間。 </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<<"客戶"<<"到達(dá)"<<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<<"客戶"<<"到達(dá)"<<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<<"準(zhǔn)備處理第二隊(duì)中人的業(yè)務(wù)"<<endl; //如果第二隊(duì)中的人數(shù)不為零,則準(zhǔn)備處理第二隊(duì)中人的業(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、 //看錢是否夠取走。夠則取,不夠則入第二隊(duì)。 </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<<"客戶"<<"到達(dá)"<<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ù)太多,不夠取出。入第二隊(duì)。 </p><p>  cout<

109、<"第"<<clientnum<<"客戶"<<"繼續(xù)留在第二隊(duì)"<<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>  { //計(jì)算客戶在銀行內(nèi)呆的總時(shí)間。</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íng)業(yè)信息如下*****************"<<endl;</p><p>  cout<

114、;<"顧客呆的總時(shí)間為 "<<totle_time<<endl;</p><p>  cout<<"一天之內(nèi)來(lái)的總顧客人數(shù)為 "<<totle_people<<endl;</p><p>  cout<<"顧客呆的平均時(shí)間為 "<<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(" 歡迎進(jìn)入銀行模擬系統(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<<"開始進(jìn)行業(yè)務(wù)辦理------"<<endl; //程序開始。</p><p>  cout&l

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

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

122、t;  L=input(); //建成事件表.函數(shù)返回值為事件表的首地址.</p><p>  dealwith(L,&P,&Q);//處理客戶請(qǐng)求.首先將客戶排入第一隊(duì).</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. 由于對(duì)隊(duì)列以及單鏈表的算法推敲不足,導(dǎo)致一些小錯(cuò)誤出現(xiàn)以及對(duì)題目不太理解導(dǎo)致算法錯(cuò)誤和調(diào)試結(jié)果的不正確;經(jīng)過(guò)老師的幫助和不斷閱讀題目,最后設(shè)計(jì)出正確的代碼。</p><p>  2. 剛開始時(shí)曾忽略了一些變量參數(shù)的標(biāo)識(shí)"*",使調(diào)試程序時(shí)費(fèi)時(shí)不少。今后應(yīng)多注意確定參數(shù)的變量和外部變量屬性的區(qū)分和標(biāo)識(shí)。</p><p&

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

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

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

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

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

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

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

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

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

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

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

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

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論