




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告第5頁,共頁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é)
2、構(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)盡量利用
3、已有的標(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)出層,即是電梯 的
4、“本壘層”,電梯“空閑”時(shí),將來該層候命。五個(gè)樓層從下到上的編號(hào)為:0、1、2、3、4。除了地下層外,每一層都有一個(gè)要求向下的按鈕除了第四層外,每一層都有一個(gè)要求向上的按鈕。 對(duì)應(yīng)的變量為:CallUp0.3和CallDown1.4。電梯內(nèi)的五個(gè)目標(biāo)層按鈕對(duì)應(yīng)的變量為: CallCar0.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è)能容忍的最長等待時(shí)間,一旦等候
5、電梯時(shí)間過長,他將放棄。對(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)變量為EleStack04。(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í)間超過 300
6、t,則駛回1層候命。(5) 、按時(shí)序顯示系統(tǒng)狀態(tài)的變化過程:發(fā)生的全部人和電梯的動(dòng)作序列。 二概要設(shè)計(jì)1、乘客類型 反映乘客的所有屬性。ADT Clie nt數(shù)據(jù)對(duì)象:D=a乘客信息,1=1,2,n,n > 0 數(shù)據(jù)關(guān)系:R=<a-1 ,ai>|a/,a i D,i=2,n 基本操作:Prin tClie ntln fo(Clie nt const & e,Clie ntStatus s) 操作結(jié)果:輸出乘客信息。CreatClie nt(Clie nt *&p)操作結(jié)果:生成新的乘客。DestoryClie nt(Clie nt *&p) 操作結(jié)果:
7、該乘客離開系統(tǒng)。GoAbove(Clie nt co nst &e) 操作結(jié)果:判斷該乘客是否去往高層。CIn floor(Clie nt const &e) 操作結(jié)果:返回乘客進(jìn)入的樓層。CIn Time(Clie nt const &e) 操作結(jié)果:返回乘客進(jìn)入時(shí)間。COutfloor(Clie nt const &e)操作結(jié)果:返回乘客進(jìn)入時(shí)間。2、乘客棧類型電梯內(nèi)的乘客用乘客棧表示,去不同樓層的乘客放在不同的棧中。ADT Estack數(shù)據(jù)對(duì)象:D=a乘客信息,1=1,2,n,n > 0數(shù)據(jù)關(guān)系:R=<a-i ,ai>|a/,a i D,
8、i=2,n基本操作: 略。3、等候隊(duì)列類型在電梯外等待的乘客用等待隊(duì)列表示。每層各有兩個(gè)等待隊(duì)列,分別為上樓隊(duì)列和 下樓隊(duì)列。與一般隊(duì)列不同的是在基本操作中加入了放棄操作CGiveUp(WQueue & Q,i ntfloor)。4、電梯類型表示電梯的各個(gè)屬性和所有動(dòng)作。ADT Elevator數(shù)據(jù)對(duì)象:D=a 電梯信息,1=1,2,n,n > 0基本操作:In itEle(Elevator &E) 操作結(jié)果:初始化電梯類型。DestoryEle(Elevator &E)操作結(jié)果:銷毀電梯類型。EleDecide(Elevator & E,WQueue w
9、Maxfloo r+12) 操作結(jié)果:電梯動(dòng)作決策。ElevatorRu n(Elevator & E,WQueue wMaxflo o葉 12) 操作結(jié)果:電梯狀態(tài)轉(zhuǎn)換。Cou ntOver(Elevator &E)操作結(jié)果:判斷電梯計(jì)時(shí)是否完成。EleFloor(Elevator const &E) 操作結(jié)果:返回電梯所在的層。EleStatus(Elevator const &E)操作結(jié)果:返回電梯狀態(tài)。RequireAbove(Elevator const &E)操作結(jié)果:判斷是否有高層請(qǐng)求。RequireBelow(Elevator const
10、 &E)操作結(jié)果:判斷是否有低層請(qǐng)求。EleAchieved(Elevator &E)操作結(jié)果:判斷電梯是否要停于當(dāng)前層。EleOpe nDoor(Elevator &E) 操作結(jié)果:判斷電梯是否要開門。5、高樓模塊實(shí)現(xiàn)電梯和乘客之間的互交功能。包括:InO ut(Elevator &E,WQueue wMaxfloor+12)操作結(jié)果:進(jìn)行乘客的進(jìn)出電梯活動(dòng)。NewClie nt(Elevator & E,WQueue w52)操作結(jié)果:進(jìn)入新乘客。Prin tStatus(Elevator & E,WQueue w52)操作結(jié)果:輸出當(dāng)前狀態(tài)
11、。Print(Elevator &E,Action a)操作結(jié)果:輸出電梯動(dòng)作信息。6、主程序主程序主要處理兩類事件:乘客事件和電梯事件。除此之外,主程序還處理各個(gè)模塊的 初始化和銷毀工作,以及電梯狀態(tài)的輸出。乘客事件包括新乘客到達(dá)事件,乘客放棄等待事件,乘客進(jìn)出電梯事件。電梯事件包括電梯運(yùn)行事件。7、本程序包含6個(gè)模塊:(1)主程序模塊(2)乘客模塊(3)乘客棧模塊(4)電梯模塊(5)等待隊(duì)列模塊(6)高樓模塊:實(shí)現(xiàn)電梯和乘客之間的互交各模塊之間的調(diào)用關(guān)系如下:三詳細(xì)設(shè)計(jì)所有常量,全局變量和類型定義#defi ne NULL0/空指針#defi ne TRUE1#defi ne FA
12、LSE0#defi ne OK1#defi ne ERROR0#defi ne INFEASIBLE -1#defi ne OVERFLOW -2#defi ne INT_MAX 32767/Status是函數(shù)類型,其值是函數(shù)結(jié)果狀態(tài)代碼typedef int Status;#defi ne Empty 0/電梯狀態(tài)enum EleStatusOpe nin g,Ope ned,Closi ng,Closed,Movi ng,Decelerate,Waiti ng; enum Actio nDoorOpe ned,DoorClosed,Goi ngUp,Goi ngDow n, Achieve
13、d,N on e;enumEleStageUp,Dow n. Ope nDoor,Stop;en umClie ntStatusNew,GiveUp,l n,O ut,Fi nish;#defi ne CloseTest 40/電梯關(guān)門測(cè)試時(shí)間#define OverTime 300 /電梯停候超時(shí)時(shí)間#defi ne Accelerate 15/ 加速時(shí)間#defi ne UpTime 51 / 上升時(shí)間#defi ne Dow nTime 61/ 下降時(shí)間#defi ne UpDecelerate 14 / 上升減速#defi ne Down Decelerate 23#defi ne D
14、oorTime #defi ne InO utTime #define Maxfloor #defi ne Min floor 0下降減速 20 開門關(guān)門時(shí)間 25 進(jìn)出電梯時(shí)間 4最高層/最低層long Time=0; / 時(shí)鐘long MaxTime;/系統(tǒng)運(yùn)行最長時(shí)間int In OutCo un t=0;/用于進(jìn)出計(jì)時(shí)int In terTime=0;/下一乘客進(jìn)入系統(tǒng)的時(shí)間int ID=0;乘客編號(hào)int GiveUpNumber=0;乘客放棄的數(shù)目int TotalTime=0;/總共等待時(shí)間部分重要操作的算法:1、判斷運(yùn)動(dòng)方向函數(shù) EleDecide的算法:2、 統(tǒng)計(jì)高層和低層的
15、請(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的算法:1. 該層的CallCar為1;2. 該層在上升(下降)期有上升(下降)請(qǐng)求(判斷 CallUp或CallDown);3. 上升(下降)期高(低)層沒有請(qǐng)求而該層由下降(上升)請(qǐng)求,要轉(zhuǎn)換運(yùn)行時(shí)期。 判斷電梯動(dòng)作函數(shù)ElevatorRun的算法:1. 若電梯在Opening狀態(tài),則轉(zhuǎn)至 Opene
16、d狀態(tài)。2. 若電梯在Opened狀態(tài),若無人進(jìn)出,則轉(zhuǎn)至 Closing狀態(tài)。3. 若電梯在Closed狀態(tài),則根據(jù)電梯請(qǐng)求情況轉(zhuǎn)至相應(yīng)狀態(tài)。4. 若電梯在Closing狀態(tài),則轉(zhuǎn)至 Closed狀態(tài)。5. 若電梯在Moving狀態(tài),若達(dá)到目標(biāo)層,則轉(zhuǎn)至 Decelerate狀態(tài)。否則,繼 續(xù)移動(dòng)。6. 若電梯在Decelerate狀態(tài),則設(shè)定電梯時(shí)期,并轉(zhuǎn)至 Opening狀態(tài)。7. 若電梯在Waiting狀態(tài),在判斷是否等待超時(shí),若超時(shí)則向第一層移動(dòng)。否數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告第6頁,共 頁 貝判斷電梯請(qǐng)求情況并轉(zhuǎn)至相應(yīng)狀態(tài)。四設(shè)計(jì)與調(diào)試分析在本程序中如何判斷電梯的動(dòng)作最為關(guān)鍵。此外,合理劃
17、分各個(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)行
18、時(shí)間,貝恠時(shí)間到達(dá)時(shí)即可退出系統(tǒng)。由于開始為 了簡(jiǎn)化程序而定義了很多變量,結(jié)果發(fā)現(xiàn)并不實(shí)際,有的變量僅是在某些函數(shù)中賦予其值罷了, 于是就將這些變量刪除,比如開始按照提示設(shè)置了D1表示人們正在進(jìn)出電梯等等。由于將程序分塊,將不同部分寫入不同源文件中,這樣出錯(cuò)后便于查找及修改,這是分模塊 的優(yōu)點(diǎn)之一也是編寫和調(diào)試的一個(gè)小技巧。五用戶手冊(cè)程序運(yùn)行后輸入程序的運(yùn)行時(shí)間,電梯開始運(yùn)行。在本設(shè)計(jì)中,用04分別表示地下一樓至四樓,用戶只要按照提示依次輸入正確的數(shù)值,每次按 下回車鍵即認(rèn)為已經(jīng)輸入信息。此后只需等待系統(tǒng)自行進(jìn)行處理,若未顯示乘客放棄乘坐電梯即 認(rèn)為該乘客已達(dá)目的樓層。此間程序會(huì)一直運(yùn)行到開始
19、時(shí)輸入的運(yùn)行時(shí)間,此時(shí)整個(gè)程序運(yùn)行結(jié) 束,按任意鍵退出。此操作可參考測(cè)試成果中的效果圖。六測(cè)試成果從測(cè)試結(jié)果看,乘客放棄數(shù)的大小和平均等待時(shí)間的長短還與乘客出現(xiàn)的密度和乘客的平均 容忍時(shí)間有關(guān)系。數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告第11頁,共頁F乘客男斤要到達(dá)瓦*宀H0夕號(hào)乘客進(jìn)入菱零0逍乘蓉放棄導(dǎo)持,等730/0-1対人進(jìn)入索統(tǒng),共3人放棄。直均等待時(shí)間為,10ress anu key to continue.七附錄(源程序清單)#i nclude <stdlib.h>#i nclude <iostream.h> #i nclude <ioma nip.h> #i nc
20、lude <stdio.h>#i nclude <win dows.h> #in clude vconi o.h>#in clude <time.h>所有常量,全局變量和類型定義#0/空指針#defi ne TRUE1#defi ne FALSE0#defi ne OK1#defi ne ERROR0#defi ne INFEASIBLE -1#defi ne OVERFLOW -2#defi ne INT_MAX 32767/Status是函數(shù)類型,其值是函數(shù)結(jié)果狀態(tài)代碼typedef int Status;#defi ne Empty 0/電梯狀態(tài)
21、enum EleStatusOpe nin g,Ope ned,Closi ng,Closed,Movi ng,Decelerate,Waiti ng; enum Actio nDoorOpe ned,DoorClosed,Goi ngUp,Goi ngDow n. Achieved,” on e; enum EleStageUp,Dow n, Ope nDoor,Stop;en um Clie ntStatusNew,GiveUp,l n,O ut,Fi ni sh;#defi ne CloseTest 40/電梯關(guān)門測(cè)試時(shí)間#define OverTime 300 /電梯停候超時(shí)時(shí)間#de
22、fi ne Accelerate 15/ 加速時(shí)間#defi ne UpTime 51 / 上升時(shí)間#defi ne Dow nTime 61/ 下降時(shí)間#defi ne UpDecelerate 14 / 上升減速#define DownDecelerate 23 下降減速#defi ne DoorTime #defi ne InO utTime#define Maxfloor #defi ne Min floor 020 開門關(guān)門時(shí)間25 進(jìn)出電梯時(shí)間4最高層/最低層long Time=0; / 時(shí)鐘long MaxTime;/系統(tǒng)運(yùn)行最長時(shí)間 int In OutCo un t=0;/用
23、于進(jìn)出計(jì)時(shí) int In terTime=0;/下一乘客進(jìn)入系統(tǒng)的時(shí)間 int ID=0;乘客編號(hào)int GiveUpNumber=O;乘客放棄的數(shù)目 int TotalTime=0;/總共等待時(shí)間乘客類型typedef struct int Cli netID; / 乘客編號(hào)int Outfloor; / 去哪層int In Time; 該乘客進(jìn)入時(shí)間int GivepuTime; 所能容忍的等待時(shí)間 int In floor;/乘客進(jìn)入的樓層Clie nt;乘客類型基本操作void Prin tClie ntln fo(Clie nt const & e,Clie ntStatus
24、 s) /輸出乘客信息#if !testswitch(s) case New:coutv<Timevv't'vve.ClinetIDvv"號(hào)乘客進(jìn)入第"<<e.Infloor<<"層"<<endl;break;case GiveUp:coutv<Timevv"t"vve.Cli netIDvv"號(hào)乘客放棄等待,等待了 "«Time-e.l nTime<v"/0.1s"vve ndl;break;case Out:co
25、utv<Timevv't'vve.ClinetIDvv"號(hào)乘客走出電梯"<<endl;break;case In:cout<vTimevv't'v<e.ClinetIDvv"號(hào)乘客走進(jìn) 電梯,要去第"vve.Outfloorvv"層 "<<e ndl;break;default:break;/switch#en difStatus CreatClie nt(Clie nt *&p) /生成新的乘客int d;p=new Clie nt;if(!p) re
26、turn OVERFLOW;p->Cli netlD=+ID;/utvvID;coutvv"所在樓層:"/utvve .In floorvv'n'coutvvlD;coutvv"所能容忍的等待時(shí)間:"cin>>d;p->GivepuTime=d;產(chǎn)生所能容忍的等待時(shí)間p->I nTime=Time;coutvv"下一乘客要到達(dá)的時(shí)間:"cin>>d;In terTime=d;/產(chǎn)生下一乘客要到達(dá)的時(shí)間coutvv"所要到達(dá)的樓層:"cin»d;p-
27、>Outfloor=d; /產(chǎn)生所要到達(dá)的樓層/該乘客出現(xiàn)的樓層while(p->I nfloor=ra nd()%(Maxfloo r+1)=p->Outfloor);/cin> >p->ln floor>>p->Outfloor >>ln terTime;Prin tClie ntl nfo(*p,New);return OK;Status DestoryClie nt(Clie nt *&p) /該乘客離開系統(tǒng)delete p;p=NULL;return OK;Status GoAbove(Clie nt cons
28、t &e) 判斷該乘客是否去往咼層if(e.Outfloor>e. In floor) return TRUE;else return FALSE;in t CIn floor(Clie nt co nst &e) /返回乘客進(jìn)入的樓層return e.Infloor;in t CIn Time(Clie nt const &e) /返回乘客進(jìn)入時(shí)間return e.I nTime;int COutfloor(Client const &e) /返回乘客進(jìn)入時(shí)間return e.Outfloor;#define STACK_INIT_SIZE 10 /存儲(chǔ)
29、空間初始分配量#defi ne STACKINCREMENT 5 存儲(chǔ)空間分配增量乘客棧typedef Clie nt *SEIemType;typedef struct SElemType *base; 棧底指針,棧不存在時(shí)base的值為NULLSElemType *top;棧頂指針intstacksize; 當(dāng)前已分配存儲(chǔ)空間,以元素為單位Clie ntStack;乘客棧的基本操作Status In itStack(Clie ntStack & S);/構(gòu)造一個(gè)空棧Status DestroyStack(ClientStack &S);銷毀棧SStatus ClearSta
30、ck(Clie ntStack & S);/把S置為空Status StackEmpty(ClientStack S);若棧S為空,則返回TRUE,否則返回FALSEint StackLength(ClientStack S);返回棧S的長度Status GetTop(Clie ntStack S,SElemType & e);/返回棧頂元素Status Push(Clie ntStack & S,SElemType e);/入棧Status Pop(Clie ntStack & S,SElemType & e);/出棧void Prin tStack(
31、Clie ntStack & S);/輸出棧Status InitStack(ClientStack &S) /構(gòu)造一個(gè)空棧S.base=(SEIemType *)malloc(STACK_INIT_SIZE*sizeof(SEIemType); if(!S.base) return OVERFLOW;數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告第11頁,共 頁S.top=S.base;S.stacksize=STACK_INIT_SIZE;return OK;/lni tStackStatus DestroyStack(ClientStack &S) 銷毀棧SSElemType *p;if(
32、S.base) for(p=S.base;p<S.top;p+)DestoryClie nt(*p);free(S.base);return OK;Status ClearStack(Clie ntStack &S) /把S置為空if(!S.base) return ERROR;S.top=S.base;return OK;Status StackEmpty(Clie ntStack S) 若棧S為空,則返回TRUE,否則返回FALSEif(S.top=S.base) return TRUE;elsereturn FALSE;int StackLe ngth(Clie ntSta
33、ck S) /返回棧S的長度return S.top-S.base;Status GetTop(Clie ntStack S,SElemType &e) /返回棧頂元素if(!S.base) return ERROR;e=*(S.top-1);return OK;/GetTopStatus Push(Clie ntStack & S,SElemType e) /入棧if(!S.base) return ERROR;if(S.top-S.base>=S.stacksize) S.base=(SElemType *)realloc(S.base,(S.stacksize+ST
34、ACKINCREMENT)*sizeof(SEIemType) if(!S.base) return OVERFLOW;S.top=S.base+S.stacksize;S.stacksize+=STACKINCREMENT;*S.top+=e;return OK;/Status Pop(Clie ntStack & S,SEIemType &e) /出棧if(S.top=S.base) return ERROR;e=*(-S.top);return OK;/Popvoid Prin tStack(Clie ntStack &S) /輸出棧SElemType *i;i=
35、S.base;while(i<S.top)cout«(*i+)->Cli netIDvv''電梯類型#include "ClientStack.h"typedef struct int floor; /電梯所在層int Clie ntNumber;/ 電梯內(nèi)人數(shù)EleStatus status;/電梯當(dāng)前狀態(tài)EleStage Stage; /電梯運(yùn)行時(shí)期int Cou nt;用于電梯計(jì)時(shí)int CallUpMaxfloor+1;/ 每層的 Up 按鈕int CallDownMaxfloo葉1;/ 每層的 Down 按鈕int CallC
36、arMaxfloo葉1;/電梯內(nèi)的目標(biāo)層按鈕ClientStack SMaxfloo葉1;/乘客棧,要去不同樓層的人放在不同的棧中 Elevator;電梯類型基本操作void InitEle(Elevator &E) /初始化電梯類型int i;E.floor=1;/電梯初始停在第一層E.status=Waiti ng;E.Cou nt=OverTime;E.Stage=Dow n;E.Clie ntNumber=O;for(i=0;i<=Maxfloor;i+) E.CallUpi=O;E.CallDow n i=0;E.CallCari=0;for(i=0;i<=Max
37、floor;i+) In itStack(E.Si);Status Cou ntOver(Elevator &E) 判斷電梯計(jì)時(shí)是否完成if(E.Co unt) E.Cou nt-;return FALSE;數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告第13頁,共 頁return TRUE;void DestoryEle(Elevator &E) /銷毀電梯類型int i;for(i=0;i<=Maxfloor;i+) DestroyStack(E.Si);int EleFloor(Elevator const &E) /返回電梯所在的層return E.floor;EleStatus
38、EleStatus(Elevator const &E) /返回電梯狀態(tài)return E.status;Status RequireAbove(Elevator const &E) 判斷是否有咼層請(qǐng)求for(int i=E.floor+1;i<=Maxfloor;i+)if(E.CallCari|E.CallDow ni|E.CallUpi) return TRUE;return FALSE;Status RequireBelow(Elevator const &E) 判斷是否有低層請(qǐng)求for(int i=E.floor-1;i>=Minfloor;i-)i
39、f(E.CallCari|E.CallDowni|E.CallUpi) return TRUE;return FALSE;Status EleAchieved(Elevator &E) 判斷電梯是否要停于當(dāng)前層if(E.CallCarE.floor) return TRUE;if(E.Stage=Up&&E.CallUpE.floor|E.Stage=Dow n&&E.CallDow n E.floor) return TRUE;if(E.Stage=Up&&E.CallDownE.floor&&!RequireAbove
40、(E) E.Stage=Dow n; retur n TRUE;if(E.Stage=Down&&E.CallUpE.floor&&!RequireBelow(E) E.Stage=Up;return TRUE;return FALSE;Status EleOpe nDoor(Elevator &E) 判斷電梯是否要開門if(E.CallCarE.floor|E.CallDow n E.floor&&E.Stage=Dow n|E.CallUpE.floor&&E.Stage=Up) return TRUE;if(E.st
41、atus=Waiting) if(E.CallDow nE.floor) E.Stage=Dow n; retur n TRUE;數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告第17頁,共 頁if(E.CallUpE.floor) E.Stage=Up;return TRUE;return FALSE;EleStage EleDecide(Elevator &E) 判斷電梯動(dòng)作int Above,Below;Above=RequireAbove(E);Below=RequireBelow(E);/無請(qǐng)求則停止if(Above=0&&Below=0) return Stop;/有請(qǐng)求則按請(qǐng)求移動(dòng)e
42、lse if(E.Stage=Up) if(Above!=0) return Up;else E.Stage=Dow n;retur n Dow n;/ifelse if(Below!=0) retur n Down;else E.Stage=Up;return Up;/ifActio n ElevatorR un( Elevator & E)/電梯狀態(tài)轉(zhuǎn)換switch(E.status) case Opening:完成開門則轉(zhuǎn)入Opened狀態(tài)E.status=Ope ned;E.Co un t=CloseTest;return DoorOpe ned;case Open ed:進(jìn)行
43、關(guān)門測(cè)試無人進(jìn)出,關(guān)門if(E.Stage=Dow n&&!E.CallCarE.floor&&!E.CallDow n E.floor| E.Stage=Up&&!E.CallCarE.floor&&!E.CallUpE.floor) / E.status=Closi ng;E.Co un t=DoorTime;/ifbreak;case Clos ing:完成關(guān)門則轉(zhuǎn)入Closed狀態(tài)E.status=Closed;retur n DoorClosed;case Waiti ng:不在第一層且超出所規(guī)定的停候時(shí)間,電梯向第一層
44、移動(dòng)if(E.Cou nt=O) if(E.floor!=1) E.CallCar1=1;else E.Co un t-;如果有人可以進(jìn)入,則開門if(EleOpenDoor(E) E.status=Ope nin g;E.Co un t=DoorTime;break;case Closed:根據(jù)EleDecide的返回值設(shè)定電梯狀態(tài)switch(EleDecide(E) case Up: E.status=Movi ng;E.Co un t=UpTime+Accelerate;return Goi ngUp;case Down: E.status=Movi ng;E.Co un t=Dow
45、nTime+Accelerate;return Goi ngDow n;case Stop:if(E.status!=Waiti ng) E.status=Waiti ng;E.Co un t=OverTime;/switchbreak;case Moving:完成移動(dòng)if(E.Stage=Up) E.floo 葉+;elseE.floor-;if(EleAchieved(E) /到達(dá)目標(biāo)層,轉(zhuǎn)入減速狀態(tài) E.status=Decelerate;E.Co un t=Dow nDecelerate;else E.Cou nt+=Dow nTime;/未到達(dá)目標(biāo)層,繼續(xù)下降retur n Achi
46、eved;case Decelerate:完成減速確定正確的電梯時(shí)期if(E.Stage=Up&&!E.CallUpE.floor&&!RequireAbove(E) E.Stage=Down;else if(E.Stage=Down&&!E.CallDownE.floor&&!RequireBelow(E) E.Stage=Up;轉(zhuǎn)到開門狀態(tài)E.status=Ope nin g;E.Co un t=DoorTime;break;/switchreturn None;/ElevatorR un單鏈隊(duì)列一一隊(duì)列的鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)type
47、def Clie nt *QEIemType;等候隊(duì)列typedef struct QNode QElemType data;struct QNode *n ext;QNode,*QueuePtr;typedef struct 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告第21頁,共頁QueuePtr front; / 隊(duì)頭指針QueuePtr rear;/ 隊(duì)尾指針WQueue;等待隊(duì)列的基本操作Status Ini tQueue(WQueue &Q) /構(gòu)造一個(gè)空隊(duì)列QQ.fron t=Q.rear =new QNode;if(!Q.front) return OVERFLOW;/ 分配存儲(chǔ)失敗Q.fro
48、 nt-> next=NULL;Q.fro nt->data=NULL;return OK;Status DestroyQueue(WQueue &Q) 銷毀隊(duì)列Qwhile(Q.fro nt) Q.rear=Q.fr on t- >n ext;if(Q.front->data) DestoryClient(Q.front->data);delete Q.fro nt;Q.fro nt=Q.rear;return OK;Status En Queue(WQueue & Q,QEIemType e) 插入元素e為Q的新的隊(duì)尾元素QueuePtr p;
49、p=new QNode;if(!p) return OVERFLOW;p->data=e;p->n ext=NULL;Q.rear- >n ext=p;Q.rear=p;return OK;Status DeQueue(WQueue & Q,QElemType &e) 若隊(duì)列不空,則刪除Q的隊(duì)頭元素,用e返回其值,并返回0K;否貝U返回ERRORQueuePtr p;if(Q.fro nt=Q.rear) return ERROR;p=Q.fr ont->n ext;e=p->data;Q.front->n ext=p->n ext;i
50、f(Q.rear=p) Q.rear=Q.fro nt;delete p;return OK;Status QueueEmpty(WQueue Q) 判斷隊(duì)列是否為空if(Q.fro nt=Q.rear) return TRUE;else return FALSE;Status QDelNode(WQueue & Q,QueuePtr p) 刪除隊(duì)列中p指向的結(jié)點(diǎn)的下一個(gè)結(jié)點(diǎn)QueuePtr q;if(p=NULL|p->next=NULL) return ERROR; q=p->n ext;p->n ext=q->n ext;if(p->n ext=NU
51、LL) Q.rear=p;DestoryClie nt(q->data);delete q;return OK;Status CGiveUp(WQueue & Q,i nt floor) 刪除放棄等待的乘客QueuePtr p;p=Q.fr ont;if(p-> next!=NULL)if(p->n ext->data->GivepuTime=0&&floor!=p->n ext->data->ln floor) Prin tClie ntI nfo(*(p-> next->data),GiveUp); Tot
52、alTime+=Time-C In Time(*(p->n ext->data); QDelNode(Q,p);將放棄等待的人刪除 GiveUpNumber+;else p->n ext->data->GivepuTime-;return OK;void Prin tQueue(WQueue Q) /輸出隊(duì)列QueuePtr q;int coun t=0;if(Q.fro nt->n ext=NULL) goto end;q=Q.fr on t- >n ext; while(q!=NULL) cout<<setw(3)vvq->dat
53、a->Cli netIDvv'' q=q->n ext;coun t+;數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告第23頁,共 頁end: while(co un t+<=4) cout<<""#i nclude "mai n.h"#in elude "Clie nt.h"#i nclude "wqueue.h"#i nclude "Elevator.h"void In Out(Elevator & E,WQueue wMaxfloo 葉12) 進(jìn)行乘客的進(jìn)出電梯
54、活動(dòng)注意:電梯時(shí)期要正確,否則乘客無法進(jìn)入。Clie nt *p;if(E.CallCarE.floor)/人要從電梯中走出 if(StackEmpty(E.SE.floor) E.CallCarE.floor=0;else /當(dāng)前層的乘客棧非空,出電梯Pop(E.SE.floor,p);E.CIie ntNumber-;In OutCou nt=l nO utTime;Prin tClie ntI nfo(*p,Out);TotalTime+=Time-CI nTime(*p);DestoryClie nt(p);/else if(E.CallCarE.floor=0) / 有人要走入電梯
55、if(!QueueEmpty(wE.floorE.Stage) / 若隊(duì)列不空,繼續(xù)進(jìn)電梯 DeQueue(wE.floorE.Stage,p); Push(E.SCOutfloor(*p),p);if(E.CallCarCOutfloor(*p)!=1) /按下要去樓層的按鈕E.CallCarCOutfloor(*p)=1;E.Clie ntNumbe 葉+;In OutCou nt=l nO utTime; Prin tClie ntIn fo(*p,I n);/ifelse /乘客的進(jìn)出活動(dòng)已完成if(E.Stage=Down) E.CallDownE.floor=0;/ 將相應(yīng)的下降按
56、鈕取消 else E.CallUpE.floor=0;將相應(yīng)的上升按鈕取消void NewClie nt(Elevator & E,WQueue w52) /進(jìn)入新乘客Clie nt *p;CreatClie nt(p); 新的乘客/將該乘客插入相應(yīng)隊(duì)列并按下相應(yīng)按鈕(Up/Dow n) if(GoAbove(*p) En Queue(wCI nfloor(*p)Up,p);E.CallUpCI nfloor(*p)=1;else En Queue(wCI nfloor(*p)Dow n ,p);E.CallDow n CI nfloor(*p)=1;/else/*/void Prin t(Elevator & E,Action a) /輸出電梯動(dòng)作信息switch(a) case DoorOpe ned: cout<vTime<v"t 電梯門已打開"<<endl;break;case DoorClosed: cout<<Time<<"t 電梯門已關(guān)閉"<<endl;break;case
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年學(xué)年工作方案
- 2025年扶貧單位工作方案
- 2025年初三個(gè)人教學(xué)工作方案演講稿
- 重慶城市管理職業(yè)學(xué)院《應(yīng)用中子物理學(xué)》2023-2024學(xué)年第二學(xué)期期末試卷
- 山東省德州市八校2025屆下學(xué)期初三第三次質(zhì)量考評(píng)物理試題含解析
- 湖南農(nóng)業(yè)大學(xué)《藥物分析A實(shí)驗(yàn)》2023-2024學(xué)年第一學(xué)期期末試卷
- 2025年遼寧省葫蘆島市第一中學(xué)高三第一次診斷性考試生物試題文試題含解析
- 微課程的設(shè)計(jì)與應(yīng)用
- 江西省宜春九中2025屆高三廣東六校高考模擬考試物理試題及參考答案含解析
- 滑膜炎超聲診斷
- (二模)哈三中2025年高三學(xué)年第二次模擬考試語文試卷(含答案)
- 甘肅省農(nóng)墾集團(tuán)有限責(zé)任公司招聘生產(chǎn)技術(shù)人員筆試真題2024
- 實(shí)時(shí)數(shù)據(jù)驅(qū)動(dòng)孿生-全面剖析
- 2024年新疆醫(yī)科大學(xué)第八附屬醫(yī)院招聘筆試真題
- 2025年上半年下半年浙江省舟山市港航管理局招聘6人易考易錯(cuò)模擬試題(共500題)試卷后附參考答案
- 2025年中醫(yī)針灸學(xué)主治醫(yī)師-中醫(yī)針灸學(xué)考試題(附答案)
- 老年人安全用藥與護(hù)理
- 黑色三分鐘生死一瞬間第9、10部
- 適老化住宅改造服務(wù)行業(yè)深度調(diào)研及發(fā)展戰(zhàn)略咨詢報(bào)告
- 2025年鄭州黃河護(hù)理職業(yè)學(xué)院?jiǎn)握新殬I(yè)技能測(cè)試題庫及答案1套
- 2025年上半年甘肅省農(nóng)墾集團(tuán)限責(zé)任公司人才招聘380人易考易錯(cuò)模擬試題(共500題)試卷后附參考答案
評(píng)論
0/150
提交評(píng)論