第一篇:c++作業(yè)
P179 5.9.2(11)
1.意圖
保證一個(gè)類僅有一個(gè)實(shí)例,并提供一個(gè)訪問它的全局訪問點(diǎn)。
2.動機(jī)
對一些類來說,只有一個(gè)實(shí)例是很重要的。雖然系統(tǒng)中可以有許多打印機(jī),但卻只應(yīng)該有一個(gè)打印假脫機(jī)(printer spooler),只應(yīng)該有一個(gè)文件系統(tǒng)和一個(gè)窗口管理器。一個(gè)數(shù)字濾波器只能有一個(gè)A / D轉(zhuǎn)換器。一個(gè)會計(jì)系統(tǒng)只能專用于一個(gè)公司。
我們怎么樣才能保證一個(gè)類只有一個(gè)實(shí)例并且這個(gè)實(shí)例易于被訪問呢?一個(gè)全局變量使得一個(gè)對象可以被訪問,但它不能防止你實(shí)例化多個(gè)對象。一個(gè)更好的辦法是,讓類自身負(fù)責(zé)保存它的唯一實(shí)例。這個(gè)類可以保證沒有其他實(shí)例可以被創(chuàng)建(通過截取創(chuàng)建新對象的請求),并且它可以提供一個(gè)訪問該實(shí)例的方法。這就是Singleton模式。
3.適用性
在下面的情況下可以使用Singleton模式.當(dāng)類只能有一個(gè)實(shí)例而且客戶可以從一個(gè)眾所周知的訪問點(diǎn)訪問它時(shí)。當(dāng)這個(gè)唯一實(shí)例應(yīng)該是通過子類化可擴(kuò)展的,并且客戶應(yīng)該無需更改代碼就能使用一個(gè)擴(kuò)展的實(shí)例時(shí)。
4.結(jié)構(gòu)
5.參與者
Singleton
定義一個(gè)GetInstance操作,允許客戶訪問它的唯一實(shí)例。GetInstance是一個(gè)類操作(即Smalltalk中的一個(gè)類方法和C++中的一個(gè)靜態(tài)成員函數(shù))??赡茇?fù)責(zé)創(chuàng)建它自己的唯一實(shí)例。
6.協(xié)作
客戶只能通過Singleton的GetInstance操作訪問一個(gè)Singleton的實(shí)例。
7.效果
Singleton模式有許多優(yōu)點(diǎn):
1)對唯一實(shí)例的受控訪問因?yàn)镾ingleton類封裝它的唯一實(shí)例,所以它可以嚴(yán)格的控制客戶怎樣以及何時(shí)訪問它。
2)縮小名空間Singleton模式是對全局變量的一種改進(jìn)。它避免了那些存儲唯一實(shí)例的全局變量污染名空間。
3)允許對操作和表示的精化Singleton類可以有子類,而且用這個(gè)擴(kuò)展類的實(shí)例來配置一個(gè)應(yīng)用是很容易的。你可以用你所需要的類的實(shí)例在運(yùn)行時(shí)刻配置應(yīng)用。
4)允許可變數(shù)目的實(shí)例這個(gè)模式使得你易于改變你的想法,并允許Singleton類的多個(gè)實(shí)例。此外,你可以用相同的方法來控制應(yīng)用所使用的實(shí)例的數(shù)目。只有允許訪問Singleton實(shí)例的操作需要改變。
5)比類操作更靈活另一種封裝單件功能的方式是使用類操作(即C++中的靜態(tài)成員函數(shù)或者是Smalltalk中的類方法)。但這兩種語言技術(shù)都難以改變設(shè)計(jì)以允許一個(gè)類有多個(gè)實(shí)例。
此外,C++中的靜態(tài)成員函數(shù)不是虛函數(shù),因此子類不能多態(tài)的重定義它們。
8.實(shí)現(xiàn)
class Singleton
{
static std::auto_ptr
protected:
//prevent user making our any instance by manually
//構(gòu)造函數(shù)是保護(hù)類型的。
Singleton(){}
public:
~Singleton(){}
//Return this singleton class' instance pointer
static Singleton* Instance()
{
if(!m_pInstance.get())
{
m_pInstance = std::auto_ptr
}
return m_pInstance.get();
}
};
怎樣來使用它呢?不要試圖從這個(gè)類派生你的單件子類,那樣的結(jié)果是不妥當(dāng)?shù)模绻阈枰鄠€(gè)單件子類,還是使用下面的宏定義更為妥當(dāng):
#define DEFINE_SINGLETON(cls)
private:
static std::auto_ptr
protected:
cls(){}
public:
~cls(){}
static cls* Instance(){
if(!m_pInstance.get()){
m_pInstance = std::auto_ptr
}
return m_pInstance.get();
}
#define IMPLEMENT_SINGLETON(cls)
std::auto_ptr
假定你需要實(shí)現(xiàn)一個(gè)單件類YY,這樣書寫:
class YY
{
DEFINE_SINGLETON(YY);
public:
//your interfaces here...};
在cpp文件中,書寫:
IMPLEMENT_SINGLETON(YY);
需要引入這個(gè)類的實(shí)例的時(shí)候,使用這樣的語句:
YY* pYY = YY::Instance();
這,就是全部。
如果需要定義其他的單件類,重復(fù)上面的定義,就可以了。
當(dāng)想集中管理一個(gè)應(yīng)用程序所需的所有配置時(shí),可以聲明一個(gè)CToolsOptions的類,其中包含配置屬性集合。對于這個(gè)類的實(shí)例,顯然是一個(gè)實(shí)例就夠了;當(dāng)編寫繪圖程序時(shí),考慮繪制矩形,圓形等分別使用CGraphTool派生的工具類,每個(gè)派生類負(fù)責(zé)處理具體的繪制動作和相關(guān)的UI相應(yīng)邏輯。這些工具類典型的在被用戶選擇工具欄的圖元按鈕時(shí)被選中。依照這種模式,你應(yīng)該對所有的圖元工具從事注冊工作,使得繪圖程序了解運(yùn)行時(shí)刻可以使用那些圖元工具。同樣的,負(fù)責(zé)管理注冊信息的這個(gè)管理器也只需
P2467.6.2(1)
必須把它作為類成員函數(shù)的運(yùn)算符有:
(),[],->和任何賦值運(yùn)算符,重載這些運(yùn)算符時(shí)必須把操作符函數(shù)聲明為類的成員函數(shù)
什么時(shí)候定義類成員操作符重載,什么時(shí)候定義非類成員操作符重載?
答:(1)如果一個(gè)重載操作符是類成員,那么只有當(dāng)跟它一起使用的左操作數(shù)是該類對象時(shí),它才會被調(diào)用,如果該操作符的左操作數(shù)必須是其他類型,那么重載操作符必須是非類成員操作符重載。
(2)C++要求,賦值(=),下標(biāo)([ ]),調(diào)用(())和成員訪問箭頭(->)操作符必須被指定為類成員操作符,否則錯(cuò)誤。
第二篇:C++數(shù)據(jù)結(jié)構(gòu) 大作業(yè)課程設(shè)計(jì)
C++/數(shù)據(jù)結(jié)構(gòu) 大作業(yè)/課程設(shè)計(jì)——【校園導(dǎo)游咨詢】【停車場管理】娃娃們可以收著以后用 絕對純手工打造 內(nèi)含類模塊/一維指針數(shù)組(謹(jǐn)以此程序供大家參考。運(yùn)行結(jié)果后面有貼圖)
目錄
【1】校園導(dǎo)游咨詢 程序設(shè)計(jì)源代碼 及 截圖 【2】停車場管理——方案一 程序設(shè)計(jì)源代碼 及 截圖 【3】停車場管理——方案二 程序設(shè)計(jì)源代碼 及 截圖
【1】【【校園導(dǎo)游咨詢】】
######
(ps:該校園導(dǎo)游咨詢系統(tǒng)沒有輸入值,所有信息是都在class MGraph的構(gòu)造函數(shù)中傳輸?shù)模倚@景點(diǎn)信息皆為【【上海電力學(xué)院】】景點(diǎn)信息。請大家注意,直接從文章copy到visual stutio中會出現(xiàn)中文字符,注意刪除,推薦大家在一行語句的分號后面,點(diǎn)出光標(biāo),按一下delete鍵,然后按一下enter鍵,完成visual stutio的自動對齊,這樣程序看起來一目了然,更易于操作和更改)【問題描述】
設(shè)計(jì)一個(gè)校園導(dǎo)游程序,為來訪的客人提供各種信息查詢服務(wù)?!净疽蟆?/p>
(1)設(shè)計(jì)你所在學(xué)校的校園平面圖,所含景點(diǎn)不少于10個(gè)。以圖中頂點(diǎn)表示校內(nèi)各景點(diǎn),存放景點(diǎn)名稱、代號、簡介等信息;以邊表示路徑,存放路徑長度等相關(guān)信息。(2)為來訪客人提供圖中任意景點(diǎn)相關(guān)信息的查詢。
(3)為來訪客人提供圖中任意景點(diǎn)的問路查詢,即查詢?nèi)我鈨蓚€(gè)景點(diǎn)之間的一個(gè)最短的簡單路徑。【選作內(nèi)容】
(6)擴(kuò)充每個(gè)景點(diǎn)的鄰接景點(diǎn)的方向等信息,使得路徑查詢結(jié)果能提供詳盡的導(dǎo)向信息。**************************【以下為類的定義】******************************** #include
class direction;template
{ friend class MGraph
direction dir;//存放頂點(diǎn)方位信息的direction類的dir。};
class direction { public: int ln;//存放在方向圖中的橫坐標(biāo),表示東西 int col;//存放在方向圖中的縱坐標(biāo),表示南北 };template
{ public: MGraph();
//構(gòu)造函數(shù),初始化具有n個(gè)頂點(diǎn)的圖
void printvexname();//顯示所有景點(diǎn)及景點(diǎn)代號
void printvexinf(int i);//顯示代號為i景點(diǎn)的名稱及信息
void printroad(int i,int j);//顯示景點(diǎn)i~j的最短路徑方案信息
void printdir(int i,int j);//顯示景點(diǎn)i到j(luò)的方向信息,如“向東100m,向南200m” VertexNode
void Root(int p,int q);//遞歸尋找pq間的最短路徑
int Path[MaxSize][MaxSize],Dist[MaxSize][MaxSize];//創(chuàng)建Path和Dist分別存放兩點(diǎn)間最短路徑的前驅(qū)節(jié)點(diǎn),兩點(diǎn)間最短路徑長度
int Line[MaxSize];//Line存放路徑 int kkk;//Line[]數(shù)組的標(biāo)記
private: T vertex[MaxSize];//存放圖中頂點(diǎn)的數(shù)組
int arc[MaxSize][MaxSize];//存放圖中邊的數(shù)組 };*************************【以下為類的實(shí)現(xiàn) 即類函數(shù)的定義】*********************************** template
//s[]為存放景點(diǎn)鄰接矩陣信息的一維數(shù)組,根據(jù)其對稱性可以用公式賦值給二維數(shù)組arc[][] { int s[]={0, 1,0, 0,2,0, 0,0,2,0, 0,0,2,3,0, 0,0,0,4,2,0, 0,0,0,0,2,3,0, 0,0,0,0,2,3,1,0, 0,0,2,0,2,0,0,2,0, 4,0,2,0,0,0,0,0,1,0, 0,0,0,0,0,0,0,0,0,2,0, 1,0,0,0,0,0,0,0,0,0,2,0, 0,0,0,0,0,0,0,0,0,3,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,2,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0, 0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,2,0, 0,0,0,0,0,0,0,0,0,0,0,0,4,4,0,0,2,0};int a[]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17};char* b[]={“南門”,“實(shí)驗(yàn)樓”,“南圖”,“大活”,“睿思樓”,“大禮堂”, “南4教”,“知行樓”,“國交樓”,“南3教”,“南2教”,“南1教”, “北圖”,“北3教”,“北4教”,“北2教”,“北1教”,“北門”};char* c[]={“南校區(qū)正門”,“物理實(shí)驗(yàn)樓”,“南校區(qū)圖書館”,“大學(xué)生活動中心”, “教師辦公樓、醫(yī)務(wù)室及留學(xué)生公寓”,“大禮堂,用于舉辦各種文藝演出”,“南校區(qū)第4教學(xué)樓”,“實(shí)習(xí)基地,計(jì)算機(jī)房等”, “國際交流中心,教職工餐廳”,“南校區(qū)第3教學(xué)樓”,“南校區(qū)第2教學(xué)樓”,“南校區(qū)第1教學(xué)樓”, “北校區(qū)圖書館”,“北校區(qū)第3教學(xué)樓”,“北校區(qū)第4教學(xué)樓”,“北校區(qū)第2教學(xué)樓”, “北校區(qū)第1教學(xué)樓”,“北校區(qū)正門”};int d[]={8,6,4,4,1,0,0,1,3,4,6,8,4,3,2,3,5,8};int e[]={8,8,8,10,8,10,7,6,6,6,6,6,3,1,0,0,0,2};int i,j;vertexNum=18;arcNum=30;
for(i=0;i for(j=0;j template cout<<“向東”< cout<<“向南”< if(Path[p][q]>0){ Root(p,Path[p][q]);Root(Path[p][q],q);} else { Line[kkk]=q;kkk++;} } template for(q=0;q Dist[p][q]=Dist[p][k]+Dist[k][q];Path[p][q]=k;} cout<<“n=======n”;cout<<“從”< { int choice;cout<<“================”< 【2】【停車場管理系統(tǒng)【方案一 程序】】 ###### (ps:該程序有漏洞,若將要離開的車輛是停于便道上的,則對該車進(jìn)行駛離操作時(shí)程序內(nèi)部有錯(cuò)誤數(shù)據(jù),雖然做了函數(shù)完成這一功能,但因時(shí)間有限,沒能及時(shí)查找更正,現(xiàn)在懶得改了。。大家將就看吧。不過運(yùn)行是可以的)【問題描述】 設(shè)停車場是一個(gè)可停放n輛汽車的 長通道,且只有一個(gè)大門可供汽車進(jìn)出。汽車在停車場內(nèi)按車輛到達(dá)時(shí)間的先后順序,依次由北向南排列(大門在最南端,最先到達(dá)的第一輛車信放在車場的最北端),若車場內(nèi)已停滿n輛汽車,則后來的汽車只能在門外的便道上等候,一旦有車開走,則排在便道上的第一輛車即可開入;當(dāng)停車場內(nèi)某輛車要離開時(shí),在它之后進(jìn)入的車輛必須先退出車場為它讓路,待該輛車開出大門外,其他車輛再按原次序進(jìn)入車場院,每輛停放在車場的車在它離開停車場時(shí)必須按它停留的時(shí)間長短交納費(fèi)用。試為停車場編制按上述要求進(jìn)行管理的模擬程序?!净疽蟆?/p> 以棧模擬停車場,以隊(duì)列模擬車場外的便道,按照從終端讀入的輸入數(shù)據(jù)序列進(jìn)行模擬管理。每一組輸入數(shù)據(jù)包括三個(gè)數(shù)據(jù)項(xiàng):汽車“到達(dá)”或“離去”信息、汽車牌照號碼以及到達(dá)或離去的時(shí)刻。對每一組輸入數(shù)據(jù)進(jìn)行操作后的輸出信息為:若是車輛到達(dá),則輸出汽車在停車場內(nèi)或便道上的停車位置;若是車輛離去,則輸出汽車在停車場內(nèi)停留的時(shí)間和應(yīng)交納的費(fèi)用(在便道上停留的時(shí)間不收費(fèi))。棧以順序結(jié)構(gòu)實(shí)現(xiàn),隊(duì)列以鏈表結(jié)構(gòu)實(shí)現(xiàn)?!緶y試數(shù)據(jù)】 設(shè)n=2,輸入數(shù)據(jù)為:(A,1,5),(A,2,15),(A,3,20),(A,4,25),(A,5,30),(D,2,35),(D,4,40),(E,0,0)。其中:A表示到達(dá)(Arrival);D表示離去(Departure);E表示輸入結(jié)束(End)。**************************【以下為類的定義】************************************* #include const double price=30;//每小時(shí)的費(fèi)用 //思想:(報(bào)告第四頁) //我的系統(tǒng)界面,輸入信息為:(到達(dá)/離開/退出);車牌號;時(shí)刻 //因此,我的停車場類分成車輛到達(dá)和車輛離開兩個(gè)主要的函數(shù)實(shí)現(xiàn)。//車輛到達(dá),有入棧和入隊(duì)。車輛離開有出棧,出隊(duì)和入棧操作。 //因此我又編寫入棧的類,隊(duì)的類。與parkingmanagement進(jìn)行友元。 //**************************************類定義*********************************************** class car//車的信息類 { public: double time;//計(jì)費(fèi)時(shí)間 int number;//車牌號 car *next;//存放car類型元素的數(shù)組初始地址 };class carstack//棧(停車場)的類 { friend class parkingmanagement;//parkingmanagement能訪問carstack類中所有成員 public: carstack();//構(gòu)造函數(shù),棧的初始化 int empty();//判斷棧是否為空 int full();//判斷棧是否為滿 car *s;//存放car類型棧元素的數(shù)組初始地址 int top;//棧頂指針 };class carqueue//隊(duì)列(便道)的類 { friend class parkingmanagement;//parkingmanagement能訪問carstack類中所有成員 public: carqueue();//構(gòu)造函數(shù),隊(duì)列的初始化 int full();//判斷隊(duì)列是否為滿 car *front,*rear;//存放car類型隊(duì)列元素的數(shù)組初始地址 };class parkingmanagement { public: int pushstack(carstack &cs,int cnum,double ctime);//入棧,cs棧內(nèi)進(jìn)行調(diào)整,返回棧內(nèi)位置 void popstack(carstack &cs,int cnum);//出棧,cs棧內(nèi)進(jìn)行調(diào)整,//根據(jù)車牌號把車彈出棧,將出棧car的number賦值給int popstacknumber()//將出棧car的time賦值給double popstacktime(),無返回值! int pushqueue(carqueue &cq,int cnum,double ctime);//入隊(duì),隊(duì)內(nèi)進(jìn)行調(diào)整,返回隊(duì)內(nèi)位置 int popqueue(carqueue &cq);//出隊(duì),隊(duì)內(nèi)進(jìn)行調(diào)整,返回汽車車牌號 void arrival(carstack &cs,carqueue &cq,int cnum,double ctime);//車輛到達(dá),//根據(jù)輸入的車牌號、到達(dá)時(shí)間,變更函數(shù)參數(shù);并cout車位信息 void leave(carstack &cs,carqueue &cq,int cnum,double ctime);//車輛離開,//根據(jù)輸入的車牌號找到汽車,并進(jìn)行出棧操作、出隊(duì)操作和入棧操作; //并cout停留時(shí)間和收費(fèi)情況 void deletequeue(carqueue &cq,int i);//刪除cq過道中第i輛車 int popstacknumber;//專門存放出棧的時(shí)候返回的車牌號 double popstacktime;//專門存放出棧的時(shí)候返回的時(shí)刻 };**********************************【以下為類的實(shí)現(xiàn)】************************************ carstack::carstack()//構(gòu)造函數(shù),棧的初始化 { top=-1;s=new car[Max];//創(chuàng)建car類型棧元素的數(shù)組 if(s==NULL){ cout<<“棧空間分配不成功!”< cs.top++;(cs.s[cs.top]).number=cnum;//將cnum賦給棧頂位置的車的車牌號,s是car類型棧元素的數(shù)組(cs.s[cs.top]).time=ctime;//將ctime賦給棧頂位置的車的入棧時(shí)間,s是car類型棧元素的數(shù)組 return(cs.top+1);//返回棧內(nèi)位置加1,即停車場內(nèi)車位從1號開始 } } void parkingmanagement::popstack(carstack &cs,int cnum)//出棧,cs棧內(nèi)進(jìn)行調(diào)整,//根據(jù)車牌號把車彈出棧,將出棧car的number賦值給int popstacknumber //將出棧car的time賦值給double popstacktime,無返回值!{ int i;car p;carstack stemp;//定義一個(gè)carstack類型的臨時(shí)存放出棧元素的棧 for(i=0;i<=cs.top;i++)if((cs.s[i]).number==cnum)break;//當(dāng)要出棧的車的車牌號=棧內(nèi)的車牌號元素時(shí),跳出循環(huán) p=cs.s[i];//將要出棧的元素賦給car類型的p存放 while(cs.top>i)stemp.s[++(stemp.top)]=cs.s[(cs.top)--];//出棧的元素?cái)?shù)組逐個(gè)賦給臨時(shí)棧 popstacknumber=p.number;//將這個(gè)車牌號信息傳給int popstacknumber()popstacktime=p.time;//將該車的時(shí)間信息傳給double popstacktime()cs.top--;//棧頂指針回到原來位置 while(stemp.top>=0)cs.s[++(cs.top)]=stemp.s[(stemp.top)--];//臨時(shí)棧出棧的元素逐個(gè)賦給原棧,完成先退再進(jìn)的工作 } int parkingmanagement::pushqueue(carqueue &cq,int cnum,double ctime)//入隊(duì),隊(duì)內(nèi)進(jìn)行調(diào)整,返回隊(duì)內(nèi)位置 { car *p,*countp;int count(1);//count用于記錄車在過道上的位置信息,因隊(duì)列為鏈?zhǔn)降?,所以進(jìn)行循環(huán)累加 p=new car;//創(chuàng)建一個(gè)car類型的指針 p->number=cnum;p->time=ctime;p->next=NULL;//首先將指向存放car類型元素的數(shù)組初始地址置空 if(cq.front==NULL)//第一次入隊(duì)要判斷頭結(jié)點(diǎn)是否為空 { cq.front=cq.rear=p;} else {//尾插法插入元素 p->next=(cq.rear)->next;(cq.rear)->next=p;cq.rear=(cq.rear)->next;} countp=(cq.front)->next;while(countp!=NULL){ count++;countp=countp->next;}//count即車在過道上的位置,【從1開始計(jì)?。 ?return count;} int parkingmanagement::popqueue(carqueue &cq)//出隊(duì),隊(duì)內(nèi)進(jìn)行調(diào)整,返回汽車車牌號 { car p;p.number=((cq.front)->next)->number;//cq隊(duì)里,從cq.front開始指向下一個(gè)元素的車牌號賦給car類型的車信息 p.time=((cq.front)->next)->time;//cq隊(duì)里,從cq.front開始指向下一個(gè)元素的時(shí)刻 //賦給car類型的車信息 p.next=((cq.front)->next)->next;//cq隊(duì)里,從cq.front開始指向下一個(gè)元素的指針 //賦給car類型的車信息的下一個(gè)元素的指針 return p.number;cq.front=(cq.front)->next;} void parkingmanagement::arrival(carstack &cs,carqueue &cq,int cnum,double ctime)//車輛到達(dá),根據(jù)輸入的車牌號、到達(dá)時(shí)間,變更函數(shù)參數(shù);并cout車位信息 { int pos;if(!(cs.full()))//如果棧未滿,車輛停入停車場 { int fl(0),i;//定義一個(gè)從0開始的標(biāo)記fl for(i=0;i<=cs.top;i++){ if(cs.s[i].number==cnum)//如果到達(dá)的車的車牌號=棧內(nèi)已有車輛的車牌號 { fl=1;//fl記1 break;} } if(fl==1)//如果到達(dá)的車的車牌號!=棧內(nèi)已有車輛的車牌號 cout<<“輸入錯(cuò)誤!請重新輸入!”< cout<<“該停車場還有空位,請到”< { pos=pushqueue(cq,cnum,ctime);//入隊(duì),返回車位信息 cout<<“該停車場已滿,請將車停到便道”< { popstack(cs,cnum);//出棧操作 hour=ctime-popstacktime;//時(shí)間計(jì)算 outcarnum=popqueue(cq);//將便道上的第一輛車出隊(duì),入棧。并將其車牌號賦給outcarnum pstack=pushstack(cs,outcarnum,ctime);//將便道上的第一輛車,入棧 cout<<“該車在本停車場內(nèi)停留時(shí)間為”< { p=cq.front;while(p!=NULL){ count++;//如果在過道中找到該車,則該車的位置為過道中的第count位置(count從1開始)p=p->next;if(p->number==cnum)//在過道中找到要出去的車,則在隊(duì)列中刪除該car。//后面的車輛依然順序排列,補(bǔ)足空位 { deletequeue(cq,count);if(count>Max){ cout<<“您的車在便道上的位置為”< car *p,*q;int j(0);p=cq.front;while(p && j ######【3】【停車場管理系統(tǒng)【方案二 程序】】 (ps:本方案與方案一有同樣的問題,就是在對 便道上的車 進(jìn)行駛離操作時(shí),數(shù)據(jù)錯(cuò)誤,同樣的理由,沒有改正。如果有細(xì)心娃娃幫忙指點(diǎn)改正,在此感激啦~) *************************【以下為類定義】************************************ #include struct Node//過道停車的隊(duì)列所需鏈?zhǔn)浇Y(jié)點(diǎn) { T carnum;//定義車牌號類型 Node friend class carStack;public: T carnum;//車號 int cartime;//停車時(shí)間 }; template int EnQueue(T cnum);//將元素x入隊(duì),并返回其在隊(duì)內(nèi)的位置(從1開始)T DeQueue();//將隊(duì)頭鏈?zhǔn)浇Y(jié)點(diǎn)出隊(duì),并返回汽車車牌號 void deletequeue(int i);//將隊(duì)內(nèi)低i個(gè)元素刪除,即便道上i位置的汽車駛離 bool Empty();//判斷鏈隊(duì)列是否為空 Node int Popcar(T outcnum,int outctime);//將第cnum輛車出棧,并返回其停車時(shí)間(hour)bool full();//判斷棧是否為滿?滿則返回1 carinfo s=new Node front=rear=s;} else { rear->next=s;//將結(jié)點(diǎn)s插入到隊(duì)尾 rear=s;} p=front;while(p!=NULL){ i++;p=p->next;}//i即車在過道上的位置,【從1開始計(jì)??!】 return i;} template front=front->next;//將隊(duì)頭元素所在結(jié)點(diǎn)摘鏈 } return p->carnum;delete p;//將出隊(duì)進(jìn)棧的車從隊(duì)列里刪除 } template template :top(-1){//建立一個(gè)最大尺寸為size的空棧 S=new carinfo { cerr<<“動態(tài)存儲失??!”< template template void outputpark()//系統(tǒng)功能選擇頁面,輸入泊車信息 { cout<<“========================”< { cs.Pushcar(carnum,cartime);cout<<“請駛?cè)胪\噲龅摹? Node #include const N=5000;// 定義系統(tǒng)可錄入的職工最大數(shù)值 string Ename[N];long Enum[N];char Esex[N];int Eage[N]; char Emarriage[N];int Edepart[N];int Eposition[N];int Edegree[N];int Eworktime[N];float Epay[N]; class Employee { public: string Employeename; long Employeenum; char Employeesex; int Employeeage; char Employeemarriage; int Employeedepart; int Employeeposition; int Employeedegree; int Employeeworktime; float Employeepay; static long EmployeeMaxNum; static float EmployeeBasePay; void NewInfo(); void ShowInfo(); void showall(); void showdepart(int depart); void showdegree(int degree); void showage(int min,int max); void shownum(long number); void RefreshInfo(); void DeleteInfo(); float Pay(int Employeegrade); static int MaxNum();}; class DBOperate { public: string Employeename; long Employeenum; char Employeesex; int Employeeage; char Employeemarriage; int Employeedepart; int Employeeposition; int Employeedegree; int Employeeworktime; float Employeepay; static long EmployeeMaxNum; static float EmployeeBasePay; void WriteIn(int iflag); void ReadOut(); void RefreshMaxNum(int iflag);//iflg=1 or-1 or 0 }; long Employee::EmployeeMaxNum = 1000;float Employee::EmployeeBasePay = 1500; int Employee::MaxNum()//返回系統(tǒng)已經(jīng)存儲的人數(shù) { int MN = 0; ifstream myf; myf.open(“EmployeeMaxNum.txt”); myf>>MN; cout< myf.close(); return MN;} void Employee::NewInfo()//添加新職工函數(shù) { cout<<“新職工姓名: ”; cin>>Employee::Employeename; Employee::Employeenum = EmployeeMaxNum + Employee::MaxNum()+1; cout<<“新職工性別(F為女性,M為男性): ”; cin>>Employee::Employeesex; cout<<“新職工年齡: ”; cin>>Employee::Employeeage; cout<<“新職工婚姻狀況(Y為已婚,N為未婚): ”; cin>>Employee::Employeemarriage; cout<<“新職工學(xué)歷,請輸入相應(yīng)學(xué)歷的序號: ”< cout<<“ [1:小學(xué) 2:初中 3:高中 4:本科 5:碩士 6:博士] ”; cin>>Employee::Employeedegree; while(Employee::Employeedegree!=1&&Employee::Employeedegree!=2&&Employee::Employeedegree!=3&&Employee::Employeedegree!=4&&Employee::Employeedegree!=5&&Employee::Employeedegree!=6) { cout<<“輸入有誤,請重新輸入:”< cout<<“ [1:小學(xué) 2:初中 3:高中 4:本科 5:碩士 6:博士] ”; cin>>Employee::Employeedegree; } cout<<“新職工所在部門,請輸入相應(yīng)部門的序號:”< cout<<“ [1:董事會 2:銷售部 3:人事部 4:客服中心 5:財(cái)務(wù)部 6:技術(shù)研發(fā)部 7:安全監(jiān)察部] ”; cin>>Employee::Employeedepart; while(Employee::Employeedepart!=1&&Employee::Employeedepart!=2&&Employee::Employeedepart!=3&&Employee::Employeedepart!=4&&Employee::Employeedepart!=5&&Employee::Employeedepart!=6&&Employee::Employeedepart!=7) { cout<<“輸入有誤,請重新輸入:”< cout<<“ [1:董事會 2:銷售部 3:人事部 4:客服中心 5:財(cái)務(wù)部 6:技術(shù)研發(fā)部 7:安全監(jiān)察部] ”; cin>>Employee::Employeedepart; } cout<<“新職工職位, 請輸入相應(yīng)職位的序號: ”< cout<<“ [1:臨時(shí)職工 2: 正式職工 3:部門經(jīng)理 4:主任 5:董事長] ”; cin>>Employee::Employeeposition; while(Employee::Employeeposition!=1&&Employee::Employeeposition!=2&&Employee::Employeeposition!=3&&Employee::Employeeposition!=4&&Employee::Employeeposition!=5) { cout<<“輸入有誤,請重新輸入:”< cout<<“ [1:臨時(shí)職員 2: 正式職員 3:部門經(jīng)理 4:主任 5:董事長] ”; cin>>Employee::Employeeposition; } cout<<“新職工的工作時(shí)長(不需要輸入單位): ”; cin>>Employee::Employeeworktime; Employee::Employeepay = Employee::Pay(Employee::Employeeposition); DBOperate dbo; dbo.ReadOut(); int MaxNum = Employee::MaxNum(); Enum[MaxNum] = Employee::Employeenum; Ename[MaxNum] = Employee::Employeename; Esex[MaxNum] = Employee::Employeesex; Eage[MaxNum] = Employee::Employeeage; Emarriage[MaxNum] = Employee::Employeemarriage; Edegree[MaxNum] = Employee::Employeedegree; Edepart[MaxNum] = Employee::Employeedepart; Eposition[MaxNum] = Employee::Employeeposition; Eworktime[MaxNum] = Employee::Employeeworktime; Epay[MaxNum] = Employee::Employeepay; dbo.WriteIn(1); cout<<“ 添加新成員成功!”< void Employee::ShowInfo()//程序主體 數(shù)據(jù)輸出函數(shù) { int choice1,choice2,min,max; long searchnum; Employee e; cout<<“*******************************************”< cout<<“-----------1.輸出全體職工信息--------------”< cout<<“-----------2.按職工部門輸出----------------”< cout<<“-----------3.按職工學(xué)歷輸出----------------”< cout<<“-----------4.按職工年齡輸出----------------”< cout<<“-----------5.按職工編號輸出----------------”< cout<<“*******************************************”< cout<<“ 請選擇查詢方式:”; cin>>choice1; switch(choice1) { case 1: showall();break; case 2: cout<<“請輸入要查詢職工的部門編號[1:董事會 2:銷售部 3:人事部 4:客服中心 5:財(cái)務(wù)部 6:技術(shù)研發(fā)部 7:安全監(jiān)察部] ”; cin>>choice2; e.showdepart(choice2);break; case 3: cout<<“請輸入要查詢職工的學(xué)歷編號: [1:小學(xué) 2:初中 3:高中 4:本科 5:碩士 6:博士] ”; cin>>choice2; e.showdegree(choice2);break; case 4: cout<<“請輸入要查詢的年齡范圍: ”; cout<<“最小值: ”; cin>>min; cout<<“最大值: ”; cin>>max; e.showage(min,max);break; case 5: cout<<“請輸入要查詢的職工編號: ”; cin>>searchnum; e.shownum(searchnum);break; default: cout<<“出錯(cuò)啦!”< } } void Employee::showall()//全體職工輸出函數(shù) { int i; long number; for(i=0;i { number = Enum[i]; shownum(number); } } void Employee::showdepart(int depart)//按職工所在部門輸出函數(shù) { int i; switch(depart) { case 1: cout<<“董事會的成員有: ”< case 2: cout<<“銷售部的成員有: ”< case 3: cout<<“人事部的成員有: ”< case 4: cout<<“客服中心的成員有: ”< case 5: cout<<“財(cái)務(wù)部的成員有: ”< case 6: cout<<“技術(shù)研發(fā)部的成員有: ”< case 7: cout<<“安全監(jiān)察部的成員有: ”< default: cout<<“輸入錯(cuò)誤!>”< } for(i=0;i { if(Edepart[i] == depart) { long number = Enum[i]; shownum(number); } else continue; } } void Employee::showdegree(int degree)//按職工學(xué)歷輸出函數(shù) { int i; switch(degree) { case 1:cout<<“初中學(xué)歷的員工有:”< case 2:cout<<“初中學(xué)歷的員工有:”< case 3:cout<<“高中學(xué)歷的員工有:”< case 4:cout<<“本科學(xué)歷的員工有:”< case 5:cout<<“碩士學(xué)位的員工有:”< case 6:cout<<“博士學(xué)位的員工有:”< } for(i=0;i { if(Edegree[i] == degree) { long number = Enum[i]; shownum(number); } else continue; } } void Employee::showage(int min,int max)//按職工年齡段輸出函數(shù) { int i; for(i=0;i { if(Eage[i]>=min&&Eage[i]<=max) { long number = Enum[i]; shownum(number); } else continue; } } void Employee::shownum(long number)//按職工編號輸出函數(shù) { int i; for(i=0;i { if(Enum[i] == number) { cout<<“**********************************”< cout<<“職工編號:”< cout<<“姓 名:”< cout<<“性 別:”; if(Esex[i]=='F')cout<<“女 ”< else if(Esex[i]=='M')cout<<“男 ”< cout<<“年 齡:”< cout<<“婚姻情況:”; if(Emarriage[i]=='Y')cout<<“已婚 ”< else if(Emarriage[i]=='N')cout<<“未婚 ”< cout<<“學(xué) 歷:”; switch(Edegree[i]) { case 1:cout<<“小 學(xué) ”< case 2:cout<<“初 中 ”< case 3:cout<<“高 中 ”< case 4:cout<<“本 科 ”< case 5:cout<<“碩 士 ”< case 6:cout<<“博 士 ”< } cout<<“所在部門:”; switch(Edepart[i]) { case 1:cout<<“董事會 ”< case 2:cout<<“銷售部 ”< case 3:cout<<“人事部 ”< case 4:cout<<“客服中心 ”< case 5:cout<<“財(cái)務(wù)部 ”< case 6:cout<<“技術(shù)研發(fā)部 ”< case 7:cout<<“安全監(jiān)察部 ”< } cout<<“所任職務(wù):”; switch(Eposition[i]) { case 1:cout<<“臨時(shí)成員 ”< case 2:cout<<“正式員工 ”< case 3:cout<<“部門經(jīng)理 ”< case 4:cout<<“主任 ”< case 5:cout<<“董事長 ”< } cout<<“工作時(shí)長:”< cout<<“工資:”< cout<<“**********************************”< } else continue; } } void Employee::RefreshInfo()//修改職工信息的函數(shù) { int cNum = 1000; DBOperate dbo; dbo.ReadOut(); void Employee::shownum(long number); cout<<“請輸入您要修改的職工編號:”; cin>>cNum; int MN; MN = Employee::MaxNum(); for(int i=0;i { if(Enum[i] == cNum) { Employee::shownum(cNum); cout<<“請輸入該職工的新信息: ”< cout<<“職工姓名: ”;//錄入職工的新的數(shù)據(jù),職工編號保持不變 cin>>Employee::Employeename; Ename[i] = Employee::Employeename; cout<<“職工性別(F為女性,M為男性): ”; cin>>Employee::Employeesex; Esex[i] = Employee::Employeesex; cout<<“職工年齡: ”; cin>>Employee::Employeeage; Eage[i] = Employee::Employeeage; cout<<“職工婚姻狀況(Y為已婚,N為未婚): ”; cin>>Employee::Employeemarriage; Emarriage[i] = Employee::Employeemarriage; cout<<“職工學(xué)歷,請輸入相應(yīng)學(xué)歷的序號:”< cout<<“ [1:小學(xué) 2:初中 3:高中 4:本科 5:碩士 6:博士] ”; cin>>Employee::Employeedegree; while(Employee::Employeedegree!=1&&Employee::Employeedegree!=2&&Employee::Employeedegree!=3&&Employee::Employeedegree!=4&&Employee::Employeedegree!=5&&Employee::Employeedegree!=6) { cout<<“輸入有誤,請重新輸入:”< cout<<“ [1:小學(xué) 2:初中 3:高中 4:本科 5:碩士 6:博士] ”; cin>>Employee::Employeedegree; } Edegree[i] = Employee::Employeedegree; cout<<“職工所在部門,請輸入相應(yīng)部門的序號: ”< cout<<“ [1:董事會 2:銷售部 3:人事部 4:客服中心 5:財(cái)務(wù)部 6:技術(shù)研發(fā)部 7:安全監(jiān)察部] ”; cin>>Employee::Employeedepart; while(Employee::Employeedepart!=1&&Employee::Employeedepart!=2&&Employee::Employeedepart!=3&&Employee::Employeedepart!=4&&Employee::Employeedepart!=5&&Employee::Employeedepart!=6&&Employee::Employeedepart!=7) { cout<<“輸入有誤,請重新輸入:”< cout<<“ [1:董事會 2:銷售部 3:人事部 4:客服中心 5:財(cái)務(wù)部 6:技術(shù)研發(fā)部 7:安全監(jiān)察部] ”; cin>>Employee::Employeedepart; } Edepart[i] = Employee::Employeedepart; cout<<“職工職位,請輸入相應(yīng)職位的序號:”< cout<<“ [1:臨時(shí)職員 2: 正式職員 3:部門經(jīng)理 4:主任 5:董事長] ”; cin>>Employee::Employeeposition; while(Employee::Employeeposition!=1&&Employee::Employeeposition!=2&&Employee::Employeeposition!=3&&Employee::Employeeposition!=4&&Employee::Employeeposition!=5) { cout<<“輸入有誤,請重新輸入:”< cout<<“ [1:臨時(shí)職員 2: 正式職員 3:部門經(jīng)理 4:主任 5:董事長] ”; cin>>Employee::Employeeposition; } Eposition[i] = Employee::Employeeposition; cout<<“員工的工作時(shí)(不需要輸入單位): ”; cin>>Employee::Employeeworktime; Eworktime[i] = Employee::Employeeworktime; Epay[i] = Employee::Pay(Employee::Employeeposition); break; } } dbo.WriteIn(0);} void Employee::DeleteInfo()//刪除職工數(shù)據(jù)的函數(shù) { char tmp; int cNum = 1000; DBOperate dbo; dbo.ReadOut(); void Employee::shownum(long number); cout<<“請輸入您要刪除的職工編號>: ”; cin>>cNum; int MN; MN = Employee::MaxNum(); for(int i=0;i { if(Enum[i] == cNum) Employee::shownum(cNum); } cout<<“確認(rèn)要刪除該職工信息?(Y為確認(rèn),N為放棄): ”; cin>>tmp; if(tmp=='Y') { if(i==MN-1) dbo.WriteIn(-1); else { for(int j=i;j { Enum[j] = Enum[j+1];} dbo.WriteIn(-1); } cout<<“ 刪除操作成功!”< } } float Employee::Pay(int Employeeposition)//根據(jù)職工職位計(jì)算工資的函數(shù) { float tmpPay; tmpPay = Employee::EmployeeBasePay + Employee::Employeeposition Employee::EmployeeBasePay; * return tmpPay;} void DBOperate::WriteIn(int iflag)//數(shù)據(jù)操作函數(shù)—寫入 { DBOperate::RefreshMaxNum(iflag); ofstream myf(“Employee.txt”); Employee e; int MN; MN = e.MaxNum(); for(int i=0;i { myf< } myf.close(); return;} void DBOperate::ReadOut()//數(shù)據(jù)操作函數(shù)—讀出 { ifstream myf(“Employee.txt”); Employee e; int MN; MN = e.MaxNum(); for(int i=0;i { myf>>DBOperate::Employeenum>>DBOperate::Employeename>>DBOperate::Employeesex>>DBOperate::Employeeage>>DBOperate::Employeemarriage >>DBOperate::Employeedegree>>DBOperate::Employeedepart>>DBOperate::Employeeposition>>DBOperate::Employeeworktime>>DBOperate::Employeepay; Enum[i] = DBOperate::Employeenum; Ename[i] = DBOperate::Employeename; Esex[i] = DBOperate::Employeesex; Eage[i] = DBOperate::Employeeage; Emarriage[i] = DBOperate::Employeemarriage; Edegree[i] = DBOperate::Employeedegree; Edepart[i] = DBOperate::Employeedepart; Eposition[i] = DBOperate::Employeeposition; Eworktime[i] = DBOperate::Employeeworktime; Epay[i] = DBOperate::Employeepay; } myf.close();} void DBOperate::RefreshMaxNum(int iflag)//更新系統(tǒng)中員工計(jì)數(shù)文件的函數(shù) { int MaxNum = 0; ifstream myif(“EmployeeMaxNum.txt”); myif>>MaxNum; myif.close(); MaxNum = MaxNum+iflag; ofstream myof(“EmployeeMaxNum.txt”); myof< myof.close();} int main()//主函數(shù) { system(“color B0”);//設(shè)置當(dāng)前窗口的背景色和前景色 // 0 = 黑色 = 灰色 // 1 = 藍(lán)色 = 淡藍(lán)色 // 2 = 綠色 A = 淡綠色 // 3 = 淺綠色 B = 淡淺綠色 // 4 = 紅色 C = 淡紅色 // 5 = 紫色 D = 淡紫色 // 6 = 黃色 E = 淡黃色 // 7 = 白色 F = 亮白色 int select = 0; while(select!=5) { cout<<“ ╭————————————————————————————╮”< cout<<“ ∣ 《主菜單》 ∣”< cout<<“ ├————————————————————————————┤”< cout<<“ ∣ 1.新建并錄入職工信息 ∣”< cout<<“ ∣ 2.按條件輸出職工信息 ∣”< cout<<“ ∣ 3.修改指定職工的信息 ∣”< cout<<“ ∣ 4.刪除職工信息 ∣”< cout<<“ ∣ 5.退出系統(tǒng) ∣”< cout<<“ ╰————————————————————————————╯”< cout<<“ ——————————————————————————————”< cout<<“ 請選擇您需要功能的代號: ”; cin>>select; Employee e; DBOperate dbo; switch(select) { case 1: e.NewInfo();break; case 2: dbo.ReadOut(); e.ShowInfo();break; case 3: e.RefreshInfo();break; case 4: e.DeleteInfo();break; case 5: cout<<“ 退出成功”< default: cout<<“命令錯(cuò)誤!”< } if(select == 5) break; } exit(1); return 0;} 程序設(shè)計(jì)所涉及二叉樹解釋 任意一棵樹或一個(gè)森林都能唯一地對應(yīng)一棵二叉樹,由此而編寫本程序。本程序采用類二叉樹為整體結(jié)構(gòu),二叉樹類下定義節(jié)點(diǎn)類,每一條支路均為樹的一個(gè)節(jié)點(diǎn),支路所有的參數(shù)均作為節(jié)點(diǎn)的屬性,并給節(jié)點(diǎn)加入屬性“支路編號”,并以支路編號為依據(jù)構(gòu)建二叉樹,這就要求提前根據(jù)二叉樹結(jié)構(gòu)給每一個(gè)支路編號。 支路編號原則:左子樹上所有編號均小于其雙親的編號,右子樹上所有編號均大于其雙親的編號,為了便于查看,本程序在節(jié)點(diǎn)較少時(shí)編號從1開始,逐個(gè)遞加至支路數(shù);當(dāng)支路較多時(shí),可不必拘泥于逐個(gè)遞加,只要滿足支路編號原則即可。 例如習(xí)題3-4: 123118kV113kV8.5+j20.5Wj2.82×10-4S1.22+j20.2Wj2.82×10-4SDST=0.17+j1.7MVA40+j30MVA20+j15MVA 程序二叉樹結(jié)構(gòu)示意圖: 本二叉樹中節(jié)點(diǎn)1即支路1為題目中節(jié)點(diǎn)1與節(jié)點(diǎn)2之間的部分; 本二叉樹中節(jié)點(diǎn)2即支路2為題目中節(jié)點(diǎn)2與節(jié)點(diǎn)3之間的部分; 對于習(xí)題3-3: 程序二叉樹結(jié)構(gòu)示意圖: 本二叉樹中節(jié)點(diǎn)2即支路2為題目中節(jié)點(diǎn)1與節(jié)點(diǎn)2之間的部分; 本二叉樹中節(jié)點(diǎn)1即支路1為題目中節(jié)點(diǎn)2與節(jié)點(diǎn)3之間的部分; 本二叉樹中節(jié)點(diǎn)3即支路3為題目中節(jié)點(diǎn)2與節(jié)點(diǎn)4之間的部分.拓展: 如下多支路網(wǎng)絡(luò): 對于三節(jié)點(diǎn)網(wǎng)絡(luò)需先進(jìn)行以下網(wǎng)絡(luò)處理轉(zhuǎn)化為標(biāo)準(zhǔn)二叉樹,而后進(jìn)行計(jì)算; 圖中三角形表明該項(xiàng)阻抗為零,為純導(dǎo)線,并進(jìn)行相應(yīng)參數(shù)補(bǔ)充進(jìn)行計(jì)算。 程序說明文檔 ******************************************************************************************************************************************************* 本程序測試使用方法:在E盤根目錄下建立輸入文件: 輸入文件名:input.txt; 將所附算例對應(yīng)輸入文件內(nèi)容復(fù)制粘貼至上述文件中,在VC++6.0環(huán)境下運(yùn)行cpp文件得出結(jié)果。 輸出文件在E盤根目錄下 輸出文件名為:data.txt;******************************************************************************************************************************************************* 程序功能說明:本程序可以計(jì)算任意長度線型開始網(wǎng)絡(luò)潮流; 支持多電壓等級下的計(jì)算; 可在除供電節(jié)點(diǎn)外任意節(jié)點(diǎn)引出負(fù)載; ******************************************************************************************************************************************************* 輸入格式說明:以支路為基本單位,按潮流方向輸入數(shù)據(jù): 以下例示意: //支路個(gè)數(shù) 1,110,118,8.5,20.5,0.000564,0,0,1,0,0 //線路等效的支路 2,11,110,1.22,20.2,0,40,30,10,0.17,1.7 //變壓器等效的支路 .//按此方式知道輸入所有的支路 .//輸入從上到下的順序?yàn)槌绷髟?/p> .//線型開式網(wǎng)絡(luò)中的流動方向 /* 第一行輸入支路個(gè)數(shù),回車 第二行至后輸入各個(gè)支路參數(shù),回車分隔不同支路; 各行輸入的支路參數(shù)順序是: 支路編號,末端電壓,始端電壓,線路等效電阻,線路等效感抗,線路等效容納,末端輸入有功,末端輸入無功,變比,變壓器有功勵(lì)磁損耗,變壓器無功勵(lì)磁損耗 對于線路等效電路:變壓器有功/無功損耗輸入零,變比輸入1; 對于變壓器等效電路:所有的參數(shù)均歸算至高壓側(cè),Rt,Xt對應(yīng)輸入線路等效電阻/感抗的位置,線路等效容抗為零; 對于個(gè)節(jié)點(diǎn)的引出負(fù)荷:輸入至以此節(jié)點(diǎn)為末節(jié)點(diǎn)的支路的末端輸入有功/無功部分; */ ******************************************************************************************************************************************************** 輸出文件格式說明:輸出的內(nèi)容包括 (1)支路信息:每個(gè)支路元件的始端有功、無功和末端有功、無功;有功損耗無功損耗;電壓損耗; (2)全網(wǎng)信息:全網(wǎng)的總電源有功、總負(fù)荷有功、有功損耗、網(wǎng)損率; (3)迭代信息:每次完整迭代后的所有內(nèi)容; 具體在輸出文件中都明確標(biāo)出。 ********************************************************************************************************************************************************* 程序中變量定義說明: 類中定義的變量 class line_part{ //定義支路類 double U[2]; //支路電壓降落:U[0]電壓降落橫分量,U[1]電壓降落縱分量 double k; //變壓器變比 double val; //支路排序 double U_end; //支路末端電壓 double U_begin; //支路首段電壓 double X[3]; //支路等效阻抗: X[0]電阻,X[1]感抗,X[2]容納 double S_end[2]; //支路末端功率:S_end[0]有功,S_end[1]無功 double S_begin[2]; //支路首段功率:S_begin[0]有功,S_begin[1]無功 double S0[2]; //變壓器勵(lì)磁損耗:S0[0]有功,S0[1]無功 double S_org[2]; //支路末端負(fù)載:S_org[0]有功,S_org[1]無功 line_part *lchild,*rchild; //支路的后繼兩個(gè)支路 } class BinTree{ //定義樹類 void PreOrder(){PreOrder(root);}; //樹的先序遍歷修改電壓 void PostOrder(){PostOrder(root);}; //樹的后序遍歷修改潮流 void display(){display(root);}; //樹的先序遍歷顯示數(shù)據(jù) line_part *root; //樹的根,是一個(gè)支路類 };主函數(shù)中定義的數(shù)據(jù) ofstream outfile; //輸出數(shù)據(jù)流定 ifstream infile; //輸入數(shù)據(jù)流定 const int M(a); //支路個(gè)數(shù)常量 主程序(復(fù)制粘貼到C++就能用) ************************************************************************************************************************************************************** #include double p_cost_all=0; double sqr(double x){ //平方計(jì)算函數(shù) return x*x;}; class line_part{ //定義支路類 private: double val; //支路排序 double U_end; //支路末端電壓 double U_begin; //支路首段電壓 double X[3]; //支路等效阻抗: X[0]電阻,X[1]感抗,X[2]容納 double S_end[2]; //支路末端功率:S_end[0]有功,S_end[1]無功 double S_begin[2]; //支路首段功率:S_begin[0]有功,S_begin[1]無功 double S0[2]; //變壓器勵(lì)磁損耗:S0[0]有功,S0[1]無功 double S_org[2]; //支路末端負(fù)載:S_org[0]有功,S_org[1]無功 line_part *lchild,*rchild;public: double U[2]; //支路電壓降落:U[0]電壓降落橫分量,U[1]電壓降落縱分量 double k; //變壓器變比 public: line_part(){ val=0;U_end=0;U_begin=0;X[0]=0;X[1]=0; X[2]=0;S_end[0]=S_org[0]=0;S_end[1]=S_org[1]=0; S_begin[0]=0;S_begin[1]=0;k=1; S0[0]=0;S0[1]=0;U[0]=0;U[1]=0; lchild = rchild= NULL;} line_part(double vall,double u_end=0,double u_begin=0,double r=0,double x=0,double b=0,double Pe=0,double Xe=0,double K=0,double P0=0,double Q0=0){ val=vall; U_end=u_end; U_begin=u_begin; X[0]=r; X[1]=x; X[2]=b; S_end[0]=S_org[0]=Pe; S_end[1]=S_org[1]=Xe; S_begin[0]=0; S_begin[1]=0; k=K; S0[0]=P0; S0[1]=Q0; U[0]=0; U[1]=0; lchild = rchild= NULL; };friend class BinTree; friend void pass_U(line_part*a,line_part*b,line_part*c); //電壓傳遞函數(shù) friend void pass_w(line_part*a,line_part*b,line_part*c); //功率傳遞函數(shù) friend void pass_U2(line_part*a,line_part*b); //電壓傳遞函數(shù) friend void pass_w2(line_part*a,line_part*b); //功率傳遞函數(shù) void Sbegin(){ (U_end)*X[2]/2))/sqr(Uend);;-sqr(U_begin)*X[2]/2-sqr(U_end)*X[2]/2;};void Uend(){ double U_heng(0),U_zong(0); X[2]/2-S0[1];1])/U_begin; //U_heng即是△u2 0])/U_begin; //U_zong即是δu2 sqr(U_zong))/k; double get_val(){ }; //支路首段功率計(jì)算函數(shù) double Uend,I2;Uend=k*U_end;I2=(sqr(S_end[0])+sqr(S_end[1]-sqrS_begin[0]=S_end[0]+I2*X[0]+S0[0]S_begin[1]=S_end[1]+I2*X[1]+S0[1] //支路末端電壓計(jì)算函數(shù) double p_begin,q_begin;p_begin=S_begin[0]-S0[0];q_begin=S_begin[1]+sqr(U_begin)*U_heng=(p_begin*X[0]+q_begin*X[U_zong=(p_begin*X[1]-q_begin*X[U_end=sqrt(sqr(U_begin-U_heng)+U[0]=U_heng;U[1]=U_zong;}; //返回支路編號 if(this==0){return-1;}else{ if(val>0&&val<100){return val;} else return-1;} double get_Uend(){ //返回支路末端電壓 return U_end;}; double get_Ubegin(){ //返回支路首段電壓 return U_begin;}; double get_Pbegin(){ //返回支路首段有功 return S_begin[0];}; double get_Pend(){ //返回支路末端有功 return S_end[0];}; double get_Qbegin(){ //返回支路首段無功 return S_begin[1];}; double get_Qend(){ //返回支路末端無功 return S_end[1];}; double get_Pcost(){ //返回支路有功損耗 return S_begin[0]-S_end[0];}; double get_Qcost(){ //返回支路無功損耗 return S_begin[1]-S_end[1];};line_part *get_lchild(){ //返回支路無功損耗 return lchild;};line_part *get_rchild(){ //返回支路無功損耗 return rchild;};}; void pass_U(line_part *a,line_part *b,line_part *c){(*c).U_begin=(*a).U_end;(*b).U_begin=(*a).U_end;};void pass_w(line_part *a,line_part *b,line_part *c){(*a).S_end[0]=(*b).S_begin[0]+(*c).S_begin[0]+(*a).S_org[0];(*a).S_end[1]=(*b).S_begin[1]+(*c).S_begin[1]+(*a).S_org[1];};void pass_U2(line_part *a,line_part *b){(*b).U_begin=(*a).U_end;};void pass_w2(line_part *a,line_part *b){(*a).S_end[0]=(*b).S_begin[0]+(*a).S_org[0];(*a).S_end[1]=(*b).S_begin[1]+(*a).S_org[1];}; class BinTree{ public: friend void pass_U(line_part*,line_part*,line_part*); //電壓傳遞函數(shù) pass_w(line_part*,line_part*,line_part*); line_part(0,0,0,0,0,0,0,0,0,0,0);root = aa;} vall,double u_end=0,double u_begin=0,double r=0, Pe=0,double Xe=0, P0=0,double Q0=0){ egin,r,x,b,Pe,Xe,K,P0,Q0); private: *&t,double vall,double u_end,double u_begin,double r, Pe,double Xe, Q0); }; friend void //功率傳遞函數(shù) BinTree(){line_part *aa=new line_part *Getroot(){return root;} void insertline_part(double double x=0,double b=0,double double K=0,double insertline_part(root,vall,u_end,u_b} void PreOrder(){PreOrder(root);};void PostOrder(){PostOrder(root);};void display(){display(root);};line_part *root;void insertline_part(line_part double x,double b,double double K,double P0,double void PreOrder(line_part *&t);void PostOrder(line_part *t);void display(line_part *&t); void BinTree::insertline_part(line_part *&t, double vall,double u_end=0,double u_begin=0,double r=0,double x=0,double b=0,double Pe=0,double Xe=0,double K=0,double P0=0,double Q0=0){ //插入節(jié)點(diǎn) double ass=t->get_val();if(t==0||t->get_val()<=0){ t=new line_part(vall,u_end,u_begin,r,x,b,Pe,Xe,K,P0,Q0);} else if(vall insertline_part(t->lchild, vall,u_end,u_begin,r,x,b,Pe,Xe,K,P0,Q0);} else { insertline_part(t->rchild, vall,u_end,u_begin,r,x,b,Pe,Xe,K,P0,Q0);} };/////////////////////////////////////////////////////////////////////////////////////////////////////////////// void BinTree::display(line_part *&t){ if(t->get_val()>0&&t->get_val()<100){ display(t->lchild); display(t->rchild); ofstream outfile1; outfile1.open(“e:data.txt”,ios::ate); p_cost_all +=t->get_Pcost(); double U; // 計(jì)算并存放各個(gè)節(jié)點(diǎn)的電壓相角(始端為零) U=atan2(t->U[1],(t->get_Ubegin()-t->U[0]))/3.1415926*180; outfile1<<“支路”< ”< outfile1<<“ ”<<“首端電壓”<<“ ”< outfile1<<“ ”<<“末端電壓”<<“ ”< //計(jì)算并存放各個(gè)支double U_cost; //計(jì)算并存放各個(gè)支路的電壓損耗 U_cost=t->get_Ubegin()-t->get_Uend(); outfile1<<“ ”<<“電壓損耗”<<“ outfile1<<” “<<”始端有功“<<” 首端電壓 outfile1<<“ ”<<“始端無功”<<“ 路的末端電壓 outfile1<<” “<<”末端有功“<<” 首端電壓 outfile1<<“ ”<<“末端無功”<<“ 路的末端電壓 double P_cost; 的有功損耗 P_cost=t->get_Pcost(); outfile1<<” “<<”有功損耗“<<” double Q_cost; 的無功損耗 Q_cost=t->get_Qcost(); outfile1<<“ ”<<“無功損耗”<<“ outfile1.close(); ”< //計(jì)算并存放各個(gè)支“< //計(jì)算并存放各個(gè)支 //計(jì)算并存放各個(gè)支路 “< //計(jì)算并存放各個(gè)支路 ”< };///////////////////////////////////////////////////////////////////////////////////////////////////////////////// void BinTree::PreOrder(line_part *&t){ //先序遍歷二叉樹修改電壓 0) get_lchild()->get_val()<100) get_rchild()->get_val()<100) get_rchild()->get_val()<100) if(t->get_val()>0&&t->get_val()<10{ if(t->get_lchild()->get_val()>0&&t-> { if(t->get_rchild()->get_val()>0&&t-> { t->Uend(); pass_U(t,t->lchild,t->rchild); t->lchild->Uend(); t->rchild->Uend(); } else{ t->Uend(); pass_U2(t,t->lchild); t->lchild->Uend();} } else { if(t->get_rchild()->get_val()>0&&t-> { t->Uend(); pass_U2(t,t->rchild); t->rchild->Uend(); } else{} } PreOrder(t->lchild);PreOrder(t->rchild); } };void BinTree::PostOrder(line_part *t){ //后序遍歷二叉樹修改潮流 if(t->get_val()>0&&t->get_val()<100) get_lchild()->get_val()<100) get_rchild()->get_val()<100) get_rchild()->get_val()<100) { PostOrder(t->lchild);PostOrder(t->rchild);if(t->get_lchild()->get_val()>0&&t-> { if(t->get_rchild()->get_val()>0&&t-> { t->lchild->Sbegin(); t->rchild->Sbegin(); pass_w(t,t->lchild,t->rchild); t->Sbegin(); } else{ t->lchild->Sbegin(); pass_w2(t,t->lchild); t->Sbegin();} } else { if(t->get_rchild()->get_val()>0&&t-> { t->rchild->Sbegin(); pass_w2(t,t->rchild); t->Sbegin(); } else{} }; void main(){ ofstream outfile; //輸入數(shù)據(jù)流定義 infile>>a; cout<<“節(jié)點(diǎn)個(gè)數(shù)第三篇:C++大作業(yè)_職工信息管理系統(tǒng)源代碼
第四篇:潮流計(jì)算--電力系統(tǒng)大作業(yè)(C++編寫)