- 相關(guān)推薦
免費vc++航空客運訂票系統(tǒng)+論文(一)
航空客運訂票系統(tǒng)
1 問題描述
航空客運訂票的業(yè)務(wù)活動包括:查詢航線、客票預(yù)訂和辦理退票等。試設(shè)計一個航空客運訂票系統(tǒng),以使上述業(yè)務(wù)可以借助計算機(jī)來完成。
1.1 每條航線所涉及的信息有:終點站名、航班號、飛機(jī)號、飛行周日(星期幾)、乘員定額、余票量、已訂票的客戶名單(包括姓名、訂票量、艙位等級1,2或3)以及等候替補(bǔ)的客戶名單(包括姓名、所需票量)
1.2 作為示意系統(tǒng),全部數(shù)據(jù)可以只放在內(nèi)存中
1.3 系統(tǒng)能實現(xiàn)的操作和功能如下:
1.3.1 查詢航線:根據(jù)旅客提出的終點站名輸出下列信息:航班號、飛機(jī)號、星期幾飛行,最近一天航班的日期和余票額
1.3.2 承辦訂票業(yè)務(wù):根據(jù)客戶提出的要求(航班號、訂票數(shù)額)查詢該航班票額情況,若尚有余票,則為客戶辦理訂票手續(xù),輸出座位號;若已滿員或余票額少于訂票額,則需重新詢問客戶要求。若需要,可登記排隊候補(bǔ)
1.3.3 承辦退票業(yè)務(wù):根據(jù)客戶提供的情況(日期、航班),為客戶辦理退票手續(xù),然后查詢該航班是否有人排隊候補(bǔ),首先詢問排在第一的客戶,若所退票額能滿足他的要求,則為他辦理訂票手續(xù),否則依次詢問其他排隊候補(bǔ)的客戶
2 概要設(shè)計
2.1 存儲結(jié)構(gòu)設(shè)計
typedef struct Al_Custom //已訂票客戶
{
char name[15];//姓名
int count;//訂票量
int level;//艙位等級
Al_Custom *next;//下一節(jié)點指針
}Al_Custom,*Al_CustomLink;
typedef struct Wait_Custom//等候替補(bǔ)的客戶
{
char name[15];//姓名
int count;//所需票量
Wait_Custom *next;//下一節(jié)點指針
}Wait_Custom;
typedef struct Wait_Queue//等待隊列
{
Wait_Custom *front;//隊列頭指針
Wait_Custom *rear;//尾指針
}Wait_Queue;
typedef struct Flight//航線
{
char terminus[15];//終點站名
char flight_no[10];//航班號
char plane_no[10];//飛機(jī)號
int week;//飛行周日
int count;//乘客定額
int rest;//余票量
Al_CustomLink Al_link;//指向成員名單鏈表的頭指針
Wait_Queue wait_queue;//等待替補(bǔ)隊列
}Flight;
2.2 主要算法設(shè)計
2.2.1 主程序模塊:
void main()
{
初始化;
do{
接受命令;
處理命令;
}while(命令!="退出");
}
2.2.2 查詢航線模塊——實現(xiàn)查詢功能
void findFlight()
{
提示輸入要查詢航線的終點站名;
如果存在該航線,則輸出該航線信息;
否則提示不存在該航線;
}
2.2.3 承辦訂票業(yè)務(wù)模塊——實現(xiàn)訂票功能
void dingpiao()
{
提示輸入航班號和訂票數(shù);
若不存在該航班號,則提示不存在該航線;
否則{
如果有余票,則辦理業(yè)務(wù);
否則提示沒有足夠的余票,詢問是否候補(bǔ);
若是,則排隊候補(bǔ);
}
}
2.2.4 承辦退票業(yè)務(wù)模塊——實現(xiàn)退票功能
void tuipiao()
{
提示輸入航班號和飛行周日;
確認(rèn)航班號和飛行周日都存在,并且客戶有訂票,
則 {執(zhí)行退票;
為排隊候補(bǔ)的客戶辦理訂票業(yè)務(wù);
}
否則{
提示有誤
}
}
2.3 測試用例設(shè)計
2.3.1 航線3條:1001 hp001 shanghai 2 50
1002 hp002 beijing 5 50
1003 hp003 guangzhou 7 50
2.3.2 查詢航線:shanghai
2.3.3 承辦訂票業(yè)務(wù):航班號1001 數(shù)額30 姓名chengangjie 艙位等級2
2.3.4 承辦訂票業(yè)務(wù):航班號1001 數(shù)額23 姓名zhenxi 艙位等級3
2.3.5 承辦退票業(yè)務(wù):姓名chengangjie 航班號1001 飛行周日2
2.3.6 查詢航線:終點站名:shanghai
3 調(diào)試分析
3.1 本次的設(shè)計比較困難,需要實現(xiàn)較多的功能,所以在調(diào)試過程中不太順利,主要是指針的修改。經(jīng)過反復(fù)調(diào)試以后才得以解決。
3.2 本程序航線采用數(shù)組的存儲結(jié)構(gòu),每條航線包含8個域,其中乘員名單域為指向乘員名單鏈表的頭指針,等候替補(bǔ)的客戶名單域為分別指向?qū)︻^和對尾的指針。
3.3 訂票函數(shù)是在退票業(yè)務(wù)模塊中使用
4 經(jīng)驗和體會
通過這次的程序設(shè)計,進(jìn)一步理解了鏈表和隊列結(jié)構(gòu)的實現(xiàn)和應(yīng)用。尤其需要注意的是:對于指針的修改要仔細(xì),否則會發(fā)生意想不到的結(jié)果。
5 源程序清單和運行結(jié)果
5.1 程序清單
#include<iostream.h>
#include<iomanip.h>
#include<string.h>
#include<stdio.h>
#include<conio.h>
#define FLIGHT_NUM 100//航線最大數(shù)量
typedef struct Al_Custom //已訂票客戶
{
char name[15];//姓名
int count;//訂票量
int level;//艙位等級
Al_Custom *next;//下一節(jié)點指針
}Al_Custom,*Al_CustomLink;
typedef struct Wait_Custom//等候替補(bǔ)的客戶
{
char name[15];//姓名
int count;//所需票量
Wait_Custom *next;//下一節(jié)點指針
}Wait_Custom;
typedef struct Wait_Queue//等待隊列
{
Wait_Custom *front;//隊列頭指針
Wait_Custom *rear;//尾指針
}Wait_Queue;
typedef struct Flight//航線
{
char terminus[15];//終點站名
char flight_no[10];//航班號
char plane_no[10];//飛機(jī)號
int week;//飛行周日
int count;//乘客定額
int rest;//余票量
Al_CustomLink Al_link;//指向成員名單鏈表的頭指針
Wait_Queue wait_queue;//等待替補(bǔ)隊列
}Flight;
void Custom_init(Al_CustomLink &L)
{
L=new Al_Custom;
L->next=0;
}
void Custom_insert(Al_CustomLink &L,Al_Custom& custom)
{
Al_Custom *p=L,*newnode=new Al_Custom;
memcpy((void*)newnode,&custom,sizeof(Al_Custom));
newnode->next=p->next;
p->next=newnode;
}
void copyCustomLink(Al_CustomLink &dest,Al_CustomLink &source)//復(fù)制已訂票客戶鏈表
{
Al_CustomLink p=source;
Al_CustomLink q;
Al_Custom *pnew;
Custom_init(dest);
q=dest;
while(p->next)
{
pnew=new Al_Custom;
memcpy(pnew,p->next,sizeof(Al_Custom));
pnew->next=0;
q->next=pnew;
q=pnew;
p=p->next;
}
}
void Waiter_init(Wait_Queue &Q)
{
Q.front=Q.rear=new Wait_Custom;
Q.front->next=0;
}
void Waiter_En(Wait_Queue &Q,Wait_Custom& custom)
{
Wait_Custom *newnode=new Wait_Custom;
memcpy(newnode,&custom,sizeof(Wait_Custom));
newnode->next=0;
Q.rear->next=newnode;
Q.rear=newnode;
}
bool Waiter_De(Wait_Queue &Q,Wait_Custom& custom)
{
if(Q.rear==Q.front)
return false;
memcpy(&custom,Q.front,sizeof(Wait_Custom));
Wait_Custom *p=Q.front->next;
Q.front->next=p->next;
if(Q.rear!=Q.front)
Q.rear=Q.front;
delete p;
custom.next=0;
return true;
}
void copyWait_Queue(Wait_Queue &dest,Wait_Queue& source)//復(fù)制等待隊列
{
Wait_Custom *p=source.front;
Waiter_init(dest);
while(p->next)
{
Waiter_En(dest,*p);
p=p->next;
}
}
int flight_no;//航線數(shù)量
Flight flight[FLIGHT_NUM];//航線數(shù)組
void initFlight(Flight &f)//初始化一條航線
{
char ch=0;
strncpy((char*)&f,&ch,sizeof(Flight));
Custom_init(f.Al_link);
Waiter_init(f.wait_queue);
}
void initFlight()//初始化航線數(shù)組
{
flight_no=0;
char ch=0;
strncpy((char*)flight,&ch,FLIGHT_NUM*sizeof(Flight));
for(int i=0;i<FLIGHT_NUM;i++)
{
Custom_init(flight[i].Al_link);
Waiter_init(flight[i].wait_queue);
}
}
void insertFlight(Flight& f)//按終點站名有序插入航線到航線數(shù)組
{
int i=-1;
while(i+1<flight_no && strcmp(f.terminus,flight[i+1].terminus)==1)
{
i++;
}
for(int j=flight_no-1;j>=i+1;j--)
{
memcpy((void*)(&(flight[j+1])),(void*)(&(flight[j])),sizeof(Flight));
}
memcpy((void*)(&(flight[i+1])),(void*)(&f),sizeof(Flight));
Custom_init(flight[i+1].Al_link);
Waiter_init(flight[i+1].wait_queue);
copyCustomLink(flight[i+1].Al_link,f.Al_link);
copyWait_Queue(flight[i+1].wait_queue,f.wait_queue);
flight_no++;
}
void init()
{
int m;
cout<<"請輸入航線條數(shù):";
cin>>m;
for(int i=1;i<=m;i++)
{
Flight f;
initFlight(f);
cout<<"輸入第"<<i<<"條航線:"<<endl;
cout<<"航班號:";
cin>>f.flight_no;
cout<<"飛機(jī)號:";
cin>>f.plane_no;
cout<<"終點站名:";
cin>>f.terminus;
cout<<"飛行周日:";
cin>>f.week;
cout<<"成員定額:";
cin>>f.count;
f.rest=f.count;
insertFlight(f);
printf("\n");
}
}
int findbyname(char terminus[15])//根據(jù)終點站名查找
{
for(int i=0;i<flight_no;i++)
{
if(strcmp(flight[i].terminus,terminus)==0)
{
return i;
}
}
return -1;
}
int findbyno(char no[10])//根據(jù)航班號查找
{
for(int i=0;i<flight_no;i++)
{
if(strcmp(flight[i].flight_no,no)==0)
{
return i;
}
}
return -1;
}
void findFlight()//查詢航線子模塊
{
char terminus[15];
cout<<"請輸入要查詢航線的終點站號:";
cin>>terminus;
int index=findbyname(terminus);
if(index==-1)
{
printf("該航線不存在!\n");
return ;
}
cout<<setw(12)<<"航班號"<<setw(12)<<"飛機(jī)號"<<setw(12)<<"飛行周日"<<setw(12)<<"余票額"<<endl;
cout<<setw(12)<<flight[index].flight_no
<<setw(12)<<flight[index].plane_no
<<setw(12)<<flight[index].week
<<setw(12)<<flight[index].rest<<endl<<endl;
}
void dingpiao(int index)
{
Wait_Custom *p=flight[index].wait_queue.front;
while(p!=flight[index].wait_queue.rear)
{
if(p->next->count<=flight[index].count)
{
cout<<"為"<<p->next->name<<"辦理訂票手續(xù)"<<endl;
Al_Custom *pnew=new Al_Custom;
pnew->count=p->next->count;
flight[index].rest-=p->next->count;
strcpy(pnew->name,p->next->name);
do{
cout<<"請"<<p->next->name<<"輸入所需要的艙位等級(1-3):";
cin>>pnew->level;
}while(pnew->level<1 || pnew->level>3);
pnew->next=flight[index].Al_link->next;
flight[index].Al_link->next=pnew;
Wait_Custom *q=p->next;
p->next=q->next;
if(flight[index].wait_queue.rear==q)
flight[index].wait_queue.rear=p;
delete q;
}
}
}
void dingpiao()//承辦訂票業(yè)務(wù)子模塊
{
char no[10];//航班號
int count;//訂票量
cout<<"請輸入航班號和訂票數(shù)額:";
cin>>no>>count;
int index=findbyno(no);
if(index==-1)
{
cout<<"該航線不存在"<<endl;
return ;
}
if(flight[index].rest>=count)//尚有余票
{
Al_Custom *pnew=new Al_Custom;
cout<<"請輸入您的姓名:";
cin>>pnew->name;
cout<<"請輸入您要訂的艙位等級:";
cin>>pnew->level;
pnew->count=count;
pnew->next=0;
flight[index].rest-=count;
pnew->next=flight[index].Al_link->next;
flight[index].Al_link->next=pnew;
}
else//沒有余票
{
cout<<"該航班的余票額不能滿足您的要求,是否排隊候補(bǔ)(y/n):";
cout.flush();
char select;
do{
select=getch();
}while(select!='y' && select!='n');
if(select=='y')//排隊候補(bǔ)
{
Wait_Custom *pnew=new Wait_Custom;
cout<<endl;
cout<<"請輸入您的姓名:";
cin>>pnew->name;
pnew->count=count;
pnew->next=0;
flight[index].wait_queue.rear->next=pnew;
flight[index].wait_queue.rear=pnew;
cout<<flight[index].wait_queue.rear->name<<endl;
}
else
{
}
}
}
void tuipiao()//承辦退票業(yè)務(wù)子模塊
{
cout<<"請輸入您的姓名:";
char name[15];
cin>>name;
cout<<"請輸入你要退票的航班號與飛行周日:";
int week;
char no[10];
cin>>no>>week;
bool isfind=false;
for(int index=0;index<flight_no;index++)
{
if(flight[index].week==week && strcmp(flight[index].flight_no,no)==0)
{
Al_Custom *p=flight[index].Al_link;
while(p && p->next)
{
if(strcmp(p->next->name,name)==0)
{
isfind=true;
Al_Custom *q=p->next;
p->next=q->next;
{
flight[index].rest+=q->count;
cout<<flight[index].rest<<endl;
dingpiao(index);//為第index條航線排隊等候的客戶辦理訂票手續(xù)
}
delete q;
}
p=p->next;
}
}
}
if(!isfind)
{
cout<<"您沒有訂該天該航班的票!"<<endl;
return;
}
cout<<"退票成功!"<<endl;
}
void welcome()
{
cout<<"選擇操作:"<<endl;
cout<<" 1.查詢航線"<<endl;
cout<<" 2.承辦訂票業(yè)務(wù)"<<endl;
cout<<" 3.承辦退票業(yè)務(wù)"<<endl;
cout<<" 4.退出"<<endl;
}
void main()
{
initFlight();
init();
char ch;
do{
welcome();
do{
ch=getch();
}while(ch<'1' || ch>'4');
switch(ch)
{
case '1':
findFlight();
break;
case '2':
dingpiao();
break;
case '3':
tuipiao();
break;
case '4':
break;
}
}while(ch!='4');
}
5.2 運行結(jié)果:
5.2.1 輸入航線:
5.2.2 查詢航線:
5.2.3 承辦訂票業(yè)務(wù):
5.2.4 承辦退票業(yè)務(wù):
5.2.5查詢航線:
【免費vc++航空客運訂票系統(tǒng)+論文(一)】相關(guān)文章:
免費vc++網(wǎng)上尋呼QICQ源代碼(附帶論文)(一)11-22
視頻監(jiān)控系統(tǒng)―視頻捕獲和傳輸模塊VC++03-08
基于USB接口的數(shù)據(jù)采集系統(tǒng)-GSM功率測量VC++03-08
國內(nèi)航空客運收入管理的應(yīng)用模型03-24
免費畢業(yè)論文--齒輪鏈輪套件設(shè)計(一)03-08