数据结构课程设计.docx
《数据结构课程设计.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计.docx(31页珍藏版)》请在冰豆网上搜索。
数据结构课程设计
数据结构课程设计
航空订票系统
一、设计目的:
编写一个航空订票系统,可以在系统中录入并修改各个航班的具体情况,帮助乘客准确的查询个航班的最新信息(包括航班号、航班的起始时间和地点。
票价)和各个项目业务的及时办理(包括订票、退票等)。
二、任务:
航空客运定票的业务活动包括:
查询航线、客票预定和办理退票等。
试设计一个航空客运定票系统,以使上述业务可以借助计算机来完成。
三、功能要求:
1)录入:
可以录入航班情况(数据可以存储在一个数据文件中,数据结构、具
体数据自定)
2)查询:
可以查询某个航线的情况(如,输入航班号,查询起降时间,起飞抵
达城市,航班票价,票价折扣,确定航班是否满仓);可以输入起飞抵达城市,
查询飞机航班情况;
3)订票:
(订票情况可以存在一个数据文件中,结构自己设定)可以订票,如果
该航班已经无票,可以提供相关可选择航班;
4)退票:
可退票,退票后修改相关数据文件;
5)客户资料:
有姓名,证件号,订票数量及航班情况,订单要有编号;
6)修改航班信息:
当航班信息改变可以修改航班数据文件。
四、设计程序:
#include
#include
#include
#defineN100//最大容量
typedefstructFlight//航班信息
{
charFlightNumber[6];//航班号
charSPlace[10];//起始地
charDPlace[10];//目的地
charStime[5];//起飞时间
charEtime[5];//降落时间
intprice;//票价
intRemnantSeat;//剩余座位数
}Flight;
typedefstructOrder//订单信息
{
intOrderNumber;//订单编号
charPName[10];//乘客姓名
charID[20];//身份证号
charFlightNumber[6];//航班号
intnum;//订票数量
}Order;
Flightfl[N];
Orderod[N];
inti,j;//两个常用角标变量
intlenf=0;//航班数
intleno=0;//订单数
charch;//获取用户选择的变量
charfilenamef[]="flight.txt";//航班文件名
charfilenameo[]="order.txt";//订单文件名
voidsave()//保存信息
{
FILE*fp;
if((fp=fopen(filenamef,"w"))!
=NULL)//打开文件保存航班信息
{
for(i=0;i{
fprintf(fp,"%s\t%s\t%s\t%s\t%s\t%d\t%d\n",fl[i].FlightNumber,fl[i].SPlace,fl[i].DPlace,fl[i].Stime,fl[i].Etime,fl[i].price,fl[i].RemnantSeat);
}
fclose(fp);//关闭文件
}
if((fp=fopen(filenameo,"w"))!
=NULL)//打开文件保存订单信息
{
for(i=0;i{
fprintf(fp,"%d\t%s\t%s\t%s\t%d\n",od[i].OrderNumber,od[i].PName,od[i].ID,od[i].FlightNumber,od[i].num);
}
fclose(fp);//关闭文件
}
}
voidload()//读取信息
{
FILE*fp;
if((fp=fopen(filenamef,"r"))!
=NULL)//打开文件读取航班信息
{
i=0;
while(!
feof(fp))//读取文件
{
fscanf(fp,"%s%s%s%s%s%d%d",&fl[i].FlightNumber,&fl[i].SPlace,&fl[i].DPlace,&fl[i].Stime,&fl[i].Etime,&fl[i].price,&fl[i].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",&od[i].OrderNumber,&od[i].PName,&od[i].ID,&od[i].FlightNumber,&od[i].num);
if(!
feof(fp))
i++;
}
leno=i;//订单数量
fclose(fp);//关闭文件
}
}
intcheck(chars[])//检查是否重复
{
intg=0;
for(;gif(strcmp(fl[g].FlightNumber,s)==0&&g!
=i)//对比是否相同相同就说明重复了
returng;//表示重复了
return-1;//遍历了整个数组都没发现重复的表示没有重复
}
voidinput()//录入信息
{
system("cls");//清屏
for(i=lenf;i{
printf("请输入航班号:
");
gets(fl[i].FlightNumber);
while(check(fl[i].FlightNumber)!
=-1)//检查是否重复
{
printf("航班号重复,请重新输入:
");
gets(fl[i].FlightNumber);
}
printf("请输入下列信息:
\n");
printf("出发地:
");
gets(fl[i].SPlace);
printf("目的地:
");
gets(fl[i].DPlace);
printf("起飞时间:
");
gets(fl[i].Stime);
printf("降落时间:
");
gets(fl[i].Etime);
printf("票价:
");
scanf("%d",&fl[i].price);
printf("剩余座位数:
");
scanf("%d",&fl[i].RemnantSeat);
getchar();//消除回车
lenf++;//航班数加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();//保存
}
voidmodify()//修改信息
{
chars[20];
system("cls");//清屏
printf("请输入要修改的航班号:
");
gets(s);
for(i=0;iif(strcmp(fl[i].FlightNumber,s)==0)
break;//存在结束循环
if(i==lenf)
{
printf("没有您输入航班信息,请按回车返回");
getchar();
return;
}
printf("请输入新的航班号:
");
gets(fl[i].FlightNumber);
while(check(fl[i].FlightNumber)==1)//检查是否重复
{
printf("航班号重复,请重新输入:
");
gets(fl[i].FlightNumber);
}
printf("请更新下列信息:
\n");
printf("出发地:
");
gets(fl[i].SPlace);
printf("目的地:
");
gets(fl[i].DPlace);
printf("起飞时间:
");
gets(fl[i].Stime);
printf("降落时间:
");
gets(fl[i].Etime);
printf("票价:
");
scanf("%d",&fl[i].price);
printf("剩余座位数:
");
scanf("%d",&fl[i].RemnantSeat);
getchar();//消除回车
save();//保存
printf("修改成功!
\n");
system("pause");//任意键继续
}
voidbook()//订票
{
system("cls");//清屏
i=leno;
printf("请输入您的姓名:
");
gets(od[i].PName);
printf("请输入您的身份证号:
");
gets(od[i].ID);
printf("请输入订票的航班号:
");
gets(od[i].FlightNumber);
for(j=0;jif(strcmp(fl[j].FlightNumber,od[i].FlightNumber)==0)//对比是否相同
break;
if(j==lenf)//表示航班不存在
{
printf("航班号不存在!
请按回车返回");
getchar();
return;
}
printf("请输入订票数量:
");
scanf("%d",&od[i].num);
fl[j].RemnantSeat-=od[i].num;//新的剩余票数
printf("请输入订单编号:
");
scanf("%d",&od[i].OrderNumber);
getchar();//消除回车
leno++;//订单数加1
save();//保存到文件
printf("定票成功。
\n");
system("pause");//任意键继续
}
voidback()//退票
{
intnum;
system("cls");//清屏
printf("请输入要退票的订单编号:
");
scanf("%d",&num);
getchar();//消除回车
for(i=0;iif(od[i].OrderNumber==num)//检查是否存在订单编号
break;
if(i==leno)
{
printf("航班号不存在!
请按回车返回");
getchar();
return;
}
j=check(od[i].FlightNumber);//获取航班的下标
fl[j].RemnantSeat+=od[i].num;//新的剩余票数
od[i]=od[leno-1];//最后一条订单覆盖退票的订单
leno--;//订单数减1
save();//保存
printf("退票成功。
\n");
system("pause");//任意键继续
}
voidsearch_num()//航班信息查询(按航班号)
{
chars[20];
system("cls");//清屏
printf("请输入要查询的航班号:
");
gets(s);
for(i=0;iif(strcmp(fl[i].FlightNumber,s)==0)
break;//存在结束循环
if(i==lenf)
{
printf("航班号不存在!
请按回车返回");
getchar();
return;
}
printf("查询成功!
\n");
printf("******************************************************************************\n");
printf("航班号起始地目的地起飞时间降落时间票价剩余座位数\n\n");
printf("%-8s%-10s%-10s%-10s%-10s%-6d%d\n",fl[i].FlightNumber,fl[i].SPlace,fl[i].DPlace,fl[i].Stime,fl[i].Etime,fl[i].price,fl[i].RemnantSeat);
printf("******************************************************************************\n");
system("pause");//任意键继续
}
voidsearch_line()//航班信息查询(按路线)
{
chars[20],e[20];
intflag=0;
system("cls");//清屏
printf("请输入要查询的路线的起点:
");
gets(s);
printf("请输入要查询的路线的终点:
");
gets(e);
printf("查询成功!
\n");
printf("******************************************************************************\n");
printf("航班号起始地目的地起飞时间降落时间票价剩余座位数\n\n");
for(i=0;iif(strcmp(fl[i].SPlace,s)==0&&strcmp(fl[i].DPlace,e)==0)
{
printf("%-8s%-10s%-10s%-10s%-10s%-6d%d\n",fl[i].FlightNumber,fl[i].SPlace,fl[i].DPlace,fl[i].Stime,fl[i].Etime,fl[i].price,fl[i].RemnantSeat);
flag=1;//标记找到了信息
}
if(flag==0)
{
printf("航班信息不存在!
\n");
}
printf("******************************************************************************\n");
system("pause");//任意键继续
}
charmenu()//菜单
{
charc;
system("cls");//清屏
printf("**************************主菜单****************************\n");
printf("*****1、航班数据录入*****\n");
printf("*****2、航班信息查看(按航班号)*****\n");
printf("*****3、航班信息查询(按路线)*****\n");
printf("*****4、航班预订*****\n");
printf("*****5、退票*****\n");
printf("*****6、航班信息修改*****\n");
printf("*****7、退出系统*****\n");
printf("************************************************************\n");
printf("请选择功能:
");
c=getchar();
getchar();//消除缓存中的换行符
returnc;
}
voidmain()
{
load();//读取文件信息
while
(1)
{
ch=menu();//获取选择
switch(ch)
{
case'1':
input();break;//航班信息录入
case'2':
search_num();break;//航班信息查询(按航班号)
case'3':
search_line();break;//航班信息查询(按路线)
case'4':
book();break;//订票
case'5':
back();break;//退票
case'6':
modify();break;//航班信息修改
case'7':
exit(0);//退出
}
}
}
运行结果:
运动会分数统计
1、设计题目:
运动会分数统计
二、运行环境
硬件:
32位机软件:
WindowsXPMicrosoftvisualstudio6.0
三、算法设计思想
由于学校个数、项目个数是确定的,并不会随时需要增加或减少,所以采用顺序存储结构较好,并且能随机存取,又不用做插入删除操作,故采用数组作为存储结构。
利用结构体创建好数组后,定义input函数向两数组逐条输入数据,其中主要用到while和for循环语句的嵌套以及if语句。
利用while
(1){scanf("%d",&n);if(n>=1&&n<=20)y=1;if(y)break;elseprintf("输入数据有误,请重新输入:
");}这样的循环体现了很好的容错性,输入数据不合理会返回让用户重新输入的提示,更友好。
本程序中我设计让男子项目去前五名,女子项目取前三名。
因此对应的名次可以分别积分7、5、3、2、1和5、3、2。
然后定义了print函数,可以按不同要求输出成绩和编号等信息。
而后定义bianhao()、zongfen()、malezf()、femalezf()可以分别按学校编号、学校总分、男子总分和女子总分输出结果。
然后定义了菜单函数solve()来调用不同的排序函数。
最后定义了cxsch()和cxxm()两函数以实现按学校和项目查询成绩。
该题我规定了男子项目取前五名,女子项目取前三名。
函数调用关系如下图:
main()
Input()solve()
bianhao()zongfen()malezf()femalezf()cxsch()cxxm()
print()
4、
算法流程图
五、算法设计分析
功能要求有:
可以输入各个项目的前三名或前五名的成绩;能统计各学校总分;可以按学校编号、学校总分、男女团体总分排序输出;可以按学校编号查询学校某个项目的情况。
所以利用结构体创建两个数组,数组sch[]包含学校名称、编号、总分、男子总分、女子总分等内容;数组pro[]包含项目名称、项目编号以及该项目前三名或前五名的学校编号。
需要注意的是,预处理命令中使用了iostream、iomanip、fstream等头文件,因此可以更方便的使用一些C++中的输入输出语句。
六、源代码
#include
#include
#include
#include
usingnamespacestd;
intn;//n个学校
intm;//m个男子项目
intw;//w个女子项目
structpro//表示项目的结构体
{
stringname;//项目名称
intsnum[6];//前3或5名学校的编号
}p[21];
structschool//表示学校的结构体
{
intnum;
stringname;//学校名称
intscore;//学校总分
intmale;//男子总分
intfemale;//女子总分
}sch[21];
intqianwu[5]={7,5,3,2,1};//前五名得分
intqiansan[3]={5,3,2};//前三名得分
voidinput()//输入前三或前五成绩
{
inti,j,y,x;
printf("输入学校数目:
");
y=0;
while
(1)
{
scanf("%d",&n);
if(n>=1&&n<=20)y=1;
if(y)break;
elseprintf("输入数据有误,请重新输入:
");
}
for(i=1;i<=n;i++)
{
printf("输入第%d个学校的名称:
",i);
cin>>sch[i].name;
sch[i].score=0;
sch[i].female=0;
sch[i].male=0;
sch[i].num=i;
}
printf("输入男子项目数和女子项目数:
");
y=0;
while
(1)
{
scanf("%d,%d",&m,&w);
if(m<=20&&m>=1&&w<=20&&w>=1)y=1;
if(y)break;
elseprintf("输入数据有误,请重新输入:
");
}
for(i=1;i<=m;i++)
{
printf("输入第%d个项目的名称:
\n",i);
cin>>p[i].name;
printf("输入第%d个项目(男子)的前5名的学校编号:
\n",i);
for(j=1;j<=5;j++)
{
y=0;
while
(1)
{
scanf("%d",&x);
if(x>=1&&x<=20)y=1;
if(y)break;
elseprintf("输入数据有误,请重新输入:
");
}
p[i].snum[j]=x;
sch[x].score+=qianwu[j-1];
sch[x].male+=qianwu[j-1];
}
}
for(i=m+1;i<=m+w;i++)
{
printf("输入第%d个项目(女子)的编号:
\n",i);
cin>>p[i].name;