版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
數(shù)據(jù)結(jié)構(gòu)-電梯模擬的報(bào)告數(shù)據(jù)結(jié)構(gòu)-電梯模擬的報(bào)告數(shù)據(jù)結(jié)構(gòu)-電梯模擬的報(bào)告
1.課程設(shè)計(jì)目的1、訓(xùn)練學(xué)生靈活應(yīng)用所學(xué)數(shù)據(jù)結(jié)構(gòu)知識(shí),獨(dú)立完成問題分析,結(jié)合數(shù)據(jù)結(jié)構(gòu)理論知識(shí),編寫程序求解指定問題.2.初步掌握軟件開發(fā)過程的問題分析、系統(tǒng)設(shè)計(jì)、程序編碼、測(cè)試等基本方法和技能;3.提高綜合運(yùn)用所學(xué)的理論知識(shí)和方法獨(dú)立分析和解決問題的能力;4。訓(xùn)練用系統(tǒng)的觀點(diǎn)和軟件開發(fā)一般規(guī)范進(jìn)行軟件開發(fā),鞏固、深化學(xué)生的理論知識(shí),提高編程水平,并在此過程中培養(yǎng)他們嚴(yán)謹(jǐn)?shù)目茖W(xué)態(tài)度和良好的工作作風(fēng)。2.課程設(shè)計(jì)任務(wù)與要求:任務(wù)根據(jù)教材《數(shù)據(jù)結(jié)構(gòu)題集(C語言版)》(嚴(yán)蔚敏、吳偉民主編)選擇課程設(shè)計(jì)題目,要求通過設(shè)計(jì),在數(shù)據(jù)結(jié)構(gòu)的邏輯特性和物理表示、數(shù)據(jù)結(jié)構(gòu)的選擇應(yīng)用、算法的設(shè)計(jì)及其實(shí)現(xiàn)等方面加深對(duì)課程基本內(nèi)容的理解和綜合運(yùn)用。設(shè)計(jì)題目從《數(shù)據(jù)結(jié)構(gòu)題集》“第二篇實(shí)習(xí)篇”中選取,每班每題不得超過2人。另選題:學(xué)生自選課題學(xué)生原則上可以結(jié)合個(gè)人愛好自選課題,要求課題有一定的深度與難度,有一定的算法復(fù)雜性,能夠鞏固數(shù)據(jù)結(jié)構(gòu)課程所學(xué)的知識(shí).學(xué)生自選課題需在17周前報(bào)課程設(shè)計(jì)指導(dǎo)教師批準(zhǔn)方可生效。要求:1、在處理每個(gè)題目時(shí),要求從分析題目的需求入手,按設(shè)計(jì)抽象數(shù)據(jù)類型、構(gòu)思算法、通過設(shè)計(jì)實(shí)現(xiàn)抽象數(shù)據(jù)類型、編制上機(jī)程序和上機(jī)調(diào)試等若干步驟完成題目,最終寫出完整的分析報(bào)告。前期準(zhǔn)備工作完備與否直接影響到后序上機(jī)調(diào)試工作的效率.在程序設(shè)計(jì)階段應(yīng)盡量利用已有的標(biāo)準(zhǔn)函數(shù),加大代碼的重用率。2、.設(shè)計(jì)的題目要求達(dá)到一定工作量(300行以上代碼),并具有一定的深度和難度。3、程序設(shè)計(jì)語言推薦使用C/C++,程序書寫規(guī)范,源程序需加必要的注釋;4、每位同學(xué)需提交可獨(dú)立運(yùn)行的程序;5、每位同學(xué)需獨(dú)立提交設(shè)計(jì)報(bào)告書(每人一份),要求編排格式統(tǒng)一、規(guī)范、內(nèi)容充實(shí),不少于10頁(代碼不算);6、課程設(shè)計(jì)實(shí)踐作為培養(yǎng)學(xué)生動(dòng)手能力的一種手段,單獨(dú)考核。
3.課程設(shè)計(jì)說明書一需求分析(1)、模擬某校五層教學(xué)樓的電梯系統(tǒng).該樓有一個(gè)自動(dòng)電梯,能在每層停留。五個(gè)樓層由下至上依次稱為地下層、第一層、第二層、第三層和第四層,其中第一層是大樓的進(jìn)出層,即是電梯的“本壘層",電梯“空閑”時(shí),將來該層候命。五個(gè)樓層從下到上的編號(hào)為:0、1、2、3、4.除了地下層外,每一層都有一個(gè)要求向下的按鈕除了第四層外,每一層都有一個(gè)要求向上的按鈕。對(duì)應(yīng)的變量為:CallUp[0。。3]和CallDown[1。.4]。電梯內(nèi)的五個(gè)目標(biāo)層按鈕對(duì)應(yīng)的變量為:CallCar[0。.4]。(2)、電梯一共有七個(gè)狀態(tài),即正在開門(Opening)、已開門(Opened)、正在關(guān)門(Closing)、已關(guān)門(Closed)、等待(Waiting)、移動(dòng)(Moving)、減速(Decelerate)。(3)、
乘客可隨機(jī)地進(jìn)出于任何層。對(duì)每個(gè)人來說,他有一個(gè)能容忍的最長(zhǎng)等待時(shí)間,一旦等候電梯時(shí)間過長(zhǎng),他將放棄.對(duì)于在樓層內(nèi)等待電梯的乘客,將插入在等候隊(duì)列里,每一層有兩個(gè)等候隊(duì)列,一隊(duì)要求向上,一隊(duì)要求向下,用鏈隊(duì)列來實(shí)現(xiàn)。對(duì)于在電梯內(nèi)的乘客,用五個(gè)乘客棧來實(shí)現(xiàn),該乘客要去哪一層,就把他放在相應(yīng)編號(hào)的棧中,對(duì)應(yīng)變量為EleStack[0…4]。(4)、模擬時(shí)鐘從0開始,時(shí)間單位為0。1秒.人和電梯的各種動(dòng)作均要耗費(fèi)一定的時(shí)間單位(簡(jiǎn)記為t):有人進(jìn)出時(shí),電梯每隔40t測(cè)試一次,若無人進(jìn)出,則關(guān)門關(guān)門和開門各需要20t每個(gè)人進(jìn)出電梯均需要25t電梯加速需要15t上升時(shí),每一層需要51t,減速需要14t下降時(shí),每一層需要61t,減速需要23t如果電梯在某層靜止時(shí)間超過300t,則駛回1層候命。(5)、按時(shí)序顯示系統(tǒng)狀態(tài)的變化過程:發(fā)生的全部人和電梯的動(dòng)作序列。二概要設(shè)計(jì)乘客類型反映乘客的所有屬性。ADTClient數(shù)據(jù)對(duì)象: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é)果:返回乘客進(jìn)入的樓層。CInTime(Clientconst&e) 操作結(jié)果:返回乘客進(jìn)入時(shí)間。COutfloor(Clientconst&e) 操作結(jié)果:返回乘客進(jìn)入時(shí)間。}乘客棧類型電梯內(nèi)的乘客用乘客棧表示,去不同樓層的乘客放在不同的棧中。ADTEstack數(shù)據(jù)對(duì)象:D={ai∈乘客信息,I=1,2,…,n,n≥0}數(shù)據(jù)關(guān)系:R={<ai—1,ai〉|ai-1,ai∈D,i=2,…,n}基本操作:略。}等候隊(duì)列類型在電梯外等待的乘客用等待隊(duì)列表示。每層各有兩個(gè)等待隊(duì)列,分別為上樓隊(duì)列和下樓隊(duì)列。與一般隊(duì)列不同的是在基本操作中加入了放棄操作CGiveUp(WQueue&Q,intfloor)。電梯類型表示電梯的各個(gè)屬性和所有動(dòng)作.ADTElevator數(shù)據(jù)對(duì)象:D={ai∈電梯信息,I=1,2,…,n,n≥0}基本操作:InitEle(Elevator&E) 操作結(jié)果:初始化電梯類型。DestoryEle(Elevator&E) 操作結(jié)果:銷毀電梯類型.EleDecide(Elevator&E,WQueuew[Maxfloor+1][2]) 操作結(jié)果:電梯動(dòng)作決策。ElevatorRun(Elevator&E,WQueuew[Maxfloor+1][2]){ 操作結(jié)果:電梯狀態(tài)轉(zhuǎn)換。CountOver(Elevator&E) 操作結(jié)果:判斷電梯計(jì)時(shí)是否完成.EleFloor(Elevatorconst&E) 操作結(jié)果:返回電梯所在的層。EleStatus(Elevatorconst&E) 操作結(jié)果:返回電梯狀態(tài)。RequireAbove(Elevatorconst&E) 操作結(jié)果:判斷是否有高層請(qǐng)求。RequireBelow(Elevatorconst&E) 操作結(jié)果:判斷是否有低層請(qǐng)求。EleAchieved(Elevator&E) 操作結(jié)果:判斷電梯是否要停于當(dāng)前層。EleOpenDoor(Elevator&E) 操作結(jié)果:判斷電梯是否要開門。}高樓模塊實(shí)現(xiàn)電梯和乘客之間的互交功能。包括:InOut(Elevator&E,WQueuew[Maxfloor+1][2]) 操作結(jié)果:進(jìn)行乘客的進(jìn)出電梯活動(dòng).NewClient(Elevator&E,WQueuew[5][2]) 操作結(jié)果:進(jìn)入新乘客。PrintStatus(Elevator&E,WQueuew[5][2]) 操作結(jié)果:輸出當(dāng)前狀態(tài)。Print(Elevator&E,Actiona) 操作結(jié)果:輸出電梯動(dòng)作信息。主程序主程序主要處理兩類事件:乘客事件和電梯事件。除此之外,主程序還處理各個(gè)模塊的初始化和銷毀工作,以及電梯狀態(tài)的輸出.乘客事件包括新乘客到達(dá)事件,乘客放棄等待事件,乘客進(jìn)出電梯事件.電梯事件包括電梯運(yùn)行事件。本程序包含6個(gè)模塊:主程序模塊乘客模塊乘客棧模塊電梯模塊等待隊(duì)列模塊高樓模塊:實(shí)現(xiàn)電梯和乘客之間的互交.各模塊之間的調(diào)用關(guān)系如下:主程序主程序電梯模塊乘客棧模塊等待隊(duì)列模塊乘客模塊高樓模塊三詳細(xì)設(shè)計(jì)//所有常量,全局變量和類型定義#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)門測(cè)試時(shí)間#defineOverTime300 //電梯停候超時(shí)時(shí)間#defineAccelerate15 //加速時(shí)間#defineUpTime 51 //上升時(shí)間#defineDownTime61 //下降時(shí)間#defineUpDecelerate14 //上升減速#defineDownDecelerate23 //下降減速#defineDoorTime 20 //開門關(guān)門時(shí)間#defineInOutTime 25 //進(jìn)出電梯時(shí)間#defineMaxfloor 4 //最高層#defineMinfloor 0 //最低層longTime=0; //時(shí)鐘longMaxTime;//系統(tǒng)運(yùn)行最長(zhǎng)時(shí)間intInOutCount=0;//用于進(jìn)出計(jì)時(shí)intInterTime=0;//下一乘客進(jìn)入系統(tǒng)的時(shí)間intID=0; //乘客編號(hào)intGiveUpNumber=0;//乘客放棄的數(shù)目intTotalTime=0;//總共等待時(shí)間部分重要操作的算法:1、判斷運(yùn)動(dòng)方向函數(shù)EleDecide的算法:2、統(tǒng)計(jì)高層和低層的請(qǐng)求(不包括當(dāng)前層)。3、高層和低層均無請(qǐng)求:發(fā)出Stop命令。4、否則,1)若電梯在上升期:1。若有高層請(qǐng)求:上升;2.若無高層請(qǐng)求:轉(zhuǎn)下降期,下降。2)若電梯在下降期:1.若有低層請(qǐng)求:下降;2。若無有低層請(qǐng)求:轉(zhuǎn)上升期,上升。判斷電梯是否要停于當(dāng)前層函數(shù)EleAchieved的算法:該層的CallCar為1;該層在上升(下降)期有上升(下降)請(qǐng)求(判斷CallUp或CallDown);上升(下降)期高(低)層沒有請(qǐng)求而該層由下降(上升)請(qǐng)求,要轉(zhuǎn)換運(yùn)行時(shí)期。判斷電梯動(dòng)作函數(shù)ElevatorRun的算法:若電梯在Opening狀態(tài),則轉(zhuǎn)至Opened狀態(tài).若電梯在Opened狀態(tài),若無人進(jìn)出,則轉(zhuǎn)至Closing狀態(tài)。若電梯在Closed狀態(tài),則根據(jù)電梯請(qǐng)求情況轉(zhuǎn)至相應(yīng)狀態(tài)。若電梯在Closing狀態(tài),則轉(zhuǎn)至Closed狀態(tài)。若電梯在Moving狀態(tài),若達(dá)到目標(biāo)層,則轉(zhuǎn)至Decelerate狀態(tài)。否則,繼續(xù)移動(dòng)。若電梯在Decelerate狀態(tài),則設(shè)定電梯時(shí)期,并轉(zhuǎn)至Opening狀態(tài)。若電梯在Waiting狀態(tài),在判斷是否等待超時(shí),若超時(shí)則向第一層移動(dòng)。否則,判斷電梯請(qǐng)求情況并轉(zhuǎn)至相應(yīng)狀態(tài)。四設(shè)計(jì)與調(diào)試分析在本程序中如何判斷電梯的動(dòng)作最為關(guān)鍵。此外,合理劃分各個(gè)模塊和處理各個(gè)模塊之間的聯(lián)系也非常重要.本設(shè)計(jì)中涉及時(shí)間函數(shù)的使用,由于剛開始接觸,這方面的使用相當(dāng)有難度。使用不當(dāng)就容易造成編譯不通過或者運(yùn)行時(shí)發(fā)送錯(cuò)誤報(bào)告。還有在電梯調(diào)度方面不能按照預(yù)定的想法實(shí)現(xiàn),所以和現(xiàn)實(shí)中的電梯有出入.沒有顯示電梯的運(yùn)行到哪里,而是用有乘客進(jìn)入電梯時(shí)顯示乘客進(jìn)入到哪層樓來告知電梯運(yùn)行到幾樓。開門,關(guān)門時(shí)需要精心思考,此處記時(shí)及判斷是否要開門也是難點(diǎn),所以這些看似很平常的動(dòng)作卻是最難也是最容易錯(cuò)的地方。此外在指針的使用方面也是難點(diǎn),很多地方比如乘客進(jìn)隊(duì)出隊(duì)以及放棄乘坐電梯時(shí)均涉及指針的使用,也經(jīng)常在這些地方通不過編譯。為了便于控制循環(huán),設(shè)計(jì)了電梯運(yùn)行時(shí)間,則在時(shí)間到達(dá)時(shí)即可退出系統(tǒng)。由于開始為了簡(jiǎn)化程序而定義了很多變量,結(jié)果發(fā)現(xiàn)并不實(shí)際,有的變量?jī)H是在某些函數(shù)中賦予其值罷了,于是就將這些變量刪除,比如開始按照提示設(shè)置了D1-表示人們正在進(jìn)出電梯等等。由于將程序分塊,將不同部分寫入不同源文件中,這樣出錯(cuò)后便于查找及修改,這是分模塊的優(yōu)點(diǎn)之一也是編寫和調(diào)試的一個(gè)小技巧。五用戶手冊(cè)程序運(yùn)行后輸入程序的運(yùn)行時(shí)間,電梯開始運(yùn)行。在本設(shè)計(jì)中,用0—4分別表示地下一樓至四樓,用戶只要按照提示依次輸入正確的數(shù)值,每次按下回車鍵即認(rèn)為已經(jīng)輸入信息。此后只需等待系統(tǒng)自行進(jìn)行處理,若未顯示乘客放棄乘坐電梯即認(rèn)為該乘客已達(dá)目的樓層.此間程序會(huì)一直運(yùn)行到開始時(shí)輸入的運(yùn)行時(shí)間,此時(shí)整個(gè)程序運(yùn)行結(jié)束,按任意鍵退出。此操作可參考測(cè)試成果中的效果圖。六測(cè)試成果從測(cè)試結(jié)果看,乘客放棄數(shù)的大小和平均等待時(shí)間的長(zhǎng)短還與乘客出現(xiàn)的密度和乘客的平均容忍時(shí)間有關(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)門測(cè)試時(shí)間#defineOverTime300 //電梯停候超時(shí)時(shí)間#defineAccelerate15 //加速時(shí)間#defineUpTime 51 //上升時(shí)間#defineDownTime61 //下降時(shí)間#defineUpDecelerate14 //上升減速#defineDownDecelerate23 //下降減速#defineDoorTime 20 //開門關(guān)門時(shí)間#defineInOutTime 25 //進(jìn)出電梯時(shí)間#defineMaxfloor 4 //最高層#defineMinfloor 0 //最低層longTime=0; //時(shí)鐘longMaxTime;//系統(tǒng)運(yùn)行最長(zhǎng)時(shí)間intInOutCount=0;//用于進(jìn)出計(jì)時(shí)intInterTime=0;//下一乘客進(jìn)入系統(tǒng)的時(shí)間intID=0; //乘客編號(hào)intGiveUpNumber=0;//乘客放棄的數(shù)目intTotalTime=0;//總共等待時(shí)間//乘客類型typedefstruct{ intClinetID; //乘客編號(hào) intOutfloor; //去哪層 intInTime; //該乘客進(jìn)入時(shí)間 intGivepuTime; //所能容忍的等待時(shí)間 intInfloor;//乘客進(jìn)入的樓層}Client;//乘客類型基本操作voidPrintClientInfo(Clientconst&e,ClientStatuss){ //輸出乘客信息#if!test switch(s){ caseNew:cout〈<Time〈<'\t'〈〈e。ClinetID〈〈”號(hào)乘客進(jìn)入第"〈<e。Infloor<〈”層"<<endl;break; caseGiveUp:cout<<Time<〈"\t"<〈e.ClinetID〈<”號(hào)乘客放棄等待,等待了"<〈Time-e.InTime<〈”/0.1s”〈〈endl;break; caseOut:cout<〈Time<〈'\t'<〈e。ClinetID<〈”號(hào)乘客走出電梯"〈〈endl;break; caseIn:cout〈<Time〈<’\t’〈<e。ClinetID<<”號(hào)乘客走進(jìn)電梯,要去第”〈<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〈<"所能容忍的等待時(shí)間:”;cin>〉d; p->GivepuTime=d;//產(chǎn)生所能容忍的等待時(shí)間 p—〉InTime=Time; cout〈〈”下一乘客要到達(dá)的時(shí)間:";cin〉〉d; InterTime=d;//產(chǎn)生下一乘客要到達(dá)的時(shí)間cout〈〈"所要到達(dá)的樓層:”;cin〉>d; p-〉Outfloor=d; //產(chǎn)生所要到達(dá)的樓層 //該乘客出現(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){ //返回乘客進(jìn)入的樓層 returne。Infloor;}intCInTime(Clientconst&e){ //返回乘客進(jìn)入時(shí)間 returne。InTime;}intCOutfloor(Clientconst&e){ //返回乘客進(jìn)入時(shí)間 returne.Outfloor;}#define STACK_INIT_SIZE 10 //存儲(chǔ)空間初始分配量#define STACKINCREMENT 5 //存儲(chǔ)空間分配增量//乘客棧typedef Client *SElemType; typedefstruct{ SElemType *base; //棧底指針,棧不存在時(shí)base的值為NULL SElemType *top; //棧頂指針 int stacksize; //當(dāng)前已分配存儲(chǔ)空間,以元素為單位}ClientStack;//乘客棧的基本操作StatusInitStack(ClientStack&S); //構(gòu)造一個(gè)空棧StatusDestroyStack(ClientStack&S); //銷毀棧SStatusClearStack(ClientStack&S); //把S置為空StatusStackEmpty(ClientStackS); //若棧S為空,則返回TRUE,否則返回FALSEintStackLength(ClientStackS); //返回棧S的長(zhǎng)度StatusGetTop(ClientStackS,SElemType&e); //返回棧頂元素StatusPush(ClientStack&S,SElemTypee); //入棧StatusPop(ClientStack&S,SElemType&e); //出棧voidPrintStack(ClientStack&S); //輸出棧StatusInitStack(ClientStack&S){ //構(gòu)造一個(gè)空棧 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的長(zhǎng)度 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; //電梯當(dāng)前狀態(tài) EleStageStage; //電梯運(yùn)行時(shí)期 intCount;//用于電梯計(jì)時(shí) intCallUp[Maxfloor+1];//每層的Up按鈕 intCallDown[Maxfloor+1];//每層的Down按鈕 intCallCar[Maxfloor+1];//電梯內(nèi)的目標(biāo)層按鈕 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){ //判斷電梯計(jì)時(shí)是否完成 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){ //判斷是否有高層請(qǐng)求 for(inti=E.floor+1;i〈=Maxfloor;i++) if(E.CallCar[i]||E.CallDown[i]||E.CallUp[i])returnTRUE; returnFALSE;}StatusRequireBelow(Elevatorconst&E){ //判斷是否有低層請(qǐng)求 for(inti=E.floor-1;i〉=Minfloor;i--) if(E.CallCar[i]||E.CallDown[i]||E.CallUp[i])returnTRUE; returnFALSE;}StatusEleAchieved(Elevator&E){ //判斷電梯是否要停于當(dāng)前層 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){ //判斷電梯動(dòng)作 intAbove,Below; Above=RequireAbove(E); Below=RequireBelow(E); //無請(qǐng)求則停止 if(Above==0&&Below==0)returnStop; //有請(qǐng)求則按請(qǐng)求移動(dòng) 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: //進(jìn)行關(guān)門測(cè)試 if(E.Stage==Down&&!E.CallCar[E.floor]&&!E。CallDown[E。floor]|| E.Stage==Up&&!E。CallCar[E。floor]&&!E。CallUp[E。floor]){//無人進(jìn)出,關(guān)門 E。status=Closing;E。Count=DoorTime; }//if break; caseClosing: //完成關(guān)門則轉(zhuǎn)入Closed狀態(tài) E。status=Closed; returnDoorClosed; caseWaiting: //不在第一層且超出所規(guī)定的停候時(shí)間,電梯向第一層移動(dòng) if(E.Count==0){ if(E。floor!=1)E。CallCar[1]=1; } elseE。Count——; //如果有人可以進(jìn)入,則開門 if(EleOpenDoor(E)){ E.status=Opening;E。Count=DoorTime;break; } caseClosed: //根據(jù)EleDecide的返回值設(shè)定電梯狀態(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: //完成移動(dòng) if(E。Stage==Up)E.floor++; else E.floor-—; if(EleAchieved(E)){//到達(dá)目標(biāo)層,轉(zhuǎn)入減速狀態(tài) E.status=Decelerate; E.Count=DownDecelerate; } elseE。Count+=DownTime;//未到達(dá)目標(biāo)層,繼續(xù)下降 returnAchieved; caseDecelerate: //完成減速 //確定正確的電梯時(shí)期 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//單鏈隊(duì)列-—隊(duì)列的鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)typedefClient*QElemType;//等候隊(duì)列typedefstructQNode{ QElemType data; structQNode *next;}QNode,*QueuePtr;typedefstruct{ QueuePtr front; //隊(duì)頭指針 QueuePtr rear; //隊(duì)尾指針}WQueue;//等待隊(duì)列的基本操作StatusInitQueue(WQueue&Q){ //構(gòu)造一個(gè)空隊(duì)列Q Q。front=Q.rear=newQNode; if(!Q.front)returnOVERFLOW;//分配存儲(chǔ)失敗 Q.front—〉next=NULL; Q.front—>data=NULL; returnOK;}StatusDestroyQueue(WQueue&Q){ //銷毀隊(duì)列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的新的隊(duì)尾元素 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){ //若隊(duì)列不空,則刪除Q的隊(duì)頭元素,用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){ //判斷隊(duì)列是否為空 if(Q。front==Q.rear)returnTRUE; else returnFALSE;}StatusQDelNode(WQueue&Q,QueuePtrp){ //刪除隊(duì)列中p指向的結(jié)點(diǎn)的下一個(gè)結(jié)點(diǎn) 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){ //輸出隊(duì)列 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]){ //進(jìn)行乘客的進(jìn)出電梯活動(dòng) //注意:電梯時(shí)期要正確,否則乘客無法進(jìn)入. Client*p; if(E。CallCar[E.floor])//人要從電梯中走出 if(StackEmpty(E.S[E.floor]))E。CallCar[E.floor]=0; else{//當(dāng)前層的乘客棧非空,出電梯 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])){//若隊(duì)列不空,繼續(xù)進(jìn)電梯 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{//乘客的進(jìn)出活動(dòng)已完成 if(E.Stage==Down)E。CallDown[E。floor]=0;//將相應(yīng)的下降按鈕取消 elseE.CallUp[E。floor]=0;//將相應(yīng)的上升按鈕取消 }}voidNewClient(Elevator&E,WQueuew[5][2]){ //進(jìn)入新乘客 Client*p; CreatClient(p);//新的乘客 //將該乘客插入相應(yīng)隊(duì)列并按下相應(yīng)按鈕(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){ //輸出電梯動(dòng)作信息 switch(a){ caseDoorOpened: cout<〈Time〈〈"\t電梯門已打開"<<endl;break; caseDoorClosed: cout<<Time<〈”\t電梯門已關(guān)閉"〈
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年餐飲供貨合同協(xié)議書范本
- 合同簽訂即生效 股權(quán)變更避風(fēng)險(xiǎn)
- 組織架構(gòu)及崗位職責(zé)
- 指定汽車維修服務(wù)協(xié)議
- 年度項(xiàng)目可行性研究報(bào)告購買合同
- 勞動(dòng)合同書【鄉(xiāng)鎮(zhèn)企業(yè)】
- 園林苗木購銷合同范本
- 場(chǎng)地游戲安全協(xié)議書經(jīng)典版
- 2024年個(gè)人勞務(wù)協(xié)議書
- 2024股權(quán)轉(zhuǎn)讓合同協(xié)議書范本
- 期中測(cè)試卷-2024-2025學(xué)年統(tǒng)編版語文一年級(jí)上冊(cè)
- 國家基本醫(yī)療保險(xiǎn)、工傷保險(xiǎn)和生育保險(xiǎn)藥品目錄(2023年)
- 人教版一年級(jí)數(shù)學(xué)上冊(cè)《第一、二單元測(cè)試卷》(附答案)
- 人教版二年級(jí)上冊(cè)數(shù)學(xué)計(jì)算題400道
- 供應(yīng)室教學(xué)課件
- 第三單元 測(cè)量(單元測(cè)試)-2024-2025學(xué)年三年級(jí)上冊(cè)數(shù)學(xué)人教版
- 1輸變電工程施工質(zhì)量驗(yàn)收統(tǒng)一表式(線路工程)-2024年版
- 華為年財(cái)務(wù)報(bào)表分析(共16張課件)
- 讓我們一起去追“星”!兩彈一星之核彈老人魏世杰課件高二下學(xué)期愛國主義教育主題班會(huì)
- 2024-2025學(xué)年七年級(jí)生物上冊(cè) 第二單元第一、二章 單元測(cè)試卷( 人教版)
- 人教部編版三年級(jí)上冊(cè)《道德與法治》教案全套
評(píng)論
0/150
提交評(píng)論