第一篇:C++數(shù)據(jù)結(jié)構(gòu) 大作業(yè)課程設(shè)計
C++/數(shù)據(jù)結(jié)構(gòu) 大作業(yè)/課程設(shè)計——【校園導(dǎo)游咨詢】【停車場管理】娃娃們可以收著以后用 絕對純手工打造 內(nèi)含類模塊/一維指針數(shù)組(謹以此程序供大家參考。運行結(jié)果后面有貼圖)
目錄
【1】校園導(dǎo)游咨詢 程序設(shè)計源代碼 及 截圖 【2】停車場管理——方案一 程序設(shè)計源代碼 及 截圖 【3】停車場管理——方案二 程序設(shè)計源代碼 及 截圖
【1】【【校園導(dǎo)游咨詢】】
######
(ps:該校園導(dǎo)游咨詢系統(tǒng)沒有輸入值,所有信息是都在class MGraph的構(gòu)造函數(shù)中傳輸?shù)?,且校園景點信息皆為【【上海電力學(xué)院】】景點信息。請大家注意,直接從文章copy到visual stutio中會出現(xiàn)中文字符,注意刪除,推薦大家在一行語句的分號后面,點出光標,按一下delete鍵,然后按一下enter鍵,完成visual stutio的自動對齊,這樣程序看起來一目了然,更易于操作和更改)【問題描述】
設(shè)計一個校園導(dǎo)游程序,為來訪的客人提供各種信息查詢服務(wù)?!净疽蟆?/p>
(1)設(shè)計你所在學(xué)校的校園平面圖,所含景點不少于10個。以圖中頂點表示校內(nèi)各景點,存放景點名稱、代號、簡介等信息;以邊表示路徑,存放路徑長度等相關(guān)信息。(2)為來訪客人提供圖中任意景點相關(guān)信息的查詢。
(3)為來訪客人提供圖中任意景點的問路查詢,即查詢?nèi)我鈨蓚€景點之間的一個最短的簡單路徑?!具x作內(nèi)容】
(6)擴充每個景點的鄰接景點的方向等信息,使得路徑查詢結(jié)果能提供詳盡的導(dǎo)向信息。**************************【以下為類的定義】******************************** #include
class direction;template
{ friend class MGraph
direction dir;//存放頂點方位信息的direction類的dir。};
class direction { public: int ln;//存放在方向圖中的橫坐標,表示東西 int col;//存放在方向圖中的縱坐標,表示南北 };template
{ public: MGraph();
//構(gòu)造函數(shù),初始化具有n個頂點的圖
void printvexname();//顯示所有景點及景點代號
void printvexinf(int i);//顯示代號為i景點的名稱及信息
void printroad(int i,int j);//顯示景點i~j的最短路徑方案信息
void printdir(int i,int j);//顯示景點i到j(luò)的方向信息,如“向東100m,向南200m” VertexNode
void Root(int p,int q);//遞歸尋找pq間的最短路徑
int Path[MaxSize][MaxSize],Dist[MaxSize][MaxSize];//創(chuàng)建Path和Dist分別存放兩點間最短路徑的前驅(qū)節(jié)點,兩點間最短路徑長度
int Line[MaxSize];//Line存放路徑 int kkk;//Line[]數(shù)組的標記
private: T vertex[MaxSize];//存放圖中頂點的數(shù)組
int arc[MaxSize][MaxSize];//存放圖中邊的數(shù)組 };*************************【以下為類的實現(xiàn) 即類函數(shù)的定義】*********************************** template
//s[]為存放景點鄰接矩陣信息的一維數(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[]={“南門”,“實驗樓”,“南圖”,“大活”,“睿思樓”,“大禮堂”, “南4教”,“知行樓”,“國交樓”,“南3教”,“南2教”,“南1教”, “北圖”,“北3教”,“北4教”,“北2教”,“北1教”,“北門”};char* c[]={“南校區(qū)正門”,“物理實驗樓”,“南校區(qū)圖書館”,“大學(xué)生活動中心”, “教師辦公樓、醫(yī)務(wù)室及留學(xué)生公寓”,“大禮堂,用于舉辦各種文藝演出”,“南校區(qū)第4教學(xué)樓”,“實習(xí)基地,計算機房等”, “國際交流中心,教職工餐廳”,“南校區(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:該程序有漏洞,若將要離開的車輛是停于便道上的,則對該車進行駛離操作時程序內(nèi)部有錯誤數(shù)據(jù),雖然做了函數(shù)完成這一功能,但因時間有限,沒能及時查找更正,現(xiàn)在懶得改了。。大家將就看吧。不過運行是可以的)【問題描述】 設(shè)停車場是一個可停放n輛汽車的 長通道,且只有一個大門可供汽車進出。汽車在停車場內(nèi)按車輛到達時間的先后順序,依次由北向南排列(大門在最南端,最先到達的第一輛車信放在車場的最北端),若車場內(nèi)已停滿n輛汽車,則后來的汽車只能在門外的便道上等候,一旦有車開走,則排在便道上的第一輛車即可開入;當停車場內(nèi)某輛車要離開時,在它之后進入的車輛必須先退出車場為它讓路,待該輛車開出大門外,其他車輛再按原次序進入車場院,每輛停放在車場的車在它離開停車場時必須按它停留的時間長短交納費用。試為停車場編制按上述要求進行管理的模擬程序。【基本要求】 以棧模擬停車場,以隊列模擬車場外的便道,按照從終端讀入的輸入數(shù)據(jù)序列進行模擬管理。每一組輸入數(shù)據(jù)包括三個數(shù)據(jù)項:汽車“到達”或“離去”信息、汽車牌照號碼以及到達或離去的時刻。對每一組輸入數(shù)據(jù)進行操作后的輸出信息為:若是車輛到達,則輸出汽車在停車場內(nèi)或便道上的停車位置;若是車輛離去,則輸出汽車在停車場內(nèi)停留的時間和應(yīng)交納的費用(在便道上停留的時間不收費)。棧以順序結(jié)構(gòu)實現(xiàn),隊列以鏈表結(jié)構(gòu)實現(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表示到達(Arrival);D表示離去(Departure);E表示輸入結(jié)束(End)。**************************【以下為類的定義】************************************* #include const double price=30;//每小時的費用 //思想:(報告第四頁) //我的系統(tǒng)界面,輸入信息為:(到達/離開/退出);車牌號;時刻 //因此,我的停車場類分成車輛到達和車輛離開兩個主要的函數(shù)實現(xiàn)。//車輛到達,有入棧和入隊。車輛離開有出棧,出隊和入棧操作。 //因此我又編寫入棧的類,隊的類。與parkingmanagement進行友元。 //**************************************類定義*********************************************** class car//車的信息類 { public: double time;//計費時間 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//隊列(便道)的類 { friend class parkingmanagement;//parkingmanagement能訪問carstack類中所有成員 public: carqueue();//構(gòu)造函數(shù),隊列的初始化 int full();//判斷隊列是否為滿 car *front,*rear;//存放car類型隊列元素的數(shù)組初始地址 };class parkingmanagement { public: int pushstack(carstack &cs,int cnum,double ctime);//入棧,cs棧內(nèi)進行調(diào)整,返回棧內(nèi)位置 void popstack(carstack &cs,int cnum);//出棧,cs棧內(nèi)進行調(diào)整,//根據(jù)車牌號把車彈出棧,將出棧car的number賦值給int popstacknumber()//將出棧car的time賦值給double popstacktime(),無返回值! int pushqueue(carqueue &cq,int cnum,double ctime);//入隊,隊內(nèi)進行調(diào)整,返回隊內(nèi)位置 int popqueue(carqueue &cq);//出隊,隊內(nèi)進行調(diào)整,返回汽車車牌號 void arrival(carstack &cs,carqueue &cq,int cnum,double ctime);//車輛到達,//根據(jù)輸入的車牌號、到達時間,變更函數(shù)參數(shù);并cout車位信息 void leave(carstack &cs,carqueue &cq,int cnum,double ctime);//車輛離開,//根據(jù)輸入的車牌號找到汽車,并進行出棧操作、出隊操作和入棧操作; //并cout停留時間和收費情況 void deletequeue(carqueue &cq,int i);//刪除cq過道中第i輛車 int popstacknumber;//專門存放出棧的時候返回的車牌號 double popstacktime;//專門存放出棧的時候返回的時刻 };**********************************【以下為類的實現(xiàn)】************************************ carstack::carstack()//構(gòu)造函數(shù),棧的初始化 { top=-1;s=new car[Max];//創(chuàng)建car類型棧元素的數(shù)組 if(s==NULL){ cout<<“??臻g分配不成功!”< cs.top++;(cs.s[cs.top]).number=cnum;//將cnum賦給棧頂位置的車的車牌號,s是car類型棧元素的數(shù)組(cs.s[cs.top]).time=ctime;//將ctime賦給棧頂位置的車的入棧時間,s是car類型棧元素的數(shù)組 return(cs.top+1);//返回棧內(nèi)位置加1,即停車場內(nèi)車位從1號開始 } } void parkingmanagement::popstack(carstack &cs,int cnum)//出棧,cs棧內(nèi)進行調(diào)整,//根據(jù)車牌號把車彈出棧,將出棧car的number賦值給int popstacknumber //將出棧car的time賦值給double popstacktime,無返回值!{ int i;car p;carstack stemp;//定義一個carstack類型的臨時存放出棧元素的棧 for(i=0;i<=cs.top;i++)if((cs.s[i]).number==cnum)break;//當要出棧的車的車牌號=棧內(nèi)的車牌號元素時,跳出循環(huán) p=cs.s[i];//將要出棧的元素賦給car類型的p存放 while(cs.top>i)stemp.s[++(stemp.top)]=cs.s[(cs.top)--];//出棧的元素數(shù)組逐個賦給臨時棧 popstacknumber=p.number;//將這個車牌號信息傳給int popstacknumber()popstacktime=p.time;//將該車的時間信息傳給double popstacktime()cs.top--;//棧頂指針回到原來位置 while(stemp.top>=0)cs.s[++(cs.top)]=stemp.s[(stemp.top)--];//臨時棧出棧的元素逐個賦給原棧,完成先退再進的工作 } int parkingmanagement::pushqueue(carqueue &cq,int cnum,double ctime)//入隊,隊內(nèi)進行調(diào)整,返回隊內(nèi)位置 { car *p,*countp;int count(1);//count用于記錄車在過道上的位置信息,因隊列為鏈式的,所以進行循環(huán)累加 p=new car;//創(chuàng)建一個car類型的指針 p->number=cnum;p->time=ctime;p->next=NULL;//首先將指向存放car類型元素的數(shù)組初始地址置空 if(cq.front==NULL)//第一次入隊要判斷頭結(jié)點是否為空 { 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開始計!!】 return count;} int parkingmanagement::popqueue(carqueue &cq)//出隊,隊內(nèi)進行調(diào)整,返回汽車車牌號 { car p;p.number=((cq.front)->next)->number;//cq隊里,從cq.front開始指向下一個元素的車牌號賦給car類型的車信息 p.time=((cq.front)->next)->time;//cq隊里,從cq.front開始指向下一個元素的時刻 //賦給car類型的車信息 p.next=((cq.front)->next)->next;//cq隊里,從cq.front開始指向下一個元素的指針 //賦給car類型的車信息的下一個元素的指針 return p.number;cq.front=(cq.front)->next;} void parkingmanagement::arrival(carstack &cs,carqueue &cq,int cnum,double ctime)//車輛到達,根據(jù)輸入的車牌號、到達時間,變更函數(shù)參數(shù);并cout車位信息 { int pos;if(!(cs.full()))//如果棧未滿,車輛停入停車場 { int fl(0),i;//定義一個從0開始的標記fl for(i=0;i<=cs.top;i++){ if(cs.s[i].number==cnum)//如果到達的車的車牌號=棧內(nèi)已有車輛的車牌號 { fl=1;//fl記1 break;} } if(fl==1)//如果到達的車的車牌號!=棧內(nèi)已有車輛的車牌號 cout<<“輸入錯誤!請重新輸入!”< cout<<“該停車場還有空位,請到”< { pos=pushqueue(cq,cnum,ctime);//入隊,返回車位信息 cout<<“該停車場已滿,請將車停到便道”< { popstack(cs,cnum);//出棧操作 hour=ctime-popstacktime;//時間計算 outcarnum=popqueue(cq);//將便道上的第一輛車出隊,入棧。并將其車牌號賦給outcarnum pstack=pushstack(cs,outcarnum,ctime);//將便道上的第一輛車,入棧 cout<<“該車在本停車場內(nèi)停留時間為”< { p=cq.front;while(p!=NULL){ count++;//如果在過道中找到該車,則該車的位置為過道中的第count位置(count從1開始)p=p->next;if(p->number==cnum)//在過道中找到要出去的車,則在隊列中刪除該car。//后面的車輛依然順序排列,補足空位 { deletequeue(cq,count);if(count>Max){ cout<<“您的車在便道上的位置為”< car *p,*q;int j(0);p=cq.front;while(p && j ######【3】【停車場管理系統(tǒng)【方案二 程序】】 (ps:本方案與方案一有同樣的問題,就是在對 便道上的車 進行駛離操作時,數(shù)據(jù)錯誤,同樣的理由,沒有改正。如果有細心娃娃幫忙指點改正,在此感激啦~) *************************【以下為類定義】************************************ #include struct Node//過道停車的隊列所需鏈式結(jié)點 { T carnum;//定義車牌號類型 Node friend class carStack;public: T carnum;//車號 int cartime;//停車時間 }; template int EnQueue(T cnum);//將元素x入隊,并返回其在隊內(nèi)的位置(從1開始)T DeQueue();//將隊頭鏈式結(jié)點出隊,并返回汽車車牌號 void deletequeue(int i);//將隊內(nèi)低i個元素刪除,即便道上i位置的汽車駛離 bool Empty();//判斷鏈隊列是否為空 Node int Popcar(T outcnum,int outctime);//將第cnum輛車出棧,并返回其停車時間(hour)bool full();//判斷棧是否為滿?滿則返回1 carinfo s=new Node front=rear=s;} else { rear->next=s;//將結(jié)點s插入到隊尾 rear=s;} p=front;while(p!=NULL){ i++;p=p->next;}//i即車在過道上的位置,【從1開始計?。 ?return i;} template front=front->next;//將隊頭元素所在結(jié)點摘鏈 } return p->carnum;delete p;//將出隊進棧的車從隊列里刪除 } template template :top(-1){//建立一個最大尺寸為size的空棧 S=new carinfo { cerr<<“動態(tài)存儲失??!”< template template void outputpark()//系統(tǒng)功能選擇頁面,輸入泊車信息 { cout<<“========================”< { cs.Pushcar(carnum,cartime);cout<<“請駛?cè)胪\噲龅摹? Node 題目:計算表達式的值 1、問題描述 對于給定的一個表達式,表達式中可以包括常數(shù)、算術(shù)運行符(“+”、“-”、“*”、“/”)和括號,編寫程序計算表達式的值。 基本要求:從鍵盤輸入一個正確的中綴表達式,將中綴表達式轉(zhuǎn)換為對應(yīng)的后綴表達式,計算后綴表達式的值。 提高要求:(1)對于表達式中的簡單錯誤,能夠給出提示; (2)不僅提示錯誤,也能給出錯誤信息(3)表達式中可以包括單個字母表示的變量(4)能夠處理多種操作符(5)實現(xiàn)包含簡單運算的計算器 (6)實現(xiàn)一個包含簡單運算和函數(shù)運算的計算器。 2.需求分析 軟件的基本功能:由鍵盤輸入中綴表達式,程序可以將輸入的中綴表達式轉(zhuǎn)換成對應(yīng)的后綴表達式,并計算后綴表達式的值。對于在輸入時發(fā)生的簡單錯誤,程序可以給出提示。本程序支持整數(shù)、小數(shù)、多種操作數(shù)的處理,可以計算含加、減、乘、除、運算符的表達式,并能判斷表達式括號是否匹配。輸入/輸出形式:用戶可以通過控制臺,根據(jù)輸入提示。輸入形式: ①正確的不含字母變量的中綴表達式; ②含有簡單錯誤的中綴表達式。 輸出形式: ①對于正確的中綴表達式,可以輸出其轉(zhuǎn)化后的后綴表達式及表達式的計算結(jié)果; ②對于含有簡單錯誤的中綴表達式,程序?qū)⒆詣虞敵鲥e誤提示,并給出錯誤信息。 測試數(shù)據(jù)要求:用戶可以輸入一個符合要求的中綴表達式,也可以輸入一個包含簡單錯誤的表達式。表達式中可以包括各種類型的常數(shù)以及小數(shù)等,操作符包括(+、-、*、/),同時表達式還可以包括各種括號。 3.概要設(shè)計 (1)抽象數(shù)據(jù)類型: 根據(jù)題目的要求,考慮用棧類型比較適合。ADT SeqStack Data 棧中元素具有相同類型及后進先出特性,相鄰元素具有前驅(qū)和后繼關(guān)系 Operation SeqStack 前置條件:棧不存在 輸入:無 功能:棧的初始化 輸出:無 后置條件:構(gòu)造一個空棧 ~ SeqStack 前置條件:棧已存在輸入:無 功能:銷毀棧 輸出:無 后置條件:釋放棧所占用的存儲空間 Push 前置條件:棧已存在 輸入:元素值x 功能:在棧頂插入一個元素x 輸出:如果插入不成功,拋出異常 后置條件:如果插入成功,棧頂增加了一個元素 Pop 前置條件:棧已存在輸入:無 功能:刪除棧頂元素 輸出:如果刪除成功,返回被刪元素值,否則,拋出異常 后置條件:如果刪除成功,棧頂減少了一個元素 GetTop 前置條件:棧已存在 輸入:無 功能:讀取當前的棧頂元素 輸出:若棧不空,返回當前的棧頂元素值 后置條件:棧不變 Empty 前置條件:棧已存在輸入:無 功能:判斷棧是否為空 輸出:如果棧為空,返回1;否則,返回0 后置條件:棧不變 End ADT 4.詳細設(shè)計 (1)實現(xiàn)概要設(shè)計的數(shù)據(jù)類型: 采用順序棧 const int StackSize = 50;template ~SeqStack();//析構(gòu)函數(shù) void Push(T x);//將元素x入棧 DataType Pop(); //將棧頂元素彈出 DataType GetTop();//取棧頂元素(并不刪除) int Empty();//判斷棧是否為空 private: DataType data[StackSize];//存放棧元素的數(shù)組 int top;//棧頂元素 };(2)主程序以及其它模塊的算法描述: 這個函數(shù)主要調(diào)用了實現(xiàn)功能的各個函數(shù)。其步驟為:在用戶沒有選擇退出時,先調(diào)用輸入函數(shù),輸入中綴表達式;然后調(diào)用判斷表達式,如果中綴表達式錯誤,則根據(jù)返回的值來輸出錯誤提示,不再往下運算;如果中綴表達式正確,則將中綴表達式轉(zhuǎn)換為后綴表達式,然后輸出中綴表達式和轉(zhuǎn)換后的后綴表達式;接著,再調(diào)用計算函數(shù),計算后綴表達式的結(jié)果輸出。最后是清屏函數(shù)。直至用戶選擇退出。 5、編碼與調(diào)試分析 編碼與調(diào)試過程中遇到的問題及解決辦法: 【問題1】程序在判斷表達式輸入形式有誤時,考慮情況不周全。解決辦法:盡可能多的將表達式有誤的情況考慮在內(nèi)。以下為現(xiàn)已考慮到并解決的問題:①表達式中出現(xiàn)非數(shù)字或非運算符的其他字符; ②表達式中括號不匹配。 【問題2】給變量賦值時出現(xiàn)重定義問題。 解決辦法:在定義暫存棧頂元素的變量t時,應(yīng)該在函數(shù)外面定義,在函數(shù)里面給變量賦值時不能定義。【問題3】無法處理多位數(shù)和小數(shù)。 解決辦法:在連續(xù)的操作數(shù)結(jié)束之后插入空格到后綴表達式中,以分隔操作數(shù)。 解決此問題的核心代碼: int i,t=0;float sum=0;for(i=0;i if(a[i]=='.'){ } } t=i;break;if(t!=0){ } else { } return sum; 2.待解決問題: for(i=0;i } i++;for(;i } sum=(a[i]-'0')*pow(0.1,i-t)+sum;if(a[i]=='.')break;sum=(a[i]-'0')*pow(10,n-(n-t)-1-i)+sum;for(i=0;i 6、使用說明 進入菜單,根據(jù)提示進行選擇。 7、測試結(jié)果 (1)含小數(shù)、多位數(shù)及括號的表達式顯示結(jié)果: 8、自學(xué)知識 在課程設(shè)計過程中,特別是在代碼編寫和調(diào)試的過程中,自學(xué)了很多新的知識。例如atof()函數(shù),包含于表頭文件 #include 第二篇:C++ 數(shù)據(jù)結(jié)構(gòu) 課程設(shè)計報告 計算表達式