數(shù)據(jù)結構課程設計-理發(fā)館仿真模擬(基于隊列)_第1頁
數(shù)據(jù)結構課程設計-理發(fā)館仿真模擬(基于隊列)_第2頁
數(shù)據(jù)結構課程設計-理發(fā)館仿真模擬(基于隊列)_第3頁
數(shù)據(jù)結構課程設計-理發(fā)館仿真模擬(基于隊列)_第4頁
數(shù)據(jù)結構課程設計-理發(fā)館仿真模擬(基于隊列)_第5頁
已閱讀5頁,還剩4頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

數(shù)據(jù)結構課程設計理發(fā)館仿真模擬(基于隊列)問題描述(或者需求分析)理發(fā)館一天的工作過程如下:

1)理發(fā)館有N把理發(fā)椅,可同時為N位顧客進行理發(fā)。

2)理發(fā)師分三個等級(一級、二級、三級),對應不同的服務收費。

3)當顧客進門時,需選擇某級別理發(fā)師,只要該級別的理發(fā)師有空椅,則可立即坐下理發(fā),否則需排隊等候。

4)一旦該級別的理發(fā)師有顧客理發(fā)完離去,排在隊頭的顧客便可開始理發(fā)。

5)若理發(fā)館每天連續(xù)營業(yè)T分鐘,求

(1)一天內顧客在理發(fā)館內的平均逗留時間;

(2)顧客排隊等候理發(fā)的隊列長度平均值;

(3)營業(yè)時間到點后仍需完成服務的收尾工作時間;

(4)統(tǒng)計每天的營業(yè)額;

(5)統(tǒng)計每天不同級別理發(fā)師的創(chuàng)收?;疽螅?)模擬理發(fā)館一天的工作過程:必須采用事件驅動的離散模型(參考教科書3.5節(jié)離散事件模擬p65);

2)每個顧客到達和下一顧客到達時間的間隔應是隨機的;

3)理發(fā)師編號、理發(fā)師級別和每天的營業(yè)時間由用戶輸入;

4)某顧客挑選某一個級別的理發(fā)師而不得時,選第一個隊列排隊等待;

5)每個顧客進門時將生成三個隨機數(shù):

(1)durtime:進門顧客理發(fā)所需服務時間(簡稱:理發(fā)時間);

(2)intertime:下一顧客將到達的時間間隔(簡稱:間隔時間);

(3)select:服務選項。

6)服務收費:應包含服務時間和理發(fā)師級別兩個因素。

7)除了輸出統(tǒng)計的數(shù)據(jù)外,還需要顯示理發(fā)館的狀態(tài),可以采用文本方式(橫向顯示每張椅編號、理發(fā)師級別??v向表示等待該理發(fā)師理發(fā)的排隊長度)。算法設計思想:在實現(xiàn)技術上,假設當前temp每次將它加一表示過了一分鐘,然后判斷在這個時間單位中判斷是否有人理發(fā)完畢,如果有將此座位上的num置為-1。然后判斷是否有人可以接受服務,如果有判斷是否有空椅子,如果有,則進入理發(fā),否則將他入隊。重復執(zhí)行上面的過程,直到temp加到了其關門時間。顧客進門和出門這兩個時刻發(fā)生的事情稱“事件”,按事件的先后次序逐個處理事件的工作方式稱“事件驅動模擬”。離散事件驅動模型的特點是只關注和刻畫事物的狀態(tài)變化(即事件),不關心變化的過渡過程。模型靠每一個事件引發(fā)其它事件的方式來維持運轉。每個事件都有發(fā)生時間,模型的運轉實際就是按事件發(fā)生時間順序逐個處理事件,'處理'將產生新的事件。因此,建模的關鍵就是全面分析事物的主要特點,抽象出幾種能反映本質的事件和它們之間的驅動關系。系統(tǒng)時間就是當前事件的事件發(fā)生時間,它不是等間隔變化而是跳躍變化的。程序中的數(shù)據(jù)結構及存儲結構說明:顧客結構:typedefstruct{intnum;intcometime;intdurtime;intwaittime;}cutpeople;理發(fā)椅結構體:typedefstructcutnode{intnum;/*顧客編號*/intcometime;/*顧客到達時間*/structcutnode*next;}cutnode;/*隊列的結點定義*/隊列結構體:typedefstruct{cutnode*front;cutnode*rear;}cutqueue;/*隊列的鏈式定義*/流程圖:部分圖示(程序運行截圖)程序代碼:#defineNUM100#defineERROR0#defineKONG-1#include<stdio.h>#include<math.h>#include<conio.h>typedefstruct{intnum;intcometime;intdurtime;intwaittime;}cutpeople;/*顧客信息結點的定義*/typedefstructcutnode{intnum;/*顧客編號*/intcometime;/*顧客到達時間*/structcutnode*next;}cutnode;/*隊列的結點定義*/typedefstruct{cutnode*front;cutnode*rear;}cutqueue;/*隊列的鏈式定義*/intinitqueue(cutqueue*d1){d1->front=(cutnode*)malloc(sizeof(cutnode));if(d1->front){d1->front->next=NULL;d1->rear=d1->front;}elsereturn(OVERFLOW);}/*初始化隊列*/intenterqueue(cutqueue*d2,intcometime,intnum){cutnode*q;q=(cutnode*)malloc(sizeof(cutnode));if(q){q->cometime=cometime;q->num=num;q->next=NULL;d2->rear->next=q;d2->rear=q;}elsereturn(OVERFLOW);}/*入隊列*/cutnodedeleted(cutqueue*d3){cutnode*a;cutnodep;a=d3->front->next;d3->front->next=a->next;etime=a->cometime;p.num=a->num;if(d3->rear==a)d3->rear=d3->front;free(a);return(p);}/*出隊列*/intpdkong1(cutqueue*d4)/*判斷隊列是否為空*/{if(d4->front!=d4->rear)return(1);elsereturn(0);}voidinitundercut(cutpeople*undercut,intd5)/*數(shù)組undercut指的是理發(fā)店內的位子*/{inti;for(i=0;i<d5;i++){undercut[i].num=-1;/*若位子上沒有人,則其num取值為-1*/undercut[i].cometime=-1;undercut[i].durtime=-1;undercut[i].waittime=-1;}}/*初始化理發(fā)店內的位子情況*/intpdkong2(cutpeople*undercut,intd6){intk=0;while(k<d6){if(undercut[k].num==-1)break;elsek++;}if(k>=d6)return(-1);elsereturn(k);}/*判斷店內是否有空位子,若有,返回位置,否則返回0*/intpdtime(cutpeople*undercut,intd7,inttime,intv[20]){intb=0,i=0,j;for(j=0;j<20;j++)v[j]=-1;/*數(shù)組v裝的是在此時刻同時理發(fā)完畢的人*/while(b<d7){if(undercut[b].cometime+undercut[b].waittime+undercut[b].durtime==time)v[i++]=b;b++;}}/*判斷在time時刻是否有人已經(jīng)理發(fā)完畢*/main(){intN,T,R;/*椅子數(shù).總時間.隨機數(shù)*/cutqueues;/*等待隊列*/inttemp=0;/*時間計數(shù)器*/intnumber_custeromer=1;/*顧客總數(shù)*/intintertime;/*記錄下一個顧客來的時間間隔*/intu[20],r,i,a;inttotallenth=0;cutnodez;cutpeople*undercut;floataverage_time,average_queuelength;undercut=(cutpeople*)malloc(N*sizeof(cutpeople));initundercut(undercut,N);initqueue(&s);printf("Pleaseshuruthechairs:");scanf("%d",&N);printf("Pleaseshuruyingyeshijian:");scanf("%d",&T);undercut[0].num=number_custeromer++;undercut[0].cometime=0;undercut[0].waittime=0;R=fabs(srand((unsigned)time(NULL)));/*產生隨機數(shù)*/undercut[0].durtime=15+R%50;intertime=2+R%10;clrscr();/*清屏*/printf("numcometimedurtime\n");while(temp<=T||pdkong1(&s)){intertime--;temp++;pdtime(undercut,N,temp,u);if(u[0]!=-1)/*判斷是否有理發(fā)完畢的人*/{for(r=0;r<20&&u[r]!=-1;r++){printf("%4d%4d%4d\n",undercut[u[r]].num,undercut[u[r]].cometime+undercut[u[r]].waittime,undercut[u[r]].durtime);undercut[u[r]].num=-1;if(pdkong1(&s)){z=deleted(&s);R=fabs(srand((unsigned)time(NULL)+temp));undercut[u[r]].durtime=15+R%50;undercut[u[r]].num=z.num;undercut[u[r]].cometime=etime;undercut[u[r]].waittime=etime;intertime=2+R%10;}}/*如果有理發(fā)完畢的人,并且隊列不空,就出隊*/}if(intertime==0)/*如果有人來理發(fā)了*/{R=fabs(srand((unsigned)time(NULL)+temp));intertime=2+R%10;if(T-temp>=intertime){i=pdkong2(undercut,N);/*判斷是否有空位子*/if(i>=0){undercut[i].durtime=15+R%50;if(T-temp>=undercut[i].durtime)/*判斷是否符合進入條件*/{undercut[i].num=number_custeromer++;

溫馨提示

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

評論

0/150

提交評論