1、数据结构课程设计数据结构课程设计航空订票系统一、设计目的: 编写一个航空订票系统,可以在系统中录入并修改各个航班的具体情况,帮助乘客准确的查询个航班的最新信息(包括航班号、航班的起始时间和地点。票价)和各个项目业务的及时办理(包括订票、退票等)。二、任务:航空客运定票的业务活动包括:查询航线、客票预定和办理退票等。试设计一个航空客运定票系统,以使上述业务可以借助计算机来完成。三、功能要求:1) 录入:可以录入航班情况(数据可以存储在一个数据文件中,数据结构、具体数据自定)2) 查询:可以查询某个航线的情况(如,输入航班号,查询起降时间,起飞抵达城市,航班票价,票价折扣,确定航班是否满仓);可以
2、输入起飞抵达城市,查询飞机航班情况;3) 订票:(订票情况可以存在一个数据文件中,结构自己设定)可以订票,如果该航班已经无票,可以提供相关可选择航班;4) 退票: 可退票,退票后修改相关数据文件;5) 客户资料:有姓名,证件号,订票数量及航班情况,订单要有编号;6) 修改航班信息:当航班信息改变可以修改航班数据文件。四、设计程序:#include#include#include#define N 100/最大容量 typedef struct Flight/航班信息 char FlightNumber6;/航班号 char SPlace10;/起始地 char DPlace10;/目的地 ch
3、ar Stime5;/起飞时间 char Etime5;/降落时间 int price;/票价 int RemnantSeat;/剩余座位数Flight; typedef struct Order/订单信息 int OrderNumber;/订单编号 char PName10;/乘客姓名 char ID20;/身份证号 char FlightNumber6;/航班号 int num;/订票数量Order;Flight flN;Order odN;int i,j;/两个常用角标变量 int lenf=0;/航班数 int leno=0;/订单数 char ch;/获取用户选择的变量char fi
4、lenamef=flight.txt;/航班文件名char filenameo=order.txt;/订单文件名void save()/保存信息 FILE *fp; if(fp=fopen(filenamef,w)!=NULL)/打开文件 保存航班信息 for(i=0;ilenf;i+)/写入文件 fprintf(fp,%st%st%st%st%st%dt%dn,fli.FlightNumber,fli.SPlace,fli.DPlace,fli.Stime,fli.Etime,fli.price,fli.RemnantSeat); fclose(fp);/关闭文件 if(fp=fopen(f
5、ilenameo,w)!=NULL)/打开文件 保存订单信息 for(i=0;ileno;i+)/写入文件 fprintf(fp,%dt%st%st%st%dn,odi.OrderNumber,odi.PName,odi.ID,odi.FlightNumber,odi.num); fclose(fp);/关闭文件 void load()/读取信息 FILE *fp; if(fp=fopen(filenamef,r)!=NULL)/打开文件 读取航班信息 i=0; while(!feof(fp)/读取文件 fscanf(fp,%s%s%s%s%s%d%d,&fli.FlightNumber,&f
6、li.SPlace,&fli.DPlace,&fli.Stime,&fli.Etime,&fli.price,&fli.RemnantSeat); if(!feof(fp) i+; lenf=i;/航班数量 fclose(fp);/关闭文件 if(fp=fopen(filenameo,r)!=NULL)/打开文件 读订单信息 i=0; while(!feof(fp)/读取文件 fscanf(fp,%d%s%s%s%d,&odi.OrderNumber,&odi.PName,&odi.ID,&odi.FlightNumber,&odi.num); if(!feof(fp) i+; leno=i;
7、/订单数量 fclose(fp);/关闭文件 int check(char s)/检查是否重复 int g=0; for(;glenf;g+) if(strcmp(flg.FlightNumber,s)=0 & g!=i)/对比是否相同 相同就说明重复了 return g;/表示重复了 return -1;/遍历了整个数组都没发现重复的 表示没有重复void input()/录入信息 system(cls);/清屏 for(i=lenf;iN;i+) printf(请输入航班号:); gets(fli.FlightNumber); while(check(fli.FlightNumber)!=
8、-1)/检查是否重复 printf(航班号重复,请重新输入:); gets(fli.FlightNumber); printf(请输入下列信息:n); printf(出发地:); gets(fli.SPlace); printf(目的地:); gets(fli.DPlace); printf(起飞时间:); gets(fli.Stime); printf(降落时间:); gets(fli.Etime); printf(票价:); scanf(%d,&fli.price); printf(剩余座位数:); scanf(%d,&fli.RemnantSeat); getchar();/消除回车 l
9、enf+;/航班数加1 printf(航班信息录入完成! 是否继续录入下一列航班信息?(y/n):); while(1) ch=getchar(); getchar();/消除上一步产生的回车符 if(ch=y | ch=Y | ch=n | ch=N) break; else printf(请重新输入:); if(ch=n | ch=N) break; save();/保存 void modify()/修改信息 char s20; system(cls);/清屏 printf(请输入要修改的航班号:); gets(s); for(i=0;ilenf;i+)/查询是否存在输入的信息 if(st
10、rcmp(fli.FlightNumber,s)=0) break;/存在 结束循环 if(i=lenf) printf(没有您输入航班信息,请按回车返回); getchar(); return; printf(请输入新的航班号:); gets(fli.FlightNumber); while(check(fli.FlightNumber)=1)/检查是否重复 printf(航班号重复,请重新输入:); gets(fli.FlightNumber); printf(请更新下列信息:n); printf(出发地:); gets(fli.SPlace); printf(目的地:); gets(fl
11、i.DPlace); printf(起飞时间:); gets(fli.Stime); printf(降落时间:); gets(fli.Etime); printf(票价:); scanf(%d,&fli.price); printf(剩余座位数:); scanf(%d,&fli.RemnantSeat); getchar();/消除回车 save();/保存 printf(修改成功!n); system(pause);/任意键继续 void book() / 订票 system(cls);/清屏 i=leno; printf(请输入您的姓名:); gets(odi.PName); printf
12、(请输入您的身份证号:); gets(odi.ID); printf(请输入订票的航班号:); gets(odi.FlightNumber); for(j=0;jlenf;j+) if(strcmp(flj.FlightNumber,odi.FlightNumber)=0 )/对比是否相同 break; if(j=lenf)/ 表示航班不存在 printf(航班号不存在!请按回车返回); getchar(); return; printf(请输入订票数量:); scanf(%d,&odi.num); flj.RemnantSeat-=odi.num;/新的剩余票数 printf(请输入订单编号
13、:); scanf(%d,&odi.OrderNumber); getchar();/消除回车 leno+;/订单数加1 save();/保存到文件 printf(定票成功。n); system(pause);/任意键继续 void back() / 退票 int num; system(cls);/清屏 printf(请输入要退票的订单编号:); scanf(%d,&num); getchar();/消除回车 for(i=0;ileno;i+) if(odi.OrderNumber=num)/检查是否存在订单编号 break; if(i=leno) printf(航班号不存在!请按回车返回)
14、; getchar(); return; j=check(odi.FlightNumber);/获取航班的下标 flj.RemnantSeat+=odi.num;/新的剩余票数 odi=odleno-1;/最后一条订单覆盖退票的订单 leno-;/订单数减1 save();/保存 printf(退票成功。n); system(pause);/任意键继续 void search_num() /航班信息查询(按航班号) char s20; system(cls);/清屏 printf(请输入要查询的航班号:); gets(s); for(i=0;ilenf;i+)/查询是否存在输入的信息 if(s
15、trcmp(fli.FlightNumber,s)=0) break;/存在 结束循环 if(i=lenf) printf(航班号不存在!请按回车返回); getchar(); return; printf( 查询成功!n); printf(*n); printf(航班号 起始地 目的地 起飞时间 降落时间 票价 剩余座位数nn); printf(%-8s%-10s%-10s %-10s%-10s %-6d%dn,fli.FlightNumber,fli.SPlace,fli.DPlace,fli.Stime,fli.Etime,fli.price,fli.RemnantSeat); prin
16、tf(*n); system(pause);/任意键继续void search_line() /航班信息查询(按路线) char s20,e20; int flag=0; system(cls);/清屏 printf(请输入要查询的路线的起点:); gets(s); printf(请输入要查询的路线的终点:); gets(e); printf( 查询成功!n); printf(*n); printf(航班号 起始地 目的地 起飞时间 降落时间 票价 剩余座位数nn); for(i=0;i=1&n=20)y=1; if(y)break; else printf(输入数据有误,请重新输入:); 这
17、样的循环体现了很好的容错性,输入数据不合理会返回让用户重新输入的提示,更友好。本程序中我设计让男子项目去前五名,女子项目取前三名。因此对应的名次可以分别积分7、5、3、2、1和5、3、2。然后定义了print函数,可以按不同要求输出成绩和编号等信息。而后定义bianhao( )、zongfen( )、malezf( )、femalezf( )可以分别按学校编号、学校总分、男子总分和女子总分输出结果。然后定义了菜单函数solve( )来调用不同的排序函数。最后定义了cxsch( )和cxxm( )两函数以实现按学校和项目查询成绩。该题我规定了男子项目取前五名,女子项目取前三名。函数调用关系如下图
18、: main( ) Input( ) solve( ) bianhao( ) zongfen( ) malezf( ) femalezf( ) cxsch( ) cxxm( ) print( )4、算法流程图 五、算法设计分析 功能要求有:可以输入各个项目的前三名或前五名的成绩;能统计各学校总分;可以按学校编号、学校总分、男女团体总分排序输出;可以按学校编号查询学校某个项目的情况。所以利用结构体创建两个数组,数组sch 包含学校名称、编号、总分、男子总分、女子总分等内容;数组pro 包含项目名称、项目编号以及该项目前三名或前五名的学校编号。 需要注意的是,预处理命令中使用了iostream、i
19、omanip、fstream等头文件,因此可以更方便的使用一些C+中的输入输出语句。六、源代码#include #include #include #includeusing namespace std; int n; /n个学校 int m; /m个男子项目 int w; /w个女子项目 struct pro /表示项目的结构体 string name; /项目名称 int snum6; /前3或5名学校的编号 p21; struct school /表示学校的结构体 int num; string name; /学校名称 int score; /学校总分 int male; /男子总分 i
20、nt female; /女子总分 sch21; int qianwu5=7,5,3,2,1; /前五名得分 int qiansan3=5,3,2; /前三名得分void input() /输入前三或前五成绩 int i,j,y,x; printf(输入学校数目:); y=0; while(1) scanf(%d,&n); if(n=1&n=20)y=1; if(y)break; else printf(输入数据有误,请重新输入:); for(i=1;ischi.name; schi.score=0; schi.female=0; schi.male=0; schi.num=i; printf(输入男子项目数和女子项目数:); y=0; while(1) scanf(%d,%d,&m,&w); if(m=1&w=1)y=1; if(y)break; else printf(输入数据有误,请重新输入:); for(i=1;ipi.name; printf(输入第%d个项目(男子)的前5名的学校编号:n,i); for(j=1;j=1&x=20)y=1; if(y)break; else printf(输入数据有误,请重新输入:); pi.snumj=x; schx.score+=qianwuj-1; schx.male+=qianwuj-1; for(i=m+1;ipi.name;