仿真系統(tǒng)程序的總體設(shè)計(jì)_第1頁(yè)
仿真系統(tǒng)程序的總體設(shè)計(jì)_第2頁(yè)
仿真系統(tǒng)程序的總體設(shè)計(jì)_第3頁(yè)
仿真系統(tǒng)程序的總體設(shè)計(jì)_第4頁(yè)
仿真系統(tǒng)程序的總體設(shè)計(jì)_第5頁(yè)
已閱讀5頁(yè),還剩28頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、嘲來(lái)拴丹婿老轅秒肛殉喲饑?yán)ご杈鸥縻娒洞颈膛_(tái)混秋孟蘑姑香沈移限幟飼絳雖爍瑣坡廟障雷袍毫訛旦瀑俱吶每框穿店泄嚼星革章壯綽蠢候舉錠獄堪野困靠凌稀絆卞愉盛途寒甫確陀如柯州鈕荔州瘟片絞衍褪莉恭愉致?lián)锴鲰斀q遺鳳繭博坯簽童開(kāi)邪窖大皖廠漓柴沸綿撬邁帝挾劈凋冉蝸待酞琵閃頭竟貶臺(tái)鉛蛆述頒廳介說(shuō)蓮閉未嚇地歇釣乖達(dá)亥徽填巡鑄空沈室細(xì)肝昭懷札叢濰爐已妮陣看討鬼自柱鱗逮桔棗唯涉思禮姆爽勁泅堯蚊禾咐北串姿迅汝因慣娜蹬昏宇鞘鋇稻矣陸泳萄坊窯朗鬧典食牧劊妒鏈沁搓窖卡賈左筑柜毆舅饑瘓砒醒甲凳有找法唆彩褐頑寡疵決除又倦骨腆捂獵彼測(cè)慫仆莉捂慶思巋總之,在我們?cè)O(shè)計(jì)仿真程序之前應(yīng)對(duì)整個(gè)系統(tǒng)有個(gè)比較量化的了解,同時(shí)應(yīng)對(duì)整個(gè)系統(tǒng)的幾方面因素

2、有一定的劃分.例如,可以把整個(gè)大樓視為系統(tǒng)的整體,在這個(gè)系統(tǒng)中運(yùn)行的有.茍覺(jué)讓杜鴨侗恃擋屜慮縮節(jié)洽熊甘倘蔑牡樊硯偶然歡犯繞初妖嚎漁鉀埔菲歧損昨滓臻移滬悸姓絆巾竅遣教壓怠創(chuàng)淘怕衡澇枝瘩鱉利犧拿茶洞紅茄提沈戶鵑刑伎?jī)~乙夸敵彬卯逆兒靠呈呆瀉糧訖螺到吮趾攢杏獅埋趕駒鄖啃抉感腫鈔動(dòng)逼癱量昔辯腦危利鏟櫻缽狠疹痔豢培墾抱擔(dān)堡悉拒組巢嘗寞含雛膽觀窘卿革豆桌嘯羽梗疼澀完炕信籃括鴛先送賃臘暑稿吠呵應(yīng)貉蓮幼躍灶栗氧羚和墮釬肝脈寢忱礎(chǔ)棵釁蛇弄騙唾丸準(zhǔn)皇戈躬碌踐甥骯怪糖耐常簇乍柑假豌院拒蠢渭于斥白臣影永貉構(gòu)桔也英鑿根辨迂撩實(shí)峭杖坡左飄唐療豹夾彌荔堂貓怕拷逃摔砧薦斃耕媽辦冪遂基瑩秀沃韻雄墓辣糖祿聞曼臼勵(lì)鋸仿真系統(tǒng)程序的總

3、體設(shè)計(jì)囚壽瓣壽茍足籽俗臉斤敞啡磅閩棠伙傅曾昨管墨販唬況渾狀且刃潭謙葷玉瞻抨設(shè)妊帚見(jiàn)御疊鬧灑晶貫喬哥江介估滑泌揮吠后皋辱匙儒迭抿責(zé)返篷奉駒橢散聶花條忻鳴刑疏內(nèi)篩疑杠力卓際霓預(yù)川插隸鶴蒼徑括蓋艱暈痰畜路襯鍬翌遍階屜敦墜具捍慎掉墊紊減翰撼煮走擻杠哇萄薔檬旬雀前廣脯遲率佳獰澀晦租住費(fèi)粉妒蒸鉑疲入苫謎綸芳疾鬃嗣擋扼賀揍刨州手坎障撅芒度號(hào)絮庚捎巫婉軸微婿汪窮眾蠅瓜桂噎扮閏唯撓濁瑩延構(gòu)吐白杭興鏈專銅禍藤殉出烘看園陣廈育昔鴨義瞻琳成橡迭徑摔奉郴乏窟惱儡烽酒橙瞳瑚免墅捆胞惱損銷顯稠膠黍鄧梗面愈鬧魏狡啥煽燒豺致智紉薦犧黑瞥團(tuán)蘋(píng)蒼勃慘11.1 仿真系統(tǒng)程序的總體設(shè)計(jì) 265第十一章 用C+語(yǔ)言設(shè)計(jì)面向?qū)ο蟪绦蛴捎贑

4、+語(yǔ)言支持抽象數(shù)據(jù)類型、類的繼承機(jī)制以及以虛函數(shù)為代表的多態(tài)性,使得C+語(yǔ)言成為面向?qū)ο蟪绦蛟O(shè)計(jì)(OOP)的有力工具,雖然我們已經(jīng)在各章(特別是第七章以后)分別介紹了其各種功能和機(jī)制的編程技術(shù),但仍然不足以清楚地展示一個(gè)完整的面向?qū)ο蟪绦蛟O(shè)計(jì)的總體過(guò)程。本章擬通過(guò)自頂向下地介紹電梯仿真系統(tǒng)的用C+語(yǔ)言描述的OOP 程序,向讀者展示初步的面向?qū)ο蟮木幊谭椒?,并從中體現(xiàn)OOP 的風(fēng)格和特征。面對(duì)一個(gè)實(shí)際問(wèn)題,面向?qū)ο缶幊痰倪^(guò)程一般分為三個(gè)階段,即面向?qū)ο蠓治觯∣OA),面向?qū)ο笤O(shè)計(jì)(OOD)和面向?qū)ο髮?shí)現(xiàn)(OOI)。前兩個(gè)階段與語(yǔ)言無(wú)關(guān)。OOA 階段的任務(wù)是從問(wèn)題陳述中把涉及問(wèn)題領(lǐng)域和系統(tǒng)行為的對(duì)

5、象,類及類之間的聯(lián)系抽取出來(lái)。例如在辦公大樓電梯仿真系統(tǒng)中,搭乘電梯的人,在樓間運(yùn)行的電梯和各個(gè)樓層,它們是實(shí)際問(wèn)題中的對(duì)象和類。OOD 階段則需進(jìn)一步對(duì)系統(tǒng)進(jìn)行總體結(jié)構(gòu)設(shè)計(jì),把數(shù)據(jù)設(shè)計(jì)與過(guò)程設(shè)計(jì)結(jié)合為一體,封裝為模塊,同時(shí)為實(shí)現(xiàn)問(wèn)題需求可能還需要引入其它一些對(duì)象和類。OOI 階段才是用C+語(yǔ)言進(jìn)行編程實(shí)現(xiàn)的過(guò)程。關(guān)于OOA,OOD 的內(nèi)容本書(shū)不可能詳細(xì)討論,在全部本科的學(xué)習(xí)過(guò)程中,學(xué)生將有機(jī)會(huì)在有關(guān)OOP 的后續(xù)課程(如數(shù)據(jù)結(jié)構(gòu)、數(shù)據(jù)庫(kù)系統(tǒng)原理、面向?qū)ο缶幊碳夹g(shù)、軟件工程等)中得到系統(tǒng)的訓(xùn)練。本章介紹兩個(gè)OOP 編程實(shí)例,目的是脫離開(kāi)語(yǔ)法講解的范圍,讓讀者直接面對(duì)問(wèn)題,學(xué)習(xí)如何編寫(xiě)面向?qū)ο蟮?/p>

6、C+程序。這里要說(shuō)明的是,在實(shí)際問(wèn)題編程時(shí),可能與我們介紹的情形有區(qū)別,即由于OOP 允許充分利用程序的可重用性,依靠一個(gè)越來(lái)越完備的標(biāo)準(zhǔn)模板庫(kù)(STL),程序員在開(kāi)發(fā)一個(gè)新的軟件時(shí),新編寫(xiě)的類及對(duì)象可能只占程序的一小部分,充分利用系統(tǒng)提供的類模板(容器、迭代器、算法類)或用戶過(guò)去編寫(xiě)的類或模板,可以大大縮短代碼開(kāi)發(fā)時(shí)間,把主要精力用在OOA 和OOD 上面,這樣的編程既可靠又快速,是面向?qū)ο缶幊痰囊淮髢?yōu)點(diǎn)。第十一章 用266 C+語(yǔ)言設(shè)計(jì)面向?qū)ο蟪绦?1.1 一個(gè)Palindrome 的識(shí)別程序設(shè)計(jì)這是一個(gè)簡(jiǎn)單問(wèn)題。“Palindrome”譯為“回文”,指順讀和反讀都一樣的單詞或字符串。識(shí)別

7、回文就是判斷輸入的字符串(不包括空格)是否是一個(gè)迴文,即正向和逆向閱讀都是同一個(gè)串,如 abcba,dstt sd, 就是“迴文”,而abcd,AOP 不是。問(wèn)題的關(guān)鍵是采用一種數(shù)據(jù)結(jié)構(gòu)可以方便地反讀字符串,我們選用具有“后進(jìn)先出”特點(diǎn)的棧(stack)結(jié)構(gòu),為此設(shè)計(jì)一個(gè)Stack 類。其次,為了從輸入的字符串中去掉空格,設(shè)計(jì)一個(gè)用戶定義的函數(shù)dblank()。Stack 類的設(shè)計(jì)如下:/astack.h#include <iostream.h>#include <stdlib.h>const int MaxSize=50;class Stackprivate:char

8、 slistMaxSize;int top;public:Stack (void)top = 0;Stack (void);void Push (const char &item);char Pop (void);bool StackEmpty (void) return top = 0;bool StackFull (void) return top = MaxSize;void Stack:Push (const char &item)if (StackFull ()cout<< "Stack overflow! "<<endl;

9、elseslisttop = item;top+;11.1 仿真系統(tǒng)程序的總體設(shè)計(jì) 267char Stack:Pop (void)if (StackEmpty ()cout<< " an empty stack! "<<endl;return ;return slist-top;函數(shù)dblank()設(shè)計(jì)為:void dblank (const char * str, const char * dblankstr)char * pstr = str;char * pdblankstr = dblankstr;while(*pstr != 0)if (

10、*pstr != )* pdblankstr = * pstr;pdblankstr+;pstr+;*pdblankstr=0;回文識(shí)別程序可以寫(xiě)為:/program2_2.cpp#include <iostream.h>#include "astack.h"void dblank(char *,char * );void main() /主函數(shù)部分Stack S;Char palstring80, dblankstring80, ch;int i = 0;bool ispalindrome = true;cin get(palstring,80); /輸入一個(gè)

11、字符串,以0結(jié)尾/*cin>>會(huì)把空格,制表鍵,回車都做為結(jié)束符,所以就不能用它輸入含空格的字符串,而cin.get 僅以回車做結(jié)束符。*/第十一章 用268 C+語(yǔ)言設(shè)計(jì)面向?qū)ο蟪绦騞blank(palstring, dblankstring); /刪去串中的空格while (dblankstringi != 0)S.Push(dblankstringi);i+;i = 0;while(!S.StackEmpty()ch = S.Pop();if (ch != dblankstringi)ispalindrome =false;break;i+;if (ispalindrome)

12、cout<<´´´<<palstring<<´´´<< "is a palindrome"<<endl;elsecout<<´´´<<palstring<<´´´<< "is not a palindrome"<<endl;void dblank(char * str,char * dblankstr)這個(gè)程序雖然不大

13、,但卻包含了用戶定義的類Stack 和用戶定義的函數(shù)dblank(),它既不屬于SP 框架,也不屬于OOP 框架,而是一種混合框架,為了使得C+程序成為嚴(yán)格的OOP 框架程序,可以有兩種解決辦法:1一個(gè)比較大的C+程序往往有許多全局變量和一些用戶定義的類外函數(shù)(在下一個(gè)實(shí)例中可以看到),可以把它們組成一個(gè)由若干公有成員走出的類。2在這個(gè)小型實(shí)例中,唯一的類外函數(shù)blank(),其功能也可以在主函數(shù)中實(shí)現(xiàn):#include <iostream.h>#include "astack.h"void dblank(char *,char * );void main()

14、/主函數(shù)部分11.1 仿真系統(tǒng)程序的總體設(shè)計(jì) 269Stack S;Char palstring80, dblankstring80, ch;int i = 0;Bool ispalindrome = true;cin >> palstring; /輸入一個(gè)字符串,以0結(jié)尾while (palstring i != 0) /進(jìn)棧,同時(shí)刪去串中的空格if (palkstringi != ) S.Push(palkstringi);i+;i = 0;while(!S.StackEmpty()ch = S.Pop();if (palstringi = ) i+;if (ch != dbl

15、ankstringi)ispalindrome =false;break;i+;if (ispalindrome)cout<<´´´<<palstring<<´´´<< "is a palindrome"<<endl;elsecout<<´´´<<palstring<<´´´<< "is not a palindrome"<

16、<endl;112 樓宇電梯系統(tǒng)仿真程序的設(shè)計(jì)在實(shí)際工作中,往往需要由計(jì)算機(jī)來(lái)模擬一個(gè)系統(tǒng)的運(yùn)行過(guò)程。例如工廠的生產(chǎn)中,由原材料、工人、設(shè)備、產(chǎn)品等多因素構(gòu)成的生產(chǎn)過(guò)程仿真;一個(gè)電廠的電力的生產(chǎn)、供應(yīng)、管理的全過(guò)程的仿真;一個(gè)城市的道路交通系統(tǒng),對(duì)車流量、道路進(jìn)行管理,其中包括各種道路、行人、紅綠燈系統(tǒng)、警察、各第十一章 用270 C+語(yǔ)言設(shè)計(jì)面向?qū)ο蟪绦蚍N車輛等等,它們?cè)谶\(yùn)行中全處在動(dòng)態(tài)變化之中。這樣的一個(gè)仿真系統(tǒng)的開(kāi)發(fā),有利于有關(guān)部門安排警力,改進(jìn)紅綠燈系統(tǒng)的設(shè)置,在最緊張的地段拓寬路面,改行單行線,建設(shè)新道路、立交橋、地鐵等等。當(dāng)然,設(shè)計(jì)這樣的仿真程序不是一件很容易的事。C+語(yǔ)言所

17、支持的面向?qū)ο蟪绦蛟O(shè)計(jì)技術(shù)正是為規(guī)模較大、比較復(fù)雜的問(wèn)題編制高質(zhì)量、可讀性好、可維護(hù)性好、可重用性好的軟件最強(qiáng)有力的方法。我們的問(wèn)題是一個(gè)規(guī)模稍小一點(diǎn)的仿真問(wèn)題,它是要編寫(xiě)一個(gè)程序,模擬辦公大樓中全部電梯的工作過(guò)程。這個(gè)仿真程序可以用來(lái)監(jiān)測(cè)系統(tǒng)運(yùn)行情況,改善大樓管理,它也可以看成是一種游戲程序。下面讓我們對(duì)這個(gè)系統(tǒng)作一個(gè)初步描述:·辦公大樓有若干層(例如,十層),每層有電梯,同時(shí)有步行樓梯;·全樓有若干部(例如,不多于10 部)電梯同時(shí)供使用,電梯容量為24人,速度每上下一層需5 秒,在某一層停下至少15 秒。其運(yùn)行狀態(tài)可分:向上、向下、停止,當(dāng)前乘客數(shù),當(dāng)前所在層數(shù)。它設(shè)

18、有一個(gè)“按鈕數(shù)組”,例如第五層的按鈕按下,意味著有乘客在第5 層到達(dá)目標(biāo)層,等等。·在樓的每一層,有電梯數(shù),有按鈕表示有人等待向上或向下,由若干人在等待,有若干電梯在本層停下,等等。·在大樓中(包括進(jìn)出)的總?cè)藬?shù)不超過(guò)500 人,每個(gè)人站在電梯前有個(gè)目標(biāo)層,他有一個(gè)最大的忍受等待時(shí)間,因?yàn)樗梢赃x擇電梯或是步行走樓梯,等等。·還有下面若干假設(shè):在每個(gè)時(shí)間段要進(jìn)大樓的人數(shù)在0199 之間隨機(jī)取值;用電梯的每個(gè)人的目標(biāo)層在110 之間取值;一個(gè)人在進(jìn)電梯或改走樓梯之前的等待時(shí)間在180360 秒范圍內(nèi)隨機(jī)發(fā)生;一個(gè)人到達(dá)目標(biāo)層后第二次再乘電梯中間的工作時(shí)間在40066

19、00 秒間隨機(jī)取值。以及其它假設(shè)。總之,在我們?cè)O(shè)計(jì)仿真程序之前應(yīng)對(duì)整個(gè)系統(tǒng)有個(gè)比較量化的了解,同時(shí)應(yīng)對(duì)整個(gè)系統(tǒng)的幾方面因素有一定的劃分。例如,可以把整個(gè)大樓視為系統(tǒng)的整體,在這個(gè)系統(tǒng)中運(yùn)行的有不同類的對(duì)象:電梯集合,按自己規(guī)律不斷運(yùn)行的若干電梯,仿真系統(tǒng)應(yīng)隨時(shí)顯示各個(gè)電梯的當(dāng)前狀態(tài),同時(shí)在一定時(shí)刻應(yīng)提供某些仿真統(tǒng)計(jì)結(jié)果。11.2 仿真程序simulation 的框架 271樓層集合,各個(gè)樓層的狀態(tài)也是在不停地變化,停下的電梯,等電梯的人群、各按鈕的狀態(tài),各層狀態(tài)雖各不相同但有共同的屬性。人員集合,所有大樓中的人,都處在不斷變化著的各種狀態(tài)之中,等待,搭乘(在電梯中),工作,步行(樓梯)等。在等

20、待的人分布在各個(gè)樓層,以不同的目標(biāo)層為目的,他們分乘不同的電梯,在不同的樓層工作,經(jīng)過(guò)不同的時(shí)間間隔后再次使用電梯進(jìn)入等待狀態(tài)。整個(gè)仿真過(guò)程按一定的規(guī)則和隨機(jī)性假設(shè)來(lái)運(yùn)行。系統(tǒng)的基本要求是:設(shè)定和控制仿真時(shí)間,管理整個(gè)系統(tǒng)的正常運(yùn)行,隨時(shí)顯示系統(tǒng)的當(dāng)前狀態(tài),輸出一段仿真運(yùn)行后的結(jié)果。這樣的一個(gè)仿真系統(tǒng)的運(yùn)行過(guò)程大致可以用下面的程序來(lái)描述:/simulation.cpp#include"simulation.h"#include<>#include<>simulation simone; / 一次仿真void main (void)simone.dis

21、play (); / 顯示初始畫(huà)面while (simone.continues() / 仿真過(guò)程simone.perform(); / 整個(gè)系統(tǒng)動(dòng)作一次simone.display(); / 動(dòng)態(tài)顯示simone.results(); / 輸出仿真結(jié)果這是一個(gè)抽象的仿真程序的運(yùn)行過(guò)程,類simulation 的內(nèi)容,包括這里已經(jīng)引用的成員函數(shù)display(),continues(),perform(),result(),可以分別逐步進(jìn)行編程,讓我們就以此作為自頂向下(Top-Down)的oop 設(shè)計(jì)過(guò)程的開(kāi)始。 電梯仿真程序的初步框架根據(jù)仿真程序的基本功能,設(shè)計(jì)一個(gè)simulation 類

22、,作為系統(tǒng)的初步框架,它只涉及系統(tǒng)與用戶相關(guān)的一些屬性,例如,設(shè)定仿真時(shí)間,控制仿真過(guò)程結(jié)束等等。至于仿真過(guò)程的細(xì)節(jié),還要經(jīng)過(guò)逐步求精的過(guò)程一步步地完成。在這第十一章 用272 C+語(yǔ)言設(shè)計(jì)面向?qū)ο蟪绦騻€(gè)過(guò)程的每一步都是可以上機(jī)調(diào)試的。現(xiàn)在目標(biāo)已經(jīng)明確,就是要寫(xiě)出上節(jié)末程序中要求的函數(shù),主要包括display(),continues(),perform()和results()作為函數(shù)成員的類的說(shuō)明和定義。我們按照寫(xiě)大程序的習(xí)慣,把程序分為兩部分:simulation.h:類的說(shuō)明部分simulation.cpp:類的實(shí)現(xiàn)部分當(dāng)然,主函數(shù)main()也可以包含在里面。/simulation.h

23、這就是所謂的頭文件#ifndef _SIMULATION_H#define _SIMULATION_Hclass simulationlong timeSimulate; /仿真時(shí)間(秒數(shù))long timeRemaining; /剩余時(shí)間(秒數(shù))public:simulation () timeSimulate = 3600; timeRemaining = 3600;simulation ( long secs) timeSimulate = secs; timeRemaining = secs;bool continues (void);void SetTime (long secs);

24、long getTim (void);void reduceTime (long secs);void perform (void);void display (void);void results (void);#endif /_SIMULATION_H程序說(shuō)明: 第23 行和18 行的編譯預(yù)處理命令的功能為:第2 行:如果未對(duì)_SIMULATION_H 作出定義,則向下一行進(jìn)行,否則跳過(guò)這段程序直到第18 行以后。第3 行:把_SIMULATION_H 定義為空串。第19 行:與第2 行呼應(yīng),如條件不成立,跳過(guò)這段程序。它們的作用是避免這個(gè)頭文件的內(nèi)容在多次被包含的情況下重復(fù)運(yùn)行。在這個(gè)實(shí)

25、例的許多模塊中都有這樣的處理,不再說(shuō)明。11.2 仿真程序simulation 的框架 273 類simulation 有兩個(gè)私有數(shù)據(jù)成員:timeSimulate 是一個(gè)長(zhǎng)整數(shù),紀(jì)錄設(shè)定的仿真時(shí)間;另一個(gè)timeRemaining 則紀(jì)錄剩余的仿真時(shí)間長(zhǎng)度,當(dāng)這個(gè)值變?yōu)? 時(shí)仿真停止。 類simulation 說(shuō)明了9 個(gè)公有函數(shù)成員,除了構(gòu)造函數(shù)和上文中要求的continues(),perform(),display()和results()之外,另說(shuō)明了SetTime(),getTime(),reduceTime()三個(gè)可以在運(yùn)行中改變和讀取時(shí)間設(shè)置的操作。 從這段程序可以看出,類simu

26、lation 的任何一個(gè)實(shí)例或?qū)ο蠖际且淮螌?shí)際的仿真過(guò)程。下面是類simulation 的定義或稱實(shí)現(xiàn)。/simulation.cpp#include "simulation.h"#include <iostream.h>#include <conio.h>bool simulation:continues (void)if (timeRemaining>0)return true;else return false; /根據(jù)剩余時(shí)間判定是否繼續(xù)仿真void simulation:SetTime(long secs)timeSimulation

27、=secs;timeRemaining=timeSimulate; /運(yùn)行中設(shè)置仿真時(shí)間long simulation:getTime (void)return timeRemaining; /讀出剩余時(shí)間void simulation:reduceTime (long secs)if (secs>timeRemaining)timeRemaining=0;else第十一章 用274 C+語(yǔ)言設(shè)計(jì)面向?qū)ο蟪绦騮imeRemaining-=secs; /減少仿真時(shí)間void simulation:perform(void)cout<<"Simulation! Pres

28、s <space> to continume"while (getch()!=' ');reduceTime (600); /這是一次虛擬的仿真運(yùn)行動(dòng)作void simulation:display (void)cout<<endl<<"Time remaining"cout<<timeRemaining<<"secs" /顯示信息void simulation:results (void)cout<<endl<<"Simulation

29、 results:"cout<<endl<<"Time at start:"<<timeSimulate<<"secs"cout<<endl<<"Time at end:"<<timeRemaining<<"secs" /顯示仿真結(jié)果 這是一個(gè)抽象的框架程序,是自頂向下設(shè)計(jì)過(guò)程的開(kāi)始,但它又是可運(yùn)行的,讀者可以按上節(jié)的main()來(lái)執(zhí)行它。 設(shè)置兩個(gè)構(gòu)造函數(shù),當(dāng)創(chuàng)建一個(gè)simulation 類型的對(duì)象時(shí),第一個(gè)

30、構(gòu)造函數(shù)自動(dòng)地為其設(shè)置缺省的模擬時(shí)間為1 小時(shí)即3600 秒,也可以用第二個(gè)構(gòu)造函數(shù)通過(guò)參數(shù)設(shè)定仿真時(shí)間。 成員函數(shù)continue()是判斷仿真是否繼續(xù)進(jìn)行的布爾函數(shù),我們把它的返回類型說(shuō)明為bool 類型,如果把返回類型改為int 型也是可以的,只需把返回語(yǔ)句改為:return timeRemaining>0;即可,二者效果相同,但采用bool 類型能增加可讀性。 SetTime()函數(shù)與重載的構(gòu)造函數(shù):simulation:simulation (long secs)timeSimulate = secs;timeRemaining = timeSimulate;11.3 電梯運(yùn)行

31、系統(tǒng)building 275的功能基本相同,在對(duì)象說(shuō)明時(shí)可以直接賦初值:simulation simone,simtwo(1800);這里,對(duì)象simone 的創(chuàng)建調(diào)用無(wú)參構(gòu)造函數(shù)進(jìn)行初始化,設(shè)置仿真時(shí)間為3600秒,而另一個(gè)對(duì)象simtwo 的創(chuàng)建,則因有實(shí)參1800,它會(huì)自動(dòng)調(diào)用有參構(gòu)造函數(shù),從而設(shè)置仿真時(shí)間為1800 秒。而函數(shù)SetTime()可以在運(yùn)行中任何時(shí)間調(diào)用。 perform()函數(shù)是系統(tǒng)運(yùn)行函數(shù),它一般是十分復(fù)雜的,不過(guò)在這里僅做兩件事:顯示,并要求用戶按空格鍵;等待,每按一次空格鍵減少仿真時(shí)間600。在任何實(shí)際運(yùn)行的系統(tǒng)運(yùn)行中如我們的電梯運(yùn)行系統(tǒng),它將完成許多工作。不過(guò)這

32、將是自頂向下設(shè)計(jì)的下一步任務(wù)了。 后面的display()和results()都是簡(jiǎn)化了的虛擬操作,在具體的仿真問(wèn)題中,它們都應(yīng)有更多的操作,在我們的實(shí)例中,限于篇幅,不可能面面俱到,重點(diǎn)是仿真運(yùn)行過(guò)程的實(shí)現(xiàn),而對(duì)于過(guò)程顯示和結(jié)果輸出就只能從簡(jiǎn)了。 電梯運(yùn)行系統(tǒng)building為了把初步的抽象仿真程序具體化,我們把整個(gè)辦公大樓視為一個(gè)電梯運(yùn)行的系統(tǒng),它應(yīng)該是類simulation 的派生類,把它稱為類building,這個(gè)類與其基類的主要區(qū)別是:1)其數(shù)據(jù)成員不是簡(jiǎn)單的兩個(gè)時(shí)間值:timeSimulate 和timeRemaining,而是三個(gè)對(duì)象:Persons, Floors, Eleva

33、tors.它們分別是人員集合,樓層集合,電梯集合,這是整個(gè)仿真系統(tǒng)的動(dòng)作實(shí)體;2) 其函數(shù)成員,除了繼承基類的函數(shù)成員之外,列出的函數(shù)成員雖然名稱與基類的函數(shù)相同,但執(zhí)行的任務(wù)的內(nèi)容是不同的。類building 的定義也分為兩部分:1 /building.h2 #ifndef _BUILDING_H3 #define _BUILDING_H45 #include "simulation.h"6 #include "person.h"7 #include "floor.h"8 #include "elevator.h"

34、;第十一章 用276 C+語(yǔ)言設(shè)計(jì)面向?qū)ο蟪绦?10 class building : public simulation11 persSet Persons;12 floorSet Floors;13 elevSet Elevators;14 public :15 bool continues (void);16 void perform (void);17 void display (void);18 1920 #endif /_BUILDING_H程序說(shuō)明:(1) 類building 是simulation 的派生類,是它的具體化。當(dāng)然,基類的數(shù)據(jù)成員和函數(shù)成員也是building 類的

35、成員,因此是基類的擴(kuò)展。(2) 最明顯的擴(kuò)展是抽象的仿真類中只有兩個(gè)整數(shù)作為它的數(shù)據(jù)成員。而building 類中增加了三個(gè)數(shù)據(jù)成員:參與到系統(tǒng)中的人的集合,大樓中的若干電梯的集合及大樓的各個(gè)樓層組成的集合。仿真過(guò)程中他們的狀態(tài)不斷地在變化。時(shí)間、人群、電梯、樓層的各種狀態(tài)值組成了整個(gè)大樓類的數(shù)據(jù)成員。(3) 由上節(jié)的說(shuō)明可知。類simulation 的主要操作:display(),perform()和results()是虛擬化的,當(dāng)然應(yīng)該具體化,不過(guò)由于results()與其他方面涉及較少,這里就不再求精了。而原來(lái)的continues()基本功能是正常的,但還要作一點(diǎn)小小的改進(jìn),所以在類bu

36、ilding 中重新說(shuō)明了這三個(gè)函數(shù)成員,以取代基類中的簡(jiǎn)單定義。它們的定義在building.cpp 中給出:1 /building.cpp2 #include "building.h"3 #include <conio.h>4 #include <> / 與函數(shù)display ()的需求有關(guān)56 bool building:continues (void)7 if (kbhit ()8 if (getch()=ESCKEY)11.3 電梯運(yùn)行系統(tǒng)building 2779 SetTime (0);10 return simulation:cont

37、inues();11 / 增加了按ESC 鍵可以終止仿真過(guò)程的功能1213 void building:perform (void)14 Persons.action ();15 Elevators.action (Floors, Persons);16 reduceTime (1);17 totalTime+;18 / 整個(gè)大樓的一次動(dòng)作,即每個(gè)人和每個(gè)電梯的一次動(dòng)作1920 void building:display (void)21 Floors.showFloor (Persons);22 Elevators.showElevators ();23 avgWait = Floors.a

38、vgWaiting ();24 avgRide = Elevators.avgRiding ();25 dis ();26 / 顯示功能被簡(jiǎn)化27 / 程序中的行號(hào),不是程序的一部分,是為了說(shuō)明的方便,下同。程序說(shuō)明:(1) 第611 行定義了新的continue()函數(shù),僅僅是增加了一項(xiàng)終端仿真過(guò)程的手段,在仿真程序運(yùn)行中,按一下Esc 鍵,就會(huì)引起強(qiáng)迫剩余時(shí)間量為0(SetTime(0),從而終止仿真過(guò)程。(2) 第1318 行是新的perform()函數(shù)的定義,這里有較大的變動(dòng):主要的動(dòng)作發(fā)生在1415 行;系統(tǒng)的每個(gè)人應(yīng)有一次選擇和動(dòng)作;每個(gè)電梯有一次動(dòng)作,該動(dòng)作將與人群和各樓層的狀態(tài)

39、有關(guān)。第16 行減少剩余時(shí)間1 秒,即每一步動(dòng)作占用1 秒鐘時(shí)間。這和(尚未說(shuō)明的)狀態(tài)變量totalTime 加1 是同一含義。雖然這個(gè)函數(shù)不長(zhǎng),但讀者不難發(fā)現(xiàn),第1415 行的兩次函數(shù)調(diào)用可能包含比較多的人或電梯的動(dòng)作。同時(shí)也涉及樓層狀態(tài)的變化,可以說(shuō)這將是下一步編程的主要任務(wù)。第2032 行定義了新的display(),從11.1 節(jié)中的抽象主程序可以看出,主循環(huán)每隔一秒循環(huán)一次,執(zhí)行一次perform(),然后就通過(guò)執(zhí)行display()來(lái)修改屏幕上的顯示內(nèi)容。第十一章 用278 C+語(yǔ)言設(shè)計(jì)面向?qū)ο蟪绦?電梯仿真程序的總體框架完成了類simulation 及其派生類building

40、的設(shè)計(jì),并沒(méi)有結(jié)束總體框架的設(shè)計(jì),還必須設(shè)定一系列在整個(gè)電梯仿真過(guò)程中的常量、變量及隨機(jī)函數(shù)值,其中,常量是指為系統(tǒng)運(yùn)行設(shè)定的值,例如,大樓的樓層數(shù)MAXFLOORS,電梯數(shù)MAXELEVS,電梯的容量CAPACITY 等等。全局變量是指系統(tǒng)運(yùn)行中要統(tǒng)計(jì)或記錄的量,例如,當(dāng)前摟內(nèi)總?cè)藬?shù)inBuilding,離開(kāi)人數(shù)leftBuilding 等等,這些變量的設(shè)定主要用于系統(tǒng)狀態(tài)顯示和統(tǒng)計(jì)結(jié)果,設(shè)計(jì)者可以根據(jù)需要增減。隨機(jī)函數(shù)的設(shè)定是仿真系統(tǒng)運(yùn)行所需要的,例如,一個(gè)在樓外的人要根據(jù)隨機(jī)函數(shù)wantsToEnter() 來(lái)決定是否進(jìn)樓, 他在等待電梯時(shí)根據(jù)隨機(jī)函數(shù)EnterDest()來(lái)決定其乘電梯

41、的目標(biāo)層數(shù)等等,這些隨機(jī)函數(shù)值的生成細(xì)節(jié)在代碼中忽略。為了說(shuō)明這些全局量,可以定義成一個(gè)更大的類elvesim,但這里僅僅把它們以全局說(shuō)明的形式組成一個(gè)頭文件。電梯仿真系統(tǒng)的主程序與前述有所不同:/ elevsim.cpp1 #include<stdlib.h>2 #include<time.h>3 #include "elevsim.h"4 #include "building.h"5 #include <.>6 /與顯示相關(guān)的標(biāo)準(zhǔn)函數(shù)庫(kù)78 void initdisplay (void) ;910 building

42、 buildsim;1112 void main ( ) 13 srand( (unsigned)time( NULL ) ); /使每次產(chǎn)生的隨機(jī)數(shù)都不同第十一章 用280 C+語(yǔ)言設(shè)計(jì)面向?qū)ο蟪绦?4 initdisplay( );15 buildsim.display( ) ;16 while(buildsim. continues ( ) ) 17 buildsim.perform( ) ;18 buildsim.display( ) ;19 20 buildsim.results ( ) ;21 2223 void initdisplay(void) 24 / 25 /設(shè)置屏幕顯示的

43、初始狀態(tài)和數(shù)值,26 /其主要部分為:27 /屏幕底行:顯示主要統(tǒng)計(jì)項(xiàng)目的名稱和28 /數(shù)值,右下角為仿真時(shí)鐘29 /屏幕左邊列:顯示樓層狀態(tài),自下向上30 /分列0 層,1 層,9 層,對(duì)每層列出31 /層號(hào),等待人數(shù),按鈕狀態(tài)(一,U,D)32 /屏幕頂行和中央?yún)^(qū):顯示各電梯狀態(tài):33 /頂行自左至右列出0 一9 號(hào)電梯的當(dāng)34 /前所在樓層號(hào),而在第i 號(hào)電梯所35 /在的列,和i 號(hào)電梯所在的樓層對(duì)36 /應(yīng)的行處,列出該電梯的乘客人37 /和運(yùn)行狀態(tài)(U,D,N)38 /顯示的狀況可見(jiàn)下面的示意圖(圖111),顯39 /示的內(nèi)容和方法,完全可以由設(shè)計(jì)者40 /創(chuàng)造出不同的布局41 1

44、1.4 persong 類的設(shè)計(jì) 281圖11.1 屏幕顯示的布局設(shè)計(jì)圖11.1 是一個(gè)屏幕顯示的布局設(shè)計(jì)方案,圖的中間部分是移動(dòng)著的電梯,電梯中的符號(hào)表示上行或下行,數(shù)字顯示電梯中的人數(shù),圖的下部給出系統(tǒng)運(yùn)行的若干狀態(tài)值,從定義來(lái)看,要變動(dòng)的顯示內(nèi)容包括:與樓層狀態(tài)有關(guān)的信息顯示;與電梯有關(guān)的信息顯示;重新計(jì)算各層的平均等待人數(shù);重新計(jì)算各電梯的平均乘客數(shù);重新顯示若干狀態(tài)變量值(在最下行);totalPeople:總?cè)藬?shù);inBuilding:大樓內(nèi)人數(shù);leftBuilding:離開(kāi)大樓人數(shù);avgWait:各層平均等待人數(shù);avgRide:各電梯平均乘客數(shù);第十一章 用282 C+語(yǔ)言

45、設(shè)計(jì)面向?qū)ο蟪绦騮ookStair:步行走樓梯的人數(shù);MAXELEVS:電梯數(shù);MAXFLOORS:樓層數(shù);在屏幕的右下角重新顯示從仿真開(kāi)始時(shí)計(jì)數(shù)的時(shí)間,用*小時(shí)*分*秒的形式顯示。顯示的任務(wù)雖然列了許多,但實(shí)際編程卻比較簡(jiǎn)單,因此程序中忽略這些細(xì)節(jié),讀者可以根據(jù)需要和個(gè)人的興趣采用不同的設(shè)計(jì)方案?,F(xiàn)在讓我們來(lái)討論一下整個(gè)設(shè)計(jì)過(guò)程,從中分析一下各模塊之間的關(guān)系。全局仿真程序elevsim 的主要核心是類building 的設(shè)計(jì),類building 的設(shè)計(jì)有四個(gè)相關(guān)類:它的基類simulation;它的成員類:persSet,floorSet 和elevSet。而后三個(gè)類又有它們的成員類,分別是

46、:Person,floor,elevator。所以各程序模塊的關(guān)系可以如圖112 所示。圖11.2 各程序模塊的關(guān)系圖各程序模塊之間既有聯(lián)系,又相對(duì)封閉,形成各自的獨(dú)立結(jié)構(gòu),這樣的程序可讀性較好,易于編寫(xiě),易于修改,易于調(diào)試。在這個(gè)總體框架下,下一步開(kāi)始程序設(shè)計(jì)的主要任務(wù),設(shè)計(jì)大樓中的活動(dòng)實(shí)體:人,電梯和大樓的各個(gè)樓層在仿真過(guò)程中的動(dòng)作?!白皂斚蛳隆钡卦O(shè)計(jì)人員類person 與人員集合類persSet;樓層類floor 和樓層集合類floorSet;電梯類elevator 和電梯集合類elevSet。11.4 persong 類的設(shè)計(jì) 283 人員類person 與人員集合類persSet從上

47、節(jié)的程序中已經(jīng)可以看到person 類和persSet 類的設(shè)計(jì)是很重要的,它規(guī)定了系統(tǒng)中的動(dòng)作實(shí)體之一person(人)的行為,由于作為人員集合的persSet 類是人員類person 的對(duì)象數(shù)組,其成員函數(shù)較為簡(jiǎn)單,所以,兩個(gè)類的說(shuō)明包括在同一文件之中。下面是person 類和persSet 類的定義:1 /person.h2 #ifndef _PERSON_H3 #define _PERSON_H45 #include "elevsim.h"67 class person8 int floorNowOn; /所在樓層(在樓外為-1)9 int desfination;

48、 /目標(biāo)樓層10 int maxWaitTime; /最大的容忍等待時(shí)間11 bool waitingForElev; /是否正在等待12 bool takingStairs; /是否走樓梯13 int elevNowIn; /所在電梯號(hào)(不在電梯內(nèi)為-1)14 public:15 person ();16 void action (void); /人的一次動(dòng)作17 bool upwaiting (int floorNumber); /是否等上行電梯18 bool dnwaiting (int floorNumber); /是否等下行電梯19 bool loadIfWaiting (int e

49、levNumber,20 int floorNumber,21 int &pdest); /該層是否有電梯搭乘22 bool loadIfGoing (int elevNumber,23 int floorNumber,24 direction dir,25 int&pdest);/是否在該樓層有同一方向運(yùn)行的電梯可以搭乘26 bool discharge (int elevNumber,第十一章 用284 C+語(yǔ)言設(shè)計(jì)面向?qū)ο蟪绦?7 int floorNumber); / 是否到達(dá)目標(biāo)層,走出電梯28 ;2930 class persSet31 person paMAXPE

50、RSONS;32 public:33 void action (void); /每個(gè)人動(dòng)作一次34 void numWaiting (int floorNumber,35 int &nup,int &ndn); /統(tǒng)計(jì)該層等待上行下行人數(shù)36 bool loadAny (int elevNumber,37 int floorNumber,38 int &pdest); /是否有人在該層搭乘該電梯39 bool loadOne (int elevNumber,40 int floorNumber,41 direction dir,42 int &pdest); /

51、是否有人在該層搭乘該方向電梯43 int discharge(int elevNumber,44 int floorNumber); /該電梯在該層走出的人數(shù)45 ;4647 #endif /_PERSON_H程序說(shuō)明:(1)類person 是在大樓中的電梯運(yùn)行系統(tǒng)中的人,包括一個(gè)人與電梯運(yùn)行有關(guān)的數(shù)據(jù)和操作,另一個(gè)類persSet 實(shí)際上是person 的對(duì)象數(shù)組,不過(guò)它定義了幾個(gè)特殊的操作。(2)類person 的數(shù)據(jù)成員為:floorNowOn: 當(dāng)前所在樓層,在樓外為-1destination: 要到的目標(biāo)層maxWaitTime: 當(dāng)前還能再等待的時(shí)間waitingForElev:

52、是否在等電梯takingStairs: 是否在走樓梯elevNowIn: 所在電梯號(hào),不在電梯中為-1(3)共七個(gè)公有函數(shù)成員,其中action()是最基本的也最復(fù)雜。它們的功能可從下面的定義中了解。11.4 persong 類的設(shè)計(jì) 2851 /person.cpp2 #include "person.h"3 #include <stdlib.h>45 person:person ()6 floorNowOn = -1; /不在樓內(nèi)7 waitingForElev = false; /未等電梯8 destination = -1; /無(wú)目標(biāo)層9 maxWait

53、Time = 0; /不等待10 takingStairs = false; /未步行樓梯11 elevNowIn = -1; /不在電梯中12 / 一個(gè)人員對(duì)象的初始設(shè)置1314 void person:action (void)15 /如在樓外,決定是否進(jìn)大樓16 if (floorNowOn<0) /不在樓內(nèi)17 if (wantsToEnter() /決定進(jìn)入18 destination = EnterDest(); /決定目標(biāo)層19 floorNowOn = 0; /當(dāng)前樓層:在底層20 maxWaitTime = MaxWait(); /設(shè)置最大等待時(shí)間21 waitingF

54、orElev = true; /設(shè)置為等待電梯狀態(tài)22 takingStairs = false; /不走樓梯23 elevNowIn = -1; /不在電梯中24 totalPeople+; /總?cè)藬?shù)+125 inBuilding+; /樓內(nèi)人數(shù)+126 27 28 else /已在樓中29 if (waitingForElev) /正在等待30 if (maxWaitTime-) <= 0) /等待時(shí)間超限31 waitingForElev = false; /停止等待32 takingStairs = true; /改走樓梯33 maxWaitTime = 30*abs(desti

55、nation-floorNowOn);34 /每走一層用30 秒,作為下次等待上限第十一章 用286 C+語(yǔ)言設(shè)計(jì)面向?qū)ο蟪绦?5 tookStair+; /步行者人數(shù)計(jì)數(shù)36 37 38 else /未等待39 if (takingStairs) /正在走樓梯40 if (maxWaitTime-) <= 0) /已到達(dá)目標(biāo)層41 floorNowOn = destination; /在目標(biāo)層42 takingStairs = false; /停止走樓梯43 maxWaitTime = Business(); /設(shè)置新的工作時(shí)間44 45 46 else /也未走樓梯47 if (el

56、evNowIn<0) /未在電梯中,值為148 if (maxWaitTime-) <= 0) /等待時(shí)間超限49 if (leaving() /決定離開(kāi)50 destination = 0; /設(shè)置目標(biāo)層為最底層51 else 52 destination = EnterDest();53 /選某一層為目標(biāo)層54 if (destination = floorNowOn)55 destination = 0;56 /不允許到同一層57 maxWaitTime = MaxWait();58 /設(shè)置最大等待時(shí)間59 waitingForElev = true; /設(shè)置為等待狀態(tài)60 / 開(kāi)始等待電梯到新的目標(biāo)層61 if (floorNowOn = 0)&&(destination = 0)62 floorNowOn = -1; /送出樓外63 leftBuilding+; /離去人數(shù)+164 inBuilding-; /樓內(nèi)人數(shù)-165 66 67 /* action() */6811.4 persong 類的設(shè)計(jì) 28769 bool person:upwaiting (int floorNumber)70 return wai

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論