第一篇:數據結構課程設計 飛機訂票系統
飛機訂票系統
1.需求分析
描述要求編程解決的問題。以無歧義的陳述說明程序設計的任務,強調的是程序要做什么?明確規定:
(a)輸入的形式和輸入值的范圍;
(b)輸出的形式;
(c)程序所能達到的功能;
(d)測試數據:包括正確的輸入及其輸出結果和含有錯誤的輸入及其輸出結果。
2.概要設計
給出程序要達到的具體的要求。描述解決相應問題算法的設計思想。描述所設計程序的各個模塊(即函數)功能。說明本程序中用到的所有抽象數據類型的定義、主程序的流程以及各程序模塊之間的層次(調用)關系。
3.詳細設計
實現概要設計中定義的所有數據類型,對每個操作只需要寫出流程或偽碼算法;對主程序和其他模塊也都需要寫出流程或偽碼算法(偽碼算法達到的詳細程度建議為:按照偽碼算法可以在計算機鍵盤直接輸入高級程序設計語言程序);畫出函數的調用關系圖。給出所使用的基本抽象數據類型,所定義的具體問題的數據類型,以及新定義的抽象數據類型。設計出良好的輸入輸出界面(清晰易懂)。
4.調試分析 內容包括:
(a)調試過程中遇到的問題是如何解決的以及對設計與實現的回顧討論和分析;
(b)算法的時空分析(包括基本操作和其他算法的時間復雜度和空間復雜度的分析)和改進設想;
(c)經驗和體會等。
5.用戶使用說明
說明如何使用你編寫的程序,詳細列出每一步的操作步驟。
6.測試結果
設計測試數據,或具體給出測試數據。要求測試數據能全面地測試所設計程序的功能。列出你的測試結果,包括輸入和輸出。這里的測試數據應該完整和嚴格,最好多于需求分析中所列。
7.測試情況:給出程序的測試情況,并分析運行結果
附錄(非必須,按照需要添加)
帶注釋的源程序。可以只列出程序文件名的清單。
需求分析
任務:通過此系統可以實現如下功能: 錄入:
可以錄入航班情況(數據可以存儲在一個數據文件中,數據結構、具體數據自定)
查詢:
可以查詢某個航線的情況(如,輸入航班號,查詢起降時間,起飛抵達城市,航班票價,票價折扣,確定航班是否滿倉); 可以輸入起飛抵達城市,查詢飛機航班情況;
訂票:(訂票情況可以存在一個數據文件中,結構自己設定)可以訂票,如果該航班已經無票,可以提供相關可選擇航班;
退票: 可退票,退票后修改相關數據文件;
客戶資料有姓名,證件號,訂票數量及航班情況,訂單要有編號。
概要設計
詳細設計
詳列函數 void list(){
struct airline *info;
int i=0;
info=start;
printf(“起點城市t終點城市t航班號t起飛時間t降落時間t總票數t余票數n”);
while(i { display(info); info++; i++; } printf(“nn”);} 查詢函數 void search(){ struct airline *info,*find(); char qiname[10]; char jiangname[10]; int i=0; info=start; printf(“請輸入要起飛城市的名稱:”); scanf(“%s”,qiname); printf(“請輸入要抵達城市的名稱:”); scanf(“%s”,jiangname); while(i { if(!strcmp(jiangname,info->jiang_name)) { break; } info++; i++; } if(i>=MAXSIZE) { printf(“沒有這條航線!n”); } else { printf(“起飛城市t降落城市t航班號t起飛時間t降落時間t總票數t余票數n”); display(info); } } struct airline *find(){ struct airline *info; char number[10]; int i=0; info=start; printf(“請輸入航班號:”); scanf(“%s”,number); while(i { if(!strcmp(number,info->air_num)) { return info; } info++; i++; } printf(“沒有這條航線!n”); return NULL;} 訂票函數 void order(){ struct airline *info; char qiname[10]; char jiangname[10]; int amount; char name[10]; char id[30]; info=start; printf(“請輸入您的起飛城市:”); scanf(“%s”,qiname); printf(“請輸入您的降落城市:”); scanf(“%s”,jiangname); printf(“請輸入您需要的票數:”); scanf(“%d”,&amount); int i=1; while(i<5) { if(!strcmp(info->qi_name,qiname)&&!strcmp(info->jiang_name,jiangname)) { if(amount<=info->ticket_left) { int i; printf(“請輸入您的姓名:”); scanf(“%s”,name); printf(“請輸入您的身份證號:”); scanf(“%s”,id); info->order=insertlink(info->order,amount,name,id); printf(“您的航班信息為:n”); display(info); for(i=0;i { printf(“%s的座位號是:%dn”,name,info->ticket_all-info->ticket_left+i+1); } info->ticket_left-=amount; printf(“訂票成功!n”); break; } else { info++; i++; } } else { info++; i++; } } } 退票函數 void returnticket(){ struct airline *info; linklist *p1,*p2,*head; char name[10]; if(!(info=find())) { return; } head=info->order; p1=head; printf(“請輸入您的姓名:”); scanf(“%s”,name); while(p1!=NULL) { if(!strcmp(name,p1->name)) { break; } p2=p1; p1=p1->next; } if(p1==NULL) { printf(“您沒有訂過票!n”); return; } else { if(p1==head) { head=p1->next; } else { p2->next=p1->next; } info->ticket_left+=p1->tickets; printf(“%s退票成功!n”,p1->name); free(p1); } info->order=head;} 存儲結構 typedef struct passenger { char name[10]; int tickets; char id[30]; struct passenger *next;} linklist;typedef struct airline { char qi_name[10]; char jiang_name[10]; char air_num[10]; char qi_time[10]; char jiang_time[10]; int ticket_all; int ticket_left; linklist *order;} lineinfo;調試分析 查看航線信息 查詢航線 ① 輸入起飛城市 ② 輸入抵達城市 ③ 輸出航班信息 辦理訂票業務 ① 查詢符合的航班 ② 查詢余票量 ③ 輸出航班信息 辦理退票業務 源代碼 #include char name[10]; int tickets; char id[30]; struct passenger *next;} linklist; typedef struct airline { char qi_name[10]; char jiang_name[10]; char air_num[10]; char qi_time[10]; char jiang_time[10]; int ticket_all; int ticket_left; linklist *order;} lineinfo; struct airline *start; void display(struct airline *info){ printf(“%st %10st %10st %10st %10st %5dt %5dn”,info->qi_name,info->jiang_name,info->air_num,info->qi_time,info->jiang_time,info->ticket_all,info->ticket_left);} void list(){ struct airline *info; int i=0; info=start; printf(“起點城市t終點城市t航班號t起飛時間t降落時間t總票數t余票數n”); while(i { display(info); info++; i++; } printf(“nn”);} void search(){ struct airline *info,*find(); char qiname[10]; char jiangname[10]; int i=0; info=start; printf(“請輸入要起飛城市的名稱:”); scanf(“%s”,qiname); printf(“請輸入要抵達城市的名稱:”); scanf(“%s”,jiangname); while(i { if(!strcmp(jiangname,info->jiang_name)) { break; } info++; i++; } if(i>=MAXSIZE) { printf(“沒有這條航線!n”); } else { printf(“起飛城市t降落城市t航班號t起飛時間t降落時間t總票數t余票數n”); display(info); } } struct airline *find(){ struct airline *info; char number[10]; int i=0; info=start; printf(“請輸入航班號:”); scanf(“%s”,number); while(i { if(!strcmp(number,info->air_num)) { return info; } info++; i++; } printf(“沒有這條航線!n”); return NULL;} linklist *insertlink(linklist *head,int amount,char name[],char id[]){ linklist *p1,*new1; p1=head; new1=(linklist*)malloc(sizeof(linklist)); strcpy(new1->name,name); new1->tickets=amount; new1->next=NULL; strcpy(new1->id,id); if(head==NULL) { head=new1; new1->next=NULL; } else { while(p1->next!=NULL) p1=p1->next; p1->next=new1; } return head;} void order(){ struct airline *info; char qiname[10]; char jiangname[10]; int amount; char name[10]; char id[30]; info=start; printf(“請輸入您的起飛城市:”); scanf(“%s”,qiname); printf(“請輸入您的降落城市:”); scanf(“%s”,jiangname); printf(“請輸入您需要的票數:”); scanf(“%d”,&amount); int i=1; while(i<5) { if(!strcmp(info->qi_name,qiname)&&!strcmp(info->jiang_name,jiangname)) { if(amount<=info->ticket_left) { int i; printf(“請輸入您的姓名:”); scanf(“%s”,name); printf(“請輸入您的身份證號:”); scanf(“%s”,id); info->order=insertlink(info->order,amount,name,id); printf(“您的航班信息為:n”); display(info); for(i=0;i { printf(“%s的座位號是:%dn”,name,info->ticket_all-info->ticket_left+i+1); } info->ticket_left-=amount; printf(“訂票成功!n”); break; } else { info++; i++; } } else { info++; i++; } } } void returnticket(){ struct airline *info; linklist *p1,*p2,*head; char name[10]; if(!(info=find())) { return; } head=info->order; p1=head; printf(“請輸入您的姓名:”); scanf(“%s”,name); while(p1!=NULL) { if(!strcmp(name,p1->name)) { break; } p2=p1; p1=p1->next; } if(p1==NULL) { printf(“您沒有訂過票!n”); return; } else { if(p1==head) { head=p1->next; } else { p2->next=p1->next; } info->ticket_left+=p1->tickets; printf(“%s退票成功!n”,p1->name); free(p1); } info->order=head;} int menu_select(){ int c; char s[20]; printf(“ 訂票系統n”); printf(“-------------n”); printf(“ 1.查看航線信息 printf(” 2.查詢航線 printf(“ 3.辦理訂票業務 printf(” 4.辦理退票業務 printf(“ 5.退出系統 printf(”-------------n“); do { printf(”請選擇(1-5):“); scanf(”%s“,s); c=atoi(s); } while(c<1||c>6); return c; n”);n“);n”);n“); n”); } int main(){ struct airline air[MAXSIZE]= { {“harbin”,“beijing”,“1”,“12:00”,“14:00”,30,30},{“harbin”,“shanghai”,“2”,“10:00”,“13:00”,20,20},{“harbin”,“beijing”,“3”,“13:30”,“10:00”,50,50},{“harbin”,“guangzhou”,“4”,“17:00”,“21:00”,50,50},{“harbin”,“dalian”,“5”,“14:00”,“17:00”,40,40} }; start=air; while(1) { system(“cls”); switch(menu_select()) { case 1: list(); break; case 2: search(); break; case 3: order(); break; case 4: returnticket(); break; case 5: exit(0); } getch(); } } 經驗體會 1、通過設計飛機訂票系統,加深了對鏈表的運用和理解。 2、通過多組測試數據,發現了程序的問題,并做了調整、3、通過設計選擇菜單,對選擇結構有更深刻的了解。 軟件工程專業14級 《數據結構》課程設計報告 設計題目: 飛機訂票系統 班 級: 軟 件14 姓 名: 指導教師: 2015年 11月20日 目錄 一、設計任務與要求........................................................1 1.1 總體目標與任務要求................................................1 1.2 題目選擇與目的意義................................................1 1.3 所選題目的主要工作................................................1 二、需求分析..............................................................2 2.1 用戶需求分析......................................................2 2.2 功能需求分析......................................................2 2.3 系統需求分析......................................................2 三、概要設計..............................................................3 3.1 各模塊的算法設計說明..............................................3 3.2 存儲結構設計說明..................................................8 四、詳細設計.............................................................10 五、源代碼...............................................................11 六、運行結果分析.........................................................21 七、收獲與體會...........................................................28 八、主要參考資料.........................................................28 一、設計任務與要求 1.1 總體目標與任務要求 制作一個訂票系統,通過此系統可以實現如下功能: 1)錄入 可以錄入航班情況(數據可以存儲在一個數據文件中,數據結構、具體數據自定)。2)查詢 可以查詢某個航線的情況(如,輸入航班號,查詢起降時間,起飛抵達城市,航班票價,票價折扣,確定航班是否滿倉)可以輸入起飛抵達城市,查詢飛機航班情況。3)訂票 可以訂票,如果該航班已經無票,可以提供相關可選擇的航班(訂票情況可以存在一個數據文件中,結構自己設定)。4)退票 可退票,退票后修改相關數據文件;客戶資料有姓名,證件號,訂票數量及航班情況,訂單要有編號。5)修改航班信息 當航班信息改變可以修改航班數據文件。 根據以上功能說明,設計航班信息,訂票信息的存儲結構,設計程序完成功能。 1.2 題目選擇與目的意義 選擇這個題目的原因是,訂票系統在現實生活中應用很廣泛,通過這個系統可以使訂票、退票等變得簡便。與傳統的人工用紙、筆來記錄辦理訂票、退票等相比,使用這個系統也會增加工作效率。這個題目做出來的系統還是比較實用的,所以我選擇了訂票系統這個題目。 完成此系統,需要綜合運用數據結構課程中學到的幾種典型數據結構,以及程序設計語言(C語言),自行實現一個較為完整的應用系統的設計與開發。通過課程設計,自己通過系統分析、系統設計、編程調試,寫實驗報告等環節,進一步掌握應用系統設計的方法和步驟,靈活運用并深刻理解典型數據結構在軟件開發中的應用。學會將知識應用于實際的方法,提高分析和解決問題的能力,增加綜合能力。1.3 所選題目的主要工作 這個題目的主要工作是使訂票系統可以錄入航班情況,查詢某個航線的情況、辦理訂票、辦理退票、修改航班信息、查詢訂票信息等。 第 1 頁 二、需求分析 2.1 用戶需求分析 用戶使用此程序所要完成的工作主要為:查詢所有航線信息、查看已訂票客戶信息、查詢航線、辦理訂票業務、辦理退票業務。通過此系統可以方便的進行上述工作。 每條航線所涉及的信息有:終點站名、航班號、飛行時間、票價、乘員定額、余票量。 已訂票的客戶名單信息包括姓名、訂票量、艙位等級(1,2或3)。等候替補的客戶名單信息包括姓名、所需票量。 查詢航線功能可以根據旅客提出的終點站名輸出航班號、飛行時間、票價、乘員定額、余票量。 訂票業務功能根據客戶提出的要求(航班號、訂票數額)查詢該航班票額情況,若尚有余票,則為客戶辦理訂票手續,輸出座位號;若已滿員或余票額少于定票額,則需重新詢問客戶要求。若需要,可登記排隊候補購票。 退票業務功能根據客戶提供的情況(航班號、姓名)為客戶辦理退票手續,然后查詢該航班是否有人排隊候補,首先詢問排在第一的客戶,若所退票額能滿足他的要求,則為他辦理訂票手續,否則依次詢問其他排隊候補的客戶。2.2 功能需求分析 功能需求分析模塊圖如圖2.1所示。 圖2.1 功能模塊圖 2.3 系統需求分析 第 2 頁 開發環境: Windows 7系統 使用軟件:編寫實驗報告:Microsoft Office Word 制 作 程 序:Microsoft Visual C++ 6.0 三、概要設計 3.1 各模塊的算法設計說明 1.瀏覽航線信息功能,調用display函數進行輸出。如圖3.1所示。航線信息流程圖: 圖3.1 瀏覽航線信息流程圖: 其中display函數的流程圖如圖3.2 display函數流程圖: 瀏覽第 3 頁 圖3.2 display函數流程圖 2.瀏覽已訂票客戶信息功能,按順序輸出客戶信息鏈表中的信息。流程圖如圖3.3 瀏覽已訂票客戶信息功能流程圖: 圖3.3 瀏覽已訂票客戶信息功能流程圖 3.查詢航線功能,根據客戶提出的終點站名輸出航線信息。流程圖如圖3.4 查詢航線流程圖: 第 4 頁 圖3.4 查詢航線流程圖 4.辦理訂票業務功能,根據客戶提出的航線信息等進行訂票。流程圖如圖3.5 辦理訂票業務功能流程圖: 第 5 頁 圖3.5 辦理訂票業務功能流程圖 5.辦理退票業務功能,根據客戶提出的航線信息等進行退票。流程圖如圖3.6 辦理退票業務功能流程圖: 第 6 頁 圖3.6 辦理退票業務功能流程圖 6.主函數流程圖如圖3.7 主函數流程圖: 第 7 頁 圖3.7 主函數流程圖 3.2 存儲結構設計說明 typedef struct wat_ros /*單鏈隊列存儲等候替補的客戶信息*/ { char name[10]; /*姓名*/ int req_amt; /*訂票量*/ struct wat_ros *next; }qnode,*qptr; 第 8 頁 typedef struct pqueue /*等候替補的客戶名單*/ { qptr front; qptr rear; }linkqueue;上述單鏈隊列用來存儲排隊等候的客戶名單,這樣可以通過隊先進先出的特點來進行操作。先排隊的客戶可以先訂票成功。 typedef struct ord_ros /*乘員名單*/ { char name[10]; /*客戶姓名*/ int ord_amt;int grade; /*訂票量*/ /*艙位等級*/ struct ord_ros *next;}linklist;上述單鏈表用來存儲乘員的信息,包括姓名、訂票量、艙位等級。struct airline /*航線信息*/ { char ter_name[10]; /*抵達城市*/ char air_num[10]; /*航班號*/ char time[10]; /*飛機時間*/ char pri[7]; /*票價*/ int tkt_amt; /*乘員定額*/ int tkt_sur; /*余票量*/ linklist *order; /*乘員名單域,指向乘員名單鏈表的頭指針*/ linkqueue wait; /*等候替補的客戶名單域,分別指向排隊等候名單隊頭隊尾的指針*/ }lineinfo;這個結構體存儲了航線信息,包括抵達城市、航班號、飛行時間、票價、乘員定額、余票量等。 #define MAXSIZE 5 /*定義航線數量,可修改*/ struct airline air[MAXSIZE]= /*初始化航線信息*/ { {“beijing”,“1”,“1200”,“860”,30,30}, {“shanghai”,“2”,“1000”,“770”,20,20}, {“london”,“3”,“1330”,“960”,10,10},第 9 頁 };{“harbin”,“4”,“1700”,“760”,50,50}, {“dalian”,“5”,“1400”,“550”,40,40} 通過修改全局變量MAXSIZE的數值即可更改航線數。在struct airline air[MAXSIZE]中可以修改、增加、刪除航線信息。航線信息內容依次為抵達城市、航班號、飛行時間、票價、乘員定額、余票量(飛行時間1200即12:00)。 四、詳細設計 1.查看航線信息 編寫void list()函數來查看全部航線信息。其中調用了void display(struct airline *info)函數,該函數的功能是打印每條航線的基本信息。這樣即可按順序打印出struct airline鏈表中存儲的全部航線信息。2.查看已訂票客戶信息 編寫void prtlink()函數來查看已訂票客戶信息。這個函數中需要輸入要查詢的航線,通過find()函數來尋找這個航線然后輸出該航線乘員域的乘員信息。3.查詢航線 編寫void search()函數來實現查詢航線的功能。用戶輸入抵達城市名,該函數會在航線信息鏈表中進行查詢。如果有該城市,則會輸出此航線的信息。4.辦理訂票業務 編寫void order()函數來實現訂票功能。首先提示用戶輸入航班號,然后調用find()函數來查找此航班,如果該航班存在,則會提示用戶輸入信息并調用linklist *insertlink(linklist *head,int amount,char name[],int grade)在訂票乘員名單域中添加客戶信息。如果余票不足,則會提示用戶進行排隊,如果排隊,則會調用提示用戶輸入信息并調用linkqueue appendqueue(linkqueue q,char name[],int amount)在排隊等候乘員名單域中添加客戶信息。5.辦理退票業務 編寫void return_tkt()函數來實現退票功能。首先提示用戶輸入航班號,然后調用find()函數來查找此航班,如果該航班存在,則會提示用戶輸入信息,信息正確則會提示退票成功。此時將乘員信息中的該乘員信息刪除,然后檢查替補乘員鏈表中的信息,如果其訂票量可以得到滿足,則會將其插入到訂票客戶名單鏈表中,提示他訂票成功。6.退出系統 主函數中無限循環輸出菜單for(;;),用戶在菜單頁面下輸入6回車即exit(0),即可退出系統。 第 10 頁 五、源代碼 #include #define MAXSIZE 5 /*定義航線數量,可修改*/ typedef struct wat_ros /*單鏈隊列存儲等候替補的客戶信息*/ { char name[10]; /*姓名*/ int req_amt; /*訂票量*/ struct wat_ros *next; }qnode,*qptr;typedef struct pqueue /*等候替補的客戶名單*/ { qptr front; /*等候替補客戶名單域的隊頭指針*/ qptr rear; /*等候替補客戶名單域的隊尾指針*/ }linkqueue; typedef struct ord_ros /*乘員名單*/ { char name[10]; /*客戶姓名*/ int ord_amt; /*訂票量*/ int grade; /*艙位等級*/ struct ord_ros *next;}linklist; struct airline { char ter_name[10]; /*抵達城市*/ char air_num[10]; /*航班號*/ char time[10]; /*飛機時間*/ char pri[7]; /*票價*/ 第 11 頁 int tkt_amt; /*乘員定額*/ int tkt_sur; /*余票量*/ linklist *order; /*乘員名單域,指向乘員名單鏈表的頭指針*/ linkqueue wait; /*等候替補的客戶名單域,分別指向排隊等候名單隊頭隊尾的指針*/ }lineinfo;struct airline *start; void display(struct airline *info) /*打印每條航線的基本信息*/ { } void list() /*打印全部航線信息*/ { } void search() /*根據客戶提出的終點站名輸出航線信息*/ { printf(“%8st%3st%stt%4st%3dt%10dn”,info->ter_name,info->air_num,info->time,info->pri,info->tkt_amt,info->tkt_sur);struct airline *info;int i=0;info=start;printf(“終點站名t航班號t飛行時間t票價t乘員定額t余票量n”);while(i } printf(“nn”);display(info); /*調用display函數來輸出*/ info++;i++;struct airline *info,*find();char name[10]; /*要抵達的城市名稱*/ int i=0;info=start; 第 12 頁 printf(“請輸入要抵達城市的名稱:”);scanf(“%s”,name);while(i { break; } info++; i++;} if(i>=MAXSIZE) /*沒有匹配的航線*/ { printf(“對不起,沒有這條航線!n”);} else { printf(“終點站名t航班號t飛行時間t票價t乘員定額t余票量n”); display(info); /*調用display函數輸出航線信息*/ } } struct airline *find() / *根據系統提出的航班號查詢并以指針形式返回*/ { struct airline *info;char number[10]; /*查詢的航班號*/ int i=0;info=start;printf(“請輸入航班號:”);scanf(“%s”,number);while(i { if(!strcmp(number,info->air_num)) /*有匹配航班*/ { return info; } 第 13 頁 } info++;i++;} /*無匹配航班*/ printf(“對不起,沒有這條航線!n”);return NULL;void prtlink() /*打印訂票乘員名單域的客戶名單信息*/ { } linklist *insertlink(linklist *head,int amount,char name[],int grade) /*增加訂票乘員名單域的客戶信息*/ { linklist *p;struct airline *info;info=find();p=info->order;if(p!=NULL) /*按順序輸出客戶信息鏈表*/ { printf(“客戶姓名 訂票數額 艙位等級n”);while(p) { } printf(“%stt%dt%dn”,p->name,p->ord_amt,p->grade);p=p->next; } else /*沒有人訂這個航班*/ printf(“該航線沒有客戶信息!n”);linklist *p1,*new1;p1=head;new1=(linklist*)malloc(sizeof(linklist));if(!new1) /*存儲空間不足*/ { } 第 14 頁 printf(“nOut of memory!n”);return NULL; } strcpy(new1->name,name);new1->ord_amt=amount;new1->grade=grade;new1->next=NULL;if(head==NULL) /*若原訂票客戶信息為空*/ { } else { } new1->next=p1;return head; head=new1;head=new1;new1->next=NULL;linkqueue appendqueue(linkqueue q,char name[],int amount) /*增加排隊等候的客戶名單域*/ { qptr new1;new1=(qptr)malloc(sizeof(qnode));strcpy(new1->name,name);new1->req_amt=amount;new1->next=NULL;if(q.front==NULL) /*若原排隊等候客戶名單域為空*/ { } else { } q.rear=new1;return q; 第 15 頁 q.front=new1;q.rear->next=new1; } void order() /*辦理訂票業務*/ { struct airline *info;int amount,grade; /*訂票數量,艙位等級*/ char name[10]; /*要訂的航班號*/ info=start;if(!(info=find())) /*根據客戶提供的航班號進行查詢,如為空,退出該模塊*/ { } printf(“請輸入您需要的票數:”);scanf(“%d”,&amount);if(amount>info->tkt_amt) /*若客戶訂票額超過乘員定票總額,退出*/ { } if(amount<=info->tkt_sur) /*若客戶訂票額末超過余票量,訂票成功并{ int i;printf(“請輸入您的姓名:”);scanf(“%s”,name);printf(“請輸入您需要的艙位等級(1,2或):”);scanf(“%d”,&grade);info->order=insertlink(info->order,amount,name,grade); /*在訂票乘員名單域for(i=0;i /*依次輸出該訂票客戶的座位號*/ { } info->tkt_sur-=amount; /*該航線的余票量應減掉該客戶的訂票量*/ printf(“n祝您乘坐愉快!n”); 第 16 頁 return;printf(“n對不起,您輸入票數已經超過乘員定額!”);return;等記信息*/ 中添加客戶信息*/ printf(“%s的座位號是:%dn”,name,info->tkt_amt-info->tkt_sur+i+1); } } else /*若滿員或余票額少于訂票額,詢問客戶是否需要進行排隊等候*/ { } char r;printf(“n沒有這么多票了,您需要排隊等候嗎?(Y/N)”);r=getch();printf(“%c”,r);if(r=='Y'||r=='y'){ } else { } printf(“n歡迎您再次訂購!n”);printf(“n請輸入您的姓名:”);scanf(“%s”,name);info->wait=appendqueue(info->wait,name,amount);/*在排隊等候乘員名單域printf(“n注冊排隊成功!n”);中添加客戶信息*/ void return_tkt() /*退票模塊*/ { struct airline *info;qnode *t,*back,*f,*r;int grade;linklist *p1,*p2,*head;char cusname[10];if(!(info=find())) /*調用查詢函數,根據客戶提供的航線進行搜索*/ { } head=info->order;p1=head; 第 17 頁 return; printf(“請輸入你的姓名:”);scanf(“%s”,cusname);while(p1!=NULL) /*根據客戶提供的姓名到訂票客戶名單域進行查詢*/ { } if(p1==NULL) /*若未找到,退出本模塊*/ { } else /*若信息查詢成功,刪除訂票客戶名單域中的信息*/ { } info->order=head; /*重新將航線名單域指向訂票單鏈表的頭指針*/ f=(info->wait).front; /*f指向排隊等候名單隊列的頭結點*/ r=(info->wait).rear; /*r指向排隊等候名單隊列的尾結點*/ t=f; /*t為當前滿點條件的排隊候補名單域*/ 第 18 頁 if(!strcmp(cusname,p1->name)){ } p2=p1;p1=p1->next;break;printf(“對不起,您沒有訂過票!n”);return;if(p1==head){ } { } grade=p1->grade;printf(“%s退票成功!n”,p1->name);p2->next=p1->next;head=p1->next; else info->tkt_sur+=p1->ord_amt; free(p1); while(t){ if(info->tkt_sur>=info->wait.front->req_amt) /*若滿足條件者為頭結點*/ { } back=t;t=t->next;if((info->tkt_sur)>=(t->req_amt)&&t!=NULL)/*若滿足條件者不為頭結點*/ { } if(f==r){ 第 19 頁 int i;info->wait.front=t->next;printf(“%s訂票成功!n”,t->name);for(i=0;i /*輸出座位號*/ 戶名單鏈表中*/ int i;back->next=t->next;printf(“%s訂票成功!n”,t->name);for(i=0;i /*輸出座位號*/ { } info->tkt_sur-=t->req_amt;info->order=insertlink(info->order,t->req_amt,t->name,grade);/*插入到訂票客free(t);break;printf(“<%s>'s seat number is:%dn”,t->name,(info->tkt_sur)-i);戶名單鏈表中*/ break; } } } int menu_select() /*菜單界面*/ { int c;char s[20];printf(“t訂票系統n”);printf(“~~~~~~~~~~~~~~~~~~~~~~~~~n”);printf(“1.查看航線信息n”);printf(“2.查看已訂票客戶信息n”);printf(“3.查詢航線n”);printf(“4.辦理訂票業務n”);printf(“5.辦理退票業務n”);printf(“6.退出系統n”);printf(“~~~~~~~~~~~~~~~~~~~~~~~~~n”);do { printf(“請選擇(1-6):”); scanf(“%s”,s);c=atoi(s);}while(c<1||c>6);return c;} void main(){ struct airline air[MAXSIZE]= /*初始化航線信息*/ { {“beijing”,“1”,“1200”,“860”,30,30},{“shanghai”,“2”,“1000”,“770”,20,20},{“london”,“3”,“1330”,“960”,10,10}, {“harbin”,“4”,“1700”,“760”,50,50},第 20 頁 {“dalian”,“5”,“1400”,“550”,40,40} };start=air; for(;;) /*無限循環(除非用戶選擇.退出)*/ { system(“cls”); /*清空屏幕*/ switch(menu_select()) { case 1:list(); /*打印全部航線信息*/ break; case 2:prtlink(); /*瀏覽已訂票客戶信息*/ break; case 3:search(); /*查詢航線*/ break; case 4:order(); /*訂票*/ break; case 5:return_tkt(); /*退票*/ break; case 6:printf(“n感謝您的使用,再見!n”);/*退出系統*/ exit(0); /*正常退出程序*/ } printf(“n任意鍵繼續...n”); getch(); /*任意鍵繼續*/ } } 六、運行結果分析 1.菜單:進入系統后,會出現如下菜單,如圖6.1 菜單: 第 21 頁 圖6.1 菜單 用戶根據自己需求選擇輸入數字(1-6)即可進入相應功能。 2.查看航線信息:在菜單頁面下輸入數字1,回車,即可瀏覽全部航線信息。如圖6.2 查看航線信息: 圖6.2 查看航線信息 3.查看已訂票客戶信息:在菜單頁面下輸入數字2,回車,然后輸入航班號即可查看。如圖6.3 查看航線信息: 圖6.3 查看航線信息 該航線有客戶預定則顯示客戶預定的信息。如圖6.3 查看客戶預定信息: 第 22 頁 6.3 查看客戶預定信息 如果該航線沒有客戶預定,則會提示該航線沒有客戶信息。如圖6.4 無人預定航線: 圖6.4 無人預定航線 4.查詢航線:在菜單頁面下輸入數字3,回車,即可進入查詢航線功能。如圖6.5 查詢航線頁面: 圖6.5 查詢航線頁面 根據提示輸入要抵達城市的名稱即可查詢。如果有該航線,則會顯示該航線的信息。如圖6.6 航線信息: 第 23 頁 圖6.6 航線信息 如果沒有該航線,則會顯示對不起,沒有這條航線。如圖6.7 無此航線: 圖6.7 無此航線 5.辦理訂票業務:在菜單頁面下輸入數字4,回車,即可進入辦理訂票業務功能。如圖6.8 訂票頁面: 圖6.8 訂票頁面 用戶根據提示依次輸入航班號、票數、姓名、艙位等級即可。如圖6.9 訂票信息: 第 24 頁 圖6.9 訂票信息 如果訂票成功,則會顯示座位號,并提示祝您乘坐愉快。如圖6.10 訂票成功: 圖6.10 訂票成功 如果在輸入訂票信息時,輸入的票數大于額定乘員數,則會訂票失敗并提示。 第 25 頁 圖6.11 訂票失敗 如果在輸入訂票信息時,輸入的票數小于額定乘員數,大于余票數,則會提示沒有這么多票了,詢問是否進行排隊等候。如圖6.12 詢問是否排隊等候: 圖6.12 詢問是否排隊等候 如果輸入N,代表不排隊,則會提示歡迎下次訂購。如果輸入Y,代表進行排隊等候。這是會提示用戶輸入姓名進行排隊。如圖6.13 排隊等候: 圖6.13 排隊等候 6.辦理退票業務:在菜單頁面下輸入數字5,回車,即可進入辦理退票業務功能。如圖6.14 辦理退票業務頁面: 第 26 頁 圖6.14 辦理退票業務頁面 根據提示輸入航線號和姓名即可進行退票。如果此時這條航線有人排隊等候,余票數可以滿足其需求,其訂票即可成功。如圖6.15 排隊等候訂票成功: 圖6.15 排隊等候訂票成功 第 27 頁 7.退出系統:在菜單頁面下輸入數字6,回車,即可退出系統。如圖6.16 退出系統: 圖6.16 退出系統 七、收獲與體會 在編寫的時候只使用了相對較為簡單的基礎語言,代替了相對較為復雜的語言,降低了運行效率。測試輸入的數據也有一定的局限性,但是基本可以滿足訂票系統的需求。 這個程序有許多地方可以改進,例如: ① 數據全部存儲在內存中,可以考慮繼續編寫將數據保存在文件中,這樣不會丟失。 ② 航線信息只能通過修改代碼來修改,可以編寫一個函數來修改航線信息并將其保存在文件中。 ③ 使用的語言較基礎,運行效率較低,可以考慮寫一些較為復雜但運行效率高的語言。 ④ 界面不夠美觀,菜單也只是局限在左上角,可以修改。 八、參考文獻 [1] 嚴蔚敏,吳偉民,數據結構(C語言版)[M].清華大學出版社,1997.[2] 夏濤.C語言程序設計,北京郵電大學出版社,2007.[3] 譚浩強.C程序設計(第三版)[M].清華大學出版社,2006.[4] 百度.百度知道.百度文庫 第 28 頁 飛機訂票系統 1.概述(設計題目與可行性分析) 1.1設計題目:飛機訂票系統 1.2可行性分析 飛機訂票系統是為機場工作人員和客戶提供訂票退票等與機票相關內容的管理系統,方便機場工作人員對機票的管理,以提高機場工作人員對機票管理工作的效率。當前飛機訂票問題:手工訂票所產生的客座率低。而我們的目標是:建立一個飛機訂票系統數據庫。 1.2.1研究現有系統,畫現有系統的流程圖 了解當前系統能夠完成的功能及組成 航班管理:票據管理 售票點:直接面向用戶 航班管理 票據管理 票庫 訂票庫 訂票管理 出售管理 打印機票 售票點1 售票點n 現有系統:票據都分布在各個售票點 1.2.2導出新系統的高層邏輯結構 數據流圖的基本符號: 數據源/終點(人機界面): 加工處理: 文件名 文件: 數據流名 數據流: 票價信息 機票 查訂票號 訂票處理 客戶信息 出票處理 訂票記錄 顧客 訂票信息 訂票號 庫存信息 票價信息 票價管理 航班管理 航班信息 操作員 航班信息 保存 新系統的數據流圖: 說明:流向文件的數據流的名可以省略 1.2.3可行性分析報告 隨著Internet的迅速發展和用戶數量的急劇增加,互聯網對于企業和事業單位的運營和發展日益重要,網上交易也逐漸被人們認可,并成為未來交易的發展方向。在這種情況下,很多原有的C/S模式的系統也逐步向B/S模式靠攏,飛機訂票系統也不例外。 飛機訂票系統是飛機旅游服務信息系統的一個重要組成部分。為旅客提供優質便捷的服務,為了提高飛機客運的售票效率,豐富飛機客運的營銷手段,飛機售票總站的下屬代售點可以通過公用的互聯網資源,建立數據庫,實現網上的售票,查詢及管理工作。 2.系統目標和設計原則 2.1系統目標: 建立一個飛機訂票系統數據庫。 2.1.1系統簡介: 本系統是專為乘坐飛機的旅客準備的,旅客只需把自己的信息(姓名.性別.工作單位.身份證號.旅行時間.旅行目的地)預先交給旅行社,旅行社就可以將信息輸入本系統,系統就可以為旅客安排航班,打印出取票通知和帳單。旅客只要在飛機起飛的前一天憑取票通知單和帳單交款取單,系統校對無誤即印出機票給旅客。 2.2設計原則 2.2.1根據實際情況考慮三種可行性 技術可行性、經濟可行性、操作可行性 2.2.2提出侯選方案、提出各種各樣的實現方案 主機(純主機型、C/S型)、開發環境、網絡方案、對提出的每個方案進行成本估計 硬件、軟件費用投資(根據各公司的報價)開發成本估計(任務估算法) 運行費用、投資回收期 純收入:通過本系統的運行、投資回收后的收入 3、描述推薦理由:分別從技術、經濟、用戶、投資方的不同角度考慮 3.支撐環境規劃 3.1整體系統運作圖 3.2運行環境 服務器:硬件配置:CPU Intel P4 1.2G以上 內存256 硬盤 80G以上 軟件配置:Windows 2000/2003 SERVER SQL SERVER 2000 4.系統功能結構 1、錄入:可以錄入航班情況(數據可以存儲在一個數據文件中,數據結構、具體數據自定) 2、查詢:可以查詢某個航線的情況(如,輸入航班號,查詢起降時間,起飛抵達城市,航班票價,票價折扣,確定航班是否滿倉);可以輸入起飛抵達城市,查詢飛機航班情況; 3、訂票:(訂票情況可以存在一個數據文件中,結構自己設定)可以訂票,如果該航班已經無票,可以提供相關可選擇航班; 4、退票:可退票,退票后修改相關數據文件; 客戶資料有姓名,證件號,訂票數量及航班情況,訂單要有編號。 5、修改航班信息:當航班信息改變可以修改航班數據文件。 5.數據庫設計 5.1概念結構設計 E-R圖如下: 5.2邏輯結構設計 1.航空公司表:AIRLINE 2.客戶表CUSTOMER 3、飛機表PLANE 4.航線表LINE 5.航班表FLIGHT 6.訂票表BOOKTICKET 5.3實現設計 實現以下操作: 1、注冊航空公司: 2、增加飛機: 3、增加航線: 4、增加航班: 5、增加客戶: 6、建立一個訂票的存儲過程,存儲過程名為Book_Ticket,請完成以下存儲過程,實現訂票的操作: a)指定要訂的航班號(HID)及客戶的編號(KID); b)先查看客戶是否為特殊客戶,如果不是,票價不打折扣; c)否則如果客戶航程超過5萬公里,票價7折,超過15萬公里,票價打5折; d)查看客戶訂票以后,所有乘客的票數是否超過總的座位數,如果超過,回滾訂票操作; e)要求在操作過程中使用到事務技術。 CREATE PROCEDURE Book_ticket @HID VARCHAR(20) @HID VARCHAR(20) AS DECLARE @TRANS_NAME VARCHAR(20)select @TRANS_NAME=’ ’ BEGIN TRANSACTION DECLARE @Bookid int,@seats int,@IsSpec char(1)/*定義訂票里程DIST、折扣率discount、總的訂票里程distance、票價PRICE(實型)*/ select @Isspec=Isspec,@distance=Points FROM Customer where select @discount=1 IF @ BEGIN END /*選擇出票價*/ SELECT @PRICE=PRICE FROM FLIGHT WHERE /*加入客戶訂票信息*/ /*將客戶新訂票里程的信息累計到用戶信息里面*/ UPDATE SET WHERE /*查看客戶訂票后,是否超過可容納的座位數目,如果超過,取消所有操作*/ SELECT booked=count(*)FROM WHERE FID= /*查看額定座位容量*/ SELECT @seats=seatsnum FROM WHERE IF @BOOKED>@SEATS ELSE COMMIT TRANSACTION GO 7.運行這個訂票操作的存儲過程(自己設定客戶及航班) book_ticket , 8.事務運行成功后,再顯示各表的數據,按表分別寫出來。 6.總體實施計劃 6.1可行性研究: 研究現有系統,畫現有系統的流程圖,編寫可行性分析報告 6.2進行數據庫設計: 概念結構設計,邏輯結構設計,實現設計 6.3概要設計: 從數據流圖導出初始結構圖,設計優化 6.4詳細設計: 結構化的程序設計,采用流程圖的形式 6.5保密設計 1.每個用戶需要注冊才能進入航空訂票信息系統,并進行網上訂票的。用戶必須 用自己真實的身份進行注冊。 2.系統要另外在備一份數據庫,防止系統出現錯誤而使數據信息丟失的可能性。 3.系統要安裝防火墻,防止黑客入侵破壞系統。還有就是安裝殺毒軟件,防止 病毒入侵而導致系統癱瘓。 6.6維護設計 系統設置提供管理員操作頁面: 1.提供管理員密碼,方便維護操作.2.固定時間對系統進行維護和檢測.3.若系統出現癱瘓時,可出動備用系統維持運轉.4.定期對系統進行更新整頓清空.7.總結 這次數據庫課程設計的“飛機訂票系統”,通過近一周的上機操作,充分應用了所學的數據庫的知識,并去圖書館查閱了一些書集和上網搜索一部分相當資料,粗略設計出該系統。總體上來說,這次課程設計還是比較成功的,充分運用了所學的軟件工程設計、數據庫的設計,設計出E-R圖、流程圖、數據庫基本表,從整體規劃出了系統的運行環境和系統實現的功能。 當然,由于學藝不精,在課程設計的過程也碰到的一些問題。其中,畫E-R圖時,各實體中的關系的確定,由于對系統還不夠了解而找不到一個準確的詞來形容;總體規劃時,材料太多,不易整理;相關數據庫技術方面沒有多注意,這次課程設計的重點只在對整個系統的總體思路設計。 其實這些通過最近的課程設計覺得最重要一點就是:我們一定要自己動手,這樣才能真正的學到東西。書本知識固然重要,但我們更要學會將書本知識應用到實際的工作中。實踐中才會發現錯誤,也才能改進,才能達到學習的最終目的。 最后感謝在這次課程設計中幫助過我的老師,同學!8.參考文獻 物流信息系統 趙剛 四川大學人民出版社 2002/9 物流信息管理 尹濤 東北財經大學出版社 2005/1 數據庫系統概論 王珊 薩師煊 高等教育出版社 2006/5 數據庫技術與應用-Access2000篇 郭力平人民郵電出版社 2002/8 軟件設計師教程 陳平禇華 清華大學出版社 2006/6 文章引用自: 《銀行帳戶管理系統》設計報告 飛機航班訂票系統概要設計 根據需求分析中的描述,知道需要三個struct結構體類型和一個class的類 struct person //定義旅客信息結構體類型 { char name[50];//旅客姓名 char sex[20];//旅客性別 char id[20];//旅客身份證號 char from[50];//旅客出發地 char to[50];//旅客目的地 int year;//旅客出發年 int month;//月 int day;//日 };struct fly //定義航班信息結構體類型 struct piao //定義訂單信息結構體類型 這兩個結構體類型和之前第一個相似。 class plane //定義一個類--plane { public: //public表示是共有屬性,里面的東西變為共有的。對象外的用戶可以調用對象內的類型 char menu();//定義 各種成員函數 void set();//**********************旅客信息添加修改刪除函數聲明 void AddPer();//旅客 增加信息 void chp();//旅客 修改信息 void dep();//旅客 刪除信息 //**********************航班信息添加修改刪除函數聲明 《銀行帳戶管理系統》設計報告 void addf();//航班 增加信息 void chf();//航班 修改信息 void def();//航班 刪除信息 //**********************訂單信息添加修改刪除函數聲明 void addt();//訂單中 增加信息 void cht();//訂單中 修改信息 void det();//訂單中 刪除信息 //**********************按條件顯示訂單信息函數聲明 void showno();//按航班班次顯示訂單信息 void showplace();//按出發地、目的地顯示訂單信息 void showname();//按旅客姓名顯示訂單信息 void save();//保存信息 void exit();//退出界面 private: person a[100];//定義一個用戶的數組 fly b[100];//定義一個航班的數組 piao c[100];//定義一個訂單的數組 int t; //旅客個數 int s; //航班個數 int r;//訂單個數 };三個struct結構體類型中用于存放數據,在private中定義出a[]、b[]、c[]三個數組用來存放數據。并在public中聲明出將要調用的函數。public表示是共有屬性,將里面的東西變為共有的。對象外的用戶也可以調用對象內的類型。 然后在main函數中寫入一個switch函數用來滿足用戶的選擇,依照用戶的選擇來實現case中的函數。case中函數來實現用戶的需求:例如增加、修改、刪除一個旅客資料等等。 《銀行帳戶管理系統》設計報告 2. 詳細設計 //***********************plane創建一個類m將鍵盤輸入的數據輸入進m類中 plane m; //**************************從文件流之中講數據讀取************ void plane::set() { fstream file(“person.txt”,ios::in);//定義一個文件流,以輸入的方式打開文件 int i=0;if(file.is_open()) //判斷文件是否打開 { while(!file.eof()) //判斷文件是否是最末尾端(如果不是則運行下列代碼) { file>>m.a[i].name;//將名字寫入到結構體類型person中 file>>m.a[i].sex; file>>m.a[i].id; file>>m.a[i].from; file>>m.a[i].to; file>>m.a[i].year>>m.a[i].month>>m.a[i].day; if(!file.eof())//判斷文件是否是最末尾端 i++; //不是的話i+1 } m.t=i; file.close();} fstream file2(“fly.txt”,ios::in); //file2 3類似 fstream file3(“piao.txt”,ios::in);//***************************講變量名中的數據輸入到文件流之中 void plane::save(){ //*******************************將數據輸入到person文件中 fstream file(“person.txt”,ios::out | ios::trunc);/*out以輸出方式打開一個文件 trunc打開一個文件要是存在則刪除其中全部數據 若不存在則建立新文件*/ if(file.is_open())//講變量名之中的數據輸入到file中 { for(int i=0;i file< file< file< 《銀行帳戶管理系統》設計報告 file< file< file< file< file< file.close(); } fstream file2(“fly.txt”,ios::out | ios::trunc); //file2 3類似 fstream file3(“piao.txt”,ios::out | ios::trunc); //******************************定義一個menu char plane::menu() { int k; cout<<“*************************飛 機 航 班 訂 票 系 統**********************”< cout<<“ 1.增加一個旅客信息 ”< cout<<“ 2.修改一個旅客信息 ”< cout<<“ 3.刪除一個旅客信息 ”< cout<<“ 4.增加一個航班信息 ”< cout<<“ 5.修改一個航班信息 ”< cout<<“ 6.刪除一個航班信息 ”< cout<<“ 7.增加一個訂單信息 ”< cout<<“ 8.修改一個訂單信息 ”< cout<<“ 9.刪除一個訂單信息 ”< cout<<“ 10.按班次顯示訂單資料 ”< cout<<“ 11.按航班線路顯示訂單資料 ”< cout<<“ 12.按旅客姓名顯示訂單資料 ”< cout<<“請輸入您要選擇的功能序號:”; cin>>k; return k; //將用戶選擇的K值返回到主函數中賦值給R以此選擇case } //*****************************添加旅客信息—從鍵盤中將數據輸入到一個變量名之中 void plane::AddPer() { char choice;//choice用來判斷y/n for(int i=m.t;i<100;i++) { //**************添加旅客信息 cout<<“添加旅客信息--姓名:”; cin>>m.a[i].name; cout<<“添加旅客信息--性別:”; cin>>m.a[i].sex; cout<<“添加旅客信息--身份證:”; cin>>m.a[i].id; cout<<“添加旅客信息--出發地:”; cin>>m.a[i].from; cout<<“添加旅客信息--目的地:”; cin>>m.a[i].to; cout<<“添加旅客信息--出發年:”; cin>>m.a[i].year; 《銀行帳戶管理系統》設計報告 cout<<“添加旅客信息--出發月:”; cin>>m.a[i].month; cout<<“添加旅客信息--出發日:”; cin>>m.a[i].day; m.t++; cout<<“一位旅客新信息輸入完成,還要繼續添加新的旅客信息么(y/n)?”; while(1) { cin>>choice; if(choice=='y'||choice=='n') //邏輯或 如果是y或者n則跳出while函數 break; else cout<<“輸入錯誤!請重新輸入!”< if(choice=='n')//如果是n的話跳出for循環 break; } save(); //保存旅客信息 } //************************改變旅客信息 void plane::chp(){ char J[100];//定義一個數組J用于修改旅客身份證號(利用id號來進行修改) cout<<“請輸入要修改的旅客身份證號:”; cin>>J; for(int i=0;i if(strcmp(m.a[i].id,J)==0) //將已有的旅客id號和剛輸入的id號進行比較 break; if(i==m.t) { cout<<“輸入錯誤,沒有此航班!”< return; } //********************輸出修改內容 進行修改 cout<<“請輸入旅客的姓名:”; cin>>m.a[i].name; cout<<“請輸入旅客的性別:”; cin>>m.a[i].sex; cout<<“請輸入旅客的身份證號:”; cin>>m.a[i].id; cout<<“請輸入旅客的出發地:”; cin>>m.a[i].from; cout<<“請輸入旅客的目的地:”; cin>>m.a[i].to; cout<<“請輸入旅客的出發年:”; cin>>m.a[i].year; cout<<“請輸入旅客的出發月:”; cin>>m.a[i].month; cout<<“請輸入旅客的出發日:”; cin>>m.a[i].day; save(); cout<<“修改成功!”< } //**************************刪除旅客信息 void plane::dep() 《銀行帳戶管理系統》設計報告 { char R[100]; cout<<“請輸入要刪除的旅客身份證:”;cin>>R; for(int i=0;i if(strcmp(m.a[i].id,R)==0) break; if(i==m.t) { cout<<“刪除錯誤,沒有您要刪除的游客!”< return; } m.a[i]=m.a[m.t-1]; //將后面數組賦值到了找到的要刪除的數組就將那個要刪除的數組給刪除了 m.t--; save(); cout<<“刪除成功!”< 之后的幾個函數都相類似。 //****************************添加航班信息 void plane::addf()//*****************************修改航班信息 void plane::chf()//*************************刪除航班信息 void plane::def()//***********************添加航班訂票信息 void plane::addt()//******************************修改訂票信息 void plane::cht()//*********************刪除訂單信息 void plane::det()//****************************按航班起飛降落城市來查詢訂單信息 void plane::showplace() { char H[100]; char E[100]; cout<<“請輸入要查詢的訂單航班出發地:”; cin>>H; cout<<“請輸入要查詢的訂單航班目的地:”; cin>>E; for(int i=0;i //將輸入的出發和降落城市和已存在的城市想比較來找到這筆訂單 if(strcmp(m.c[i].chufadi,H)==0 && strcmp(m.c[i].mudidi,E)==0) break; if(i==m.r) { 《銀行帳戶管理系統》設計報告 cout<<“沒有此訂單!輸入錯誤!”< return; } cout<<“查詢結果如下:”< for(i=0;i if(strcmp(m.c[i].chufadi,H)==0 && strcmp(m.c[i].mudidi,E)==0) { cout<<“旅客姓名:”< cout<<“旅客性別:”< cout<<“旅客身份證:”< cout<<“航班班次:”< cout<<“出發地:”< cout<<“目的地:”< cout<<“出發日期-年:”< cout<<“出發日期-月:”< cout<<“出發日期-日:”< } } //*****************************按訂單姓名來查詢訂單信息 void plane::showname()//****************************按航班班次來查詢訂單信息 void plane::showno()//***************************主函數使用switch函數來選擇各個功能 int main(){ plane p; //plane定義一個p的類 p.set(); /*面向對象的思想 以對象為載體下一個對象要干什么 執行過程應該封裝起來 而不是像面向過程一樣講過程代碼一步一步寫出來*/ while(1){ int R; R=p.menu();//在menu函數中選擇case然后賦值到R中然后選擇是第幾個case switch(R) { case 1:p.AddPer(); break; case 2:p.chp(); break; case 3:p.dep(); break; case 4:p.addf(); break; case 5:p.chf(); break; case 6:p.def(); break; case 7:p.addt(); break; case 8:p.cht(); break; 《銀行帳戶管理系統》設計報告 case 9:p.det(); break; case 10:p.showno(); break; case 11:p.showplace(); break; case 12:p.showname(); break; default:cout<<“輸入錯誤,請重新輸入!”< } } return 0;} #include //包含access函數的頭文件 #define N 9999 //定義最多的航班數 #define PRINT “%dtt%stt%stt星期%stt%dn ”,s[i].num,s[i].start,s[i].over,s[i].time,s[i].count //宏定義輸出格式 struct air //定義結構體數組 { int num; //定義航班號 char start[20];//航班起始站 char over[20];//終點站 char time[10];//飛行時間 int count; //機票數量 }s[N]; int i,m=0; //定義全局變量 char ii[10]; void add();//函數聲明增加航班信息函數 void print(); //顯示航班信息 void search();//查找航班信息 void dingpiao();//訂票業務 void tuipiao();//退票 void read();//讀取文件 void save();//保存文件 void output();//輸出格式 void paixu();//航班排序 void chushihua();//系統初始化 void build();//建立數據文件 void paixu1();//按航班號從小到大排序 void paixu2();//從大到小 void main()//主函數 { int j; chushihua();//系統初始化判斷是否存在原始數據文件 printf(“ 歡迎使用飛機訂票系統n”);//打印出系統主界面 do { printf(“================================== ”); printf(“1.增加航班信息n” “t2.瀏覽航班信息n” “tt3.查找航班信息(按航班號)tt╮(╯_╰)╭n” “ttt4.航班排序(按航班號)n” “tttt5.訂票業務n” “to(︶︿︶)ottt6.退票業務n” “tttttt0.退出n”);printf(“================================== ”); printf(“請在0-6中選擇以回車鍵結束: ”);scanf(“%d”,&j);switch(j){ case 1: add();//調用增加航班函數 break; case 2:print();//調用顯示模塊 break; case 3:search();//調用查找模塊 break; case 4:paixu();//調用排序函數 break; case 5:dingpiao();//調用訂票模塊 break; case 6:tuipiao();//調用退票模塊 break; case 0: //退出系統 save(); printf(“謝謝使用,再見!”); break;} }while(j!=0);//判斷是否調用其他函數 } void chushihua()//定義系統初始化函數 { if(access(“hangban.dat”,0)){ build();} else read();} void build()//定義建立數據文件函數 { FILE *fp;//定義文件指針 if((fp=fopen(“hangban.dat”,“wb”))==NULL)//打開文件并判定是否出錯 { printf(“創建文件失敗!”);//打印出錯提示 getchar(); return;} printf(“請依次輸入航班信息(以回車鍵結束):n”); //打印提示信息 printf(“------------n”);for(i=0;i printf(“請輸入航班號: ”); scanf(“%d”,&s[i].num);//輸入航班號 printf(“請輸入起始站: ”); scanf(“%s”,s[i].start);//輸入起始站 printf(“請輸入終點站: ”); scanf(“%s”,s[i].over);//輸入終點站 printf(“請輸入時間(星期幾): ”); scanf(“%s”,s[i].time);//輸入時間 printf(“請輸入機票數: ”); scanf(“%d”,&s[i].count);//輸入機票數 fwrite(&s[i],sizeof(struct air),1,fp); m++; printf(“添加完畢,是否繼續添加?請鍵入y或n以回車鍵結束:”); scanf(“%s”,ii); if(strcmp(ii,“y”)!=0) //判斷是否繼續添加航班信息 { fclose(fp); //關閉文件 return; } } } void read() //定義讀取文件函數 { FILE *fp;if((fp=fopen(“hangban.dat”,“r”))==NULL){ printf(“創建文件失敗!”); getchar(); return;} i=0;while(!feof(fp)){ fread(&s[i],sizeof(struct air),1,fp);//逐塊讀取數據 i++; m++;//計算存在航班數 } m--;fclose(fp);} void save()//定義保存函數 { FILE *fp;if((fp=fopen(“hangban.dat”,“wb”))==NULL) { printf(“創建文件失敗!”); getchar(); return;} for(i=0;i //逐塊保存數據 fwrite(&s[i],sizeof(struct air),1,fp);fclose(fp);} void add()//定義增加航班信息函數 { do{ printf(“請依次輸入您要增加的航班信息(以回車鍵結束): n”); //打印提示信息 printf(“------------n”); printf(“請輸入航班號: ”); scanf(“%d”,&s[m].num);//讀取航班號 printf(“請輸入起始站: ”); scanf(“%s”,s[m].start);//讀取起始站 printf(“請輸入終點站: ”); scanf(“%s”,s[m].over);//讀取終點站 printf(“請輸入時間: ”); scanf(“%s”,s[m].time);//讀取時間 printf(“請輸入機票數: ”); scanf(“%d”,&s[m].count);//讀取機票數 m++; printf(“添加完畢,是否繼續添加?請鍵入y或n以回車鍵結束:”); scanf(“%s”,ii);}while(!strcmp(ii,“y”));//判斷是否繼續添加 } void output()//定義輸出格式函數 { printf(“航班號tt起始站tt終點站tt時間tt機票數n”);//信息標題 for(i=0;i printf(PRINT);//打印出信息 } void print()//定義顯示航班信息函數 { printf(“n目前我們有如下航班:n”);output(); //調用輸出格式函數 printf(“n請按回車鍵返回上層菜單 ”);getchar();getchar();} void search()//定義查詢函數 { int n; do { printf(“n請輸入航班號: ”); scanf(“%d”,&n);//輸入查詢的航班號 for(i=0;i { if(s[i].num==n)//按航班號判定輸出條件 { printf(“n您所查找的航班信息為:n ”); printf(“航班號tt起始站tt終點站tt時間tt機票數 nn”); printf(PRINT);//顯示信息 printf(“n查詢完畢,按回車鍵繼續”); getchar(); getchar(); return; } } printf(“n對不起,沒有您需要的信息!n ”);printf(“是否重新查找?請鍵入y或n以回車鍵結束 ”);scanf(“%s”,ii);}while(!strcmp(ii,“y”));//判定是否重新查找 } void dingpiao()//定義訂票業務函數 { int n;char a[10]=“y”;do { search();//調用查詢模塊 if(!strcmp(ii,“n”)) { printf(“對不起!沒有找到您所需要的航班,所以不能訂票。n”);//未查找到所需航班 printf(“n請按回車鍵返回上層菜單 ”); getchar(); getchar(); strcpy(ii,“n”); break; } do { printf(“請輸入您要訂的機票數(以回車鍵結束): ”); scanf(“%d”,&n);//輸入所訂機票數 if(n<=0) //判定機票數是否出錯 { printf(“輸入錯誤!至少需訂1張機票。n”); } else if(s[i].count==0)//判定機票是否售完 { printf(“對不起,你所選擇的航班的機票已售完!n”); break; } else if(s[i].count!=0&&s[i].count>=n)//判定機票數是否大于等于訂票數 { s[i].count=s[i].count-n; printf(“訂票成功!”); break; } else if(s[i].count { printf(“對不起,你所選擇的航班只剩 %d張機票n”, s[i].count); printf(“是否需要重新輸入機票數?請輸入y或n以回車鍵結束: ”);//判定是否重新輸入訂票數 scanf(“%s”,a); } }while(!strcmp(a,“y”)); printf(“是否需要訂其他航班的機票?請輸入y或n以回車鍵結束: ”); scanf(“%s”,a);}while(!strcmp(a,“y”));//判定是否繼續訂票 } void tuipiao()//定義退票函數 { int n;char a[10];do { search();//調用查詢函數 if(!strcmp(ii,“n”)) { printf(“對不起!沒有找到您所需要的航班,所以不能退票。n”); printf(“n請按回車鍵返回上層菜單 ”); getchar(); getchar(); strcpy(ii,“n”); break; } printf(“請輸入您要退的機票數目: ”); scanf(“%d”,&n);//輸入所退票數 if(n<=0) //判定票數是否有效 printf(“輸入錯誤!至少需退1張機票。”); else { s[i].count=s[i].count+n; printf(“退票成功!”); } printf(“是否繼續? 請鍵入y或n以回車鍵結束: ”);//判定是否繼續退票 scanf(“%s”,a);}while(!strcmp(a,“y”));//判定并跳出循環 } void paixu()//定義排序函數 { int n; printf(“n******************************************************************************** ”); printf(“1.按航班號從小到大排序n” “t2.按航班號從大到小排序n”);printf(“******************************************************************************** ”); printf(“請在1-2中選擇以回車鍵結束: ”);scanf(“%d”,&n);//輸入排序方式 switch(n){ case 1:paixu1();//調用從小到大排序函數 break; case 2:paixu2();//調用從大到小排序函數 break;} printf(“排序后的航班信息為:n”);output(); //顯示排序后航班信息 printf(“n請按回車鍵返回上層菜單 ”); getchar(); getchar();} void paixu1()//定義從小到大排序函數 { int k,j;struct air t;for(i=0;i { k=i; for(j=i+1;j if(s[k].num>s[j].num) k=j; if(i!=k) { t=s[k]; s[k]=s[i]; s[i]=t; } } } void paixu2()//定義從大到小排序函數 { } int k,j;struct air t;for(i=0;i if(s[k].num k=j;if(i!=k){ t=s[k]; s[k]=s[i]; s[i]=t;} }第二篇:數據結構課程設計c語言版《飛機訂票系統》
第三篇:數據庫課程設計+飛機訂票系統
第四篇:飛機訂票系統課程設計
第五篇:C語言課程設計——飛機訂票系統源代碼