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