版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、<p> 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告</p><p><b> 目錄</b></p><p> 1.航班信息管理系統(tǒng)………………3</p><p> 2.鐵路線最佳經(jīng)由問題……………11</p><p> 3.學(xué)生信息管理系統(tǒng)………………20</p><p> 4.個(gè)人實(shí)習(xí)總結(jié)……
2、………………30</p><p> 題目1:航空訂票系統(tǒng)</p><p><b> 需求分析:</b></p><p> 設(shè)計(jì)一個(gè)航空訂票系統(tǒng),基本要求如下:</p><p> 每條航班所涉及的信息有:航班號(hào),航班機(jī)型,起飛機(jī)場(chǎng),降落機(jī)場(chǎng),日期(星期幾),起飛時(shí)間,降落時(shí)間,飛行時(shí)長,價(jià)格,乘員定額,余票量,訂定
3、票的客戶名單(包括姓名,訂票量,艙位等級(jí)(頭等艙、公務(wù)艙、經(jīng)濟(jì)倉)以及等候替補(bǔ)的客戶名單(包括姓名、所需數(shù)量)。采用鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)。</p><p> 系統(tǒng)能實(shí)現(xiàn)的操作和功能如下:</p><p> ?。?)航班信息管理。</p><p> ?。?)查詢航線,按以下幾種方式查詢:</p><p><b> ①按航班號(hào)查詢;<
4、/b></p><p><b> ?、诎雌瘘c(diǎn)站查詢;</b></p><p><b> ?、郯唇K點(diǎn)站查詢;</b></p><p><b> ?、馨慈掌诓樵儯?lt;/b></p><p> 每種查詢方式中,查詢后輸出如下信息:航班號(hào),航班機(jī)型,起飛機(jī)場(chǎng),降落機(jī)場(chǎng),日期(星期
5、幾),起飛時(shí)間,降落時(shí)間,飛行時(shí)長,價(jià)格,余票量。</p><p> ?。?)承辦訂票業(yè)務(wù):根據(jù)客戶提出的要求(航班號(hào),訂票數(shù)額)查詢?cè)摵桨嗥鳖~情況,若有余票,則為客戶辦理訂票手續(xù),輸出座位號(hào);若已滿員或余票少于訂票額,則需重新詢問客戶要求。若需要,可登記排隊(duì)候補(bǔ)。</p><p> ?。?)承辦退票業(yè)務(wù):根據(jù)客戶提出的情況(日期,航班號(hào)),為客戶辦理退票手續(xù),然后查詢?cè)摵桨嗍欠裼腥伺抨?duì)候
6、補(bǔ),首先詢問排在第一的客戶,若所退票額能滿足他的要求,則為他辦理訂票手續(xù),否則依次詢問其它排隊(duì)候補(bǔ)的客戶。</p><p><b> 設(shè)計(jì)</b></p><p><b> 設(shè)計(jì)思想:</b></p><p> (1)數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì):</p><p><b> a.航班信息:<
7、/b></p><p> 該系統(tǒng)采用動(dòng)態(tài)鏈表存儲(chǔ)航班信息,每個(gè)節(jié)點(diǎn)表示一趟航班的基本信息(航班號(hào),航班機(jī)型,起飛機(jī)場(chǎng),降落機(jī)場(chǎng),日期(星期幾),起飛時(shí)間,降落時(shí)間,飛行時(shí)長,價(jià)格,乘員定額,余票量),還包括購買該趟航班的客戶信息</p><p> (包括姓名,訂票量,艙位等級(jí)(頭等艙、公務(wù)艙、經(jīng)濟(jì)倉),鏈表結(jié)構(gòu)體如下:</p><p> typedef
8、struct</p><p><b> {</b></p><p> char name[MAX]; //客戶姓名</p><p> int ticketnum; //客戶訂票量</p><p> char rank[MAX]; //艙位等級(jí)</p>
9、<p> int ticket[MAX]; //記錄座位號(hào)</p><p> }Client; //客戶信息</p><p> typedef struct</p><p><b> {</b></p><p> int NO;
10、 //座位號(hào)</p><p> int flag; //標(biāo)記是否被買</p><p><b> }Ticket;</b></p><p> typedef struct </p><p><b> {</b></p><p> int
11、 fID; //航班號(hào)</p><p> char fModel[MAX]; //航班機(jī)型</p><p> char airFrom[MAX]; //起飛機(jī)場(chǎng)</p><p> char airTo[MAX]; //降落機(jī)場(chǎng)</p><p> char week[MAX];
12、 //起飛時(shí)間</p><p> char start[MAX]; //起飛時(shí)間</p><p> char end[MAX]; //降落時(shí)間</p><p> char time[MAX]; //飛行時(shí)長</p><p> float price; //價(jià)格&
13、lt;/p><p> int count; //成員定額</p><p> int rest; //余票量</p><p> Client client[MAX]; //購買該趟航班所有客戶信息</p><p> int clientnum; //購
14、買該趟航班的客戶數(shù)量</p><p> }DataType; //航班數(shù)據(jù)類型</p><p> typedef struct node</p><p><b> {</b></p><p> DataType data; </p><p> Ticket t
15、icket[100]; //座位號(hào)</p><p> struct node* next; </p><p><b> }SLNode;</b></p><p> b.候補(bǔ)隊(duì)列結(jié)構(gòu)體:</p><p> 候補(bǔ)隊(duì)列沒有采用隊(duì)列,而是采用鏈表,只是添加數(shù)據(jù)時(shí)在末尾添加,刪除數(shù)據(jù)在首部添加。</
16、p><p> typedef struct</p><p><b> {</b></p><p> char name[MAX]; //候補(bǔ)客戶名稱</p><p> int number; //候補(bǔ)客戶訂票量</p><p> int fID;
17、 //候補(bǔ)客戶訂購的航班號(hào)</p><p> }QDataType; //候補(bǔ)信息</p><p> typedef struct qnode //候補(bǔ)客服信息鏈表 仿隊(duì)列</p><p><b> {</b></p><p> QDataType da
18、ta;</p><p> struct qnode *next;</p><p> }ListQueue;</p><p><b> 算法設(shè)計(jì)</b></p><p> 該系統(tǒng)包含五項(xiàng)基本功能:添加航班,查找航班,刪除航班,訂票,退票。</p><p> 添加航班:輸入航班基本信息,申請(qǐng)
19、空間,將客戶信息插入鏈表結(jié)尾。</p><p> 刪除航班:根據(jù)輸入的航班號(hào)在鏈表里搜索,找到后將該節(jié)點(diǎn)刪除。</p><p> 查找航班:包括按航班號(hào)查詢,按起點(diǎn)站、終點(diǎn)站查詢,按日期查詢。算法均 類似,在鏈表里搜索查詢條件,并將航班信息輸出,如果搜索到表尾均沒有,表示沒有該趟航班信息。</p><p>
20、訂票業(yè)務(wù):根據(jù)客戶輸入的航班號(hào)和訂票量,在航班信息表中搜素,沒有則提示錯(cuò)誤,并返回。有則比較航班的余票量是否滿足客戶的需求,滿足則為該客戶訂票,將該客戶信息存入該趟航班節(jié)點(diǎn)中,并檢索座位號(hào)信息是否被訂過,將沒有被訂的座位號(hào)輸出,并將該客戶的余票量改變。若不滿足客戶需求,詢問客戶是否需要進(jìn)入候補(bǔ)隊(duì)列等待買票,客戶需要?jiǎng)t將該客戶的信息存入候補(bǔ)隊(duì)列中,有客戶退票并滿足即可訂票,不需要就返回。</p><p> 退票業(yè)
21、務(wù):先提示客戶輸入航班號(hào)和名稱,在航班信息里搜索,檢查客戶輸入的信息是否正確(該客戶是否存在,該客戶退的票數(shù)是否比定的票數(shù)少或者相等),輸入錯(cuò)誤就提示并輸出,輸入正確,若輸入的票數(shù)和客戶訂購的票數(shù)相等,則將該客戶的信息從鏈表中刪除,并將該客戶的座位號(hào)退回去(將該趟航班的這幾個(gè)座位號(hào)標(biāo)識(shí)記為未定),將訂購該趟航班的客戶數(shù)量加一;若輸入的票數(shù)比客戶訂購的票數(shù)少,則將該客戶后面部分的票退回去,并將該趟航班的余票量減少,最后將該客戶訂購的票數(shù)減
22、少。退票就完成了。 然后檢索候補(bǔ)隊(duì)列的信息,依次詢問客戶是否需要訂票,若滿足則訂票,不滿足就詢問下一個(gè)。</p><p> 最后添加了一點(diǎn)打印功能,可以將購買某趟航班的客戶信息打印出來,以及打印候補(bǔ)隊(duì)列客戶信息,方便隨時(shí)查詢內(nèi)存情況。</p><p><b> 設(shè)計(jì)表示:</b></p><p> (1)函數(shù)調(diào)用關(guān)系圖:</p&
23、gt;<p><b> 函數(shù)接口規(guī)格說明:</b></p><p> void SLNodeInit(SLNode **head) //鏈?zhǔn)奖?存儲(chǔ)航班信息</p><p> int SLNodeInsert(SLNode *head,DataType x) //插入節(jié)點(diǎn)</p><p> void SLNod
24、eFirst(SLNode *head) //初始化2趟航班</p><p> int SLnodeLength(SLNode *head) //求鏈表長度</p><p> void ListQueueInit(ListQueue **head) //候補(bǔ)客戶鏈表初始化</p><p> int L
25、istQueueLength(ListQueue *head) //鏈表長度</p><p> ListQueue* ListQueueFind(ListQueue *head,int number,int fid) </p><p> //按照航班號(hào)和票數(shù)在鏈表里查找</p><p> void ListQueueDel(ListQ
26、ueue *head,ListQueue *node) //刪除該節(jié)點(diǎn)</p><p> ListQueue* ListQueueInsertLast(ListQueue *head,char name[],int fid,int number) </p><p> //客戶信息插入候補(bǔ)末尾</p><p> SLNode* FlightA
27、dd(SLNode *head) //添加航班</p><p> void FlightPrint(SLNode *head) //打印出航班信息</p><p> void FlightDelete(SLNode *head) //刪除航班</p><p> void ListQueuePrint(Li
28、stQueue *head) //候補(bǔ)名單打印</p><p> void ClientFind(SLNode *head,int fid) //查找訂購某趟航班的客戶信息</p><p> int BackFind(SLNode *head,int fid,char name[],int nu//判斷退票客戶信息是否有誤</p>
29、<p> void FlightIDFind(SLNode *head,int fid) //按航班號(hào)查詢</p><p> void FlightStartFind(SLNode *head,char start[]) //按起飛機(jī)場(chǎng)查詢</p><p> void FlightEndFind(SLNode *head,char en
30、d[]) /按著陸機(jī)場(chǎng)查詢</p><p> void FlightDateFind(SLNode *head,char date[]) //按星期查詢</p><p> ListQueue* TicketOrder(SLNode *head,int fid,int tknum,ListQueue *SS) </p><p&
31、gt;<b> //訂票</b></p><p> void TicketBack(SLNode *head,int fid,int tknum,char name[],ListQueue *S) </p><p><b> //退票</b></p><p><b> 詳細(xì)設(shè)計(jì):</b>
32、</p><p><b> ?。?).調(diào)試分析:</b></p><p> a.首先寫程序我沒有把客戶信息保存下來,而是單獨(dú)用一個(gè)鏈表保存,后來寫到后面遇到瓶頸,又改為每趟航班都保存客戶信息。</p><p> b.退票業(yè)務(wù)沒有根據(jù)客戶姓名退票,在老師的指點(diǎn)下,退票將客戶信息與鏈表中的客戶信息對(duì)比,輸入沒有錯(cuò)誤才可以退票。</p>
33、;<p> c.座位號(hào)是后來老師指點(diǎn)下設(shè)置標(biāo)記為存起來,每次訂票和退票都修改標(biāo)志位,這樣座位號(hào)才是聯(lián)系起來的。</p><p><b> (2).用戶手冊(cè):</b></p><p> a. 按照提示輸入數(shù)據(jù),一定注意數(shù)據(jù)的格式和數(shù)據(jù)的個(gè)數(shù)。</p><p> b. 輸入數(shù)據(jù)最好先保存在文檔中,再復(fù)制,不然輸入錯(cuò)誤一個(gè)肯能導(dǎo)
34、致程序運(yùn)行錯(cuò)誤。</p><p> (3).測(cè)試數(shù)據(jù)及測(cè)試結(jié)果:</p><p> 添加的兩趟航班信息:</p><p> 按航班號(hào)查詢航班信息:</p><p><b> 訂票業(yè)務(wù):</b></p><p><b> 查詢候補(bǔ)客戶信息:</b></p>
35、<p> 退票后為候補(bǔ)客戶訂票</p><p><b> 查詢購票客戶信息:</b></p><p> 題目5:鐵路網(wǎng)最佳經(jīng)由問題</p><p><b> 需求分析</b></p><p> 鐵路運(yùn)輸網(wǎng)絡(luò)中有鐵路線和火車站兩個(gè)主要概念,譬如:1號(hào)鐵路線表示京廣線,2號(hào)鐵路線
36、表示京滬線等。</p><p> 鐵路線對(duì)象包括鐵路線編號(hào)、鐵路線名稱、起始站編號(hào)、終點(diǎn)站編號(hào)、該鐵路線長度、通行標(biāo)志(00B客貨運(yùn)禁行,01B貨運(yùn)通行專線,10B客運(yùn)通行專線,11B客貨運(yùn)通行)。</p><p> 火車站對(duì)象包括所屬鐵路線編號(hào)、車站代碼、車站名、車站簡稱、離該鐵路線起點(diǎn)站路程及終點(diǎn)站路程。</p><p><b> 要求:<
37、/b></p><p> (1)查詢某站所屬的鐵路線。</p><p> (2)要求具備新增鐵路線的管理功能。</p><p> (3)要求具備新增車站的管理功能。</p><p> ?。?)針對(duì)客運(yùn)、貨運(yùn)情況能計(jì)算任何一個(gè)起始車站到任何一個(gè)終點(diǎn)站之間的最短路徑。并且要求能夠顯示出該最短路徑的各個(gè)火車站的經(jīng)由順序。</p&g
38、t;<p> ?。?)能輸出全部線路及沿途站點(diǎn)。</p><p><b> 二.設(shè)計(jì)</b></p><p><b> 1.設(shè)計(jì)思想:</b></p><p> (1)數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì):</p><p> 鐵路線采用動(dòng)態(tài)鏈表存儲(chǔ),包括鐵路線編號(hào)、鐵路線名稱、起始站編號(hào)、終點(diǎn)站編號(hào)、
39、該鐵路線長度、通行標(biāo)志(00B客貨運(yùn)禁行,01B貨運(yùn)通行專線,10B客運(yùn)通行專線,11B客貨運(yùn)通行)</p><p><b> 結(jié)構(gòu)體如下:</b></p><p> typedef struct </p><p><b> {</b></p><p> int rID;
40、 //鐵路線編號(hào)</p><p> char name[MAX]; //鐵路線名稱</p><p> int startID; //起始站站點(diǎn)編號(hào)</p><p> int endID; //終點(diǎn)站編號(hào)</p><p> long length; //
41、鐵路線長度</p><p> char sign[3]; //通行標(biāo)志</p><p> }DataType; //鐵路線數(shù)據(jù)</p><p> typedef struct node</p><p><b> {</b></p><p>
42、; DataType data;</p><p> struct node *next;</p><p> }SLNode; //鐵路線節(jié)點(diǎn)</p><p> 所有站點(diǎn)采用鄰接表存儲(chǔ),鄰接表的下一個(gè)節(jié)點(diǎn)包括該站點(diǎn)的站點(diǎn)代碼和距離上一個(gè)站點(diǎn)的距離,結(jié)構(gòu)體如下:</p><p> type
43、def struct Node2</p><p><b> {</b></p><p> int sID; //站點(diǎn)代碼</p><p> long weight; //前一個(gè)站到這站的距離</p><p> struct Node2 *next;&
44、lt;/p><p> }Edge; //兩個(gè)站點(diǎn)之間的邊</p><p> typedef struct Node1</p><p><b> {</b></p><p> int belong[MAX]; //站點(diǎn)所屬的鐵路線&l
45、t;/p><p> int routecount; //站點(diǎn)所屬的鐵路線數(shù)量</p><p> int sID; //站點(diǎn)代碼</p><p> char *name; //站點(diǎn)名稱</p><p>
46、char *shortname; //站點(diǎn)簡稱</p><p> long startDis; //距離起始站的距離</p><p> long endDis; //距離終點(diǎn)站的距離</p><p> int NO; /
47、/記錄它在數(shù)組的第幾個(gè)位置,方便深度優(yōu)先算法用</p><p> Edge *adj; //鄰接邊頭指針</p><p> }SDataType; //站點(diǎn)數(shù)據(jù)</p><p> typedef struct</p><p><b> {</b></p
48、><p> SDataType data[MAX]; //每個(gè)站點(diǎn)的數(shù)據(jù) </p><p> int count; //記錄站點(diǎn)個(gè)數(shù)</p><p> }GNode; //圖節(jié)點(diǎn)</p><p><
49、;b> (2)算法設(shè)計(jì):</b></p><p> 該系統(tǒng)采用動(dòng)態(tài)鏈表存儲(chǔ)所有鐵路線信息,但是包括的站點(diǎn)只是起點(diǎn)站和終點(diǎn)站,以及該鐵路線所有其他信息,鐵路線所以站點(diǎn)(包括起點(diǎn)站和終點(diǎn)站)單獨(dú)采用圖的鄰接表存儲(chǔ)。</p><p> 系統(tǒng)包括項(xiàng)功能:添加鐵路線,查看鐵路線,添加站點(diǎn),顯示全部站點(diǎn)信息及沿途站點(diǎn),找到任意兩點(diǎn)間的最短距離。</p><p
50、> 添加鐵路線:根據(jù)輸入的鐵路線信息,檢查這兩個(gè)站點(diǎn)是否已經(jīng)存在,若不存在,申請(qǐng)內(nèi)存,將數(shù)據(jù)存入并插入到鏈表的末尾。并將兩個(gè)站點(diǎn)所屬的鐵路線加入所屬鐵路線數(shù)組中,所屬鐵路線數(shù)量遞增。若存在,則只添加該站點(diǎn)所屬的鐵路線,并修改鄰接表的相關(guān)信息。</p><p> 查詢鐵路線:在鏈表中一次循環(huán),將鐵路線信息輸出,鏈表為空則提示錯(cuò)誤。</p><p> 添加站點(diǎn):輸入站點(diǎn)所屬的鐵路線
51、,站點(diǎn)信息,上一站代碼,距離上一站點(diǎn)的距離,下一站代碼,距離下一站點(diǎn)的距離。先查看是否存在該站點(diǎn),存在則只修改所屬的鐵路線,并修改鄰接表的相關(guān)信息。</p><p> 顯示全部鐵路線及沿途站點(diǎn):在鐵路線鏈表中依次搜索鐵路線信息,并在站點(diǎn)中搜尋,若屬于該鐵路線就輸出這個(gè)站點(diǎn)的信息,當(dāng)搜索到表尾時(shí),就可以輸出全部鐵路線信息,同時(shí)該系統(tǒng)還采用圖的深度優(yōu)先遍歷算法輸出全部站點(diǎn)信息。</p><p&g
52、t; 找到任意兩點(diǎn)間的距離:題目要求按照鐵路通行情況找到任意兩點(diǎn)間的距離,但是我只是采用弗洛伊德算法找到任意兩點(diǎn)間的最短距離,后來經(jīng)老師指點(diǎn)可以將全部站點(diǎn)導(dǎo)出各種通行情況,再用弗洛伊德算法,但是由于時(shí)間較短,還沒有弄出最終結(jié)果,目前只能實(shí)現(xiàn)尋找任意兩點(diǎn)間的最短距離及經(jīng)過的沿途站點(diǎn)。</p><p><b> 2.設(shè)計(jì)表示:</b></p><p> (1).函數(shù)
53、關(guān)系調(diào)用圖:</p><p> (2).函數(shù)接口說明:</p><p> #include "Graph.h" //站點(diǎn)相關(guān)信息</p><p> #include "SLNode.h" //鐵路線相關(guān)信息</p><p> #include "Pri
54、nt.h" //輸出相關(guān)信息</p><p> void SLNodeInit(SLNode **head) //初始化鏈表</p><p> void AddRoute(SLNode *head,int rID,char name[],int startID,char *sn,char *ss
55、,int endID,char *en,char *es,long length,char sign[],GNode *G) //添加鐵路線</p><p> void PrintRoute(SLNode *head,GNode *G) //輸出所有鐵路線信息</p><p> void GraphInit(GNode **G)
56、 //圖初始化</p><p> void AddStation(GNode *G,SLNode *head,int belong,int sid,char* sn,char* ss,int preID,long preDis,int laterID,long laterDis) //添加站點(diǎn)</p><p> int Firs
57、tVertex(GNode *G,int v) //求V的鄰接節(jié)點(diǎn)</p><p> int NextVertex(GNode *G,int v,int w) //求V的臨界點(diǎn)w的第一個(gè)節(jié)點(diǎn)</p><p> int NextVertex(GNode *G,int v,int w)
58、 //求V的臨界點(diǎn)w的第一個(gè)節(jié)點(diǎn)</p><p> void DepthFSearch(GNode *G,int v,int visited[],void Vist(int sid)) //深度優(yōu)先算法</p><p> void DepthFirstSearch(GNode *G,void Visit(int sid)) //無向圖的深
59、度優(yōu)先算法</p><p><b> 詳細(xì)設(shè)計(jì):</b></p><p> 采用動(dòng)態(tài)鏈表存儲(chǔ)所有鐵路線信息,但是包括的站點(diǎn)只是起點(diǎn)站和終點(diǎn)站,以及該鐵路</p><p> 線所有其他信息,鐵路線所以站點(diǎn)(包括起點(diǎn)站和終點(diǎn)站)單獨(dú)采用圖的鄰接表存儲(chǔ)。系統(tǒng)包括項(xiàng)功能:添加鐵路線,查看鐵路線,添加站點(diǎn),顯示全部站點(diǎn)信息及沿途站點(diǎn),找到任意兩點(diǎn)間
60、的最短距離。采用弗洛伊德算法找到任意兩點(diǎn)間的最短距離,后來經(jīng)老師指點(diǎn)可以將全部站點(diǎn)導(dǎo)出各種通行情況,再用弗洛伊德算法,但是由于時(shí)間較短,還沒有弄出最終結(jié)果,目前只能實(shí)現(xiàn)尋找任意兩點(diǎn)間的最短距離及經(jīng)過的沿途站點(diǎn)。</p><p><b> 調(diào)試分析:</b></p><p> 添加站點(diǎn)信息比較麻煩一點(diǎn),因?yàn)榭赡芤砑拥恼军c(diǎn)已經(jīng)存在,先要搜索站點(diǎn),沒有則添加,即使有了
61、,還要添加站點(diǎn)所屬的鐵路線信息。并且根據(jù)站點(diǎn)相鄰的站點(diǎn),要將整個(gè)圖串聯(lián)起來,還要算出各個(gè)站點(diǎn)間的距離。</p><p> b. 求兩點(diǎn)間的距離采用弗洛伊德算法,但是我存儲(chǔ)數(shù)據(jù)用了鄰接表存儲(chǔ),沒有找到相應(yīng)的站點(diǎn)編號(hào),后來在每個(gè)新加入的站點(diǎn)中添加編號(hào),根據(jù)編號(hào)導(dǎo)出二維數(shù)組,才能采用弗洛伊德算法求解。</p><p> c. 根據(jù)弗洛伊德算法求出path路徑后,我不知道怎么輸出所經(jīng)過的站
62、點(diǎn),在網(wǎng)上搜索各種方法,終于找到一種方法可行,就是要遞歸調(diào)用path,最終才得到正確的答案。</p><p><b> 用戶手冊(cè):</b></p><p> a.添加信息注意數(shù)據(jù)的格式和數(shù)量,否則程序運(yùn)行會(huì)出錯(cuò),最好用文檔保存下來,再復(fù)制。</p><p> b.添加站點(diǎn)信息,需要提供所屬的鐵路線,它的上一個(gè)站點(diǎn)信息,距離上一站的距離,還
63、要輸入它下一個(gè)站點(diǎn)的站點(diǎn)信息和距離下一個(gè)站點(diǎn)的距離。</p><p> c.查找最短距離,還沒有分客貨運(yùn)情況,有一點(diǎn)小遺憾,目前只能查看可以通行的路線最短距離。</p><p> 測(cè)試數(shù)據(jù)及測(cè)試結(jié)果:</p><p> 這是我用畫圖工具畫出的鐵路網(wǎng)信息圖(圓圈表示站點(diǎn)代碼)</p><p><b> 添加鐵路線信息:<
64、/b></p><p><b> 所有鐵路線信息:</b></p><p><b> 添加站點(diǎn)信息:</b></p><p><b> 查詢某站信息:</b></p><p><b> 所有站點(diǎn)信息:</b></p><p
65、> 查找兩點(diǎn)間的最短距離和經(jīng)過的站點(diǎn):</p><p> 題目8:學(xué)生成績管理系統(tǒng)</p><p><b> 需求分析:</b></p><p> 學(xué)生成績管理是高等學(xué)校教務(wù)管理的重要組成部分,主要包括學(xué)生注冊(cè)、考試成績的錄入及修改、成績的統(tǒng)計(jì)分析等等。設(shè)計(jì)一個(gè)系統(tǒng)實(shí)現(xiàn)對(duì)學(xué)生成績的管理。</p><p>
66、 要求系統(tǒng)應(yīng)具有以下基本功能:</p><p> ?。?)學(xué)生注冊(cè)登記;</p><p> ?。?)增加、刪除某一班級(jí)的學(xué)生;</p><p> ?。?)成績錄入:輸入學(xué)生的考試成績;</p><p> 要求采用二叉排序樹存放學(xué)生成績,一門課程對(duì)應(yīng)一棵二叉排序樹;</p><p> ?。?)成績修改:若輸入錯(cuò)誤可進(jìn)行
67、修改;</p><p> (5)統(tǒng)計(jì)分析:對(duì)某個(gè)班級(jí)學(xué)生的單科成績進(jìn)行統(tǒng)計(jì),求出平均成績;求出成績處于指定分?jǐn)?shù)段內(nèi)的學(xué)生人數(shù);求出每個(gè)學(xué)生一學(xué)期各科的平均成績等;</p><p> ?。?)查找:查找某個(gè)學(xué)生的某門課程成績,查找某門課程成績處于指定分?jǐn)?shù)段內(nèi)的學(xué)生名單等等。</p><p> ?。?)打印:打印一個(gè)班級(jí)學(xué)生的單科成績;打印某一課程成績處于指定分?jǐn)?shù)段內(nèi)
68、的學(xué)生名單;打印學(xué)生在某一學(xué)期的成績報(bào)告單。</p><p><b> 設(shè)計(jì)</b></p><p><b> 1.設(shè)計(jì)思想:</b></p><p> (1)數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì):</p><p> 該系統(tǒng)采用鏈表存儲(chǔ)所有學(xué)生信息,每個(gè)節(jié)點(diǎn)表示一個(gè)學(xué)生信息,包括學(xué)生的姓名,班級(jí),學(xué)號(hào)(唯一),成績
69、。其中成績用采用鏈表存儲(chǔ),可以動(dòng)態(tài)添加科目及該學(xué)生該科目的成績。</p><p><b> 鏈表結(jié)構(gòu)體如下:</b></p><p> typedef struct </p><p><b> {</b></p><p> char subjectname[
70、MAX]; //科目名稱</p><p> int sorce; //分?jǐn)?shù)</p><p> }DataTypeSub; </p><p> typedef struct node3</p><p><b> {</b><
71、;/p><p> DataTypeSub data;</p><p> struct node3 *next;</p><p> }Subject; //學(xué)生科目和成績的鏈表</p><p> typedef struct</p><p><b> {<
72、;/b></p><p> Subject *subject; </p><p> }Grade; //科目成績</p><p> typedef struct</p><p><b> {</b></p><p&
73、gt; int sID; //學(xué)號(hào)</p><p> char name[MAX]; //姓名</p><p> int cls; //班級(jí)</p><p> Grade grade; //成績</p><p>
74、 }DataType; //學(xué)生信息</p><p> typedef struct node </p><p><b> {</b></p><p> DataType data;</p><p> struct node *next; &
75、lt;/p><p> }SLNode; //學(xué)生信息管理鏈表節(jié)點(diǎn)</p><p> 成績采用二叉排序樹,一科成績對(duì)應(yīng)一科排序二叉樹,但是由于科目可以動(dòng)態(tài)添加,所以我只用了一科樹,要查看某科目的排序情況,需要輸入科目名稱,從鏈表中取出該科目的成績,并排出二叉排序樹,要查看下一刻目,再輸入科目名稱,再打印出來。</p>&l
76、t;p><b> 二叉樹結(jié)構(gòu)體如下:</b></p><p> typedef struct node2</p><p><b> {</b></p><p><b> int data;</b></p><p> struct node2 *leftChild
77、;</p><p> struct node2 *rightChild;</p><p> }BiTreeNode;</p><p><b> ?。?)算法設(shè)計(jì):</b></p><p> 該系統(tǒng)包括以下幾個(gè)模塊:</p><p> 注冊(cè)學(xué)生信息:根據(jù)輸入的學(xué)生學(xué)號(hào),姓名,班級(jí),將該學(xué)生查
78、詢鏈表末尾,其中學(xué)號(hào)是唯一的,若存在重復(fù)的會(huì)提示出錯(cuò)誤。查詢所有學(xué)生信息:遍歷鏈表,并輸出信息</p><p> 刪除學(xué)生信息:根據(jù)提供的要?jiǎng)h除的學(xué)生學(xué)號(hào),在鏈表中找到信息,并刪除節(jié)點(diǎn)。</p><p> 添加成績:提示用戶輸入學(xué)生學(xué)號(hào),科目名稱,并將成績存入鏈表相關(guān)位置。</p><p> 修改成績:在鏈表中找到該學(xué)生的科目名稱,并修改成績。</p&g
79、t;<p> 打印某一個(gè)班級(jí)的單科成績:遍歷鏈表,找到班號(hào),輸出全部學(xué)生成績。</p><p> 打印某一科目處于指定分?jǐn)?shù)段的學(xué)生名單和數(shù)目:這里采用在鏈表中求名單的方法,不足之處就是沒有采用二叉樹前序遍歷。</p><p> 打印某一學(xué)生本學(xué)期的成績單及平均成績:在鏈表中找到相關(guān)學(xué)生的信息,并全部輸出,同時(shí)求出平均成績。</p><p> 查
80、找某一學(xué)生某一科目的成績:在鏈表中找到相關(guān)信息并輸出。</p><p> 將某一科目成績存入二叉排序樹并打印:這里是先將要打印的科目名稱寫出來,根據(jù)科目名稱,取出鏈表中的全部成績,并排序,最后打印出來。</p><p><b> 2.設(shè)計(jì)表示: </b></p><p> (1)函數(shù)調(diào)用關(guān)系圖:</p><p>
81、 (2)函數(shù)接口規(guī)格說明:</p><p><b> 相關(guān)頭文件:</b></p><p> #include "Student.h" //學(xué)生相關(guān)信息</p><p> #include "Grade.h" //成績相關(guān)信息</p><p> #include &
82、quot;Print.h" //要輸出的相關(guān)函數(shù)</p><p> #include "Tree.h" //二叉排序樹并打印相關(guān)函數(shù)</p><p> void SLNodeInit(SLNode **head) //初始化學(xué)生信息鏈表</p><p> void StudentAdd
83、(SLNode *head,int sid,char name[],int cls) //注冊(cè)學(xué)生信息</p><p> void StudentPrint(SLNode *head) //顯示所有學(xué)生信息</p><p> void StudentDelete(SLNode *head,int sid,int cls) //按學(xué)號(hào)查刪除某個(gè)班級(jí)的學(xué)生
84、</p><p> void StudentSubject(SLNode *head,int sid,char subjectname[]) </p><p> //查找某個(gè)學(xué)生某門科目的成績</p><p> void SubjectInit(Subject **head) //成績信息鏈表初始化&l
85、t;/p><p> void AddObjectGrade(SLNode *head,int sid,char subjectname[],int sorce) </p><p> //添加某個(gè)學(xué)生某門課程的成績</p><p> void ListGradeModify(SLNode *head,int sid,char subjectname[],i
86、nt newsorce) </p><p> //把鏈表中的學(xué)生成績修改成新數(shù)據(jù)</p><p> void ClassSubject(SLNode *head,int cls,char subjectname[]) </p><p> //打印某個(gè)班級(jí)某科目的成績和平均成績</p><p> void BetweenGrade(
87、SLNode *head,char subjectname[],int low,int high) </p><p> //某科目處于指定分?jǐn)?shù)段的人數(shù)</p><p> void StudentGrade(SLNode *head,int sid) //打印某個(gè)學(xué)生的成績單和平均成績</p><p> void BiTreeNodeInit(Bi
88、TreeNode **root) //初始化樹節(jié)點(diǎn)</p><p> void BiTreeSort(BiTreeNode **root,int sorce) //二叉排序樹算法</p><p> void GradeTree(SLNode *head,BiTreeNode *root,char subjectname[]
89、) </p><p> //把某門課程存入排序二叉樹中</p><p> void PrintGradeBiTree(BiTreeNode *root,int n//以二叉樹形式打印存入成績的科目</p><p><b> 3詳細(xì)設(shè)計(jì):</b></p><p> 該系統(tǒng)采用鏈表存儲(chǔ)所有學(xué)生信息,每個(gè)節(jié)點(diǎn)
90、表示一個(gè)學(xué)生信息,包括學(xué)生的姓名,班級(jí),學(xué)號(hào)(唯一),成績。其中成績用采用鏈表存儲(chǔ),可以動(dòng)態(tài)添加科目及該學(xué)生該科目的成績。成績采用二叉排序樹,一科成績對(duì)應(yīng)一科排序二叉樹,但是由于科目可以動(dòng)態(tài)添加,所以我只用了一科樹,要查看某科目的排序情況,需要輸入科目名稱,從鏈表中取出該科目的成績,并排出二叉排序樹,要查看下一刻目,再輸入科目名稱,再打印出來。</p><p><b> 4調(diào)試分析:</b>
91、;</p><p> 之前寫程序只是固定的使用某些科目,但是后來才發(fā)現(xiàn)這樣不可以動(dòng)態(tài)添加,所以后來在鏈表中又動(dòng)態(tài)添加了一個(gè)鏈表,用于存儲(chǔ)科目信息及該同學(xué)所有科目的成績。</p><p> 將科目成績排成二叉樹,前序遍歷就是從低到高的成績,改算法反復(fù)推敲課本才終于明白其意思。</p><p> 查找處于某分?jǐn)?shù)段的同學(xué)信息,是在鏈表中搜索信息,沒有先排成二叉樹,在
92、遍歷后找相應(yīng)區(qū)間。</p><p><b> 5用戶手冊(cè):</b></p><p> 添加信息注意數(shù)據(jù)的格式和數(shù)量,否則程序運(yùn)行會(huì)出錯(cuò),最好用文檔保存下來,再復(fù)制。</p><p> 注冊(cè)學(xué)生信息只能一個(gè)一個(gè)的注冊(cè),且不能重復(fù)使用同一個(gè)學(xué)號(hào)</p><p> 添加成績要提供正確的科目名稱,科目是動(dòng)態(tài)添加,若輸入錯(cuò)
93、誤,就是另外一科目的成績。</p><p> 要以排序二叉樹形式打印科目,需要先提供科目名稱,并調(diào)用函數(shù)將成績?nèi)〕雠懦啥鏄?,才能打印,一次只能打印一科成績,這是為了可以動(dòng)態(tài)查看,而不是每一科目成績都事先準(zhǔn)備好一棵二叉樹。</p><p><b> 測(cè)試數(shù)據(jù)及測(cè)試結(jié)果</b></p><p><b> 注冊(cè)學(xué)生信息:</b
94、></p><p><b> 查詢?nèi)繉W(xué)生信息:</b></p><p><b> 添加學(xué)生成績:</b></p><p> 將成績以排序二叉樹打印出來:</p><p> 打印某個(gè)班級(jí)某科目成績:</p><p> 查找處于指定分?jǐn)?shù)段的學(xué)生信息:</p
95、><p> 查找某學(xué)生本學(xué)期的成績:</p><p><b> 個(gè)人總結(jié)</b></p><p> 實(shí)習(xí)時(shí)間是安排在7月初考完試,老師在大概6月20左右就把題目給我們,那幾天剛好沒有上課,也怕到實(shí)習(xí)的時(shí)候做不完,所以就先做起來了。也沒多想,就從第一題開始做起。但是開始下筆才發(fā)現(xiàn)問題重重,加之文檔沒有完全說明其要求的功能,還好我們幾個(gè)一起探討了
96、一下數(shù)據(jù)的結(jié)構(gòu)安排,第一個(gè)題是在一群人的探討摸索中慢慢寫出來的,當(dāng)然,漏洞也比較多。還有就是我們幾個(gè)總是想著,這個(gè)應(yīng)該不會(huì)要求這么高吧,比如那倉位等級(jí)的問題,當(dāng)初也考慮到要不要分開,包括余票量,價(jià)格等等。但是我們自我安慰說,這樣分也太麻煩了吧,老師不會(huì)這么要求的,并且我們也真就沒有完善這些功能,但是后來真正交報(bào)告的時(shí)候,我們才知道我們的想法很幼稚,這些功能是必須要完成的。導(dǎo)致的后果就是后來改程序比寫程序麻煩多多了。</p>
97、<p> 第一個(gè)題花了大概三四天,那幾天一天到晚在調(diào)試,其實(shí)寫到后面才知道這是最簡單的一個(gè),但還是花了好長時(shí)間,收獲也不少其實(shí)。這些代碼一通百通,寫完一個(gè),后面的就方便好多了。還有就是寫出一個(gè)功能函數(shù)就把它調(diào)試好,否則后面bug越積越多,改起來很頭疼。第一個(gè)寫完,他們就沒有寫了,我沒辦法,自己一個(gè)人寫,沒人跟我討論,只能憑自己的想法寫,但是明星感覺到?jīng)]有第一個(gè)那樣寫起來困難了。功能也比前面一個(gè)有所改進(jìn)和完善。第三個(gè)是寫的鐵
98、路系統(tǒng),這個(gè)涉及到圖,寫起來比較麻煩,所以放在了最后,就一個(gè)站點(diǎn)信息的存儲(chǔ),花了我好長時(shí)間,我是用鄰接表存儲(chǔ),每插入一個(gè)節(jié)點(diǎn)就將他相鄰的節(jié)點(diǎn)插進(jìn)去。但是后來才發(fā)現(xiàn),其實(shí)貌似使用鄰接矩陣存儲(chǔ)更方便點(diǎn),兩點(diǎn)間的權(quán)值也就是一樣的,相當(dāng)于有權(quán)無向圖。后面用深度優(yōu)先遍歷和弗洛伊德算法也比較方便。同時(shí),一個(gè)人思維比較容易受限,一直沒有找到方法怎么把客貨運(yùn)情況分開,后來驗(yàn)收程序老師跟我說應(yīng)該把鄰接表導(dǎo)出二維矩陣時(shí)分成客運(yùn)和貨運(yùn)情況。感覺恍然大悟,但是
99、后來要改這程序已經(jīng)比較困難了。</p><p> 寫完三個(gè)程序花了一周時(shí)間,依然記得剛寫完程序的喜悅和如釋重負(fù)的感覺,真的是腰酸背痛,全身乏力啊。雖然后來驗(yàn)收才發(fā)現(xiàn)程序有一些漏洞,但還是挺高興的,畢竟這是自己寫的,基本運(yùn)行沒有什么問題。后來到真正實(shí)習(xí)時(shí)間時(shí),剛考完試,明顯感覺有心無力,沒有好好靜下心來改程序。給老師驗(yàn)收時(shí),老師給了我好多修改程序的建議,后來改了一部分,但是真心覺得修改程序比寫更難,所以也沒有改到
100、很完美。</p><p> 總之,真正的去寫,去思考,真的感覺收獲不少。其中一些收獲如下:</p><p> 寫之前一定要考慮到所有的數(shù)據(jù)情況,不能抱有“僥幸”心理,最后不符合要求,要修改更麻煩。</p><p> 一定完成所有功能,雖然有些要求苛刻,但是總有解決的算法。盡量做到代碼功能強(qiáng)悍和可擴(kuò)展。</p><p> 分模塊寫,寫好
101、一個(gè)模塊,就調(diào)試好沒有bug再寫下一個(gè),不僅有一定的收獲感,還不至于后面調(diào)試很多的錯(cuò)誤。</p><p> 盡量自己先思考,不然容易受別人思想的禁錮,最后實(shí)在無路可走,就該跟別人交流,這時(shí)別人的建議會(huì)讓你“茅塞頓開”。</p><p> 堅(jiān)持。寫程序是枯燥的,調(diào)試更是無聊,但是最后的收獲感,成就感應(yīng)該讓我們更有決心堅(jiān)持把程序?qū)懲昝馈?lt;/p><p><b&
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告 (2)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告 (2)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告
- 《數(shù)據(jù)結(jié)構(gòu)》課程設(shè)計(jì)報(bào)告
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì) (2)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)--數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)----huffman編碼
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)——課程設(shè)計(jì)報(bào)告模板
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告 (4)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)實(shí)習(xí)報(bào)告
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告.doc
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告 (3)
評(píng)論
0/150
提交評(píng)論