



版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院“課程設(shè)計(jì)”項(xiàng)目報(bào)告項(xiàng)目名稱:機(jī)票預(yù)訂信息系統(tǒng)專業(yè):網(wǎng)絡(luò)工程班級:14 網(wǎng)絡(luò)工程班學(xué)號(hào):144221007姓名:彭金濤成績:指導(dǎo)教師:焦翠珍申請日期:2016 年春季學(xué)期湖北科技學(xué)院計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院制項(xiàng)目名稱機(jī)票預(yù)訂信息系統(tǒng)研究起始時(shí)間2016.6.15完成時(shí)間指導(dǎo)教師簡況姓名焦翠珍職稱副教授1所屬教研室計(jì)算機(jī)科學(xué)與技術(shù)課程名稱數(shù)據(jù)庫系統(tǒng)概論設(shè)計(jì)內(nèi)容及要求(由指導(dǎo)教師填寫) :實(shí)施方案及實(shí)施計(jì)劃1、具體研究內(nèi)容、研究目標(biāo)和擬解決的關(guān)鍵問題2、進(jìn)程安排(給出項(xiàng)目實(shí)施的具體分步驟計(jì)劃)21、乘客類型反映乘客的所有屬性。ADT Client數(shù)據(jù)對象: D=a 乘客信息 ,I=
2、1,2,n,n 0i,a>|a,aD,i=2, ,n數(shù)據(jù)關(guān)系: R=<ai-1i-1ii基本操作:PrintClientInfo(Client const &e,ClientStatus s)操作結(jié)果:輸出乘客信息。CreatClient(Client *&p)操作結(jié)果:生成新的乘客。DestoryClient(Client *&p)操作結(jié)果:該乘客離開系統(tǒng)。GoAbove(Client const &e)操作結(jié)果:判斷該乘客是否去往高層。CInfloor(Client const &e)操作結(jié)果:返回乘客進(jìn)入的樓層。CInTime(Clie
3、nt const &e)操作結(jié)果:返回乘客進(jìn)入時(shí)間。COutfloor(Client const &e)操作結(jié)果:返回乘客進(jìn)入時(shí)間。2、乘客棧類型電梯內(nèi)的乘客用乘客棧表示,去不同樓層的乘客放在不同的棧中。ADT Estack數(shù)據(jù)對象: D=ai 乘客信息 ,I=1,2,n,n 0數(shù)據(jù)關(guān)系: R=<ai-1 ,a i >|a i-1 ,a i D,i=2,n基本操作:略。3、等候隊(duì)列類型在電梯外等待的乘客用等待隊(duì)列表示。每層各有兩個(gè)等待隊(duì)列, 分別為上樓隊(duì)列和下樓隊(duì)列。與一般隊(duì)列不同的是在基本操作中加入了放棄操作CGiveUp(WQueue &Q,intflo
4、or)。4、電梯類型表示電梯的各個(gè)屬性和所有動(dòng)作。ADT Elevator數(shù)據(jù)對象: D=ai 電梯信息 ,I=1,2,n,n 0基本操作:InitEle(Elevator &E)操作結(jié)果:初始化電梯類型。3DestoryEle(Elevator &E)操作結(jié)果:銷毀電梯類型。EleDecide(Elevator &E,WQueue wMaxfloor+12)操作結(jié)果:電梯動(dòng)作決策。ElevatorRun(Elevator &E,WQueue wMaxfloor+12)操作結(jié)果:電梯狀態(tài)轉(zhuǎn)換。CountOver(Elevator &E)操作結(jié)果:判斷電梯
5、計(jì)時(shí)是否完成。EleFloor(Elevator const &E)操作結(jié)果:返回電梯所在的層。EleStatus(Elevator const &E)操作結(jié)果:返回電梯狀態(tài)。RequireAbove(Elevator const &E)操作結(jié)果:判斷是否有高層請求。RequireBelow(Elevator const &E)操作結(jié)果:判斷是否有低層請求。EleAchieved(Elevator &E)操作結(jié)果:判斷電梯是否要停于當(dāng)前層。EleOpenDoor(Elevator &E)操作結(jié)果:判斷電梯是否要開門。5、高樓模塊實(shí)現(xiàn)電梯和乘客之間
6、的互交功能。包括:InOut(Elevator &E,WQueue wMaxfloor+12)操作結(jié)果:進(jìn)行乘客的進(jìn)出電梯活動(dòng)。NewClient(Elevator &E,WQueue w52)操作結(jié)果:進(jìn)入新乘客。PrintStatus(Elevator &E,WQueue w52)操作結(jié)果:輸出當(dāng)前狀態(tài)。Print(Elevator &E,Action a)操作結(jié)果:輸出電梯動(dòng)作信息。6、主程序主程序主要處理兩類事件: 乘客事件和電梯事件。 除此之外,主程序還處理各個(gè)模塊的初始化和銷毀工作,以及電梯狀態(tài)的輸出。乘客事件包括新乘客到達(dá)事件,乘客放棄等待事件,乘
7、客進(jìn)出電梯事件。電梯事件包括電梯運(yùn)行事件。7、本程序包含 6 個(gè)模塊:(1) 主程序模塊(2) 乘客模塊(3) 乘客棧模塊(4) 電梯模塊(5) 等待隊(duì)列模塊(6) 高樓模塊:實(shí)現(xiàn)電梯和乘客之間的互交。各模塊之間的調(diào)用關(guān)系如下:4/最低層20 /開門關(guān)門時(shí)間25 /進(jìn)出電梯時(shí)間4 /最高層主程序等待隊(duì)列模塊高樓模塊電梯模塊乘客模塊乘客棧模塊三 詳細(xì)設(shè)計(jì)/所有常量,全局變量和類型定義#define NULL0/空指針#define TRUE1#define FALSE0#define OK1#define ERROR0#define INFEASIBLE-1#define OVERFLOW-2#
8、define INT_MAX32767/Status 是函數(shù)類型,其值是函數(shù)結(jié)果狀態(tài)代碼typedef int Status;#define Empty 0/-/電梯狀態(tài)enumEleStatusOpening,Opened,Closing,Closed,Moving,Decelerate,Waiting;enumActionDoorOpened,DoorClosed,GoingUp,GoingDown,Achieved,None;enumEleStageUp,Down,OpenDoor,Stop;enumClientStatusNew,GiveUp,In,Out,Finish;#define
9、 CloseTest 40/電梯關(guān)門測試時(shí)間#define OverTime300 /電梯停候超時(shí)時(shí)間#define Accelerate 15/加速時(shí)間#define UpTime 51 /上升時(shí)間#define DownTime 61/下降時(shí)間#define UpDecelerate 14 /上升減速#define DownDecelerate 23/下降減速#define DoorTime#define InOutTime #define Maxfloor #define Minfloor 0long Time=0;/時(shí)鐘long MaxTime;/ 系統(tǒng)運(yùn)行最長時(shí)間int InOutC
10、ount=0;/ 用于進(jìn)出計(jì)時(shí)5int InterTime=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ì)高層和低層的請求(不包括當(dāng)前層)。3、高層和低層均無請求:發(fā)出Stop 命令。4、否則,1)若電梯在上升期:1. 若有高層請求:上升;2. 若無高層請求:轉(zhuǎn)下降期,下降。2)若電梯在下降期:1. 若有低層請求:下降;2. 若無有低層請求:轉(zhuǎn)上升期,上升。判斷電梯是否要停于當(dāng)前層函數(shù) EleAchieve
11、d 的算法:1. 該層的 CallCar 為 1;2. 該層在上升(下降)期有上升(下降)請求(判斷CallUp 或 CallDown);3. 上升(下降)期高(低)層沒有請求而該層由下降(上升)請求,要轉(zhuǎn)換運(yùn)行時(shí)期。判斷電梯動(dòng)作函數(shù) ElevatorRun 的算法:1.若電梯在 Opening 狀態(tài),則轉(zhuǎn)至 Opened狀態(tài)。2.若電梯在 Opened狀態(tài),若無人進(jìn)出,則轉(zhuǎn)至 Closing 狀態(tài)。3.若電梯在 Closed 狀態(tài),則根據(jù)電梯請求情況轉(zhuǎn)至相應(yīng)狀態(tài)。4.若電梯在 Closing 狀態(tài),則轉(zhuǎn)至 Closed 狀態(tài)。5.若電梯在 Moving 狀態(tài),若達(dá)到目標(biāo)層,則轉(zhuǎn)至 Decel
12、erate 狀態(tài)。否則,繼續(xù)移動(dòng)。6.若電梯在 Decelerate 狀態(tài),則設(shè)定電梯時(shí)期,并轉(zhuǎn)至 Opening 狀態(tài)。7.若電梯在 Waiting 狀態(tài),在判斷是否等待超時(shí),若超時(shí)則向第一層移動(dò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)入
13、到哪層樓來告知電梯運(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é)果發(fā)現(xiàn)并不實(shí)際,有的變量僅是在某些函數(shù)中賦予其值罷了,于是就將這些變量刪除,比如開始按照提示設(shè)置了 D1表示人們正在進(jìn)出電梯等等。由于將程序分塊,將不同部分寫入不同源文件中,這樣出錯(cuò)后便于查找及修改,這是分模塊的優(yōu)點(diǎn)之一也是編寫和調(diào)試
14、的一個(gè)小技巧。五 用戶手冊6程序運(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é)束,按任意鍵退出。此操作可參考測試成果中的效果圖。六 測試成果從測試結(jié)果看,乘客放棄數(shù)的大小和平均等待時(shí)間的長短還與乘客出現(xiàn)的密度和乘客的平均容忍時(shí)間有關(guān)系。73、具體設(shè)計(jì)方案( 3000-5000 字)#include <stdlib.h>#incl
15、ude <iostream.h>#include <iomanip.h>#include <stdio.h>#include <windows.h>#include <conio.h>#include <time.h>/所有常量,全局變量和類型定義#define NULL0/空指針#define TRUE1#define FALSE0#define OK1#define ERROR0#define INFEASIBLE-1#define OVERFLOW-2#define INT_MAX32767/Status 是函數(shù)類型
16、,其值是函數(shù)結(jié)果狀態(tài)代碼typedef int Status;#define Empty 0/-/電梯狀態(tài)enumEleStatusOpening,Opened,Closing,Closed,Moving,Decelerate,Waiting;enumActionDoorOpened,DoorClosed,GoingUp,GoingDown,Achieved,None;enumEleStageUp,Down,OpenDoor,Stop;enumClientStatusNew,GiveUp,In,Out,Finish;#define CloseTest 40/電梯關(guān)門測試時(shí)間#define Ov
17、erTime300 /電梯停候超時(shí)時(shí)間#define Accelerate 15/加速時(shí)間#define UpTime 51 /上升時(shí)間#define DownTime 61/下降時(shí)間#define UpDecelerate 14 /上升減速8#define DownDecelerate 23/下降減速#define DoorTime20/開門關(guān)門時(shí)間#define InOutTime25/進(jìn)出電梯時(shí)間#define Maxfloor4/最高層#define Minfloor 0/最低層long Time=0;/時(shí)鐘long MaxTime;/ 系統(tǒng)運(yùn)行最長時(shí)間int InOutCount=0
18、;/ 用于進(jìn)出計(jì)時(shí)int InterTime=0;/ 下一乘客進(jìn)入系統(tǒng)的時(shí)間int ID=0;/乘客編號(hào)int GiveUpNumber=0;/ 乘客放棄的數(shù)目int TotalTime=0;/總共等待時(shí)間/乘客類型typedef struct int ClinetID; / 乘客編號(hào)int Outfloor; / 去哪層int InTime;/該乘客進(jìn)入時(shí)間int GivepuTime; /所能容忍的等待時(shí)間int Infloor;/ 乘客進(jìn)入的樓層Client;/乘客類型基本操作void PrintClientInfo(Client const &e,ClientStatus s)
19、 /輸出乘客信息#if !testswitch(s) case New:cout<<Time<<'t'<<e.ClinetID<<"號(hào)乘客進(jìn)入第 "<<e.Infloor<<" 層"<<endl;break; case GiveUp:cout<<Time<<"t"<<e.ClinetID<<" 號(hào) 乘 客 放 棄 等 待 , 等 待 了"<<Time-e.I
20、nTime<<"/0.1s"<<endl;break;case Out:cout<<Time<<'t'<<e.ClinetID<<"號(hào)乘客走出電梯 "<<endl;break;case In:cout<<Time<<'t'<<e.ClinetID<<" 號(hào)乘 客走 進(jìn)電 梯, 要去 第 "<<e.Outfloor<<" 層 "&l
21、t;<endl;break;default:break;/switch#endifStatus CreatClient(Client *&p) /生成新的乘客int d;p=new Client;if(!p) return OVERFLOW;p->ClinetID=+ID;/ut<<ID;cout<<"所在樓層 :"/ut<<e.Infloor<<'n'9cout<<ID;cout<<" 所能容忍的等待時(shí)間 :"cin>>d;p->
22、;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->Out
23、floor>>InterTime;PrintClientInfo(*p,New);return OK;Status DestoryClient(Client *&p) /該乘客離開系統(tǒng)delete p;p=NULL;return OK;Status GoAbove(Client const &e) /判斷該乘客是否去往高層if(e.Outfloor>e.Infloor) return TRUE;else return FALSE;int CInfloor(Client const &e) /返回乘客進(jìn)入的樓層return e.Infloor;int C
24、InTime(Client const &e) /返回乘客進(jìn)入時(shí)間return e.InTime;int COutfloor(Client const &e) /返回乘客進(jìn)入時(shí)間return e.Outfloor;#define STACK_INIT_SIZE10/存儲(chǔ)空間初始分配量#define STACKINCREMENT5/存儲(chǔ)空間分配增量/乘客棧typedef Client*SElemType;typedef struct SElemType *base;/棧底指針,棧不存在時(shí)base的值為 NULLSElemType *top;/棧頂指針intstacksize;/當(dāng)
25、前已分配存儲(chǔ)空間,以元素為單位10ClientStack;/乘客棧的基本操作Status InitStack(ClientStack &S);/構(gòu)造一個(gè)空棧Status DestroyStack(ClientStack &S);/銷毀棧 SStatus ClearStack(ClientStack &S);/把 S 置為空Status StackEmpty(ClientStack S);/若棧 S 為空,則返回 TRUE,否則返回 FALSE int StackLength(ClientStack S);/返回棧 S 的長度Status GetTop(ClientSta
26、ck S,SElemType &e);/返回棧頂元素Status Push(ClientStack &S,SElemType e);/入棧Status Pop(ClientStack &S,SElemType &e);/出棧void PrintStack(ClientStack &S);/輸出棧Status InitStack(ClientStack &S) /構(gòu)造一個(gè)空棧S.base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType); if(!S.base) return OVERFLO
27、W;S.top=S.base;S.stacksize=STACK_INIT_SIZE;return OK;/InitStackStatus DestroyStack(ClientStack &S) /銷毀棧 SSElemType *p;if(S.base) for(p=S.base;p<S.top;p+)DestoryClient(*p);free(S.base);return OK;Status ClearStack(ClientStack &S) /把 S 置為空if(!S.base) return ERROR;S.top=S.base;return OK;11Sta
28、tus StackEmpty(ClientStack S) /若棧 S 為空,則返回TRUE,否則返回 FALSEif(S.top=S.base) return TRUE;elsereturn FALSE;int StackLength(ClientStack S) /返回棧 S 的長度return S.top-S.base;Status GetTop(ClientStack S,SElemType &e) /返回棧頂元素if(!S.base) return ERROR;e=*(S.top-1);return OK;/GetTopStatus Push(ClientStack &
29、;S,SElemType e) /入棧if(!S.base) return ERROR;if(S.top-S.base>=S.stacksize) S.base=(SElemType *)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(SElemType) if(!S.base) return OVERFLOW;S.top=S.base+S.stacksize;S.stacksize+=STACKINCREMENT;*S.top+=e;return OK;/PushStatus Pop(ClientStack &S,SElem
30、Type &e) /出棧if(S.top=S.base) return ERROR;e=*(-S.top);return OK;/Popvoid PrintStack(ClientStack &S) /輸出棧SElemType *i;i=S.base;while(i<S.top)cout<<(*i+)->ClinetID<<' '/電梯類型#include "ClientStack.h"12typedef struct int floor;/電梯所在層int ClientNumber;/ 電梯內(nèi)人數(shù)EleS
31、tatus status;/電梯當(dāng)前狀態(tài)EleStage Stage; /電梯運(yùn)行時(shí)期int Count;/ 用于電梯計(jì)時(shí)int CallUpMaxfloor+1;/ 每層的 Up 按鈕int CallDownMaxfloor+1;/ 每層的 Down 按鈕int CallCarMaxfloor+1;/ 電梯內(nèi)的目標(biāo)層按鈕ClientStack SMaxfloor+1;/ 乘客棧 ,要去不同樓層的人放在不同的棧中Elevator;/電梯類型基本操作void InitEle(Elevator &E) /初始化電梯類型int i;E.floor=1;/ 電梯初始停在第一層E.status=
32、Waiting;E.Count=OverTime;E.Stage=Down;E.ClientNumber=0;for(i=0;i<=Maxfloor;i+) E.CallUpi=0;E.CallDowni=0;E.CallCari=0;for(i=0;i<=Maxfloor;i+) InitStack(E.Si);Status CountOver(Elevator &E) /判斷電梯計(jì)時(shí)是否完成if(E.Count) E.Count-;return FALSE;return TRUE;void DestoryEle(Elevator &E) /銷毀電梯類型int i
33、;for(i=0;i<=Maxfloor;i+) DestroyStack(E.Si);int EleFloor(Elevator const &E) /返回電梯所在的層return E.floor;EleStatus EleStatus(Elevator const &E) /返回電梯狀態(tài)return E.status;13Status RequireAbove(Elevator const &E) /判斷是否有高層請求for(int i=E.floor+1;i<=Maxfloor;i+) if(E.CallCari|E.CallDowni|E.CallU
34、pi) return TRUE;return FALSE;Status RequireBelow(Elevator const &E) /判斷是否有低層請求for(int i=E.floor-1;i>=Minfloor;i-) if(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.fl
35、oor|E.Stage=Down&&E.CallDownE.floor)return TRUE;if(E.Stage=Up&&E.CallDownE.floor&&!RequireAbove(E) E.Stage=Down;return TRUE;if(E.Stage=Down&&E.CallUpE.floor&&!RequireBelow(E) E.Stage=Up;return TRUE;return FALSE;Status EleOpenDoor(Elevator &E) /判斷電梯是否要開門if(
36、E.CallCarE.floor|E.CallDownE.floor&&E.Stage=Down|E.CallUpE.floor&&E.Stage=Up) return TRUE;if(E.status=Waiting) if(E.CallDownE.floor) E.Stage=Down;return TRUE;if(E.CallUpE.floor) E.Stage=Up;return TRUE;return FALSE;EleStage EleDecide(Elevator &E) /判斷電梯動(dòng)作int Above,Below;Above=Requi
37、reAbove(E);Below=RequireBelow(E);/無請求則停止if(Above=0&&Below=0) return Stop;/有請求則按請求移動(dòng)else 14if(E.Stage=Up) if(Above!=0) return Up;else E.Stage=Down;return Down;/ifelse if(Below!=0) return Down;else E.Stage=Up;return Up;/ifAction ElevatorRun(Elevator &E)/電梯狀態(tài)轉(zhuǎn)換switch(E.status) case Opening:
38、/完成開門則轉(zhuǎn)入Opened狀態(tài)E.status=Opened;E.Count=CloseTest;return DoorOpened;case Opened:/進(jìn)行關(guān)門測試if(E.Stage=Down&&!E.CallCarE.floor&&!E.CallDownE.floor| E.Stage=Up&&!E.CallCarE.floor&&!E.CallUpE.floor) / 無人進(jìn)出,關(guān)門 E.status=Closing;E.Count=DoorTime;/ifbreak;case Closing:/完成關(guān)門則轉(zhuǎn)入Cl
39、osed 狀態(tài)E.status=Closed;return DoorClosed;case Waiting:/不在第一層且超出所規(guī)定的停候時(shí)間 ,電梯向第一層移動(dòng) if(E.Count=0) if(E.floor!=1) E.CallCar1=1;else E.Count-;/如果有人可以進(jìn)入,則開門if(EleOpenDoor(E) E.status=Opening;E.Count=DoorTime;break;case Closed:/根據(jù) EleDecide 的返回值設(shè)定電梯狀態(tài)15switch(EleDecide(E) case Up: E.status=Moving;E.Count=
40、UpTime+Accelerate;return GoingUp;case Down: E.status=Moving;E.Count=DownTime+Accelerate;return GoingDown; case Stop:if(E.status!=Waiting) E.status=Waiting;E.Count=OverTime;/switchbreak;case Moving:/完成移動(dòng)if(E.Stage=Up) E.floor+;elseE.floor-;if(EleAchieved(E) / 到達(dá)目標(biāo)層,轉(zhuǎn)入減速狀態(tài)E.status=Decelerate;E.Count=D
41、ownDecelerate;else E.Count+=DownTime;/未到達(dá)目標(biāo)層,繼續(xù)下降return Achieved;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=Opening;E.Count=DoorTim
42、e;break;/switchreturn None;/ElevatorRun/單鏈隊(duì)列隊(duì)列的鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)typedef Client *QElemType;/等候隊(duì)列typedef struct QNode QElemTypedata;struct QNode*next;QNode,*QueuePtr;typedef struct QueuePtrfront;/隊(duì)頭指針QueuePtrrear;/隊(duì)尾指針WQueue;/等待隊(duì)列的基本操作Status InitQueue(WQueue &Q) /構(gòu)造一個(gè)空隊(duì)列QQ.front=Q.rear=new QNode;if(!Q.front)
43、 return OVERFLOW;/ 分配存儲(chǔ)失敗Q.front->next=NULL;16Q.front->data=NULL;return OK;Status DestroyQueue(WQueue &Q) /銷毀隊(duì)列 Qwhile(Q.front) Q.rear=Q.front->next;if(Q.front->data) DestoryClient(Q.front->data);delete Q.front;Q.front=Q.rear;return OK;Status EnQueue(WQueue &Q,QElemType e) /插入
44、元素 e 為 Q 的新的隊(duì)尾元素QueuePtr p;p=new QNode;if(!p) return OVERFLOW;p->data=e;p->next=NULL;Q.rear->next=p;Q.rear=p;return OK;Status DeQueue(WQueue &Q,QElemType &e) /若隊(duì)列不空 ,則刪除 Q 的隊(duì)頭元素 ,用 e 返回其值 ,并返回 OK; /否則返回 ERRORQueuePtr p;if(Q.front=Q.rear) return ERROR;p=Q.front->next;e=p->data;
45、Q.front->next=p->next;if(Q.rear=p) Q.rear=Q.front;delete p;return OK;Status QueueEmpty(WQueue Q) /判斷隊(duì)列是否為空if(Q.front=Q.rear) return TRUE;else return FALSE;17Status 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->next;p->next=
46、q->next;if(p->next=NULL) Q.rear=p;DestoryClient(q->data);delete q;return OK;Status CGiveUp(WQueue &Q,int floor) /刪除放棄等待的乘客QueuePtr p;p=Q.front;if(p->next!=NULL)if(p->next->data->GivepuTime=0&&floor!=p->next->data->Infloor) PrintClientInfo(*(p->next->da
47、ta),GiveUp); TotalTime+=Time-CInTime(*(p->next->data); QDelNode(Q,p);/將放棄等待的人刪除GiveUpNumber+;else p->next->data->GivepuTime-;return OK;void PrintQueue(WQueue Q) /輸出隊(duì)列QueuePtr q;int count=0;if(Q.front->next=NULL) goto end;q=Q.front->next;while(q!=NULL) cout<<setw(3)<<
48、q->data->ClinetID<<' 'q=q->next;count+;end:while(count+<=4) cout<<""#include "main.h"18#include "Client.h"#include "wqueue.h"#include "Elevator.h"void InOut(Elevator &E,WQueue wMaxfloor+12) /進(jìn)行乘客的進(jìn)出電梯活動(dòng)/注意:電梯時(shí)期要正確,
49、否則乘客無法進(jìn)入。Client *p;if(E.CallCarE.floor) / 人要從電梯中走出 if(StackEmpty(E.SE.floor) E.CallCarE.floor=0; else /當(dāng)前層的乘客棧非空,出電梯Pop(E.SE.floor,p);E.ClientNumber-;InOutCount=InOutTime;PrintClientInfo(*p,Out);TotalTime+=Time-CInTime(*p);DestoryClient(p);/elseif(E.CallCarE.floor=0) / 有人要走入電梯 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.CallCarCO
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(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ǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 正規(guī)服裝合作合同范本
- 五金電器購銷合同范本
- 米線店加盟合同范本
- 合同范本委托
- 醫(yī)療公司勞務(wù)合同范本
- 古玩字畫買賣合同范本
- 公司做飯阿姨勞務(wù)合同范本
- 公司委托租房合同范本
- 合肥 裝修 合同范本
- 廠房和設(shè)備采購合同范本
- 2025年廣州市黃埔區(qū)東區(qū)街招考社區(qū)居委會(huì)專職工作人員高頻重點(diǎn)模擬試卷提升(共500題附帶答案詳解)
- 汽車制動(dòng)系統(tǒng)課件
- 2025年黑龍江省高職單招《職測》高頻必練考試題庫400題(含答案)
- 統(tǒng)編版七年級語文下冊《第16課有為有不為》教案
- GB 45184-2024眼視光產(chǎn)品元件安全技術(shù)規(guī)范
- 【上?!康谝淮卧驴季?1【20~21章】
- 2025年湖南科技職業(yè)學(xué)院高職單招數(shù)學(xué)歷年(2016-2024)頻考點(diǎn)試題含答案解析
- 2025年東營科技職業(yè)學(xué)院高職單招語文2018-2024歷年參考題庫頻考點(diǎn)含答案解析
- 《新媒體廣告》課件 第4章 從技術(shù)到場景:新媒體廣告的創(chuàng)新應(yīng)用
- 2025年煙臺(tái)工程職業(yè)技術(shù)學(xué)院高職單招數(shù)學(xué)歷年(2016-2024)頻考點(diǎn)試題含答案解析
- 2025年上半年中煤科工集團(tuán)商業(yè)保理限公司招聘易考易錯(cuò)模擬試題(共500題)試卷后附參考答案
評論
0/150
提交評論