眾所周知,物件導向的程式設計更 適合對現實生活中的描述,更加體現了軟體的工業化的精神,所以現在大部分的軟體開發工作都圍繞oop的思想來進行的。但是在對現實生活中的實際問題,如何 對所研究的系統進行物件導向的分析與設計呢?本篇文章以乙個實際的例子,向大家介紹一下如何對實際問題進行分析和設計。
一.問題描述:
該例項是乙個電梯載客問題,問題的描述如下:
某**中心共10層,設有載客電梯1部。為了處理問題的方便,有以下的限定條件:
(1) 電梯的執行規則是:可到達每層。
(2) 每部電梯的最大乘員量均為k人(k值可以根據**情況在10~20人之間確定)。
(3) **開始時,電梯隨機地處於其符合執行規則的任意一層,為空梯。
(4) **開始後,有n人(>20人)在該國際**中心的1層,開始乘梯活動。
(5) 每個人初次所要到達的樓層是隨機的,開始在底層等待電梯到來。
(6) 每個人乘坐電梯到達指定樓層後,再隨機地去往另一樓層,依此類推,當每人乘坐過l次(l值可以根據**情況在3~10次之間確定)電梯後,第l+1次為下至底層並結束乘梯行為。到所有人結束乘梯行為時,本次**結束。
(7) 電梯執行速度為s秒/層(s值可以根據**情況在1~5之間確定),每人上下時間為t秒(t值可以根據**情況在2~10之間確定)。
(8) 電梯執行的方向由先發出請求者決定,不允許後發出請求者改變電梯的當前執行方向,除非是未被請求的空梯。
最後開發的軟體要求:
(1) 設計乙個易於理解的介面,動態顯示各梯的載客與運**況(上、下或停止),動態顯示各樓層的人員停留情況與要求乘梯情況;動態顯示從**開始到目前的時間。
(2) 可變動的引數(k、n、m、l、s、t)應在程式開始時從對話方塊輸入
二.系統分析與設計:
採用oop分析的關鍵就是要對問題的物件空間的分類(類的分析與設計,這一點跟面向過程的流程圖設計不太一樣),也就是在整個系統中包括那幾個 類,每個類包含那些屬性特徵和行為特徵。對於上面的電梯問題,很明顯有兩個類:即電梯類和乘客類(從所設計到的物件描述可以觀察到,但是有的問題即使這一 步也要仔細分析)。電梯類應該反映所有關於電梯狀態和行為的資訊,而乘客類也應該反映這些資訊。綜合上面問題的表述,現在將分析結果整理如下:
乘客類:
cpassenger
電梯類:
celevator
這裡說明一下,carray是mfc裡面的乙個模板集合類,第乙個引數 表示該集合所儲存的類別,第二個引數表示對該集合裡面的元素所採取的訪問方式,這裡採用的是引用的訪問方式,這種方式通過傳遞32位指標來進行訪問,它同 時兼有位址訪問(效率高)和值傳遞的雙重優勢,現在一般對大的物件的訪問一般提倡使用這種方式。
另外,這裡也引用了view類,定義如下:
class cliftsimulationview : public cformview
;這裡大致把各個物件的成員設定出來了,為了方便儲存,將所有的變數定義為public的型別,這樣可以提高儲存的效率,當然了,它也破壞了oop封裝的 思想,降低了物件與物件之間的隔離性。這裡因為問題不是很複雜,所以我們採用前面的方法。至此,類設計基本結束了,當然了,很多時候不是一開始就可以把類 設計得很好,往往都是要先設計一部分,然後在後面得問題得處理中,還要對原來設計的類結構進行新增和刪除工作的。這裡要特別注意的是類設計的最終目的是降 低系統的耦合,達到程式邏輯與資料之間的分離,更有利於**的編制和維護.
三.**編制:
前面已經完成了類設計,那麼剩下來的就是應該是系統邏輯部分的實現了,對於系統整體來說,應該有乙個事件偵測體系,用來對系統每個乘客和電梯的 狀態的偵測,以便傳送或者修改必要的資訊,該偵測體系的週期定為1秒鐘(可以用定時器實現),然後用序列的方式來模擬並行的。如果把思路總結一下,應該是 跟動畫片的原理是一樣的:將多個固定和靜止的畫面定時、按順序地放映出來,就變成了活動的畫面。所以,可以在程式中定義乙個主迴圈,在該迴圈外進行必要的 初始化,進入後每秒鐘執行一次,以遍歷方式一一激勵當前已經產生的物件,由它們根據自己的當前狀態和相關的狀態變化規則,決定是否需要改變、改變成什麼樣 的狀態,以及按照上述行為特徵的設計展示必要的物件狀態。
根據上面敘述的思想,下面列舉主要列出"事件偵測體系"的**:
(應該在另外乙個函式來觸發次函式,即呼叫settimer(1,1000,null)即可)
void cliftsimulationview::ontimer(uint nidevent) //主要在這裡處理所有得邏輯}}
//判斷是否結束**
for(i=1;i<=this->n;i++)
if (flag1==0) //結束**
//防止沒有乘客發訊號,系統進入死迴圈
for(i=1;i<=this->n;i++)}}
else
dwtime=::gettickcount() -this->elapsetime ;
dwtime=dwtime/1000;
sen.format("%d",dwtime%60);
h.format("%d",dwtime/3600);
m.format("%d",(dwtime/60)%60);
showtime=h+" : "+m+" : "+sen;
this->setdlgitemtext(idc_static16,showtime);
}else if (nidevent==4) //電梯空載執行(去接乘客)
//因為到站了,所以要把電梯設定為接收訊號狀態
this->m_elevator.bstop =true; //電梯不執行了
this->m_elevator.bisemptyoperation =false; //為滿載作準備
this->m_elevator.iatfloor =this->m_elevator.itofloor ;
this->m_elevator.itofloor=this->m_elevator.m_passengers[0].itofloor;
killtimer(4);
this->itimes[4]=0;
this->isrcfloor =this->m_elevator.iatfloor;
this->idesfloor =this->m_elevator.itofloor ;
this->m_elevator.bstop =false; //電梯啟動
this->itimes[2]++;
if (this->itimes[2]==1)
settimer(2,2000 ,0); //啟動乘客上電梯 }
if (iemptysrcfloor drawcolor(iemptysrcfloor,1);
iemptysrcfloor++; }
else
}else if(nidevent==2) //電梯每隔3秒,電梯是載客執行,還有一種情況是無客運行
else if (isrcfloor >idesfloor)
if (isrcfloor ==idesfloor) //到達目的地了
}cformview::ontimer(nidevent);
} 四.結論:
至此,全部的設計過程完畢,上面所有**已經在vc6.0+win2000平台下除錯成功。從上面的分析可以看出,實際上運用oop的思想進行 設計的時候,關鍵是類設計,類設計一定要通過對系統物件域的劃分來進行,而關於類裡面的具體成員就必須由系統各個部分的功能來進行確定了。總之,類設計不 是一天兩天的功夫,需要長期的實踐才可能達到熟練的程度 。
關於電梯演算法的C 實現
眾所周知,物件導向的程式設計更適合對現實生活中的描述,更加體現了軟體的工業化的精神,所以現在大部分的軟體開發工作都圍繞oop的思想來進行的。但是在對現實生活中的實際問題,如何對所研究的系統進行物件導向的分析與設計呢?本篇文章以乙個實際的例子,向大家介紹一下如何對實際問題進行分析和設計。一 問題描述 ...
電梯排程演算法 C
1.演算法解析 掃瞄演算法 scan 又稱電梯排程演算法,scan演算法是磁頭前進方向上的最短查詢時間優先演算法,它排除了磁頭在盤面區域性位置上的往復移動,scan演算法在很大程度上消除了sstf演算法的不公平性,但仍有利於對中間磁軌的請求。電梯排程演算法是從移動臂當前位置開始沿著臂的移動方向去選擇...
雙電梯電梯排程演算法的簡單分析
單部電梯排程過程中的基本原則 使用作業系統的scan演算法 多部電梯排程所遵循原則 1 順向接反向不接原則 當1號梯正在上行時,如果其上方出現上行的召喚訊號,則由1號梯去完成接送任務,而基站的2號梯留在原位置不予應答。如果在1號梯的上方出現下行召喚訊號,則在基站的2號接受此接送指令。2 當同時有多個...