




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領
文檔簡介
數(shù)據(jù)結(jié)構(gòu)-電梯模擬的報告數(shù)據(jù)結(jié)構(gòu)-電梯模擬的報告數(shù)據(jù)結(jié)構(gòu)-電梯模擬的報告
1.課程設計目的1、訓練學生靈活應用所學數(shù)據(jù)結(jié)構(gòu)知識,獨立完成問題分析,結(jié)合數(shù)據(jù)結(jié)構(gòu)理論知識,編寫程序求解指定問題.2.初步掌握軟件開發(fā)過程的問題分析、系統(tǒng)設計、程序編碼、測試等基本方法和技能;3.提高綜合運用所學的理論知識和方法獨立分析和解決問題的能力;4。訓練用系統(tǒng)的觀點和軟件開發(fā)一般規(guī)范進行軟件開發(fā),鞏固、深化學生的理論知識,提高編程水平,并在此過程中培養(yǎng)他們嚴謹?shù)目茖W態(tài)度和良好的工作作風。2.課程設計任務與要求:任務根據(jù)教材《數(shù)據(jù)結(jié)構(gòu)題集(C語言版)》(嚴蔚敏、吳偉民主編)選擇課程設計題目,要求通過設計,在數(shù)據(jù)結(jié)構(gòu)的邏輯特性和物理表示、數(shù)據(jù)結(jié)構(gòu)的選擇應用、算法的設計及其實現(xiàn)等方面加深對課程基本內(nèi)容的理解和綜合運用。設計題目從《數(shù)據(jù)結(jié)構(gòu)題集》“第二篇實習篇”中選取,每班每題不得超過2人。另選題:學生自選課題學生原則上可以結(jié)合個人愛好自選課題,要求課題有一定的深度與難度,有一定的算法復雜性,能夠鞏固數(shù)據(jù)結(jié)構(gòu)課程所學的知識.學生自選課題需在17周前報課程設計指導教師批準方可生效。要求:1、在處理每個題目時,要求從分析題目的需求入手,按設計抽象數(shù)據(jù)類型、構(gòu)思算法、通過設計實現(xiàn)抽象數(shù)據(jù)類型、編制上機程序和上機調(diào)試等若干步驟完成題目,最終寫出完整的分析報告。前期準備工作完備與否直接影響到后序上機調(diào)試工作的效率.在程序設計階段應盡量利用已有的標準函數(shù),加大代碼的重用率。2、.設計的題目要求達到一定工作量(300行以上代碼),并具有一定的深度和難度。3、程序設計語言推薦使用C/C++,程序書寫規(guī)范,源程序需加必要的注釋;4、每位同學需提交可獨立運行的程序;5、每位同學需獨立提交設計報告書(每人一份),要求編排格式統(tǒng)一、規(guī)范、內(nèi)容充實,不少于10頁(代碼不算);6、課程設計實踐作為培養(yǎng)學生動手能力的一種手段,單獨考核。
3.課程設計說明書一需求分析(1)、模擬某校五層教學樓的電梯系統(tǒng).該樓有一個自動電梯,能在每層停留。五個樓層由下至上依次稱為地下層、第一層、第二層、第三層和第四層,其中第一層是大樓的進出層,即是電梯的“本壘層",電梯“空閑”時,將來該層候命。五個樓層從下到上的編號為:0、1、2、3、4.除了地下層外,每一層都有一個要求向下的按鈕除了第四層外,每一層都有一個要求向上的按鈕。對應的變量為:CallUp[0。。3]和CallDown[1。.4]。電梯內(nèi)的五個目標層按鈕對應的變量為:CallCar[0。.4]。(2)、電梯一共有七個狀態(tài),即正在開門(Opening)、已開門(Opened)、正在關(guān)門(Closing)、已關(guān)門(Closed)、等待(Waiting)、移動(Moving)、減速(Decelerate)。(3)、
乘客可隨機地進出于任何層。對每個人來說,他有一個能容忍的最長等待時間,一旦等候電梯時間過長,他將放棄.對于在樓層內(nèi)等待電梯的乘客,將插入在等候隊列里,每一層有兩個等候隊列,一隊要求向上,一隊要求向下,用鏈隊列來實現(xiàn)。對于在電梯內(nèi)的乘客,用五個乘客棧來實現(xiàn),該乘客要去哪一層,就把他放在相應編號的棧中,對應變量為EleStack[0…4]。(4)、模擬時鐘從0開始,時間單位為0。1秒.人和電梯的各種動作均要耗費一定的時間單位(簡記為t):有人進出時,電梯每隔40t測試一次,若無人進出,則關(guān)門關(guān)門和開門各需要20t每個人進出電梯均需要25t電梯加速需要15t上升時,每一層需要51t,減速需要14t下降時,每一層需要61t,減速需要23t如果電梯在某層靜止時間超過300t,則駛回1層候命。(5)、按時序顯示系統(tǒng)狀態(tài)的變化過程:發(fā)生的全部人和電梯的動作序列。二概要設計乘客類型反映乘客的所有屬性。ADTClient數(shù)據(jù)對象:D={ai∈乘客信息,I=1,2,…,n,n≥0}數(shù)據(jù)關(guān)系:R={〈ai-1,ai>|ai-1,ai∈D,i=2,…,n}基本操作:PrintClientInfo(Clientconst&e,ClientStatuss) 操作結(jié)果:輸出乘客信息.CreatClient(Client*&p) 操作結(jié)果:生成新的乘客。DestoryClient(Client*&p) 操作結(jié)果:該乘客離開系統(tǒng)。GoAbove(Clientconst&e) 操作結(jié)果:判斷該乘客是否去往高層.CInfloor(Clientconst&e) 操作結(jié)果:返回乘客進入的樓層。CInTime(Clientconst&e) 操作結(jié)果:返回乘客進入時間。COutfloor(Clientconst&e) 操作結(jié)果:返回乘客進入時間。}乘客棧類型電梯內(nèi)的乘客用乘客棧表示,去不同樓層的乘客放在不同的棧中。ADTEstack數(shù)據(jù)對象:D={ai∈乘客信息,I=1,2,…,n,n≥0}數(shù)據(jù)關(guān)系:R={<ai—1,ai〉|ai-1,ai∈D,i=2,…,n}基本操作:略。}等候隊列類型在電梯外等待的乘客用等待隊列表示。每層各有兩個等待隊列,分別為上樓隊列和下樓隊列。與一般隊列不同的是在基本操作中加入了放棄操作CGiveUp(WQueue&Q,intfloor)。電梯類型表示電梯的各個屬性和所有動作.ADTElevator數(shù)據(jù)對象:D={ai∈電梯信息,I=1,2,…,n,n≥0}基本操作:InitEle(Elevator&E) 操作結(jié)果:初始化電梯類型。DestoryEle(Elevator&E) 操作結(jié)果:銷毀電梯類型.EleDecide(Elevator&E,WQueuew[Maxfloor+1][2]) 操作結(jié)果:電梯動作決策。ElevatorRun(Elevator&E,WQueuew[Maxfloor+1][2]){ 操作結(jié)果:電梯狀態(tài)轉(zhuǎn)換。CountOver(Elevator&E) 操作結(jié)果:判斷電梯計時是否完成.EleFloor(Elevatorconst&E) 操作結(jié)果:返回電梯所在的層。EleStatus(Elevatorconst&E) 操作結(jié)果:返回電梯狀態(tài)。RequireAbove(Elevatorconst&E) 操作結(jié)果:判斷是否有高層請求。RequireBelow(Elevatorconst&E) 操作結(jié)果:判斷是否有低層請求。EleAchieved(Elevator&E) 操作結(jié)果:判斷電梯是否要停于當前層。EleOpenDoor(Elevator&E) 操作結(jié)果:判斷電梯是否要開門。}高樓模塊實現(xiàn)電梯和乘客之間的互交功能。包括:InOut(Elevator&E,WQueuew[Maxfloor+1][2]) 操作結(jié)果:進行乘客的進出電梯活動.NewClient(Elevator&E,WQueuew[5][2]) 操作結(jié)果:進入新乘客。PrintStatus(Elevator&E,WQueuew[5][2]) 操作結(jié)果:輸出當前狀態(tài)。Print(Elevator&E,Actiona) 操作結(jié)果:輸出電梯動作信息。主程序主程序主要處理兩類事件:乘客事件和電梯事件。除此之外,主程序還處理各個模塊的初始化和銷毀工作,以及電梯狀態(tài)的輸出.乘客事件包括新乘客到達事件,乘客放棄等待事件,乘客進出電梯事件.電梯事件包括電梯運行事件。本程序包含6個模塊:主程序模塊乘客模塊乘客棧模塊電梯模塊等待隊列模塊高樓模塊:實現(xiàn)電梯和乘客之間的互交.各模塊之間的調(diào)用關(guān)系如下:主程序主程序電梯模塊乘客棧模塊等待隊列模塊乘客模塊高樓模塊三詳細設計//所有常量,全局變量和類型定義#defineNULL 0 //空指針#defineTRUE 1#define FALSE 0#defineOK 1#defineERROR 0#defineINFEASIBLE -1#defineOVERFLOW —2#defineINT_MAX 32767//Status是函數(shù)類型,其值是函數(shù)結(jié)果狀態(tài)代碼typedefintStatus;#defineEmpty 0//-—-—-—-——--—-—-----———-——--—--—--—-—---———-——-——-——--—//電梯狀態(tài)enum EleStatus{Opening,Opened,Closing,Closed,Moving,Decelerate,Waiting};enum Action{DoorOpened,DoorClosed,GoingUp,GoingDown,Achieved,None};enum EleStage{Up,Down,OpenDoor,Stop};enum ClientStatus{New,GiveUp,In,Out,Finish};#define CloseTest40 //電梯關(guān)門測試時間#defineOverTime300 //電梯停候超時時間#defineAccelerate15 //加速時間#defineUpTime 51 //上升時間#defineDownTime61 //下降時間#defineUpDecelerate14 //上升減速#defineDownDecelerate23 //下降減速#defineDoorTime 20 //開門關(guān)門時間#defineInOutTime 25 //進出電梯時間#defineMaxfloor 4 //最高層#defineMinfloor 0 //最低層longTime=0; //時鐘longMaxTime;//系統(tǒng)運行最長時間intInOutCount=0;//用于進出計時intInterTime=0;//下一乘客進入系統(tǒng)的時間intID=0; //乘客編號intGiveUpNumber=0;//乘客放棄的數(shù)目intTotalTime=0;//總共等待時間部分重要操作的算法:1、判斷運動方向函數(shù)EleDecide的算法:2、統(tǒng)計高層和低層的請求(不包括當前層)。3、高層和低層均無請求:發(fā)出Stop命令。4、否則,1)若電梯在上升期:1。若有高層請求:上升;2.若無高層請求:轉(zhuǎn)下降期,下降。2)若電梯在下降期:1.若有低層請求:下降;2。若無有低層請求:轉(zhuǎn)上升期,上升。判斷電梯是否要停于當前層函數(shù)EleAchieved的算法:該層的CallCar為1;該層在上升(下降)期有上升(下降)請求(判斷CallUp或CallDown);上升(下降)期高(低)層沒有請求而該層由下降(上升)請求,要轉(zhuǎn)換運行時期。判斷電梯動作函數(shù)ElevatorRun的算法:若電梯在Opening狀態(tài),則轉(zhuǎn)至Opened狀態(tài).若電梯在Opened狀態(tài),若無人進出,則轉(zhuǎn)至Closing狀態(tài)。若電梯在Closed狀態(tài),則根據(jù)電梯請求情況轉(zhuǎn)至相應狀態(tài)。若電梯在Closing狀態(tài),則轉(zhuǎn)至Closed狀態(tài)。若電梯在Moving狀態(tài),若達到目標層,則轉(zhuǎn)至Decelerate狀態(tài)。否則,繼續(xù)移動。若電梯在Decelerate狀態(tài),則設定電梯時期,并轉(zhuǎn)至Opening狀態(tài)。若電梯在Waiting狀態(tài),在判斷是否等待超時,若超時則向第一層移動。否則,判斷電梯請求情況并轉(zhuǎn)至相應狀態(tài)。四設計與調(diào)試分析在本程序中如何判斷電梯的動作最為關(guān)鍵。此外,合理劃分各個模塊和處理各個模塊之間的聯(lián)系也非常重要.本設計中涉及時間函數(shù)的使用,由于剛開始接觸,這方面的使用相當有難度。使用不當就容易造成編譯不通過或者運行時發(fā)送錯誤報告。還有在電梯調(diào)度方面不能按照預定的想法實現(xiàn),所以和現(xiàn)實中的電梯有出入.沒有顯示電梯的運行到哪里,而是用有乘客進入電梯時顯示乘客進入到哪層樓來告知電梯運行到幾樓。開門,關(guān)門時需要精心思考,此處記時及判斷是否要開門也是難點,所以這些看似很平常的動作卻是最難也是最容易錯的地方。此外在指針的使用方面也是難點,很多地方比如乘客進隊出隊以及放棄乘坐電梯時均涉及指針的使用,也經(jīng)常在這些地方通不過編譯。為了便于控制循環(huán),設計了電梯運行時間,則在時間到達時即可退出系統(tǒng)。由于開始為了簡化程序而定義了很多變量,結(jié)果發(fā)現(xiàn)并不實際,有的變量僅是在某些函數(shù)中賦予其值罷了,于是就將這些變量刪除,比如開始按照提示設置了D1-表示人們正在進出電梯等等。由于將程序分塊,將不同部分寫入不同源文件中,這樣出錯后便于查找及修改,這是分模塊的優(yōu)點之一也是編寫和調(diào)試的一個小技巧。五用戶手冊程序運行后輸入程序的運行時間,電梯開始運行。在本設計中,用0—4分別表示地下一樓至四樓,用戶只要按照提示依次輸入正確的數(shù)值,每次按下回車鍵即認為已經(jīng)輸入信息。此后只需等待系統(tǒng)自行進行處理,若未顯示乘客放棄乘坐電梯即認為該乘客已達目的樓層.此間程序會一直運行到開始時輸入的運行時間,此時整個程序運行結(jié)束,按任意鍵退出。此操作可參考測試成果中的效果圖。六測試成果從測試結(jié)果看,乘客放棄數(shù)的大小和平均等待時間的長短還與乘客出現(xiàn)的密度和乘客的平均容忍時間有關(guān)系。七附錄(源程序清單)#include<stdlib。h〉#include〈iostream.h〉#include〈iomanip.h>#include〈stdio.h>#include〈windows.h>#include〈conio。h〉#include〈time.h>//所有常量,全局變量和類型定義#defineNULL 0 //空指針#defineTRUE 1#define FALSE 0#defineOK 1#defineERROR 0#defineINFEASIBLE -1#defineOVERFLOW —2#defineINT_MAX 32767//Status是函數(shù)類型,其值是函數(shù)結(jié)果狀態(tài)代碼typedefintStatus;#defineEmpty 0//—-————-——-——-———-—----——-—-—--—-——-——-———-——-———-—-—-—//電梯狀態(tài)enum EleStatus{Opening,Opened,Closing,Closed,Moving,Decelerate,Waiting};enum Action{DoorOpened,DoorClosed,GoingUp,GoingDown,Achieved,None};enum EleStage{Up,Down,OpenDoor,Stop};enum ClientStatus{New,GiveUp,In,Out,Finish};#define CloseTest40 //電梯關(guān)門測試時間#defineOverTime300 //電梯停候超時時間#defineAccelerate15 //加速時間#defineUpTime 51 //上升時間#defineDownTime61 //下降時間#defineUpDecelerate14 //上升減速#defineDownDecelerate23 //下降減速#defineDoorTime 20 //開門關(guān)門時間#defineInOutTime 25 //進出電梯時間#defineMaxfloor 4 //最高層#defineMinfloor 0 //最低層longTime=0; //時鐘longMaxTime;//系統(tǒng)運行最長時間intInOutCount=0;//用于進出計時intInterTime=0;//下一乘客進入系統(tǒng)的時間intID=0; //乘客編號intGiveUpNumber=0;//乘客放棄的數(shù)目intTotalTime=0;//總共等待時間//乘客類型typedefstruct{ intClinetID; //乘客編號 intOutfloor; //去哪層 intInTime; //該乘客進入時間 intGivepuTime; //所能容忍的等待時間 intInfloor;//乘客進入的樓層}Client;//乘客類型基本操作voidPrintClientInfo(Clientconst&e,ClientStatuss){ //輸出乘客信息#if!test switch(s){ caseNew:cout〈<Time〈<'\t'〈〈e。ClinetID〈〈”號乘客進入第"〈<e。Infloor<〈”層"<<endl;break; caseGiveUp:cout<<Time<〈"\t"<〈e.ClinetID〈<”號乘客放棄等待,等待了"<〈Time-e.InTime<〈”/0.1s”〈〈endl;break; caseOut:cout<〈Time<〈'\t'<〈e。ClinetID<〈”號乘客走出電梯"〈〈endl;break; caseIn:cout〈<Time〈<’\t’〈<e。ClinetID<<”號乘客走進電梯,要去第”〈<e。Outfloor<〈"層"<〈endl;break; default:break; };//switch#endif}StatusCreatClient(Client*&p){ //生成新的乘客 intd; p=newClient; if(!p)returnOVERFLOW; p—>ClinetID=++ID; //ut<<ID; cout〈〈"所在樓層:"; //ut<〈e.Infloor<<'\n’; cout〈〈ID;cout〈<"所能容忍的等待時間:”;cin>〉d; p->GivepuTime=d;//產(chǎn)生所能容忍的等待時間 p—〉InTime=Time; cout〈〈”下一乘客要到達的時間:";cin〉〉d; InterTime=d;//產(chǎn)生下一乘客要到達的時間cout〈〈"所要到達的樓層:”;cin〉>d; p-〉Outfloor=d; //產(chǎn)生所要到達的樓層 //該乘客出現(xiàn)的樓層 while((p—〉Infloor=rand()%(Maxfloor+1))==p—〉Outfloor);// cin>〉p-〉Infloor〉>p->Outfloor〉〉InterTime; PrintClientInfo(*p,New); returnOK;}StatusDestoryClient(Client*&p){ //該乘客離開系統(tǒng) deletep; p=NULL; returnOK;}StatusGoAbove(Clientconst&e){ //判斷該乘客是否去往高層 if(e.Outfloor〉e。Infloor)returnTRUE; elsereturnFALSE;}intCInfloor(Clientconst&e){ //返回乘客進入的樓層 returne。Infloor;}intCInTime(Clientconst&e){ //返回乘客進入時間 returne。InTime;}intCOutfloor(Clientconst&e){ //返回乘客進入時間 returne.Outfloor;}#define STACK_INIT_SIZE 10 //存儲空間初始分配量#define STACKINCREMENT 5 //存儲空間分配增量//乘客棧typedef Client *SElemType; typedefstruct{ SElemType *base; //棧底指針,棧不存在時base的值為NULL SElemType *top; //棧頂指針 int stacksize; //當前已分配存儲空間,以元素為單位}ClientStack;//乘客棧的基本操作StatusInitStack(ClientStack&S); //構(gòu)造一個空棧StatusDestroyStack(ClientStack&S); //銷毀棧SStatusClearStack(ClientStack&S); //把S置為空StatusStackEmpty(ClientStackS); //若棧S為空,則返回TRUE,否則返回FALSEintStackLength(ClientStackS); //返回棧S的長度StatusGetTop(ClientStackS,SElemType&e); //返回棧頂元素StatusPush(ClientStack&S,SElemTypee); //入棧StatusPop(ClientStack&S,SElemType&e); //出棧voidPrintStack(ClientStack&S); //輸出棧StatusInitStack(ClientStack&S){ //構(gòu)造一個空棧 S.base=(SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType)); if(!S。base)returnOVERFLOW; S.top=S。base; S.stacksize=STACK_INIT_SIZE; returnOK;}//InitStackStatusDestroyStack(ClientStack&S){ //銷毀棧S SElemType *p; if(S.base){ for(p=S.base;p<S.top;p++) DestoryClient(*p); free(S.base); } returnOK;}StatusClearStack(ClientStack&S){ //把S置為空 if(!S。base)returnERROR; S.top=S.base; returnOK;}StatusStackEmpty(ClientStackS){ //若棧S為空,則返回TRUE,否則返回FALSE if(S.top==S。base)returnTRUE; else returnFALSE;}intStackLength(ClientStackS){ //返回棧S的長度 returnS.top-S。base;}StatusGetTop(ClientStackS,SElemType&e){ //返回棧頂元素 if(!S.base)returnERROR; e=*(S。top—1); returnOK;}//GetTopStatusPush(ClientStack&S,SElemTypee){ //入棧 if(!S。base)returnERROR; if(S。top-S.base>=S.stacksize){ S.base=(SElemType*)realloc(S.base,(S。stacksize+STACKINCREMENT)*sizeof(SElemType)); if(!S.base)returnOVERFLOW; S。top=S。base+S。stacksize; S。stacksize+=STACKINCREMENT; } *S。top++=e; returnOK;}//PushStatusPop(ClientStack&S,SElemType&e){ //出棧 if(S.top==S.base)returnERROR; e=*(—-S。top); returnOK;}//PopvoidPrintStack(ClientStack&S){ //輸出棧 SElemType*i; i=S.base; while(i〈S.top) cout〈〈(*i++)-〉ClinetID<〈’’;}//電梯類型#include”ClientStack.h"typedefstruct{ intfloor; //電梯所在層 intClientNumber;//電梯內(nèi)人數(shù) EleStatusstatus; //電梯當前狀態(tài) EleStageStage; //電梯運行時期 intCount;//用于電梯計時 intCallUp[Maxfloor+1];//每層的Up按鈕 intCallDown[Maxfloor+1];//每層的Down按鈕 intCallCar[Maxfloor+1];//電梯內(nèi)的目標層按鈕 ClientStack S[Maxfloor+1];//乘客棧,要去不同樓層的人放在不同的棧中}Elevator;//電梯類型基本操作voidInitEle(Elevator&E){ //初始化電梯類型 inti; E.floor=1;//電梯初始停在第一層 E。status=Waiting;E.Count=OverTime; E.Stage=Down; E.ClientNumber=0; for(i=0;i<=Maxfloor;i++){ E.CallUp[i]=0;E。CallDown[i]=0;E。CallCar[i]=0; } for(i=0;i〈=Maxfloor;i++)InitStack(E.S[i]);}StatusCountOver(Elevator&E){ //判斷電梯計時是否完成 if(E.Count){ E。Count-—;returnFALSE; } returnTRUE;}voidDestoryEle(Elevator&E){ //銷毀電梯類型 inti; for(i=0;i<=Maxfloor;i++)DestroyStack(E.S[i]);}intEleFloor(Elevatorconst&E){ //返回電梯所在的層 returnE.floor;}EleStatusEleStatus(Elevatorconst&E){ //返回電梯狀態(tài) returnE。status;}StatusRequireAbove(Elevatorconst&E){ //判斷是否有高層請求 for(inti=E.floor+1;i〈=Maxfloor;i++) if(E.CallCar[i]||E.CallDown[i]||E.CallUp[i])returnTRUE; returnFALSE;}StatusRequireBelow(Elevatorconst&E){ //判斷是否有低層請求 for(inti=E.floor-1;i〉=Minfloor;i--) if(E.CallCar[i]||E.CallDown[i]||E.CallUp[i])returnTRUE; returnFALSE;}StatusEleAchieved(Elevator&E){ //判斷電梯是否要停于當前層 if(E。CallCar[E.floor])returnTRUE; if(E.Stage==Up&&E.CallUp[E.floor]||E。Stage==Down&&E。CallDown[E。floor]) returnTRUE; if(E.Stage==Up&&E。CallDown[E。floor]&&!RequireAbove(E)){ E。Stage=Down;returnTRUE; } if(E。Stage==Down&&E.CallUp[E.floor]&&!RequireBelow(E)){ E。Stage=Up;returnTRUE; } returnFALSE;}StatusEleOpenDoor(Elevator&E){ //判斷電梯是否要開門 if(E。CallCar[E。floor]||E.CallDown[E。floor]&&E。Stage==Down||E。CallUp[E.floor]&&E。Stage==Up) returnTRUE; if(E.status==Waiting){ if(E。CallDown[E。floor]){E。Stage=Down;returnTRUE;} if(E.CallUp[E。floor]){E.Stage=Up;returnTRUE;} } returnFALSE;}EleStageEleDecide(Elevator&E){ //判斷電梯動作 intAbove,Below; Above=RequireAbove(E); Below=RequireBelow(E); //無請求則停止 if(Above==0&&Below==0)returnStop; //有請求則按請求移動 else{ if(E.Stage==Up){ if(Above!=0)returnUp; else{ E。Stage=Down;returnDown; } }//if else{ if(Below!=0)returnDown; else{ E。Stage=Up;returnUp; } }//if }}ActionElevatorRun(Elevator&E){ //電梯狀態(tài)轉(zhuǎn)換 switch(E。status){ caseOpening: //完成開門則轉(zhuǎn)入Opened狀態(tài) E。status=Opened;E.Count=CloseTest; returnDoorOpened; caseOpened: //進行關(guān)門測試 if(E.Stage==Down&&!E.CallCar[E.floor]&&!E。CallDown[E。floor]|| E.Stage==Up&&!E。CallCar[E。floor]&&!E。CallUp[E。floor]){//無人進出,關(guān)門 E。status=Closing;E。Count=DoorTime; }//if break; caseClosing: //完成關(guān)門則轉(zhuǎn)入Closed狀態(tài) E。status=Closed; returnDoorClosed; caseWaiting: //不在第一層且超出所規(guī)定的停候時間,電梯向第一層移動 if(E.Count==0){ if(E。floor!=1)E。CallCar[1]=1; } elseE。Count——; //如果有人可以進入,則開門 if(EleOpenDoor(E)){ E.status=Opening;E。Count=DoorTime;break; } caseClosed: //根據(jù)EleDecide的返回值設定電梯狀態(tài) switch(EleDecide(E)){ caseUp:E。status=Moving;E。Count=UpTime+Accelerate;returnGoingUp; caseDown:E.status=Moving;E.Count=DownTime+Accelerate;returnGoingDown; caseStop:if(E。status!=Waiting){E。status=Waiting;E.Count=OverTime;} };//switch break; caseMoving: //完成移動 if(E。Stage==Up)E.floor++; else E.floor-—; if(EleAchieved(E)){//到達目標層,轉(zhuǎn)入減速狀態(tài) E.status=Decelerate; E.Count=DownDecelerate; } elseE。Count+=DownTime;//未到達目標層,繼續(xù)下降 returnAchieved; caseDecelerate: //完成減速 //確定正確的電梯時期 if(E.Stage==Up&&!E。CallUp[E。floor]&&!RequireAbove(E))E.Stage=Down; elseif(E.Stage==Down&&!E。CallDown[E.floor]&&!RequireBelow(E))E.Stage=Up; //轉(zhuǎn)到開門狀態(tài) E。status=Opening;E.Count=DoorTime; break; };//switch returnNone;}//ElevatorRun//單鏈隊列-—隊列的鏈式存儲結(jié)構(gòu)typedefClient*QElemType;//等候隊列typedefstructQNode{ QElemType data; structQNode *next;}QNode,*QueuePtr;typedefstruct{ QueuePtr front; //隊頭指針 QueuePtr rear; //隊尾指針}WQueue;//等待隊列的基本操作StatusInitQueue(WQueue&Q){ //構(gòu)造一個空隊列Q Q。front=Q.rear=newQNode; if(!Q.front)returnOVERFLOW;//分配存儲失敗 Q.front—〉next=NULL; Q.front—>data=NULL; returnOK;}StatusDestroyQueue(WQueue&Q){ //銷毀隊列Q while(Q.front){ Q.rear=Q。front—>next; if(Q。front->data)DestoryClient(Q。front->data); deleteQ。front; Q.front=Q。rear; } returnOK;}StatusEnQueue(WQueue&Q,QElemTypee){ //插入元素e為Q的新的隊尾元素 QueuePtrp; p=newQNode; if(!p)returnOVERFLOW; p-〉data=e;p->next=NULL; Q.rear—〉next=p; Q。rear=p; returnOK;}StatusDeQueue(WQueue&Q,QElemType&e){ //若隊列不空,則刪除Q的隊頭元素,用e返回其值,并返回OK; //否則返回ERROR QueuePtrp; if(Q。front==Q。rear)returnERROR; p=Q.front—>next; e=p->data; Q.front—>next=p->next; if(Q。rear==p)Q。rear=Q.front; deletep; returnOK;}StatusQueueEmpty(WQueueQ){ //判斷隊列是否為空 if(Q。front==Q.rear)returnTRUE; else returnFALSE;}StatusQDelNode(WQueue&Q,QueuePtrp){ //刪除隊列中p指向的結(jié)點的下一個結(jié)點 QueuePtrq; if(p==NULL||p—>next==NULL)returnERROR; q=p-〉next; p-〉next=q—〉next; if(p-〉next==NULL)Q.rear=p; DestoryClient(q-〉data); deleteq; returnOK;}StatusCGiveUp(WQueue&Q,intfloor){ //刪除放棄等待的乘客 QueuePtrp; p=Q。front; if(p—〉next!=NULL) if(p->next-〉data->GivepuTime==0&&floor!=p-〉next—〉data—〉Infloor){ PrintClientInfo(*(p->next—〉data),GiveUp); TotalTime+=Time—CInTime(*(p—>next->data)); QDelNode(Q,p);//將放棄等待的人刪除 GiveUpNumber++; } else p—〉next->data-〉GivepuTime——; returnOK;}voidPrintQueue(WQueueQ){ //輸出隊列 QueuePtrq; intcount=0; if(Q.front-〉next==NULL)gotoend; q=Q.front—〉next; while(q!=NULL){ cout<<setw(3)〈〈q->data-〉ClinetID〈〈'’; q=q-〉next; count++; }end: while(count++<=4)cout〈<””;}#include"main。h"#include"Client.h"#include”wqueue.h”#include”Elevator.h”voidInOut(Elevator&E,WQueuew[Maxfloor+1][2]){ //進行乘客的進出電梯活動 //注意:電梯時期要正確,否則乘客無法進入. Client*p; if(E。CallCar[E.floor])//人要從電梯中走出 if(StackEmpty(E.S[E.floor]))E。CallCar[E.floor]=0; else{//當前層的乘客棧非空,出電梯 Pop(E.S[E.floor],p);E。ClientNumber—-; InOutCount=InOutTime; PrintClientInfo(*p,Out); TotalTime+=Time-CInTime(*p); DestoryClient(p); }//else if(E.CallCar[E.floor]==0)//有人要走入電梯 if(!QueueEmpty(w[E。floor][E.Stage])){//若隊列不空,繼續(xù)進電梯 DeQueue(w[E.floor][E。Stage],p); Push(E。S[COutfloor(*p)],p); if(E。CallCar[COutfloor(*p)]!=1){ //按下要去樓層的按鈕 E.CallCar[COutfloor(*p)]=1; } E.ClientNumber++; InOutCount=InOutTime; PrintClientInfo(*p,In); }//if else{//乘客的進出活動已完成 if(E.Stage==Down)E。CallDown[E。floor]=0;//將相應的下降按鈕取消 elseE.CallUp[E。floor]=0;//將相應的上升按鈕取消 }}voidNewClient(Elevator&E,WQueuew[5][2]){ //進入新乘客 Client*p; CreatClient(p);//新的乘客 //將該乘客插入相應隊列并按下相應按鈕(Up/Down) if(GoAbove(*p)){ EnQueue(w[CInfloor(*p)][Up],p);E.CallUp[CInfloor(*p)]=1; } else{ EnQueue(w[CInfloor(*p)][Down],p);E.CallDown[CInfloor(*p)]=1; }//else}/**********************************************************/voidPrint(Elevator&E,Actiona){ //輸出電梯動作信息 switch(a){ caseDoorOpened: cout<〈Time〈〈"\t電梯門已打開"<<endl;break; caseDoorClosed: cout<<Time<〈”\t電梯門已關(guān)閉"〈
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 親子體驗零售空間企業(yè)制定與實施新質(zhì)生產(chǎn)力項目商業(yè)計劃書
- 冷凍饅頭拓展行業(yè)跨境出海項目商業(yè)計劃書
- 逆向物流處理企業(yè)制定與實施新質(zhì)生產(chǎn)力項目商業(yè)計劃書
- 數(shù)字化金融消費者權(quán)益保護平臺行業(yè)深度調(diào)研及發(fā)展項目商業(yè)計劃書
- 路沿石施工協(xié)議書
- 互聯(lián)網(wǎng)金融監(jiān)管技術(shù)行業(yè)跨境出海項目商業(yè)計劃書-20250408-160922
- 帶收款委托協(xié)議書
- 高溫窯車隔熱耐火底板行業(yè)深度調(diào)研及發(fā)展項目商業(yè)計劃書
- 女人甩離婚協(xié)議書
- 索道游客運輸行業(yè)跨境出海項目商業(yè)計劃書
- 食品產(chǎn)業(yè)園區(qū)規(guī)劃設計方案案例
- 《分布式計算、云計算與大大數(shù)據(jù)》習題參考解答
- 教師讀書記錄表
- 中心靜脈導管(CVC)維護操作流程
- 巖溶處理監(jiān)理細則
- 走進舞蹈藝術(shù)-首都師范大學中國大學mooc課后章節(jié)答案期末考試題庫2023年
- 市容秩序輔助管理投標方案
- 單位工程的施工組織設計的編制實訓
- 上海交通大學醫(yī)學院病理生理學習題集
- 學生騎摩托車安全承諾書范本
- 河北永洋特鋼集團有限公司產(chǎn)業(yè)重組、退城搬遷、裝備升級建設項目環(huán)境影響報告
評論
0/150
提交評論