数据结构课程设计c语言版《飞机订票系统》_飞机订票系统课程设计

2020-02-28 其他范文 下载本文

数据结构课程设计c语言版《飞机订票系统》由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“飞机订票系统课程设计”。

软件工程专业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 #include #include #include #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(iter_name))/*有该站名strcmp则返回,if(!0)即break*/

{

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(amounttkt_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;ireq_amt;i++){ } info->tkt_sur-=t->req_amt;info->order=insertlink(info->order,t->req_amt,t->name,grade);/*插入到订票客free(t);break;printf(“%s的座位号是:%dn”,t->name,(info->tkt_sur)-i);

/*输出座位号*/ 户名单链表中*/ int i;back->next=t->next;printf(“%s订票成功!n”,t->name);for(i=0;ireq_amt;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(c6);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 页

《数据结构课程设计c语言版《飞机订票系统》.docx》
将本文的Word文档下载,方便收藏和打印
推荐度:
数据结构课程设计c语言版《飞机订票系统》
点击下载文档
相关专题 飞机订票系统课程设计 数据结构 订票 语言版 飞机订票系统课程设计 数据结构 订票 语言版
[其他范文]相关推荐
    [其他范文]热门文章
      下载全文