C语言航空订票系统课程设计
?
目錄
1.設(shè)計(jì)目的:
2總體設(shè)計(jì)和功能:
3.菜單設(shè)計(jì)
4.各功能代碼詳解(閑話少扯):
4.1.C語(yǔ)言文件的操作:
4.2.讀取航班信息:
C語(yǔ)言知識(shí)回顧?
4.3.打印航班信息
5.根據(jù)要求查找航班(航班號(hào)、起點(diǎn)站、終點(diǎn)站)
6.訂票功能(鏈表操作)
前言:最經(jīng)做了一個(gè)課程設(shè)計(jì),設(shè)計(jì)的內(nèi)容就是航空訂票系統(tǒng),又認(rèn)真復(fù)習(xí)了一遍c語(yǔ)言的知識(shí),感覺(jué)這個(gè)設(shè)計(jì)對(duì)于初學(xué)者來(lái)說(shuō),C的能力和邏輯能力會(huì)有一個(gè)提升,為了更好的總結(jié)自己學(xué)習(xí)的成果,故寫(xiě)下此篇博客記錄一下該課程設(shè)計(jì)的重點(diǎn)知識(shí),以便以后回顧。
1.設(shè)計(jì)目的:
1. ?數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)是綜合運(yùn)用數(shù)據(jù)結(jié)構(gòu)課程中學(xué)到的幾種典型數(shù)據(jù)結(jié)構(gòu),以及程序設(shè)計(jì)語(yǔ)言(C語(yǔ)言),自行實(shí)現(xiàn)一個(gè)較為完整的應(yīng)用系統(tǒng)的設(shè)計(jì)與開(kāi)發(fā)
2. ?通過(guò)課程設(shè)計(jì),自己通過(guò)系統(tǒng)分析、系統(tǒng)設(shè)計(jì)、編程調(diào)試,寫(xiě)實(shí)驗(yàn)報(bào)告等環(huán)節(jié),進(jìn)一步掌握應(yīng)用系統(tǒng)設(shè)計(jì)的方法和步驟,靈活運(yùn)用并深刻理解典型數(shù)據(jù)結(jié)構(gòu)在軟件開(kāi)發(fā)中的應(yīng)用 。
3. ?學(xué)會(huì)將知識(shí)應(yīng)用于實(shí)際的方法,提高分析和解決問(wèn)題的能力,增加綜合能力。
??航空訂票系統(tǒng):
(1)熟練掌握鏈表存儲(chǔ)結(jié)構(gòu)及其建立過(guò)程和常用操作;
(2)熟練掌握隊(duì)列的建立過(guò)程和常用操作;
(3)學(xué)會(huì)自己調(diào)試程序的方法并掌握一定的技巧。
2總體設(shè)計(jì)和功能:
通過(guò)此系統(tǒng)可以實(shí)現(xiàn)如下功能:
?
3.菜單設(shè)計(jì)
3.1主菜單代碼如下:
int main() {int sel;readinfo(&L);readinfo_book(&B);InitOrder();while (1){printf("\n\n\n\n");printf("\t歡迎進(jìn)入航班訂票系統(tǒng)\n");printf("*****************************\n");printf("* 航空訂票客運(yùn)系統(tǒng) *\n");printf("* 1.顯示各航線信息 *\n");printf("* 2.查詢(xún)各航線信息 *\n");printf("* 3.訂 票 *\n");printf("* 4.退 票 *\n");printf("* 0.退 出 系 統(tǒng) *\n");printf("*****************************\n");printf("請(qǐng) 選 擇(0-4):\n");scanf("%d", &sel);switch (sel){case 1:meau1(); break;//選擇菜單1case 2:meau2(); break;//選擇菜單2case 3:orderTicket(); break;//訂票case 4:refund_ticket(); break;//退票case 0:return;//退出程序default:printf("輸入錯(cuò)誤\n"); break;}}?界面如下:
主程序是整個(gè)系統(tǒng)的入口,首先初始化L和B的結(jié)構(gòu)體變量,打印提示信息,然后讓用戶(hù)輸入一個(gè)數(shù)值,從.0-4,輸入數(shù)值1進(jìn)入菜單1(meau1()):
meau1()程序如下:
void meau1(void) {int subsel;while (1){printf("============================\n");printf("= 顯示各航線信息的子菜單 =\n");printf("============================\n");printf("* 1.顯示所有航線 *\n");printf("* 2.顯示訂單客戶(hù) *\n");printf("* 3.返回主菜單 *\n");printf("============================\n");printf("請(qǐng) 選 擇(1-3):\n");scanf("%d", &subsel);switch (subsel){case 1:printAllofAirMsg(); break;case 2:printOrderCustomByAirNum1(); break;case 3:return;default:printf("輸入錯(cuò)誤\n"); break;}} }界面如下:
meau2()?程序如下:
void meau2(void) {int subsel;while (1){printf("============================\n");printf("= 航線信息查詢(xún)子菜單 =\n");printf("============================\n");printf("* 1.按航班號(hào)查詢(xún) *\n");printf("* 2.按起點(diǎn)站查詢(xún) *\n");printf("* 3.按終點(diǎn)站查詢(xún) *\n");printf("* 4.返回主菜單 *\n");printf("============================\n");printf("請(qǐng) 選 擇(1-4):\n");scanf("%d", &subsel);switch (subsel){case 1:searchbyAirno(); break;case 2:searchbystartPlace(); break;case 3:searchbyEndPlace(); break;case 4: return;default:printf("輸入錯(cuò)誤\n"); break;}} }界面如下:?
還有一些菜單都是都是比較簡(jiǎn)單的知識(shí),直接看源代碼即可。?
?
4.各功能代碼詳解(閑話少扯):
4.1.C語(yǔ)言文件的操作:
- 文件操作基礎(chǔ)知識(shí)解析:點(diǎn)我查看
在這個(gè)系統(tǒng)中,需要讀取兩個(gè)文件,一個(gè)是航班信息文件,一個(gè)是訂票客戶(hù)信息文件,后綴都是(.txt),內(nèi)容如下:
航班信息.txt
航班號(hào) 起點(diǎn) 終點(diǎn) 飛行日 起飛時(shí)間 到達(dá)時(shí)間 機(jī)型 價(jià)格 乘員定額 余票量 CA1544 合肥 北京 1.3.5 10:55 12:40 A733 960 100 90 MU5341 上海 廣州 每日 14:20 16:15 M90 1280 150 150 CZ3869 重慶 深圳 2.4.6 08:55 10:35 733 1010 100 100 MU3682 桂林 南京 2.3.4 20:50 22:15 M90 1380 150 120 HU1836 上海 北京 每日 09:40 11:20 738 1250 120 120 CZ3528 成都 廈門(mén) 1.3.5 15:10 16:50 CRJ 1060 130 130 MU4594 昆明 西安 2.4.6 10:15 11:40 328 1160 140 140 SC7425 青島 海口 1.3.6 19:20 21:20 DH4 1630 190 190 CA1234 洛陽(yáng) 上海 1.3.5 08:00 10:00 DH4 1050 300 300 CA4321 shai 洛陽(yáng) 2.4.6 16:00 18:00 DH4 1100 300 300訂票信息.txt
航班號(hào) 姓名 身份證 訂票數(shù)量 CA1544 丁方 410221 4 CA1544 邢風(fēng) 410222 4 CA1544 劉向 410223 2 MU5341 wan 415225 2 MU5341 嚴(yán)寒 412003 12 MU3682 吳偉 412009 2 MU3682 劉敏 400281 1在系統(tǒng)運(yùn)行時(shí),首先會(huì)從電腦本地磁盤(pán)讀取上面兩個(gè)文件的信息到兩個(gè)不同的結(jié)構(gòu)體里面,然后就可以通過(guò)讀取結(jié)構(gòu)體的內(nèi)容獲取到這個(gè)航班信息和訂票客戶(hù)的信息了(注意結(jié)構(gòu)體的成員變量應(yīng)該是和我們所需要讀取文件的內(nèi)容是一致的,就是說(shuō)要讀取多少的內(nèi)容,就需要為這個(gè)結(jié)構(gòu)體變量開(kāi)辟多少的靜態(tài)內(nèi)存):
航班信息結(jié)構(gòu)體如下:
//航班信息結(jié)構(gòu)體定義,每個(gè)航班號(hào)都會(huì)有不同的乘客名單,所以每個(gè)航班都應(yīng)該有一個(gè)鏈表 typedef struct airinfo {char Airno[8];//航班號(hào)char start[6];//出發(fā)地char end[6];//目的地char sche[6];//飛行日char time1[8];//出發(fā)時(shí)間char time2[8];//到達(dá)時(shí)間char mode[5];//機(jī)型int price;//票價(jià)int fixed;// 乘客定額int remained;//余票P(pán)BookList order;/*指向乘員名單鏈表的頭指針,通過(guò)這個(gè)指針就可以找到所有乘客的名單了*/ }AirInfo,*PAirInfo;客戶(hù)訂單結(jié)構(gòu)體:
//航訂票客戶(hù)列表體結(jié)構(gòu)體定義 typedef struct Book {char Airnum[8];//航班號(hào)char name[20];//客戶(hù)姓名 char didentify[6];//身份證號(hào) int order_amount;//訂票數(shù)量int grade;struct Book *Pnext;//指向下一個(gè)用戶(hù)的首地址 }*PBookList, BookList;接下來(lái)再定義兩個(gè)結(jié)構(gòu)體,去定義航班信息和客戶(hù)的總體信息,以及統(tǒng)計(jì)航班數(shù)和客戶(hù)訂單數(shù)量:
//航班信息總體結(jié)構(gòu)體定義 typedef struct {AirInfo s[MAX]; //航班信息數(shù)組int acount; //記錄當(dāng)前航班信息數(shù) }SSList; //訂單客戶(hù)總體信息 typedef struct {BookList book[BOOKMAX];int book_acount; }SbookList;#define MAX 20 #define BOOKMAX 1004.2.讀取航班信息:
下貼上程序,然后再進(jìn)行分析:
//讀取文本信息,并賦值給結(jié)構(gòu)體變量,傳入的參數(shù)是SSList結(jié)構(gòu)體變量的指針 void readinfo(SSList *L) {FILE *fp;//定義文件指針if ((fp = fopen("航班信息.txt", "r")) == NULL){printf("航班文件不存在 \n");exit(1);}else{int i = 0; char tep[500];L->acount = 0; //航班次數(shù)初始化while (!feof(fp)){fgets(tep, 500, fp);//讀取第一行說(shuō)明:航班號(hào) 起點(diǎn) 終點(diǎn) 略..;//讀取正確的信息;if (10 != fscanf(fp, "%s %s %s %s %s %s %s %d %d %d", L->s[i].Airno, L->s[i].start, L->s[i].end, L->s[i].sche, L->s[i].time1, L->s[i].time2,L->s[i].mode, &L->s[i].price, &L->s[i].fixed, &L->s[i].remained)){printf("讀取文件出錯(cuò)\n");//關(guān)閉文件流指針,退出;fclose(fp);exit(1);}i++;L->acount++;}}fclose(fp); }程序分析:
提示:文件讀取的詳細(xì)解釋:帶我查看
注意:這里打開(kāi)的文件使用的相對(duì)路徑。?
如果fopen返回了打開(kāi)文件的首地址,打開(kāi)成功,進(jìn)行航班信息的讀取工作。
-
fcanf函數(shù)的講解
格式化輸入函數(shù)fscanf
?調(diào)用:fscanf(fpt,格式控制,地址列表);
?功能:以ASCII碼值的方式從fpt關(guān)聯(lián)的文件中讀取數(shù)據(jù),按格式控制字符串中指定的數(shù)據(jù)格式轉(zhuǎn)換后送到由輸入地址列表中相應(yīng)項(xiàng)指定的內(nèi)存單元。函數(shù)返回值為正確處理的數(shù)據(jù)項(xiàng)個(gè)數(shù)。
例子:
如果文件的內(nèi)容為 ”6,6.6“,則可以使用如下語(yǔ)句讀取:
//m和a是已經(jīng)定義的int類(lèi)型和double類(lèi)型的變量
fcanf(fp,"%d,%lf",&m,&a);???//注意此處是地址列表
?
fscanf(fp, "%s %s %s %s %s %s %s %d %d %d",
?? ??? ??? ??? ?L->s[i].Airno, L->s[i].start, L->s[i].end, L->s[i].sche,
?? ??? ??? ??? ?L->s[i].time1,L->s[i].time2,L->s[i].mode, &L->s[i].price,?
?? ??? ??? ??? ?&L->s[i].fixed, &L->s[i].remained))
解釋:fscanf函數(shù)的第一個(gè)參數(shù)是打開(kāi)文件的指針變量,第二個(gè)參數(shù)格式控制,第三個(gè)參數(shù)就是讀取的地址列表。
我們需要讀入的數(shù)據(jù)以空格隔開(kāi),共有十個(gè)數(shù)據(jù),所以上面橙色字體的格式控制有10個(gè),我們需要讀入的是結(jié)構(gòu)體里面,定義了一個(gè)結(jié)構(gòu)體變量L來(lái)存放它。
為什么是這種形式賦值:L->s[i].Airno?
回憶一下:我們傳入這個(gè)函數(shù)的形參是SSList *類(lèi)型的
這里為了去統(tǒng)計(jì)航班信息數(shù),使用了一個(gè)結(jié)構(gòu)體的嵌套:如下:
如果在函數(shù)void readinfo(SSList *L),中需要去改變第i個(gè)航班的Airno的成員變量的值,如何做?
C語(yǔ)言知識(shí)回顧?
此處就涉及到了C語(yǔ)言指針一些語(yǔ)法的問(wèn)題了,先復(fù)習(xí)一下指針的知識(shí)吧,例如我定義了一下的兩個(gè)變量
int a=5; //定義了一個(gè)整形變量a int * b; //定義了一個(gè)變量b,這個(gè)變量是整形的指針變量,用于存放整形數(shù)據(jù)的地址 b = &a; //把a(bǔ)的地址 賦予給b這個(gè)指針變量上面的語(yǔ)句相當(dāng)于做了什么事呢?用一個(gè)簡(jiǎn)圖表示如下:
那么在C語(yǔ)言中有規(guī)定,此時(shí):*b? 和? a?的值是相等的。
注意:*b的含義是:以b內(nèi)容(1000h)為地址的變量的值(那就是變量a的值咯)。
繼續(xù)深入,結(jié)合結(jié)構(gòu)體:
現(xiàn)在定義一個(gè)如下的結(jié)構(gòu)體:
typedef struct student {int age; //結(jié)構(gòu)體成員變量int num; }stu;stu stu1; //定義了一個(gè)結(jié)構(gòu)體變量stu1,此時(shí)已經(jīng)在內(nèi)存開(kāi)辟了一塊靜態(tài)空間給結(jié)構(gòu)體變量stu1,因?yàn)闆](méi)有//進(jìn)行賦值,所以里面的是垃圾值如果此時(shí)我們想在主函數(shù)調(diào)用一個(gè)函數(shù)去改變這個(gè)stu1結(jié)構(gòu)體變量的信息,如何做?
提示:如果我們想通過(guò)函數(shù)調(diào)用的方法去改變一個(gè)函數(shù)的值,那必須傳遞指針才能做到,因?yàn)楫?dāng)你在主函數(shù)中調(diào)用一個(gè)函數(shù),那么此時(shí)就會(huì)分一塊新的空間給這個(gè)函數(shù),即使我們改變了調(diào)用函數(shù)的值,但是函數(shù)執(zhí)行結(jié)束,就會(huì)自動(dòng)釋放內(nèi)存,也無(wú)法把我們想要的結(jié)果傳遞回來(lái)。所以在主函數(shù)通過(guò)調(diào)用函數(shù)的方式改變一個(gè)變量或者結(jié)構(gòu)體變量,必須傳遞指針(當(dāng)然還有返回值,但是返回值只能返回一個(gè)數(shù)據(jù))。
因此定義一個(gè)函數(shù)為:void change_stu_msg(stu * student)
那么在這個(gè)函數(shù)中應(yīng)該怎樣寫(xiě),可以考慮一下,這個(gè)函數(shù)的形參是stu *?類(lèi)型的,表示的是接受stu結(jié)構(gòu)體變量的地址,那么想要改變stu1這個(gè)結(jié)構(gòu)體變量的內(nèi)容,傳遞進(jìn)來(lái)的應(yīng)該是 :?stu1的地址(&stu1)。
通過(guò)上面知道,此時(shí)?student = &stu1,也就是student這個(gè)結(jié)構(gòu)體指針變量存放了stu1的地址。
那么,*student?就等價(jià)于 stu1 ,此時(shí)想要改變stu1結(jié)構(gòu)體變量的值,函數(shù)就可以如下這樣寫(xiě):
void change_stu_msg(stu * student) {(*student).age=10;(*student).num=20;}那么當(dāng)我們?cè)趍ain主函數(shù)中調(diào)用這個(gè)函數(shù):change_stu_msg(&stu1);
執(zhí)行結(jié)果:這個(gè)結(jié)構(gòu)體變量的成員,age=10,num=20;不再是一個(gè)垃圾值了。
那么箭頭? ->?和這個(gè)有什么關(guān)系??這點(diǎn)其實(shí)就是語(yǔ)法的規(guī)定而已
在C語(yǔ)言中規(guī)定:
還是拿上面的函數(shù)舉例,為了方便書(shū)寫(xiě),可以把 :(*student).? ? 等價(jià)成為? ? ->? ??
那么?void change_stu_msg(stu * student)?也可以這樣子寫(xiě):
void change_stu_msg(stu * student) {student->age=10;student->num=20;}這下應(yīng)該對(duì)上面的賦值語(yǔ)句有所了解了吧。
復(fù)習(xí)完C語(yǔ)言的知識(shí),回到剛剛那么問(wèn)題:
如果在函數(shù)void readinfo(SSList *L),中需要去改變第i個(gè)航班的Airno的成員變量的值,如何做?
這個(gè)函數(shù)的形參不就是接受一個(gè)?SSList?結(jié)構(gòu)體變量的指針嘛,那先定義一個(gè)結(jié)構(gòu)體變量咯:SSList L;
提示:其實(shí)這個(gè)L變量就是用來(lái)存放我們的數(shù)據(jù)的,只是現(xiàn)在是一些垃圾值,void readinfo(SSList *L)?這個(gè)函數(shù)就是對(duì)這個(gè)變量?L?進(jìn)行初始化滴。
那在主函數(shù)中調(diào)用的話,必須把L的指針傳遞進(jìn)去,即為:readinfo(&L);
此時(shí)就會(huì)有這樣的一個(gè)關(guān)系:?L = &L;? ? ?//注意此時(shí)這兩個(gè)L不是一樣的,一個(gè)是實(shí)參,一個(gè)是形參。形參的L可以隨便改
這樣看起來(lái)怪怪的,把形參的L修改成?List?把,這樣容易看一點(diǎn) ,即為:void readinfo(SSList *List)?
此時(shí)有這樣一個(gè)關(guān)系:?List = &L;? ??那么 *List = L?。
而L結(jié)構(gòu)體有兩個(gè)成員變量,如下:
改變第一個(gè)成員變量的值使用:(*List).s[MAX]?
可以看到s[MAX]?是一個(gè)數(shù)組,他是一個(gè)怎樣的數(shù)組呢?AirInfo類(lèi)型的數(shù)組,而Airinfo是一個(gè)結(jié)構(gòu)體,那s[MAX]?就是一個(gè)結(jié)構(gòu)體數(shù)組(定義MAX為20),AirInfo結(jié)構(gòu)體有什么內(nèi)容?
從內(nèi)存角度來(lái)說(shuō)其實(shí)就是開(kāi)辟了類(lèi)似如下的一大塊靜態(tài)內(nèi)存:
那么想改變第2個(gè)航班的信息,就必須定位到 s[1]這個(gè)結(jié)構(gòu)體咯,即為:(*List).s[1]
想改變這個(gè)結(jié)構(gòu)體變量? s[1]的成員變量? Airno[8],如何做?? 即為:(*List).s[1].Airno ="Hello"??
在C語(yǔ)言復(fù)習(xí)那部分,知道??(*List).? 可以等價(jià)于? List->
這樣子就可以回答上面提出的問(wèn)題了:
如果在函數(shù)void readinfo(SSList *List),中需要去改變第i個(gè)航班的Airno的成員變量的值,如何做?
在函數(shù)中可以這樣寫(xiě):List->s[ i ].Airno ="Hello";
?
從本地磁盤(pán)讀取用戶(hù)信息,因?yàn)槠溥壿嫼妥x取航班信息是一樣的,只貼出程序:
//讀取訂單客戶(hù)的文件,傳入的參數(shù)是BookList結(jié)構(gòu)體變量的指針。 //讀取到訂單客戶(hù)的信息應(yīng)給是存儲(chǔ)在一個(gè)數(shù)組里面。例如:book[BOOKMAX]; void readinfo_book(SbookList * book) {FILE *fp;//定義文件指針if ((fp = fopen("訂票信息.txt", "r")) == NULL) //以只讀的方式打開(kāi){printf("訂票信息.txt文件不存在 \n");exit(1);}else{int i = 0; char title[500]; //讀B.book_acount = 0;while (!feof(fp)) //C提供了一個(gè)測(cè)試文件狀態(tài)的函數(shù)feof(pf),當(dāng)文件未結(jié)束時(shí)feof函數(shù)的值為0,//否則為非0值。使用函數(shù)feof來(lái)判斷文件是否結(jié)束既可用于文本文件,還可用于二進(jìn)制文件{fgets(title, 500, fp);//讀取第一行說(shuō)明:航班號(hào) 起點(diǎn) 終點(diǎn) 略去;//讀取正確的信息,格式化讀取信息,把fp所指向的文件讀取到結(jié)構(gòu)體里面去if (4 != fscanf(fp, "%s %s %s %d", B.book[i].Airnum, B.book[i].name, B.book[i].didentify, &B.book[i].order_amount)){printf("讀取文件出錯(cuò)\n");//關(guān)閉文件流指針,退出;fclose(fp);exit(1);}i++;B.book_acount++;}}fclose(fp); }有了這兩個(gè)結(jié)構(gòu)體和結(jié)構(gòu)體成員變量,還有文件讀取函數(shù),就可以把這些航班信息和客戶(hù)信息讀取到我們所定義的結(jié)構(gòu)體里面,我們結(jié)構(gòu)體就是存儲(chǔ)。也就是存儲(chǔ)到如下的結(jié)構(gòu)體里面
4.3.打印航班信息
通過(guò)在主函數(shù)調(diào)用讀取航班信息和讀取訂票用戶(hù)信息,然后把文本數(shù)據(jù)讀取到L和B的結(jié)構(gòu)體變量:
通過(guò)上面的函數(shù)在結(jié)構(gòu)體變量已經(jīng)進(jìn)行了賦值,也就是說(shuō)我們的航班信息和客戶(hù)訂票信息已經(jīng)儲(chǔ)存于內(nèi)存了。
接下來(lái)就可以通過(guò)調(diào)用相應(yīng)的結(jié)構(gòu)體去讀取信息啦:
- 打印航班信息:
代碼如下,此處把結(jié)構(gòu)體成員變量L的內(nèi)容打印出來(lái):
void printAllofAirMsg(void) {int i = 0;for (i = 0; i < L.acount; i++) //L.account是統(tǒng)計(jì)航班個(gè)數(shù)的,打印所有航班{printf("航班號(hào) 起點(diǎn) 終點(diǎn) 飛行日 起飛時(shí)間 到達(dá)時(shí)間 機(jī)型 價(jià)格 乘員定額 余票量\n");printf("%s %s %s %s %s %s %s %d %d %d\r\n", L.s[i].Airno, L.s[i].start, L.s[i].end, L.s[i].sche, L.s[i].time1, L.s[i].time2, L.s[i].mode, L.s[i].price, L.s[i].fixed, L.s[i].remained);} }已上的程序完成了一些簡(jiǎn)單的文件操作,需要掌握的知識(shí)是:
1.文件的操作
2.結(jié)構(gòu)體的定義
3.結(jié)構(gòu)體變量的賦值
4.打印結(jié)構(gòu)體變量的內(nèi)容?
5.根據(jù)要求查找航班(航班號(hào)、起點(diǎn)站、終點(diǎn)站)
此處只講解一下按航班號(hào)查詢(xún)航班信息,其他兩個(gè)查詢(xún)方式幾乎和第一個(gè)一樣。
先貼出代碼如下:
/*根據(jù)客戶(hù)提出的航班號(hào)輸出航線信息*/ void searchbyAirno() {PAirInfo info, a;char Airnum01[10];int i = 0, sel;info = L.s;a = L.s;printf("===============================\n");printf("== 為您列出航班號(hào)供您選擇: =\n");for (int j = 0; j < L.acount; j++){printf("%d %s\n", j, a[j].Airno);}printf("===============================\n");printf("請(qǐng)輸入要選擇航班的序號(hào):");scanf("%d", &sel);//根據(jù)用戶(hù)的選擇,給Airnumber變量賦值不同的航班號(hào)if (sel >= L.acount) {printf("輸入錯(cuò)誤\n");return;}else //輸入的序列號(hào)有效{strcpy(Airnum01, info[sel].Airno);}while (i < MAXSIZE){if (!strcmp(Airnum01, a[i].Airno)) break;i++;}if (i >= MAXSIZE){printf("\n\n");printf("對(duì)不起,該航線未找到!\n");printf("\n\n");}else{printf("================================================================================\n");//printf("航班號(hào) 起點(diǎn) 終點(diǎn) 飛行日 起飛時(shí)間 到達(dá)時(shí)間 機(jī)型 價(jià)格 乘員定額 余票量\n");printOneofAirMsg(i);} }在界面上顯示效果如下:
接下來(lái)讀取航班序號(hào),來(lái)判斷你選擇的航班信息:
打印航班信息:
void printOneofAirMsg(int i) {printf("航班號(hào) 起點(diǎn) 終點(diǎn) 飛行日 起飛時(shí)間 到達(dá)時(shí)間 機(jī)型 價(jià)格 乘員定額 余票量\n");printf("%s %s %s %s %s %s %s %d %d %d\r\n", L.s[i].Airno, L.s[i].start, L.s[i].end, L.s[i].sche, L.s[i].time1, L.s[i].time2, L.s[i].mode, L.s[i].price, L.s[i].fixed, L.s[i].remained);}效果如下:
6.訂票功能(鏈表操作)
其實(shí)這一部分最終要的就是鏈表的操作,無(wú)非就是鏈表的創(chuàng)建,鏈表的增加,鏈表的刪除等問(wèn)題。
所以首先需要熟悉的是鏈表
?
最近比較忙,先貼上代碼吧。
代碼鏈接:https://download.csdn.net/download/qq_36243942/10785641
?
?
?
?
?
?
總結(jié)
以上是生活随笔為你收集整理的C语言航空订票系统课程设计的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: win32 段寄存器怎么寻址
- 下一篇: 一起学习R软件吧——R软件的使用