资源描述
数据结构课程设计实验报告
———C语言版
课题:飞机订票系统和图的遍历的动态演示
姓名:
学号:
班级:
指导教师:
订票系统
1.需求分析
任务:通过此系统可以实现如下功能:
录入:可以录入航班情况(数据可以存储在一个数据文件中,数据结构、具体数据自定)
查询:可以查询某个航线的情况(如,输入航班号,查询起降时间,起飞抵达城市,航班票价,票价折扣,确定航班是否满仓);
可以输入起飞抵达城市,查询飞机航班情况;
订票:(订票情况可以存在一个数据文件中,结构自己设定)
可以订票,如果该航班已经无票,可以提供相关可选择航班;
退票: 可退票,退票后修改相关数据文件;
客户资料有姓名,证件号,订票数量及航班情况,订单要有编号。
修改航班信息:当航班信息改变可以修改航班数据文件
要求:
根据以上功能说明,设计航班信息,订票信息的存储结构,设计程序完成功能;
2:主要设计思路:
1) 算法构造流程图:
A:主菜单:
主菜单
0
1
2
3
4
5
6
7
8
9
输入航班的信息
列出航班的信息
按航班号查询航班信息
按城市来查询航班
订票程序
退票系统
修改飞机航班的信息
保存文件
读取文件 、下载文件
退出
B:各分块模板的构造流程图:
0.输入航班的信息
航班号
起飞城市
降落城市
出发时间
降落时间
剩下的座位
价格
折扣
1.列出航班的信息
继续 y
退出 n
2.按航班号查询航班信息
输入所需要查询的航班号
显示这个航班的的信息
3.按城市来查询航班
输入起飞城市
输入降落城市
显示这个航班的信息
4.订票程序
输入号码
输入名字
输入ID
需要定的票数
航班号
5.退票系统
输入航班号
输入你ID
确定退票 1
否定 0
6.修改飞机航班的信息
输入要修改的航班号
重新输入新的航班信息
7.保存文件
显示保存成功
3:功能函数设计:
(1):订票系统主菜单函数 menu_select()
本函数主要构造系统的主菜单,系统需要实现很多功能,并且各个功能需要各自的函数支持,所以通过主菜单可以轻松的进入各个函数下实现各自的功能,故主菜单显得尤为重要。其实就是通过键盘输入选择项,然后通过scanf接受,在通过swtich判断进入各个选择项。
(2):工作人员管理函数 enter()&change()
系统需要各个航班的详细信息,所以需要工作人员把信息输入系统里,以供乘客查询订票。enter()函数的构造就是为了解决这个问题。而有可能航班线路更改或由于天气等原因飞机的起飞时间发生了更改,故工作人员需要及时更改信息,所以需要构造change()函数。
(3):列出航班信息的函数 list()
乘客需要查询各个航班的信息,所以通过系统要能调出上面工作人员已经录入好的航班信息,所以构造本函数来实现这个功能。
(4)乘客具体查询函数 search()
本函数分两个分函数:search1()和search2(),它们分别实现乘客的按航班查询和按出发及抵达城市的两种查询方案。
(5)票务管理函数 book()&quit()
通过book()函数可以实现乘客的订票操作,通过quit()可以实现乘客的退票操作。
(6)文件操作函数 save()&load()
3.源程序代码:(WIN TC下运行)
#include<dos.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 20
#define Q 40
/*定义数据结构*/
/*乘客信息*/
typedef struct
{
char number[10];/*编号*/
char id[20]; /*证件号*/
char name[10]; /*姓名*/
int count; /*订票数*/
char flightname[10];/*乘坐航班号*/
}GUEST;
/*航班信息*/
typedef struct
{char planenumber[10];/*航班号*/
char Take_off_city[20];/*起飞城市*/
char Arrived_in_city[20];/*抵达城市*/
char takeoff_time[20];/*起飞时间*/
char Landing_time[20];/*降落时间*/
int shipping; /*舱位数*/
char price[5]; /*票价*/
char discount[5]; /*折扣*/
GUEST guest[20];
int sit;
}FLY;
/*菜单函数,函数返回值为整数,代表所选的菜单项*/
menu_select()
{
int c;
printf("按任意键返回主菜单\n");/*提示压任意键继续*/
getch(); /*读入任意字符*/
printf(" Welcome to\n\n");
printf(" Tickets Booking System\n\n");
printf(" ********************MENU****************\n\n");
printf(" 0. 输入航班信息\n");
printf(" 1. 列出航班的信息\n");
printf(" 2. 按航班号查询航班信息\n");
printf(" 3. 按城市来查询航班\n");
printf(" 4. 订票程序\n");
printf(" 5. 退票系统\n");
printf(" 6. 修改飞机航班的信息\n");
printf(" 7. 保存文件\n");
printf(" 8. 读取和下载文件\n");
printf(" 9. 退出\n");
printf(" *****************************************\n\n");
do{
printf("\n 输入你的选择项(0~9):"); /*提示输入选项*/
scanf("%d",&c); /*输入选择项*/
}while(c<0||c>9); /*选择项不在~9之间重输*/
return c; /*返回选择项,主程序根据该数调用相应的函数*/
}
/*输入函数*/
int enter(FLY t[])
{
int i,k,n,m,w,j;
char *s;
printf("输入航线总数(n<=40):");/*输入航线总数*/
scanf("%d",&n);
while(n>40||n<0)
{
printf("输入错误!!再次输入(0<n<=40):");/*输入航线总数*/
scanf("%d",&n);
}
printf(" 输入航班的信息\n\n");/*提示信息*/
printf("航班号起飞城市 降落城市 出发时间 降落时间 剩下的座位 价格 折扣\n");
printf("------------------------------------------------------------------------------\n");
for(i=0;i<n;i++)
{
scanf("%s",t[i].planenumber);/*输入姓名*/
scanf("%s",t[i].Take_off_city);/*输入起飞城市*/
scanf("%s",t[i].Arrived_in_city);/*输入降落城市*/
scanf("%s",t[i].takeoff_time);/*输入起飞时间*/
scanf("%s",t[i].Landing_time);/*输入降落时间*/
scanf("%d",&t[i].shipping);/*输入舱位数*/
scanf("%s",t[i].price);/*输入票价*/
scanf("%s",t[i].discount);/*输入折扣*/
}
printf("-----------------------------------------------------------------------------\n");
for(i=0;i<n;i++)t[i].sit=0;
return n; /*返回记录条数*/
}
/*显示记录,参数为记录数组和记录条数*/
void list(FLY t[],int n)
{
int i;
printf("航班号起飞城市 降落城市 出发时间 降落时间 剩下的座位 价格 折扣\n");
printf("------------------------------------------------------------------------------\n");
for(i=0;i<n;i++)
printf("%-12s%-12s%-10s%-12s%-10s%-7d%-7s%-7s\n",t[i].planenumber,t[i].Take_off_city,t[i].Arrived_in_city,t[i].takeoff_time,t[i].Landing_time,t[i].shipping,t[i].price,t[i].discount);
printf(" ************************end*******************\n");
}
/*按航班号查找记录*/
void search1(FLY t[],int n)
{
char s[20]; /*保存待查找航班名字符串*/
int i;
printf("输入你想查找的航班名:");
scanf("%s",s); /*输入待查找航班名*/
for(i=0;i<n;i++)/*从第一条记录开始,直到最后一条*/
{
if(strcmp(s,t[i].planenumber)==0) /*记录中的航班名和待比较的是否相等*/
break; /*相等,则返回该记录的下标号,程序提前结结束*/
}
if(i>n-1) /*如果整数i值大于n-1,说明没找到*/
printf("没有找到\n");
else
{
printf("航班号起飞城市 降落城市 出发时间 降落时间 剩下的座位 价格 折扣\n"); /*显示记录*/
printf("------------------------------------------------------------------------------\n");
printf("%-12s%-12s%-10s%-12s%-10s%-7d%-7s%-7s\n",t[i].planenumber,t[i].Take_off_city,t[i].Arrived_in_city,t[i].takeoff_time,t[i].Landing_time,t[i].shipping,t[i].price,t[i].discount);
}
}
/*按起降城市查找记录*/
void search2(FLY t[],int n)
{
char s1[20];
char s2[20];
int i;
printf("输入起飞城市名称:");
scanf("%s",s1); /*输入起飞城市名*/
printf("输入降落城市名称:");
scanf("%s",s2); /*输入降落城市名*/
for(i=0;i<n;i++)/*从第一条记录开始,直到最后一条*/
{
if((strcmp(s1,t[i].Take_off_city)==0)&&(strcmp(s2,t[i].Arrived_in_city)==0)) /*记录中的城市和待比较的是否相等*/
break; /*相等,则返回该记录的下标号,程序提前结结束*/
}
if(i>n-1) /*如果整数i值大于n-1,说明没找到*/
printf("没有找到\n");
else
{
printf("航班号起飞城市 降落城市 出发时间 降落时间 剩下的座位 价格 折扣\n"); /*找到,显示记录*/
printf("------------------------------------------------------------------------------\n");
printf("%-12s%-12s%-10s%-12s%-10s%-7d%-7s%-7s\n",t[i].planenumber,t[i].Take_off_city,t[i].Arrived_in_city,t[i].takeoff_time,t[i].Landing_time,t[i].shipping,t[i].price,t[i].discount);
}
}
/*订票*/
void book(FLY t[],int n)
{
char s[20],number1[10],name1[10],id1[20],flightname1[10];
int i,j=0,m,k,count1;
printf("输入你想预订的票数:");
scanf("%d",&m);
printf("号码 姓名 证件号 订的票数 航班号\n"); /*提示信息*/
printf("------------------------------------------------------------\n");
for(k=0;k<m;k++)
{
scanf("%s",number1);
scanf("%s",name1);/*输入订票客户姓名*/
scanf("%s",id1);/*输入证件号*/
scanf("%d",&count1);/*输入订票票数*/
scanf("%s",flightname1);/*输入航班号*/
for(i=0;i<n;i++)/*从第一条记录开始,直到最后一条*/
{
if(strcmp(flightname1,t[i].planenumber)==0) /*记录中的航班名和待比较的是否相等*/
{
j=t[i].sit;
strcpy(t[i].guest[j].number,number1);
strcpy(t[i].guest[j].name,name1);
strcpy(t[i].guest[j].id,id1);
t[i].guest[j].count=count1;
strcpy(t[i].guest[j].flightname,flightname1);
t[i].shipping=t[i].shipping-count1;
t[i].sit++;
break; /*相等,则返回该记录的下标号,程序提前结结束*/
}
}
if(i>n-1) /*如果整数i值大于n-1,说明没找到*/
{
printf("对不起!没有此航班\n");
m=m+2;
k++;
}
}
}
/*退票*/
void quit(FLY t[],int n)
{
char s1[20],s2[20]; /*保存待查找航班名和证件号字符串*/
int i,k,j,h,l,ch;
printf("请输入你想退订的航班号:");
scanf("%s",s1); /*输入待查找航班名*/
printf("请输入你的证件号:");
scanf("%s",s2); /*输入待查找证件号*/
printf("号码 姓名 证件号 订的票数 航班号\n"); /*显示提示*/
printf("------------------------------------------------------------\n");
for(i=0;i<n;i++)/*从第一条记录开始,直到最后一条*/
{
for(j=0;j<t[i].sit;j++)
if((strcmp(s1,t[i].guest[j].flightname)==0)&&(strcmp(s2,t[i].guest[j].id)==0))
{
printf("%-11s%-16s%-16s%-14d%-10s\n",t[i].guest[j].number,t[i].guest[j].name,t[i].guest[j].id,t[i].guest[j].count,t[i].guest[j].flightname);
t[i].shipping=t[i].shipping+t[i].guest[j].count;
l=j;
h=i;
break;
}
}
i=h;
if(i>n-1) /*如果整数i值大于n-1,说明没找到*/
printf("没有找到\n");
else
{
printf("你是否确认删除(1/0)\n"); /*确认是否要删除*/
scanf("%d",&ch); /*输入一个整数或*/
if(ch==1) /*如果确认删除整数为*/
{
for(k=l+1;k<t[i].sit;k++)
{
strcpy(t[i].guest[k-1].number,t[i].guest[k].number); /*将后一条记录的姓名拷贝到前一条*/
strcpy(t[i].guest[k-1].name,t[i].guest[k].name);
strcpy(t[i].guest[k-1].id,t[i].guest[k].id);
t[i].guest[k-1].count=t[i].guest[k].count;
strcpy(t[i].guest[k-1].flightname,t[i].guest[k].flightname);
}
t[i].sit--;
}
printf("退票成功!!\n");/*提示退票成功*/
}
}
/*修改航班信息*/
void channge(FLY t[],int n)
{
char s[20]; /*要删除记录的姓名*/
int i,j;
printf("请输入你要修改的航班号:"); /*提示信息*/
scanf("%s",s);/*输入航班名*/
for(i=0;i<n;i++)/*从第一条记录开始,直到最后一条*/
{
if(strcmp(s,t[i].planenumber)==0) /*记录中的航班名和待比较的是否相等*/
break; /*相等,则返回该记录的下标号,程序提前结结束*/
}
if(i>n-1) /*如果整数i值大于n-1,说明没找到*/
printf("没有找到\n");
else
{
printf("航班号起飞城市 降落城市 出发时间 降落时间 剩下的座位 价格 折扣\n"); /*找到,显示原先记录*/
printf("------------------------------------------------------------------------------\n");
printf("%-12s%-12s%-10s%-12s%-10s%-7d%-7s%-7s\n",t[i].planenumber,t[i].Take_off_city,t[i].Arrived_in_city,t[i].takeoff_time,t[i].Landing_time,t[i].shipping,t[i].price,t[i].discount);
printf("please input the new information:\n");
scanf("%s",t[i].planenumber);/*输入航班名*/
scanf("%s",t[i].Take_off_city);/*输入起始城市*/
scanf("%s",t[i].Arrived_in_city);/*输入终点城市*/
scanf("%s",t[i].takeoff_time);/*输入起飞时间*/
scanf("%s",t[i].Landing_time);/*输入降落时间*/
scanf("%d",t[i].shipping);/*输入座位号*/
scanf("%s",t[i].price);/*输入票价*/
scanf("%s",t[i].discount);/*输入折扣*/
}
}
/*保存资料*/
void save(FLY t[],int n)
{
int i,j;
FILE *fp; /*指向文件的指针*/
if((fp=fopen("record1.txt","wb"))==NULL) /*打开文件,并判断打开是否正常*/
{
printf("can not open file\n");/*没打开*/
exit(1); /*退出*/
}
printf("\n保存文件\n"); /*输出提示信息*/
fprintf(fp,"%d",n); /*将记录数写入文件*/
fprintf(fp,"\r\n"); /*将换行符号写入文件*/
for(i=0;i<n;i++)
{
fprintf(fp,"%s %s %s %s %s %d %s %s",t[i].planenumber,t[i].Take_off_city,t[i].Arrived_in_city,t[i].takeoff_time,t[i].Landing_time,t[i].shipping,t[i].price,t[i].discount);
fprintf(fp,"\r\n"); /*将换行符号写入文件*/
fprintf(fp,"%d",t[i].sit); /*将记录数写入文件*/
fprintf(fp,"\r\n"); /*将换行符号写入文件*/
for(j=0;j<t[i].sit;j++)
{fprintf(fp,"%s %s %s %d %s",t[i].guest[j].number,t[i].guest[j].name,t[i].guest[j].id,t[i].guest[j].count,t[i].guest[j].flightname);/*格式写入记录*/
fprintf(fp,"\r\n"); /*将换行符号写入文件*/
}
}
fclose(fp);/*关闭文件*/
printf("****恭喜!保存成功***\n"); /*显示保存成功*/
}
/*读入函数,参数为结构体数组*/
int load(FLY t[])
{
int i,n,j;
FILE *fp; /*指向文件的指针*/
if((fp=fopen("record1.txt","rb"))==NULL)/*打开文件*/
{
printf("不能打开\n"); /*不能打开*/
exit(1); /*退出*/
}
fscanf(fp,"%d",&n); /*读入记录数*/
for(i=0;i<n;i++)
{fscanf(fp,"%s %s %s %s %s %d %s %s",t[i].planenumber,t[i].Take_off_city,t[i].Arrived_in_city,t[i].takeoff_time,t[i].Landing_time,&t[i].shipping,t[i].price,t[i].discount);
fscanf(fp,"%d",&t[i].sit); /*读入记录数*/
for(j=0;j<t[i].sit;j++)
fscanf(fp,"%s %s %s %d %s",t[i].guest[j].number,t[i].guest[j].name,t[i].guest[j].id,&t[i].guest[j].count,t[i].guest[j].flightname); /*按格式读入记录*/
}
fclose(fp); /*关闭文件*/
printf("你已经成功从文件读取数据!!!\n\n\n\n"); /*显示读取成功*/
return n; /*返回记录数*/
}
/*主函数*/
main()
{ int i;
FLY flight[Q];
int length; /*保存记录长度*/
for(;;)/*无限循环*/
{
switch(menu_select()) /*调用主菜单函数,返回值整数作开关语句的条件*/
{
case 0:length=enter(flight);break;/*输入记录*/
case 1:list(flight,length);break; /*显示全部记录*/
case 2:search1(flight,length);break; /*查找记录*/
case 3:search2(flight,length);break; /*查找记录*/
case 4:book(flight,length);break; /*订票*/
case 5:quit(flight,length);break; /*退票*/
case 6:channge(flight,length);break; /*修改航班信息*/
case 7:save(flight,length);break; /*保存文件*/
case 8:length=load(flight); break; /*读文件*/
case 9:exit(0); /*如返回值为则程序结束*/
}
}
}
4.系统运行时窗口截图:(VC6.0下的运行结果)
订票系统菜单窗口
0.输入航班的信息
1.列出航班的信息
2.按航班号查询航班信息
3.按城市来查询航班
4.订票程序
5.退票系统
6.修改飞机航班的信息
7.保存文件
8.读取文件 、下载文件
图的遍历过程演示
一. 需求分析:
设计程序完成如下功能:对给定的图的结构和起点,产生深度优先遍历和广度优先遍历,并列出求解的过程动态演示。
二. 主要设计思路:
设计思想:简而言之,深度优先,就是先遍历它的一个邻接点,这个邻接点的邻接点……然后才遍历其他的邻接点。广度优先,就是先把它所有的邻接点都遍历完以后,再遍历它每个邻接点的邻接点 。存储结构为图的邻接多重表,它是无向图的一种链式存储结构。
深度优先遍历:设x是当前被访问顶点,在对x做过访问标记后,选择一条从x出发的未检测过的边(x,y)。若发现顶点y已访问过,则重新选择另一条从x出发的未检测过的边,否则沿边(x,y)到达未曾访问过的y,对y访问并将其标记为已访问过;然后从y开始搜索,直到搜索完从y出发的所有路径,即访问完所有从y出发可达的顶点之后,才回溯到顶点x,并且再选择一条从x出发的未检测过的边。上述过程直至从x出发的所有边都已检测过为止。此时,若x不是源点,则回溯到在x之前被访问过的顶点;否则图中所有和源点有路径相通的顶点(即从源点可达的所有顶点)都已被访问过,若图G是连通图,则遍历过程结束,否则继续选择一个尚未被访问的顶点作为新源点,进行新的搜索过程。
广度优先遍历:设x和y是两个相继要被访问的未访问过的顶点。它们的邻接点分别记为x1,x2,…,xs和y1,y2,…,yt。
为确保先访问的顶点其邻接点亦先被访问,在搜索过程中使用队列来保存已访问过的顶点。当访问x和y时,这两个顶点相继入队。此后,当x和y相继出队时,我们分别从x和y出发搜索其邻接点x1,x2,…,xs和y1,y2,…,yt,对其中未访者进行访问并将其入队。这种方法是将每个已访问的顶点入队,故保证了每个顶点至多只有一次入队。
A. 图的算法构造思想:
1.CreateALGraph()
初始条件:V是图的顶点集,VR是图中弧的集合.
操作结果:按V和VR是定义构造图G.
2. DestroyGraph(&G)
初始条件:图G存在
操作结果:销毁图G
3.LocateVex(G,u)
初始条件: 图G存在,u和G中顶点有相同的特征
操作结果:若图G中存在顶点u,则返回该顶点在图中的位置;否则返回其他信息
4. GetVex(G,v)
初始条件: 图G存在,v是G中顶点
操作结果:返回v的值
5. FirstAjvex(G,v)
初始条件: 图G存在,v是G中顶点
操作结果:返回v的第一个邻接顶点,若顶在图中没有邻接顶点,则返回为空
6. NextAjvex(G,v,w)
初始条件: 图G存在,v是G中顶点,w是v的邻接顶点
操作结果:返回v的下一个邻接顶点,若w是v的最后一个邻接顶点,则返回空
7. DeleteVexx(&G,v)
初始条件: 图G存在,v是G中顶点
操作结果:删除顶点v已经其相关的弧
8. DFStraverse(ALGraph)
初始条件: 图G存在,visit的顶点的应用函数
操作结果: 对图进行深度优先遍历,在遍历过程中对每个结点调用visit函数一次,一旦visit失败,则操作失败
9. BFStraverse(ALGraph)
初始条件: 图G存在,visit的顶点的应用函数
操作结果: 对图进行广度优先遍历,在遍历过程中对每个结点调用visit函数一次,一旦visit失败,则操作失败
附图的结构体构造:
ALGraph{
数据对象V:V是具有相同特性的数据元素的集合,称为点集.
数据关系R:
R={VR}
VR={(v,w)|v,w属于V,(v,w)表示v和w之间存在的路径}
B.队列的算法构造:
1. Init_SeqQueue()
操作结果:构造一个空队列Q
2. DestryoQueue(&Q)
初始条件:队列Q已存在。
操作结果:队列Q被销毁,不再存在。
3. In_SeqQueue()
初始条件:队列Q已经存在
操作结果:插入元素e为Q的新的队尾元素
4. Out_SeqQueue()
初始条件:Q为非空队列
操作结果:删除Q的队尾元素,并用e返回其值
5. Empty_SeqQueue()
初始条件:队列已经存在
操作结果:若队列为空,则返回TRUE,否则返回FLASE
C.本程序包含的模板:
1.程序模块
Main()
{
取得顶点数和弧数;
生成邻接表结构的图;
深度遍历图;
广度遍历图;
}
2.造邻接表结构的图;
3.度优先遍历图;
4.度优先遍历图;
5.列的基本操作模块;
6.数声明模块;
三.源程序代码:(VC++6.0下运行)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_VERTEX_NUM 50 //图的最大顶点数
#define MAXQSIZE 200 //队列的最大容量
enum BOOL {False,True}; //定义枚举变量
typedef struct ArcNode //图的邻接表存储
{int adjvex; //该弧所指向的顶点的位置
struct ArcNod
展开阅读全文