本项目涉及到的知识:指针、结构体数组、链表、参数传递
〔问题描述〕航空客运订票的业务活动包含查询航线和客票预订信息,可以办理订、退票等,用c语言设计一个程序模拟实现。
(1)航班信息:飞机抵达的城市、航班号、飞机号、起降时间、航班票价、总位置和剩余位置、已订票的客户名单。(设出发城市固定)
(2)客户信息:客户姓名、证件号、座位号。
(1)订票业务:根据客户提出的要求(飞机抵达的城市、起降时间、订票数量)查询该航班的信息(包括票价和剩余票数),若满足要求,则为客户办理订票手续,输出座位号。
(2)承办退票业务:根据客户提供的情况(航班号、订票数量)为客户办理退票手续。
(1)根据航班号或抵达城市输出相关航班信息。
(2)查询客户预订信息:根据客户证件号输出航班号、飞机号和座位号。
随着时代的发展,智能化生产给社会带来方便与精确,本系统以方便大众,妥善管理机场票务操作为基旨而开发。本程序以数据结构(c语言描述)存储结构进行开发。利用单链表等存储方式为基础进行开发。
本系统可以向客户提供订票业务。若航班票已售完,则会提示相关信息。可退票,退票后修改相关数据文件并保存,若有,则按排队先后售票。客户资料有姓名,证件号,订票数量及航班情况,订单有编号。修改航班信息:当航班信息改变可以修改航班数据文件。
根据lineinfo这个结构体的所有已经事先定义好的飞机的每个消息打印输出,先将一些输出控制符包装在display()函数里面,做好这一步以后然后定义list()函数在list函数中实现结构体指针与结构体数组指针相互对接,从而达到赋值的效果。然后在利用循环自增的方式不断调用display()从而达到输出航线信息的效果。
该模块的开始就是先调用结构体的航班信息,从而得到航班号,然后调用find()函数会得到一个关于航信信息的指针,判断这个指针是否为空从而调用打印函数打印该航班号现有所有的乘客信息,相关的流程图如下:
根据客户需要输入终点站名info->terminal_name ,用strcmp函数即strcmp (name,info->terminal_name)比较,若相同,则输出该航班信息,若不同则输出“对不起,该航班没找到!”该模块功能图下所示:
若客户订票额超过乘员定票总额,退出。若客户订票额末超过余票量,订票成功并等记信息。如图所示:
调用查询函数search(),根据客户提供的航线终点调用find()函数进行搜索,根据客户提供的姓名到订票客户名单域进行循环查询若返回的信息中姓名为空则表示找到,退出本模块,并且提示("对不起你没有订过票!)若信息查询成功,则会找到客户的订单姓名,再将指针把向后移动一位,等下一位用户购票时则会覆盖当前的这位退票的用户,这样就达到了退票删除订票客户名单域中的信息的效果,重新将航线名单域指向订票单链表的头指针指向排队等候名单队列的头结点。该模块采用的是顺序表与单链表相互结合使用的算法,顺序表用来存储每个客户的所有信息,在这里每个客户的所有信息是主体。单链表用来存储多个客户的信息,在这里多个客户是主体。
利用break语句退出switch(语句)从而达到退出整个系统的作用。
根据旅客提出的终点站名输出下列信息:终点站名,航班号,飞机号,飞行日期 航班票价,总位置,余票量。浏览航线信息的数据如下,系统自动添加7组数据作为参考输入数字2然后输入目的地即可调出该页面
根据客户提出的要求(航班号、订票数额)查询该航班票额情况,若尚有余票,则为客户办理订票手续。
输出座位号:购票成功的客户系统会自动打印座位号。订票系统的具体操作与添加数据如下,输入数字4即可进入该阶段在输入相关的信息之后系统会自动将该电话号码进行加密保存,已到到保护客户信息的效果。
根据客户提供的情况(姓名),为客户办理退票手续。客户在购买好票以后,可能会有退票或者换乘的想法,这时候数字5即可进入退票系同即可进行相关的操作,退票不需要输入身份ID只需要输入订票人的姓名即可成功退票
打印输入所有的航班信息 终点站名——航班号——飞机号——飞行日期 ——航班票价——总位置——余票量。浏览航线信息的数据如下,系统自动添加7组数据作为参考输入数字一即可调出该页面
客户在进入订票系统订票以后将会进入查询该飞机乘客查询界面,这时只会将客户的新明透露出来,而前面输入的电话号码已经被加密处理,输入数字2即可进入该阶段在输入相关的信息。
客户在所有的操作完成后会有一个退出系统的操作,输入数字6即可退出该订票系统。
6.1、浏览航线信息的数据如下,系统自动添加7组数据作为参考输入数字一即可调出该页面:
中文页面:
英文页面:
6.2、订票系统的具体操作与添加数据如下,输入数字4即可进入该阶段在输入相关的信息之后系统会自动将该电话号码进行加密保存,已到到保护客户信息的效果。
6.3、客户在进入订票系统订票以后将会进入查询该飞机乘客查询界面,这时只会将客户的新明透露出来,而前面输入的电话号码已经被加密处理,输入数字2即可进入该阶段在输入相关的信息。
6.4、客户在进行订票之前可以先查看该班次的飞机是否还有空余的座位,以便进行是否乘坐改班次。按下数字3即可进行航班的飞机号,输入目的地即可查询相关的票价信息与座位信息。
6.5、客户在购买好票以后,可能会有退票或者换乘的想法,这时候数字5即可进入退票系同即可进行相关的操作,退票不需要输入身份ID只需要输入订票人的姓名即可成功退票:
6.6、客户在所有的操作完成后会有一个退出系统的操作,输入数字6即可退出该订票系统:
录入功能:原始数据的输入(通过结构体数组输入航线的基本信息)。
查询功能:根据客户需要,查询相关航线。
订票功能:满足客户的订票任务。
退票功能:根据客户的不同情况,支持客户的退票请求。退出功能:退出系统。
在将近一周的时间里,不断地对程序及各模块进行修改、编译、调试、运行,其间遇到很多问题:
(1)程序在起初设计的时候,经常出现溢出错误,而且不只一处。为了修正这些益出错误,耗费了大量的时间,修正解释之后再看源程序,才发现原来只是因为开始的函数定义的数据类型出现了问题,对函数的定义不清楚,字符的不正确定义造成了后期大量的纠错工作.
(2)由于忘记了一些c语言的规范使得在调试过程中一些错误没有发现。例如,周用函数时,数组只需要传递数组名即可;字符‘0’和整型的0是不同的,不可以直妾对其画等号。
(3)测试用例具有一定的广泛性。运行程序时输入了多种不同字符信息,经过多次修改结果达到了预期效果,说明程序具有一定的可靠性和稳定性。
2.经过不断地学习,终于结束了这次的课程设计,虽然最后也受益匪浅,但是其中仍显现出许多的不足:
(1)录入系统,每次输入的数据会覆盖上次输入的数据。
(2)查询系统,只能查找最近输入的数据,并且相同终点站只能显现一个信息。( 3)在数据初始化的时候未对数据按照一定的顺序存放,如果航线信息较多时将可会出现数据错误的的情况。
(3)用户在进行错误购票以后,如果想换票那么只能先 购票->退票->买票这样非常的消耗时间,可以扩展为直接选择正确的航班以及票次,以达到节省时间的效果,也省却了反复操作和减少程序运行次数的效果。
程序问题加Q:3125841747
乘客的初始化定义:
typedef struct ord_ros {
char name[size];//客户姓名
int order_amount;//订票量
int IdNumber;//身份id
struct ord_ros *next;
} linklist;
linklist *new,*p1,*head;
航班的初始化信息定义:
typedef struct airline {
char terminal_name[size];//终点站名
char air_Numer[size];//航班号
char plane_Numer[size];//飞机号
char day[100];//飞行日期
int ticket_price; //机票价格
int Sum_Ticket_Numer;//总位置
int ticket_sur;//余票量
linklist *order;//乘员名单域指向乘员名单链表的头指针
} lineinfo;
lineinfo *start;
打印全部航班信息:
void list(){
lineinfo *info;
info=start;
int i;
printf("终点站名\t航班号\t飞机号\t\t飞行日期\t\t\t航班票价\t总位置\t余票量");
for(i=0;i
根据客户提出的终点站名输出航线信息:
void search(){
struct airline *info,*find();
char name[10];
int i=0;
info=start;
printf("请输入终点站名:");
scanf("%s",name);
while(iterminal_name)) break;
info++;
i++;
}
if(i>=MAXSIZE)
printf("对不起,该航线未找到!\n");
else {
printf("终点站名\t航班号\t飞机号\t\t飞行日期\t\t\t航班票价\t总位置\t余票量");
display(info);
}
}
打印订票乘员名单域的客户名单信息:
void prtlink(){
linklist *p;
struct airline *info;
info=find();
p=info->order;
if(p!=NULL) {
printf("客户姓名 订票数额 客户ID\n");
while(p) {
printf("%s\t\t%d\t%d\n",p->name,p->order_amount,p->IdNumber);
p=p->next;
}
} else
printf("该航线没有客户信息!!\n");
}
增加订票乘员名单域的客户信息:
linklist *insertlink(linklist *head,int amount,char name[],int IdNumber){
linklist *p1,*new;
p1=head;
new=(linklist *)malloc(sizeof(linklist));
if(!new) {
printf("\nOut of memory!!\n");
return NULL;
}
strcpy(new->name,name);
new->order_amount=amount;
new->IdNumber=IdNumber;
new->next=NULL;
if(head==NULL) //若原无订票客户信息
{
head=new;
new->next=NULL;
} else
head=new;
new->next=p1;
return head;
}
办理订票业务:
void order(){
struct airline *info;
int amount,IdNumber;
char name[10];
info=start;
if(!(info=find())) return;//根据客户提供的航班号进行查询如为空退出该模块
printf("请输入你所需要的订票数量:");
scanf("%d",&amount);
if(amount>info->Sum_Ticket_Numer){ //若客户订票额超过乘员定票总额退出
printf("\n对不起您输入的票的数量已经超过乘员定额!");
return;
}
if(amount<=info->ticket_sur){//若客户订票额末超过余票量订票成功并等记信息
printf("请输入您的订票客户姓名:");
scanf("%s",name);
printf("请输入%s的电话号码:",name);
scanf("%d",&IdNumber);
info->order=insertlink(info->order,amount,name,IdNumber);//在订票乘员名单域中添加客户信息
for(int i=0; iSum_Ticket_Numer-info->ticket_sur+i+1);
info->ticket_sur-=amount;//该航线的余票量应减掉该客户的订票量
printf("\n祝您乘坐愉快\n");
} else
printf("\n欢迎您下次再次订购\n");
}
退票模块:
void return_tkt(){
struct airline *info;
int IdNumber;
linklist *p1,*p2,*head;
char cusname[10];
if(!(info=find())) return;//调用查询函数根据客户提供的航线进行搜索
head=info->order;
p1=head;
printf("请输入退票客户的姓名:");
scanf("%s",cusname);
while(p1!=NULL) {//根据客户提供的姓名到订票客户名单域进行查询
if(!strcmp(cusname,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_sur+=p1->order_amount;
IdNumber=p1->IdNumber;
printf("%s成功退票!!\n",p1->name);
}
}
菜单界面:
int menu_select(){
int c;
printf("\t\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("请选择:");
scanf("%d",&c);
} while(c<0||c>7);
return c;
}
航线模块:
struct airline air_info[MAXSIZE]= {
{"北京","K12312","B8571","2021/07/05-13:00--2021/07/05-15:00",509,100,100},
{"上海","D24322","S1002","2021/07/06-13:00--2021/07/06-15:00",529,100,100},
{"伦敦","K35234","L1003","2021/07/07-13:00--2021/07/07-15:00",642,100,100},
{"杭州","D42414","B9571","2021/07/08-13:00--2021/07/08-15:00",322,100,100},
{"武汉","K12314","B3451","2021/07/09-13:00--2021/07/09-15:00",562,100,100},
{"广州","K64124","C3451","2021/07/10-13:00--2021/07/10-15:00",645,100,100},
{"美国","H12412","M3451","2021/07/11-13:00--2021/07/11-15:00",685,100,100} };
start=air_info;