高程的設(shè)計(jì)
通過(guò)此系統(tǒng)可以實(shí)現(xiàn)如下功能: 錄入: 可以錄入航班情況(數(shù)據(jù)可以存儲(chǔ)在一個(gè)數(shù)據(jù)文件中,數(shù)據(jù)結(jié)構(gòu)、具體數(shù)據(jù)自定) ; 查詢: 可以查詢某個(gè)航線的情況(如,輸入航班號(hào),查詢起降時(shí)間,起飛抵達(dá)城市,航班票價(jià),票價(jià)折扣,確定航班是否滿倉(cāng)); 可以輸入起飛抵達(dá)城市,查詢飛機(jī)航班情況; 訂票:(訂票情況可以存在一個(gè)數(shù)據(jù)文件中,結(jié)構(gòu)自己設(shè)定) 可以訂票,如果該航班已經(jīng)無(wú)票,可以提供相關(guān)可選擇航班或提供候補(bǔ)席位; 退票: 可退票,退票后修改相關(guān)數(shù)據(jù)文件; 客戶資料有姓名,證件號(hào),訂票數(shù)量及航班情況,訂單要有編號(hào)。 修改航班信息: 當(dāng)航班信息改變可以修改航班數(shù)據(jù)文件 。
2.1 結(jié)構(gòu)定義因?yàn)楸绢}函數(shù)變量巨多無(wú)比,所以我們定義了typedef struct client和airline,統(tǒng)領(lǐng)一些小變量。這樣在之后引用的時(shí)候,比較方便。 2.2 函數(shù)構(gòu)造 利用之前構(gòu)造的的變量進(jìn)行函數(shù)構(gòu)造,利用不同函數(shù)實(shí)現(xiàn)不同的功能。設(shè)計(jì)航班信息,訂票信息的存儲(chǔ)結(jié)構(gòu),設(shè)計(jì)程序完成功能。 2.3 功能實(shí)現(xiàn)通過(guò)此系統(tǒng)可以實(shí)現(xiàn)如下功能: 錄入: 可以錄入航班情況(數(shù)據(jù)可以存儲(chǔ)在一個(gè)數(shù)據(jù)文件中,數(shù)據(jù)結(jié)構(gòu)、具體數(shù)據(jù)自定) ; 查詢: 可以查詢某個(gè)航線的情況(如,輸入航班號(hào),查詢起降時(shí)間,起飛抵達(dá)城市,航班票價(jià),票價(jià)折扣,確定航班是否滿倉(cāng)); 可以輸入起飛抵達(dá)城市,查詢飛機(jī)航班情況; 訂票:(訂票情況可以存在一個(gè)數(shù)據(jù)文件中,結(jié)構(gòu)自己設(shè)定) 可以訂票,如果該航班已經(jīng)無(wú)票,可以提供相關(guān)可選擇航班或提供候補(bǔ)席位; 退票: 可退票,退票后修改相關(guān)數(shù)據(jù)文件; 客戶資料有姓名,證件號(hào),訂票數(shù)量及航班情況,訂單要有編號(hào)。 修改航班信息: 當(dāng)航班信息改變可以修改航班數(shù)據(jù)文件 。
3 程序與功能模塊設(shè)計(jì)
3.1 設(shè)計(jì)思路總體思路,通過(guò)對(duì)題目的閱讀和分析,我們發(fā)現(xiàn)要求大體分為2大模塊,1.航班信息的錄入,修改與查詢。2.顧客的信息錄入,訂票,退票系統(tǒng)。我們對(duì)錄入信息的解決方法是運(yùn)用鏈表的插入,將信息放入到一個(gè)個(gè)鏈表當(dāng)中,對(duì)于輸出,我們則借鑒了遍歷函數(shù),同時(shí),我們對(duì)于數(shù)據(jù)的查找,也借鑒了鏈表中的查找,在訂票系統(tǒng)中,我們也是基于此,進(jìn)行修改,完成了訂票退票系統(tǒng)。 錄入:首先是數(shù)據(jù)的錄入,這個(gè)可以分為航班信息airline和顧客信息client,根據(jù)題目要求航班信息airline中需包含 航班號(hào),起飛地,目的地,起飛時(shí)間,降落時(shí)間,票價(jià),座位總數(shù),剩余座位數(shù),不同艙位的數(shù)目,而顧客信息client中需要包含訂單號(hào),顧客姓名,證件號(hào),及他所訂購(gòu)的航班信息,和所定的艙位信息。我們根據(jù)需求把他們定義為不同的數(shù)據(jù)類型,便于在之后的函數(shù)中直接引用,也便于后期不同模塊的整合與統(tǒng)一。 查詢:根據(jù)功能要求,我們需采取兩種方式查詢航班:1.航班號(hào) 2.起始地和目的地。利用指針,將錄入的航班逐個(gè)與客戶查詢的關(guān)鍵字進(jìn)行比較,直至查找到對(duì)應(yīng)的航班,并輸出航班所有信息。 訂票:創(chuàng)建一個(gè)新的結(jié)構(gòu)體來(lái)儲(chǔ)存客戶的信息,其中包括選擇航班的相關(guān)信息、客戶的身份信息和訂單號(hào)。與查詢方式類似,當(dāng)指針指向相應(yīng)的航班時(shí),我們將該航班對(duì)應(yīng)的結(jié)構(gòu)體中相關(guān)信息復(fù)制儲(chǔ)存至收集客戶信息的結(jié)構(gòu)體中,并將客戶的身份信息也一同存入。若航班的余票量不能滿足客戶的訂票需求,那么系統(tǒng)將提供其他滿足客戶需求的航班,客戶可以重新進(jìn)行選擇訂票?蛻粢部梢赃x擇候補(bǔ)滿客航班,這時(shí)重新創(chuàng)建一個(gè)新結(jié)構(gòu)體來(lái)儲(chǔ)存候補(bǔ)客戶的信息。 退票:同樣運(yùn)用指針,我們先找到退票客戶的“信息文件夾”。然后將該客戶的訂票信息刪除,同時(shí)恢復(fù)對(duì)應(yīng)航班的座位數(shù)。這時(shí),系統(tǒng)將會(huì)按順序?yàn)楹蜓a(bǔ)席位中的客戶訂票。 修改:修改內(nèi)容包括:1.增加航班 2.刪除航班 3.修改部分信息。 增加航班:在儲(chǔ)存航班信息的鏈表中創(chuàng)建一個(gè)新的結(jié)點(diǎn),將對(duì)應(yīng)的新航班信息存儲(chǔ)在結(jié)構(gòu)體中。 刪除航班:利用指針找到需刪除航班的結(jié)點(diǎn),之后刪除該節(jié)點(diǎn)并釋放節(jié)點(diǎn)中存儲(chǔ)的航班信息。 修改部分內(nèi)容:利用指針找到需要修改航班的結(jié)點(diǎn),根據(jù)要求對(duì)指針指向的結(jié)構(gòu)體內(nèi)容進(jìn)行修改,以完成航班的相關(guān)信息修改。 3.2 詳細(xì)實(shí)現(xiàn)過(guò)程錄入:在主程序利用了import(num,headline);函數(shù)錄入航班信息,在之后的訂票模塊利用 bookticket錄入了顧客信息,主要的錄入就這兩塊信息,所以分別定義typedef struct client 和typedef struct airline作為結(jié)構(gòu)變量統(tǒng)領(lǐng)這些信息,而在輸入的時(shí)候只要采用循環(huán)結(jié)構(gòu),就可以實(shí)現(xiàn)地址的移動(dòng),一位一位的實(shí)現(xiàn)信息錄入,具體程序如之后程序所示。 查詢:我們分為兩種方式對(duì)航班進(jìn)行查詢:1.航班號(hào) 2.起始地和目的地。通過(guò)航班號(hào)進(jìn)行查詢,我們利用strcmp函數(shù)比較輸入的航班號(hào)字符串與指針指向的航班號(hào)字符串,若返回值為0,則指針temp所指向的就是找到的航班號(hào),這時(shí)利用指針temp將結(jié)點(diǎn)中該航班的信息全部輸出。若返回值不為0,那么指針順著鏈表移動(dòng),指向下一個(gè)結(jié)點(diǎn),繼續(xù)比較。通過(guò)起始地與目的地查找航班方法與通過(guò)航班號(hào)查詢方式差不多,只不過(guò)同時(shí)比較起始地和目的地兩個(gè)字符串。
訂票:為了便于儲(chǔ)存訂票客戶的具體信息,我們創(chuàng)建了一個(gè)新的結(jié)構(gòu)體client。訂票時(shí)客戶選擇合適航班,指針temp順著鏈表移動(dòng)找到該航班對(duì)應(yīng)的結(jié)點(diǎn),將對(duì)應(yīng)的航班信息復(fù)制儲(chǔ)存在client中,同時(shí)客戶從鍵盤上輸入自己的名字與id,一并存入client中,并將客戶的id作為訂單編號(hào)。訂票完成后,執(zhí)行函數(shù)display_client,將客戶的訂單信息輸出至屏幕上。若航班余票量不能滿足客戶的訂票需求,通過(guò)函數(shù)display_all_line將所有航班信息輸出在屏幕上為客戶提供其他選擇?蛻艨梢赃x擇訂購(gòu)其他航班,其實(shí)現(xiàn)步驟與訂票無(wú)異?蛻粢部梢赃x擇在滿客航班候補(bǔ),這時(shí)程序?qū)⒖蛻粜畔⒋嫒隿lient中。候補(bǔ)信息填寫完成后,將執(zhí)行函數(shù)display_client1將候補(bǔ)信息輸出,并提醒客戶“無(wú)余票,需耐心等待”。 退票:我們先利用指針headclient順著client鏈表移動(dòng),找到退票客戶的結(jié)點(diǎn),然后刪除該節(jié)點(diǎn)并釋放結(jié)構(gòu)體儲(chǔ)存的信息。接著再利用指針headline順著airline鏈表移動(dòng),找到與退票客戶信息中的航班號(hào)相等的結(jié)點(diǎn),修改其中的座位數(shù)。這時(shí)要判斷客戶的艙位等級(jí),利用switch語(yǔ)句分別對(duì)不同艙位進(jìn)行座位數(shù)修改。 修改:先利用switch語(yǔ)句選擇航班修改操作類型。 - 增加航班:airline鏈表新增一個(gè)結(jié)點(diǎn),然后與錄入過(guò)程相似。
- 刪除航班:指針delline順著鏈表移動(dòng)直至找到對(duì)應(yīng)航班結(jié)點(diǎn),然后刪除該結(jié)點(diǎn),并釋放相關(guān)信息存儲(chǔ)空間。
- 修改部分內(nèi)容:指針temp順著鏈表移動(dòng)直至找到對(duì)應(yīng)航班結(jié)點(diǎn),由于只有部分信息需要修改,我們利用switch語(yǔ)句的選擇結(jié)構(gòu)分別執(zhí)行不同修改內(nèi)容的語(yǔ)句。當(dāng)進(jìn)行選擇后,我們通過(guò)指針temp對(duì)結(jié)構(gòu)體的內(nèi)容進(jìn)行修改?紤]到多個(gè)部分信息需修改的情況,我們運(yùn)用了while語(yǔ)句,對(duì)定義的整型變量y判斷,當(dāng)有繼續(xù)修改的需求時(shí),y=1,循環(huán)繼續(xù),若無(wú)需求,y=0,循環(huán)結(jié)束。
3.3 設(shè)計(jì)總結(jié)這幾個(gè)功能有著類似之處,比如訂票,退票,修改在設(shè)計(jì)中,把他們?nèi)齻(gè)定義為3個(gè)函數(shù) display_line(find),bookticket和returnticket。然后在不同的函數(shù)中實(shí)現(xiàn)具體不同的功能,詳細(xì)的在之后程序分析細(xì)說(shuō)。修改也是同理,不過(guò)是找到數(shù)據(jù)地址,然后進(jìn)行數(shù)據(jù)覆蓋,只要注意變量定義在了哪里即可。 總的來(lái)說(shuō),這次的程序設(shè)計(jì)與我們之前做的作業(yè)有著異曲同工之妙,先是定義變量,而后進(jìn)行功能實(shí)現(xiàn)的構(gòu)思,然后寫主函數(shù),主函數(shù)簡(jiǎn)單,利用多種函數(shù)實(shí)現(xiàn)功能,將大程序分為一個(gè)個(gè)小功能,最后用main函數(shù)總結(jié)起來(lái),實(shí)現(xiàn)我們希望的功能。 我們最后又進(jìn)行了功能的完善和擴(kuò)展,進(jìn)行了一些實(shí)際問(wèn)題的思考讓他看起來(lái)更像一個(gè)真實(shí)的航空售票系統(tǒng)。
5 程序測(cè)試?yán)c分析
5.1 結(jié)果截圖首先進(jìn)入選項(xiàng)頁(yè)面: 1)正常錄入航班信息: 


3) 
若是訂滿,則顯示艙位已滿,讓客戶選擇排隊(duì)或者退出,若是排隊(duì)進(jìn)行信息的補(bǔ)錄,并且顯示需要幾張票。 
4)退票直接顯示退票成功 
5) 
6) 
  0) 5.2 程序結(jié)果詳解 首先,由上文的結(jié)果截圖可以看到,一共分為了六個(gè)模塊和一個(gè)系統(tǒng)退出。 在主函數(shù)處,我們把程序用switch(x) 函數(shù) ,分為不同的case,這樣便于我們分配任務(wù)編寫,和最后的檢查。接下來(lái)是每一塊的詳細(xì)實(shí)現(xiàn)過(guò)程。 (1)第一個(gè)是錄入航班信息,這也是這個(gè)系統(tǒng)最為基礎(chǔ)的部分,由程序段我們也可以看到,我們利用了typedef struct airline 定義了許多個(gè)變量,這個(gè)是需要我們手動(dòng)輸入的數(shù)據(jù)。 而折扣在這里我們采用的是0-1.0作為折扣的輸入,比如九折就是0.9,結(jié)果都如之前所示。 (2)第二個(gè)是查詢航線信息,根據(jù)我們的生活經(jīng)驗(yàn),我們把這個(gè)又分為兩種查詢方式,分別是起始地和航班編號(hào)查詢,查詢之后,會(huì)在下面把所有航班信息都列出來(lái),供人們參考。 (3)第三個(gè)是客戶訂票,在這里輸入的是客戶數(shù)據(jù),若是還有空位,利用typedef struct client將數(shù)據(jù)儲(chǔ)存起來(lái),同時(shí)把航班的空間減一,作為座位的分配,若是沒(méi)有空位,如上述程序所顯示,進(jìn)行排隊(duì)或者退出的選擇。 (4)第四個(gè)是客戶退票,這個(gè)很簡(jiǎn)單,只要把數(shù)據(jù)清空就可以了,如上述程序顯示。 (5) 第五個(gè)是輸出所有航班信息,只要利用循環(huán)結(jié)構(gòu)和與期中考試類似的node->line_num等等,輸出剛剛輸入的數(shù)據(jù),并且全部列出即可。 (6)第六個(gè)是修改航班信息,注意當(dāng)前航班信息,找對(duì)地址,修改相應(yīng)數(shù)據(jù),再進(jìn)行錄入即可,這個(gè)也是實(shí)現(xiàn)比較困難的一個(gè)。 (7)第七個(gè)是退出程序,直接break就可以了。 6整體設(shè)計(jì)總結(jié) 6.1 遇到的問(wèn)題1.刪除航班模塊,我們發(fā)現(xiàn)在刪除選擇航班后,程序會(huì)直接退出,并沒(méi)有返回訂票主系統(tǒng),即如圖所示 
- 其他還有一些函數(shù)定義的錯(cuò)誤。
- 在乘客訂票結(jié)束后,程序不進(jìn)行下一步,而是卡死在這一步,再次按回車則直接彈出。
6.2 問(wèn)題的解決方法1.我們返回函數(shù)change_line,然后在2選項(xiàng)中修改了相應(yīng)代碼delete delline->next; 增加了delline=delline->next;使他能夠一位一位后移,解決了這個(gè)問(wèn)題。 2.我們找到了相應(yīng)的定義位置,詳細(xì)修改了函數(shù)的找尋方式及具體定義,解決了這個(gè)問(wèn)題。 3.我們回到對(duì)應(yīng)函數(shù)的位置,在程序結(jié)束處補(bǔ)上了 return 0; 使函數(shù)能夠正常結(jié)束,解決了這個(gè)問(wèn)題。 6.3 總結(jié)其他還有一些問(wèn)題,都用類似方法得到了解決,發(fā)現(xiàn)程序出錯(cuò)要到相應(yīng)位置去詳細(xì)檢查,解決之后不能立刻編譯,應(yīng)該先預(yù)想一下運(yùn)行結(jié)果,然后再進(jìn)行編譯。 然后若是功能出錯(cuò),要到相應(yīng)功能實(shí)現(xiàn)的函數(shù)位置進(jìn)行檢查,之后與程序檢查的步驟一致。
7心得體會(huì) 根據(jù)第一段信息可知,應(yīng)將系統(tǒng)信息總體分為兩部分——航班信息,乘客信息?啥x出兩個(gè)結(jié)構(gòu)體來(lái)進(jìn)行信息存儲(chǔ)。對(duì)于題目所要求的 錄入,查詢,訂票,退票等功能,可通過(guò)定義不同函數(shù),分別實(shí)現(xiàn)不同功能 ,最后在主函數(shù)中進(jìn)行調(diào)用,進(jìn)行整合。 使用鏈表來(lái)存儲(chǔ)信息,更加方便靈活。不同函數(shù)間可進(jìn)行相互調(diào)用,以實(shí)現(xiàn)所要求的功能。 我們可以利用課上學(xué)到的知識(shí),定義結(jié)構(gòu)體,大量使用結(jié)構(gòu)指針,實(shí)現(xiàn)很多信息的錄入,修改,賦值,比較等。定義單鏈表,使用 while 循環(huán)語(yǔ)句,if 判斷,switch 選擇等。使用 #include<string.h> 等頭文件,使用 strcmp() 來(lái)進(jìn)行數(shù)據(jù)的比較以實(shí)現(xiàn) 航線的查詢,訂票等功能。 最后再查閱相關(guān)資料完成程序的具體編寫。
4 C語(yǔ)言程序與接口實(shí)現(xiàn)
4.1 程序設(shè)計(jì)- using namespace std;
- #include<stdlib.h>
- #include<string.h>
- #include<stdio.h>
- /*****************************************************
- *功能描述:定義客戶信息
- *輸入?yún)?shù):name,id,line_num,time1,time2,seat_num
- *輸出參數(shù):client
- txt文件
- ******************************************************/
- typedef struct client
- {
- char file[20];//訂單編號(hào)
- char name[20];//顧客名
- char id[17];//顧客證件號(hào)
- char line_num[10];//航班號(hào)
- char time1[10];//起飛時(shí)間
- char time2[10];//降落時(shí)間
- double price;//現(xiàn)票價(jià)
- int class0;//艙位等級(jí)
- int seat_num;//座位號(hào)
- struct client *next;//下一個(gè)結(jié)點(diǎn)
- } client;
- typedef struct clienthead
- {
- int count;
- client *next;
- } clienthead;
- /*****************************************************
- *功能描述:定義航班信息
- *輸入?yún)?shù):line_num,time1,time2,seat_num,start_place,end_place,total
- *輸出參數(shù):airline
- txt
- ******************************************************/
- typedef struct airline
- {
- char line_num[10];//航班號(hào)
- char start_place[20];//起飛地
- char end_place[20];//目的地
- char time1[10];//起飛時(shí)間
- char time2[10];//降落時(shí)間
- double price0;//票價(jià)
- double price;//現(xiàn)票價(jià)
- double discount;//折扣
- int class1;//一等艙
- int class2;//二等艙
- int class3;//三等艙
- int total;//座位總數(shù)
- int left;//剩余座位
- struct airline *next;//下一個(gè)結(jié)點(diǎn)
- } airline;
- //頭結(jié)點(diǎn)
- typedef struct airlinehead
- {
- int count;
- airline *next;
- } airlinehead;
- /*****************************************************
- *功能描述:錄入航班函數(shù)
- *輸入?yún)?shù):line_num,start_place,end_place,time1,time2,total,left
- *輸出參數(shù):第i+1個(gè)航班錄入
- ******************************************************/
- airlinehead* import(int n,airlinehead *pheadline)//錄入航班函數(shù): n為所要錄入航班的數(shù)量:
- {
- airline *temp = new airline;
- temp->next=NULL;
- pheadline->next=temp;
- pheadline->count = n;
- int flag;
- for(int i=0; i<n; i++)
- {
- printf("請(qǐng)輸入第%d個(gè)航班的航班號(hào) ",i+1);
- scanf("%s",temp->line_num);
- printf("\n");
- printf("請(qǐng)輸入第%d個(gè)航班的起飛地 ",i+1);
- scanf("%s",temp->start_place);
- printf("\n");
- printf("請(qǐng)輸入第%d個(gè)航班的目的地 ",i+1);
- scanf("%s",temp->end_place);
- printf("\n");
- printf("請(qǐng)輸入第%d個(gè)航班的起飛時(shí)間 ",i+1);
- scanf("%s",temp->time1);
- printf("\n");
- printf("請(qǐng)輸入第%d個(gè)航班的降落時(shí)間 ",i+1);
- scanf("%s",temp->time2);
- printf("\n");
- printf("請(qǐng)輸入第%d個(gè)航班的座位總數(shù) ",i+1);
- scanf("%d",&temp->total);
- printf("\n");
- printf("請(qǐng)輸入一等艙座位數(shù) ");
- scanf("%d",&temp->class1);
- printf("請(qǐng)輸入二等艙座位數(shù) ");
- scanf("%d",&temp->class2);
- printf("請(qǐng)輸入三等艙座位數(shù) ");
- scanf("%d",&temp->class3);
- temp->left=temp->total;
- printf("本航班的剩余座位數(shù): %d",temp->left);
- printf("\n");
- printf("請(qǐng)輸入原票價(jià) ");
- scanf("%lf",&temp->price0);
- printf("是否有折扣:(1:是 0:否)");
- scanf("%d",&flag);
- if(flag){
- printf("請(qǐng)輸入折扣:");
- scanf("%lf",&temp->discount);
- temp->price=(temp->price0)*(temp->discount);
- }
- else{
- temp->discount=0;
- temp->price=temp->price0;
- }
- printf("現(xiàn)票價(jià):%.2f",temp->price);
- printf("\n");
- printf("第%d個(gè)航班成功錄入。 ",i+1);
- printf("\n");
- if(i<n-1)
- {
- temp->next = new airline;
- if(temp->next == NULL)
- { printf("分配失敗");
- printf("\n");
- exit(1);
- }
- temp->next->next=NULL;
- temp = temp->next;
- }
- }
- return pheadline;
- }
- /*****************************************************
- *功能描述:查詢航班功能
- *輸入?yún)?shù):select,1,2
- *輸出參數(shù):航班號(hào),起飛地,抵達(dá)地,起飛時(shí)間,降落時(shí)間,座位數(shù),剩余座數(shù)
- *返回值:temp-成功,NULL-失敗
- ******************************************************/
- airline* query(airlinehead *phead )//查詢航班情況
- {
- airline *find=NULL;
- airline *temp;
- printf("(#^.^#)(#^.^#)(#^.^#)(#^.^#)(#^.^#)(#^.^#)(#^.^#)(#^.^#)(#^.^#)"); printf("\n") ;
- printf("1,航線查詢航班。 "); printf("\n") ;
- printf("2,起飛城市查詢航班。"); printf("\n") ;
- printf("(#^.^#)(#^.^#)(#^.^#)(#^.^#)(#^.^#)(#^.^#)(#^.^#)(#^.^#)(#^.^#)");
- printf("\n") ;
- printf("請(qǐng)選擇:");
- int A;
- scanf("%d",&A) ;
- printf("\n") ;
- if(A==1)
- {
- printf("請(qǐng)輸入航班號(hào):");
- char line_num[10];
- scanf("%s",line_num);
- temp = phead->next;
- while(temp )
- {
- if(strcmp(temp->line_num,line_num) == 0)
- {
- find= temp;
- //display_line(find);
- return temp;
- break;
- }
- else
- {
- temp = temp->next;
- }
- }
- if(!temp)
- {
- printf("沒(méi)有找到該航班的信息。") ;
- printf("\n") ;
- return NULL;
- }
-
- }
- if(A==2)
- {
- char start_place[20];//起飛地
- char end_place[20];//目的地
- printf("請(qǐng)輸入起始地:") ;
- scanf("%s",start_place);
-
- printf("\n") ;
- printf("請(qǐng)輸入目的地:") ;
- scanf("%s",end_place);
- printf("\n") ;
- //airline *temp;
- temp=phead->next;
- while(temp)
- {
- if(strcmp(temp->start_place,start_place)==0 &&
- strcmp(temp->end_place,end_place)==0)
- {
- find=temp;
- //return temp;
- break;
- }
- temp = temp->next;
- }
- if(!temp)
- { printf("沒(méi)有找到該航班的信息。") ;
- printf("\n") ;
- return NULL;
- }
- }
- else{
- printf("輸入錯(cuò)誤。") ;
- printf("\n") ;
- }
- return find;
- }
- /*****************************************************
- *功能描述:查詢航班功能
- *輸入?yún)?shù):select,1,2
- *輸出參數(shù):航班號(hào),起飛地,抵達(dá)地,起飛時(shí)間,降落時(shí)間,座位數(shù),剩余座數(shù)
- ******************************************************/
- void display_line(airline *node)//輸出一個(gè)航班結(jié)點(diǎn)的所有信息到屏幕
- {
- if(node==NULL)
- {
- printf("參數(shù)為空!輸出失敗.\n");
- return;
- }
- printf("\n");
- printf("航班號(hào)\t\t 起飛地\t\t 目的地\t\t 起飛時(shí)間\t\t 降落時(shí)間\t\t 一等艙座位數(shù)\t\n ");
- printf("%s\t\t",node->line_num);
- printf(" %s\t\t",node->start_place);
- printf(" %s\t\t",node->end_place);
- printf(" %s\t\t",node->time1);
- printf(" %s\t\t",node->time2);
- printf(" %d\t\t\n",node->class1);
- printf("二等艙座位數(shù)\t\t 三等艙座位數(shù)\t\t 座位總數(shù)\t\t 剩余座位\t\n ");
- printf("%d\t\t",node->class2);
- printf(" %d\t\t",node->class3);
- printf(" %d\t\t",node->total);
- printf(" %d\t\t\n",node->left);
- printf("原票價(jià)\t\t 折扣\t\t 現(xiàn)票價(jià)\t\t 余票量\t\n");
- printf("%.2f\t\t",node->price0);
- printf("%.2f\t\t",node->discount);
- printf("%.2f\t\t",node->price);
- if(node->left<0){
- printf("無(wú)余票,所需票量%d",(0-node->left));
- }
- else printf("%d\t\n",node->left);
- printf("\n");
- }
- /******************************************************
- *功能描述:輸出所有的航班信息到屏幕
- *輸入?yún)?shù):無(wú)
- *輸出參數(shù):headline
- *******************************************************/
- void display_all_line(airlinehead *headline)
- {
- printf("\n");
- airline *node;
- node = headline->next;
- if(!node)
- {
- printf("當(dāng)前沒(méi)有航班信息\n");
- return ;
- }
- printf("航班數(shù)目: \n",headline->count);
- while(node)
- {
- display_line(node);
- node=node->next;
- }
- }
- /******************************************************
- *功能描述:修改航班信息
- *輸入?yún)?shù):select
- *輸出參數(shù):無(wú)
- *返回值:0-正確,1-錯(cuò)誤
- *******************************************************/
- int change_line(airlinehead *headline)//修改航班信息。
- {
- printf("當(dāng)前所有航班的信息為:\n");
- airline *temp,*t;
- int i;
- temp = headline->next;
- while(temp)
- {
- display_line(temp);
- t=temp;
- temp=temp->next;
- }
- printf("\n");
- printf("請(qǐng)選擇你要進(jìn)行的操作:\n");
- printf("1,增加航班。\n");
- printf("2,刪除航班。\n");
- printf("3,修改部分信息。\n");
- int select;
- scanf("%d",&select);
- printf("\n");
- if(select>3 || select<1)
- {
- printf("輸入錯(cuò)誤。\n");
- return 0;
- }
- switch(select)
- {
- case 1:
- {
- //temp->next = (airline*)malloc(sizeof(airline));
- temp=new airline;
- int flag;
- // temp=temp->next;
-
- printf("請(qǐng)輸入要增加的航班號(hào): ");
- scanf("%s",temp->line_num);
- printf("請(qǐng)輸入航班的起飛地: ");
- scanf("%s",temp->start_place);
- printf("請(qǐng)輸入航班的目的地: ");
- scanf("%s",temp->end_place);
- printf("請(qǐng)輸入航班的起飛時(shí)間: ");
- scanf("%s",temp->time1);
- printf("請(qǐng)輸入航班的降落時(shí)間: ");
- scanf("%s",temp->time2);
- printf("請(qǐng)輸入一等艙座位數(shù):");
- scanf("%d",&temp->class1);
- printf("請(qǐng)輸入二等艙座位數(shù):");
- scanf("%d",&temp->class2);
- printf("請(qǐng)輸入三等艙座位數(shù):");
- scanf("%d",&temp->class3);
- printf("請(qǐng)輸入航班的座位總數(shù): ");
- scanf("%d",&temp->total);
- t->next=temp;
- temp->left=temp->total;
- printf("請(qǐng)輸入原票價(jià):");
- scanf("%lf",&temp->price0);
- printf("是否有折扣:(1:是 0:否)");
- scanf("%d",&flag);
- if(flag){
- printf("請(qǐng)輸入折扣:");
- scanf("%lf",&temp->discount);
- temp->price=(temp->price0)*(temp->discount);
- }
- temp->next=NULL;
- headline->count++;
- printf("增加成功。\n");
- break;
- }
- case 2:
- {
- printf("請(qǐng)輸入您要?jiǎng)h除的航班的航班號(hào): ");
- char line_num[10];
- scanf("%s",line_num);
- airline * delline;
- delline = headline->next;
- while(delline)
- {
- if(strcmp(delline->next->line_num, line_num)==0)
- {
- i=1;
- airline *plink;
- plink = delline->next->next;
- //free(delline->next);
- delete delline->next;
- delline->next=plink;
- headline->count--;
- }
- delline=delline->next;
- }
- if(delline == 0&&i!=1)
- {
- printf("沒(méi)有找到輸入的航班號(hào)。\n");
- return 0;
- }
- i=0;
- break;
- }
- case 3:
- {
- printf("請(qǐng)輸入您要修改的航班的航班號(hào):");
- char line_num3[10];
- scanf("%s",line_num3);
- temp = headline->next;
- while(temp)
- {
- if(strcmp(temp->line_num, line_num3)==0)
- {
- int B;
- i=1;
- printf("請(qǐng)選擇要修改的內(nèi)容??\n");
- printf("--1,座位總數(shù)。--\n");
- printf("--2,起始地址。--\n");
- printf("--3,目的地址。--\n");
- printf("--4,起飛時(shí)間。--\n");
- printf("--5,降落時(shí)間。--\n");
- printf("--6,原票價(jià)。--\n");
- printf("--7,折扣。--\n");
- printf("--0,無(wú)修改內(nèi)容。--\n");
- scanf("%d",&B);
- while(B){
- switch(B){
- case 1: {
- int c;
- int y=1;
- while(y){
- printf("請(qǐng)輸入需修改的艙位等級(jí):(1:一等座 2:二等座 3:三等座 )");
- scanf("%d",&c);
- printf("請(qǐng)輸入修改后的座位數(shù):");
- switch(c){
- case1: temp->left=(temp->total)-(temp->left);
- scanf("%d",&temp->class1);
- temp->left=(temp->left)+(temp->class1);
- break;
- case2: temp->left=(temp->left)-(temp->class2);
- scanf("%d",&temp->class2);
- temp->left=(temp->left)+(temp->class2);
- break;
- case3: temp->left=(temp->left)-(temp->c lass3);
- scanf("%d",&temp->class3);
- temp->left=(temp->left)+(temp->class3);
- break;
- }
- printf("是否繼續(xù)修改座位數(shù):(1:是 0:否)");
- scanf("%d",&y);
- }
- temp->total=(temp->class1)+(temp->class2)+(temp->class3);
- break;}
- case 2: printf("請(qǐng)輸入修改后的起始地址:");
- scanf("%s",temp->start_place);
- break;
- case 3: printf("請(qǐng)輸入修改后的目的地址:");
- scanf("%s",temp->end_place);
- break;
- case 4: printf("請(qǐng)輸入修改后的起飛時(shí)間:");
- scanf("%s",temp->time1);
- break;
- case 5: printf("請(qǐng)輸入修改后的降落時(shí)間:");
- scanf("%s",temp->time2);
- break;
- case 6: printf("請(qǐng)輸入修改后的原票價(jià):");
- scanf("%lf",&temp->price0);
- if(temp->discount) temp->price=(temp->price0)*(temp->discount);
- else temp->price=temp->price0;
- break;
- case 7: printf("請(qǐng)輸入修改后的折扣:");
- scanf("%lf",&temp->discount);
- if(temp->discount) temp->price=(temp->price0)*(temp->discount);
- else temp->price=temp->price0;
- break; }
- display_line(temp);
- printf("請(qǐng)選擇要修改的內(nèi)容??\n");
- printf("--1,座位總數(shù)。--\n");
- printf("--2,起始地址。--\n");
- printf("--3,目的地址。--\n");
- printf("--4,起飛時(shí)間。--\n");
- printf("--5,降落時(shí)間。--\n");
- printf("--6,原票價(jià)。--\n");
- printf("--7,折扣。--\n");
- printf("--0,無(wú)修改內(nèi)容。--\n");
- scanf("%d",&B); } }
- temp=temp->next; }
- if(temp==0&&i!=1)
- {
- printf("沒(méi)有找到輸入的航班號(hào)。\n");
- return 0; }
- break; } }
- return 1;}
- /*****************************************************
- *功能描述:輸出一個(gè)客戶信息到屏幕
- *輸入?yún)?shù):無(wú)
- *輸出參數(shù):姓名,證件號(hào)碼,座號(hào),航班號(hào),起飛時(shí)間,降落時(shí)間,
- ******************************************************/
- void display_client(client *node=NULL)//輸出一個(gè)客戶節(jié)點(diǎn)的信息到屏幕。
- {
- if(node==NULL)
- { printf("參數(shù)為空!輸出失敗.\n");
- return; }
- printf("\n");
- printf("訂單編號(hào)\t\t 姓名\t\t 證件號(hào)碼\t 艙位等級(jí)\t 座號(hào)\t\n");
- printf("%s\t\t",node->file);
- printf(" %s\t\t",node->name);
- printf(" %s\t\t",node->id);
- printf(" %d\t\t",node->class0);
- printf(" %d\t\n",node->seat_num);
- printf("起飛時(shí)間\t 降落時(shí)間\t 航班\t\t\n");
- printf("%s\t\t",node->time1);
- printf("%s\t\t",node->time2);
- printf("%s\t\t",node->line_num);
- printf("\n");}
- void display_client1(client *node=NULL)//輸出一個(gè)客戶節(jié)點(diǎn)的信息到屏幕。
- { if(node==NULL)
- { printf("參數(shù)為空!輸出失敗.\n");
- return; }
- printf("\n");
- printf("姓名\t\t 證件號(hào)碼\t 座號(hào)\t 起飛時(shí)間\t 降落時(shí)間\t 航班\t\t\n");
- printf("%s\t\t",node->name);
- printf("%s\t\t",node->id);
- printf("無(wú)座位,等待中");
- printf("%s\t\t",node->time1);
- printf("%s\t\t",node->time2);
- printf("%s\t\t",node->line_num);
- printf("\n");}
-
- /*****************************************************
- *功能描述:輸出未售完票航班信息
- *輸入?yún)?shù):無(wú)
- *輸出參數(shù):headline
- ******************************************************/
- void display_left_airline(airlinehead *headline)//輸出未售完票的航班的信息。
- { airline *node = headline->next;
- if(!node)
- {
- printf("當(dāng)前沒(méi)有航班。。"); }
- for(; node->left!=node->total; node = node->next)
- {
- display_line(node); } }
- /*****************************************************
- *功能描述:訂票
- *輸入?yún)?shù):line_num,id
- *輸出參數(shù):
- *返回值:1-正確,0-錯(cuò)誤
- ******************************************************/
- int bookticket(airlinehead * headline,clienthead *headclient)//訂票
- {
- //headclient->count=0;
- printf("請(qǐng)輸入航班號(hào): ");
- char line_num[10] ;
- scanf("%s",line_num);
- airline *temp;
- temp=headline->next;
- while(temp)
- { if(strcmp(temp->line_num,line_num)==0)
- { break; }
- temp=temp->next; }
- if(!temp)
- { printf("未找到該航班\n");
- return 0; }
- if(temp->left==0)
- { int x;
- printf("對(duì)不起,您所定航班已無(wú)余座\n請(qǐng)進(jìn)行選擇:1 退出\n 2 排隊(duì)\n");
- scanf("%d",&x);
- switch(x) { case 1:
- printf("請(qǐng)選擇其他合適的航班.\n");
- printf("全部");
- display_all_line(headline);
- printf("\n");
- return 0;
- case 2:int z;
- printf("替補(bǔ)人員信息補(bǔ)錄\n");
- client *custom1=new client;
- printf("請(qǐng)輸入你的證件號(hào)碼: ");
- scanf("%s",custom1->id);
- printf("\n");
- printf("請(qǐng)輸入你的姓名:");
- scanf("%s",custom1->name);
- printf("\n");
- printf("請(qǐng)輸入訂票量:");
- scanf("%d",&z);
- custom1->next=NULL;
- strcpy(custom1->line_num,line_num);
- strcpy(custom1->time1,temp->time1);
- strcpy(custom1->time2,temp->time2);
- headclient->count++;
- custom1->next = headclient->next;
- headclient->next = custom1;
- printf("\n替補(bǔ)信息加入完成!\n");
- display_client1(custom1); printf(" 需要座位\n ");printf(" %d\n",z);
- printf("替補(bǔ)輸入完成\n");
- return 1; } }
- client *custom=new client;
- printf("請(qǐng)輸入你的證件號(hào)碼: ");
- scanf("%s",custom->id);
- printf("\n");
- printf("請(qǐng)輸入你的姓名:");
- scanf("%s",custom->name);
- printf("一等艙座位數(shù)\t\t 二等艙座位數(shù)\t\t 三等艙座位數(shù)\t\n");
- printf("%d\t\t",temp->class1);
- printf(" %d\t\t",temp->class2);
- printf(" %d\t\t",temp->class3);
- printf("\n");
- printf("請(qǐng)輸入理想艙位等級(jí):(1:一等艙 2:二等艙 3:三等艙)");
- scanf("%d",&custom->class0);
- custom->seat_num=temp->total-temp->left+1;
- custom->next=NULL;
- strcpy(custom->line_num,line_num);
- strcpy(custom->time1,temp->time1);
- strcpy(custom->time2,temp->time2);
- temp->left--;
- switch(custom->class0){
- case 1: temp->class1--;
- break;
- case 2: temp->class2--;
- break;
- case 3: temp->class3--;
- break; }
- headclient->count++;
- custom->next = headclient->next;
- headclient->next = custom;
- strcat(custom->file,custom->id);
- printf("訂票成功!祝您旅途愉快~~");
- display_client(custom);
- return 1; }
- /*****************************************************
- *功能描述:退票
- *輸入?yún)?shù):id
- *輸出參數(shù):
- *返回值:1-正確,0-錯(cuò)誤
- ******************************************************/
- int returnticket(airlinehead * headline,clienthead *headclient)//退票。
- {
- printf("請(qǐng)輸入顧客的證件號(hào)碼:id: ");
- char id[20];
- scanf("%s",id);
- airline *airlinetemp= headline->next;
- client *clienttemp= headclient->next;
- if(NULL==airlinetemp)
- { printf("當(dāng)前沒(méi)有航班信息。\n");
- return 0; }
- char line_num[10]; int rclass;
- client *delnext ;
- if(strcmp(clienttemp->id,id)==0)//要?jiǎng)h除的節(jié)點(diǎn)為第一個(gè)時(shí)。。。
- {
- strcpy(line_num,clienttemp->line_num);
- rclass=clienttemp->class0;
- headclient->next=clienttemp->next;
- delete clienttemp;
- while(airlinetemp)//修改對(duì)票客戶所對(duì)應(yīng)的航班的售票信息。
- {
- if(strcmp(line_num,airlinetemp->line_num)== 0 )
- {
- airlinetemp->left++;
- switch(rclass){
- case 1: airlinetemp->class1++;
- break;
- case 2: airlinetemp->class2++;
- break;
- case 3: airlinetemp->class3++;
- break; }
- break; }
- airlinetemp = airlinetemp->next; }
- printf("退票成功!希望有機(jī)會(huì)與您繼續(xù)合作。");
- return 1; }
- while(clienttemp->next)//要?jiǎng)h除 的節(jié)點(diǎn)不是第一個(gè)時(shí)。。。
- {
- if(strcmp(clienttemp->next->id,id)==0)
- { strcpy(line_num,clienttemp->next->line_num);
- delnext = clienttemp->next->next;
- delete clienttemp->next;
- clienttemp->next=delnext;
- while(airlinetemp)//修改對(duì)票客戶所對(duì)應(yīng)的航班的售票信息。
- {
- if(strcpy(line_num,airlinetemp->line_num)== 0 )
- {
- airlinetemp->left++;
- switch(rclass){
- case 1: airlinetemp->class1++;
- break;
- case 2: airlinetemp->class2++;
- break;
- case 3: airlinetemp->class3++;
- break; }
- break; }
- airlinetemp = airlinetemp->next; }
- printf("退票成功!有機(jī)會(huì)繼續(xù)合作。\n\n");
- return 1; break; }
- clienttemp = clienttemp->next; }
- printf("未找到該客戶的信息。\n");
- return 0; }
- /*****************************************************
- *功能描述:退票
- *輸入?yún)?shù):id
- *輸出參數(shù):
- *返回值:1-正確,0-錯(cuò)誤
- ******************************************************/
-
-
- void main_menu()
- {
- printf("********<( ̄︶ ̄)/ 歡迎使用飛機(jī)售票系統(tǒng) \( ̄︶ ̄)>******** \n\n");
- printf("*** 1---- 錄入航班信息。*** \n\n");
- printf("*** 2---- 查詢航線信息。*** \n\n");
- printf("*** 3---- 客戶訂票。***\n\n");
- printf("*** 4---- 客戶退票。*** \n\n");
- printf("*** 5---- 輸出所有航班信息。*** \n\n");
- printf("*** 6---- 修改航班信息。*** \n\n");
- printf("*** 0---- 退出系統(tǒng) 。*** \n\n");
- printf("**************************************************************** \n\n");}
- int main(void)
- { airlinehead *headline=new airlinehead;
- headline->count=0;
- headline->next=NULL;
- clienthead *headclient=new clienthead;
- headclient->count=0;
- headclient->next=NULL;
- while(1)
- { main_menu();
- int x;
- printf("請(qǐng)選擇您要進(jìn)行的操作: ");
- scanf("%d",&x);
- printf("\n");
- switch(x)
- { case 1:
- int num;
- printf("請(qǐng)選擇您要錄入的航班的數(shù)目: ");
- scanf("%d",&num);
- printf("\n");
- import(num,headline);
- printf("\n");
- //display_all_line(headline);
- printf("航班信息成功錄入。。 ");
- printf("\n\n");
- break;
-
- case 2:
- airline *find;
- find=query(headline);
- if(find)
- {
- display_line(find); }
- break;
- case 3:
- *****限于篇幅余下內(nèi)容下載附件******
復(fù)制代碼
完整的Word格式文檔51黑下載地址:
程序報(bào)告-改二.doc
(498.27 KB, 下載次數(shù): 41)
2019-6-13 09:49 上傳
點(diǎn)擊文件名下載附件
航空售票系統(tǒng)
|