第一篇:飞机订票系统课程设计
《银行帐户管理系统》设计报告
飞机航班订票系统概要设计
根据需求分析中的描述,知道需要三个struct结构体类型和一个class的类
struct person //定义旅客信息结构体类型 { char name[50];//旅客姓名
char sex[20];//旅客性别
char id[20];//旅客身份证号 char from[50];//旅客出发地
char to[50];//旅客目的地
int year;//旅客出发年
int month;//月 int day;//日
};struct fly //定义航班信息结构体类型 struct piao //定义订单信息结构体类型 这两个结构体类型和之前第一个相似。
class plane //定义一个类--plane { public: //public表示是共有属性,里面的东西变为共有的。对象外的用户可以调用对象内的类型
char menu();//定义 各种成员函数
void set();//**********************旅客信息添加修改删除函数声明
void AddPer();//旅客 增加信息
void chp();//旅客 修改信息
void dep();//旅客 删除信息 //**********************航班信息添加修改删除函数声明
《银行帐户管理系统》设计报告
void addf();//航班 增加信息 void chf();//航班 修改信息
void def();//航班 删除信息 //**********************订单信息添加修改删除函数声明
void addt();//订单中 增加信息 void cht();//订单中 修改信息
void det();//订单中 删除信息
//**********************按条件显示订单信息函数声明
void showno();//按航班班次显示订单信息
void showplace();//按出发地、目的地显示订单信息
void showname();//按旅客姓名显示订单信息
void save();//保存信息 void exit();//退出界面
private:
person a[100];//定义一个用户的数组
fly b[100];//定义一个航班的数组
piao c[100];//定义一个订单的数组
int t;
//旅客个数 int s;
//航班个数
int r;//订单个数 };三个struct结构体类型中用于存放数据,在private中定义出a[]、b[]、c[]三个数组用来存放数据。并在public中声明出将要调用的函数。public表示是共有属性,将里面的东西变为共有的。对象外的用户也可以调用对象内的类型。
然后在main函数中写入一个switch函数用来满足用户的选择,依照用户的选择来实现case中的函数。case中函数来实现用户的需求:例如增加、修改、删除一个旅客资料等等。
《银行帐户管理系统》设计报告
2. 详细设计
//***********************plane创建一个类m将键盘输入的数据输入进m类中 plane m;
//**************************从文件流之中讲数据读取************ void plane::set()
{
fstream file(“person.txt”,ios::in);//定义一个文件流,以输入的方式打开文件
int i=0;if(file.is_open())
//判断文件是否打开
{
while(!file.eof())
//判断文件是否是最末尾端(如果不是则运行下列代码)
{
file>>m.a[i].name;//将名字写入到结构体类型person中
file>>m.a[i].sex;
file>>m.a[i].id;
file>>m.a[i].from;
file>>m.a[i].to;
file>>m.a[i].year>>m.a[i].month>>m.a[i].day;
if(!file.eof())//判断文件是否是最末尾端
i++;
//不是的话i+1
}
m.t=i;
file.close();} fstream file2(“fly.txt”,ios::in);
//file2 3类似 fstream file3(“piao.txt”,ios::in);//***************************讲变量名中的数据输入到文件流之中 void plane::save(){
//*******************************将数据输入到person文件中
fstream file(“person.txt”,ios::out | ios::trunc);/*out以输出方式打开一个文件
trunc打开一个文件要是存在则删除其中全部数据 若不存在则建立新文件*/
if(file.is_open())//讲变量名之中的数据输入到file中
{
for(int i=0;i file< file< file< 《银行帐户管理系统》设计报告 file< file< file< file< file< file.close(); } fstream file2(“fly.txt”,ios::out | ios::trunc); //file2 3类似 fstream file3(“piao.txt”,ios::out | ios::trunc); //******************************定义一个menu char plane::menu() { int k; cout<<“*************************飞 机 航 班 订 票 系 统**********************”< cout<<“ 1.增加一个旅客信息 ”< cout<<“ 2.修改一个旅客信息 ”< cout<<“ 3.删除一个旅客信息 ”< cout<<“ 4.增加一个航班信息 ”< cout<<“ 5.修改一个航班信息 ”< cout<<“ 6.删除一个航班信息 ”< cout<<“ 7.增加一个订单信息 ”< cout<<“ 8.修改一个订单信息 ”< cout<<“ 9.删除一个订单信息 ”< cout<<“ 10.按班次显示订单资料 ”< cout<<“ 11.按航班线路显示订单资料 ”< cout<<“ 12.按旅客姓名显示订单资料 ”< cout<<“请输入您要选择的功能序号:”; cin>>k; return k; //将用户选择的K值返回到主函数中赋值给R以此选择case } //*****************************添加旅客信息—从键盘中将数据输入到一个变量名之中 void plane::AddPer() { char choice;//choice用来判断y/n for(int i=m.t;i<100;i++) { //**************添加旅客信息 cout<<“添加旅客信息--姓名:”; cin>>m.a[i].name; cout<<“添加旅客信息--性别:”; cin>>m.a[i].sex; cout<<“添加旅客信息--身份证:”; cin>>m.a[i].id; cout<<“添加旅客信息--出发地:”; cin>>m.a[i].from; cout<<“添加旅客信息--目的地:”; cin>>m.a[i].to; cout<<“添加旅客信息--出发年:”; cin>>m.a[i].year; 《银行帐户管理系统》设计报告 cout<<“添加旅客信息--出发月:”; cin>>m.a[i].month; cout<<“添加旅客信息--出发日:”; cin>>m.a[i].day; m.t++; cout<<“一位旅客新信息输入完成,还要继续添加新的旅客信息么(y/n)?”; while(1) { cin>>choice; if(choice=='y'||choice=='n') //逻辑或 如果是y或者n则跳出while函数 break; else cout<<“输入错误!请重新输入!”< if(choice=='n')//如果是n的话跳出for循环 break; } save(); //保存旅客信息 } //************************改变旅客信息 void plane::chp(){ char J[100];//定义一个数组J用于修改旅客身份证号(利用id号来进行修改) cout<<“请输入要修改的旅客身份证号:”; cin>>J; for(int i=0;i if(strcmp(m.a[i].id,J)==0) //将已有的旅客id号和刚输入的id号进行比较 break; if(i==m.t) { cout<<“输入错误,没有此航班!”< return; } //********************输出修改内容 进行修改 cout<<“请输入旅客的姓名:”; cin>>m.a[i].name; cout<<“请输入旅客的性别:”; cin>>m.a[i].sex; cout<<“请输入旅客的身份证号:”; cin>>m.a[i].id; cout<<“请输入旅客的出发地:”; cin>>m.a[i].from; cout<<“请输入旅客的目的地:”; cin>>m.a[i].to; cout<<“请输入旅客的出发年:”; cin>>m.a[i].year; cout<<“请输入旅客的出发月:”; cin>>m.a[i].month; cout<<“请输入旅客的出发日:”; cin>>m.a[i].day; save(); cout<<“修改成功!”< } //**************************删除旅客信息 void plane::dep() 《银行帐户管理系统》设计报告 { char R[100]; cout<<“请输入要删除的旅客身份证:”;cin>>R; for(int i=0;i if(strcmp(m.a[i].id,R)==0) break; if(i==m.t) { cout<<“删除错误,没有您要删除的游客!”< return; } m.a[i]=m.a[m.t-1]; //将后面数组赋值到了找到的要删除的数组就将那个要删除的数组给删除了 m.t--; save(); cout<<“删除成功!”< 之后的几个函数都相类似。 //****************************添加航班信息 void plane::addf()//*****************************修改航班信息 void plane::chf()//*************************删除航班信息 void plane::def()//***********************添加航班订票信息 void plane::addt()//******************************修改订票信息 void plane::cht()//*********************删除订单信息 void plane::det()//****************************按航班起飞降落城市来查询订单信息 void plane::showplace() { char H[100]; char E[100]; cout<<“请输入要查询的订单航班出发地:”; cin>>H; cout<<“请输入要查询的订单航班目的地:”; cin>>E; for(int i=0;i //将输入的出发和降落城市和已存在的城市想比较来找到这笔订单 if(strcmp(m.c[i].chufadi,H)==0 && strcmp(m.c[i].mudidi,E)==0) break; if(i==m.r) { 《银行帐户管理系统》设计报告 cout<<“没有此订单!输入错误!”< return; } cout<<“查询结果如下:”< for(i=0;i if(strcmp(m.c[i].chufadi,H)==0 && strcmp(m.c[i].mudidi,E)==0) { cout<<“旅客姓名:”< cout<<“旅客性别:”< cout<<“旅客身份证:”< cout<<“航班班次:”< cout<<“出发地:”< cout<<“目的地:”< cout<<“出发日期-年:”< cout<<“出发日期-月:”< cout<<“出发日期-日:”< } } //*****************************按订单姓名来查询订单信息 void plane::showname()//****************************按航班班次来查询订单信息 void plane::showno()//***************************主函数使用switch函数来选择各个功能 int main(){ plane p; //plane定义一个p的类 p.set(); /*面向对象的思想 以对象为载体下一个对象要干什么 执行过程应该封装起来 而不是像面向过程一样讲过程代码一步一步写出来*/ while(1){ int R; R=p.menu();//在menu函数中选择case然后赋值到R中然后选择是第几个case switch(R) { case 1:p.AddPer(); break; case 2:p.chp(); break; case 3:p.dep(); break; case 4:p.addf(); break; case 5:p.chf(); break; case 6:p.def(); break; case 7:p.addt(); break; case 8:p.cht(); break; 《银行帐户管理系统》设计报告 case 9:p.det(); break; case 10:p.showno(); break; case 11:p.showplace(); break; case 12:p.showname(); break; default:cout<<“输入错误,请重新输入!”< } } return 0;} 飞机订票系统 1.需求分析 描述要求编程解决的问题。以无歧义的陈述说明程序设计的任务,强调的是程序要做什么?明确规定: (a)输入的形式和输入值的范围; (b)输出的形式; (c)程序所能达到的功能; (d)测试数据:包括正确的输入及其输出结果和含有错误的输入及其输出结果。 2.概要设计 给出程序要达到的具体的要求。描述解决相应问题算法的设计思想。描述所设计程序的各个模块(即函数)功能。说明本程序中用到的所有抽象数据类型的定义、主程序的流程以及各程序模块之间的层次(调用)关系。 3.详细设计 实现概要设计中定义的所有数据类型,对每个操作只需要写出流程或伪码算法;对主程序和其他模块也都需要写出流程或伪码算法(伪码算法达到的详细程度建议为:按照伪码算法可以在计算机键盘直接输入高级程序设计语言程序);画出函数的调用关系图。给出所使用的基本抽象数据类型,所定义的具体问题的数据类型,以及新定义的抽象数据类型。设计出良好的输入输出界面(清晰易懂)。 4.调试分析 内容包括: (a)调试过程中遇到的问题是如何解决的以及对设计与实现的回顾讨论和分析; (b)算法的时空分析(包括基本操作和其他算法的时间复杂度和空间复杂度的分析)和改进设想; (c)经验和体会等。 5.用户使用说明 说明如何使用你编写的程序,详细列出每一步的操作步骤。 6.测试结果 设计测试数据,或具体给出测试数据。要求测试数据能全面地测试所设计程序的功能。列出你的测试结果,包括输入和输出。这里的测试数据应该完整和严格,最好多于需求分析中所列。 7.测试情况:给出程序的测试情况,并分析运行结果 附录(非必须,按照需要添加) 带注释的源程序。可以只列出程序文件名的清单。 需求分析 任务:通过此系统可以实现如下功能: 录入: 可以录入航班情况(数据可以存储在一个数据文件中,数据结构、具体数据自定) 查询: 可以查询某个航线的情况(如,输入航班号,查询起降时间,起飞抵达城市,航班票价,票价折扣,确定航班是否满仓); 可以输入起飞抵达城市,查询飞机航班情况; 订票:(订票情况可以存在一个数据文件中,结构自己设定)可以订票,如果该航班已经无票,可以提供相关可选择航班; 退票: 可退票,退票后修改相关数据文件; 客户资料有姓名,证件号,订票数量及航班情况,订单要有编号。 概要设计 详细设计 详列函数 void list(){ struct airline *info; int i=0; info=start; printf(“起点城市t终点城市t航班号t起飞时间t降落时间t总票数t余票数n”); while(i { display(info); info++; i++; } printf(“nn”);} 查询函数 void search(){ struct airline *info,*find(); char qiname[10]; char jiangname[10]; int i=0; info=start; printf(“请输入要起飞城市的名称:”); scanf(“%s”,qiname); printf(“请输入要抵达城市的名称:”); scanf(“%s”,jiangname); while(i { if(!strcmp(jiangname,info->jiang_name)) { break; } info++; i++; } if(i>=MAXSIZE) { printf(“没有这条航线!n”); } else { printf(“起飞城市t降落城市t航班号t起飞时间t降落时间t总票数t余票数n”); display(info); } } 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; } info++; i++; } printf(“没有这条航线!n”); return NULL;} 订票函数 void order(){ struct airline *info; char qiname[10]; char jiangname[10]; int amount; char name[10]; char id[30]; info=start; printf(“请输入您的起飞城市:”); scanf(“%s”,qiname); printf(“请输入您的降落城市:”); scanf(“%s”,jiangname); printf(“请输入您需要的票数:”); scanf(“%d”,&amount); int i=1; while(i<5) { if(!strcmp(info->qi_name,qiname)&&!strcmp(info->jiang_name,jiangname)) { if(amount<=info->ticket_left) { int i; printf(“请输入您的姓名:”); scanf(“%s”,name); printf(“请输入您的身份证号:”); scanf(“%s”,id); info->order=insertlink(info->order,amount,name,id); printf(“您的航班信息为:n”); display(info); for(i=0;i { printf(“%s的座位号是:%dn”,name,info->ticket_all-info->ticket_left+i+1); } info->ticket_left-=amount; printf(“订票成功!n”); break; } else { info++; i++; } } else { info++; i++; } } } 退票函数 void returnticket(){ struct airline *info; linklist *p1,*p2,*head; char name[10]; if(!(info=find())) { return; } head=info->order; p1=head; printf(“请输入您的姓名:”); scanf(“%s”,name); while(p1!=NULL) { if(!strcmp(name,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_left+=p1->tickets; printf(“%s退票成功!n”,p1->name); free(p1); } info->order=head;} 存储结构 typedef struct passenger { char name[10]; int tickets; char id[30]; struct passenger *next;} linklist;typedef struct airline { char qi_name[10]; char jiang_name[10]; char air_num[10]; char qi_time[10]; char jiang_time[10]; int ticket_all; int ticket_left; linklist *order;} lineinfo;调试分析 查看航线信息 查询航线 ① 输入起飞城市 ② 输入抵达城市 ③ 输出航班信息 办理订票业务 ① 查询符合的航班 ② 查询余票量 ③ 输出航班信息 办理退票业务 源代码 #include char name[10]; int tickets; char id[30]; struct passenger *next;} linklist; typedef struct airline { char qi_name[10]; char jiang_name[10]; char air_num[10]; char qi_time[10]; char jiang_time[10]; int ticket_all; int ticket_left; linklist *order;} lineinfo; struct airline *start; void display(struct airline *info){ printf(“%st %10st %10st %10st %10st %5dt %5dn”,info->qi_name,info->jiang_name,info->air_num,info->qi_time,info->jiang_time,info->ticket_all,info->ticket_left);} void list(){ struct airline *info; int i=0; info=start; printf(“起点城市t终点城市t航班号t起飞时间t降落时间t总票数t余票数n”); while(i { display(info); info++; i++; } printf(“nn”);} void search(){ struct airline *info,*find(); char qiname[10]; char jiangname[10]; int i=0; info=start; printf(“请输入要起飞城市的名称:”); scanf(“%s”,qiname); printf(“请输入要抵达城市的名称:”); scanf(“%s”,jiangname); while(i { if(!strcmp(jiangname,info->jiang_name)) { break; } info++; i++; } if(i>=MAXSIZE) { printf(“没有这条航线!n”); } else { printf(“起飞城市t降落城市t航班号t起飞时间t降落时间t总票数t余票数n”); display(info); } } 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; } info++; i++; } printf(“没有这条航线!n”); return NULL;} linklist *insertlink(linklist *head,int amount,char name[],char id[]){ linklist *p1,*new1; p1=head; new1=(linklist*)malloc(sizeof(linklist)); strcpy(new1->name,name); new1->tickets=amount; new1->next=NULL; strcpy(new1->id,id); if(head==NULL) { head=new1; new1->next=NULL; } else { while(p1->next!=NULL) p1=p1->next; p1->next=new1; } return head;} void order(){ struct airline *info; char qiname[10]; char jiangname[10]; int amount; char name[10]; char id[30]; info=start; printf(“请输入您的起飞城市:”); scanf(“%s”,qiname); printf(“请输入您的降落城市:”); scanf(“%s”,jiangname); printf(“请输入您需要的票数:”); scanf(“%d”,&amount); int i=1; while(i<5) { if(!strcmp(info->qi_name,qiname)&&!strcmp(info->jiang_name,jiangname)) { if(amount<=info->ticket_left) { int i; printf(“请输入您的姓名:”); scanf(“%s”,name); printf(“请输入您的身份证号:”); scanf(“%s”,id); info->order=insertlink(info->order,amount,name,id); printf(“您的航班信息为:n”); display(info); for(i=0;i { printf(“%s的座位号是:%dn”,name,info->ticket_all-info->ticket_left+i+1); } info->ticket_left-=amount; printf(“订票成功!n”); break; } else { info++; i++; } } else { info++; i++; } } } void returnticket(){ struct airline *info; linklist *p1,*p2,*head; char name[10]; if(!(info=find())) { return; } head=info->order; p1=head; printf(“请输入您的姓名:”); scanf(“%s”,name); while(p1!=NULL) { if(!strcmp(name,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_left+=p1->tickets; printf(“%s退票成功!n”,p1->name); free(p1); } info->order=head;} int menu_select(){ int c; char s[20]; printf(“ 订票系统n”); printf(“-------------n”); printf(“ 1.查看航线信息 printf(” 2.查询航线 printf(“ 3.办理订票业务 printf(” 4.办理退票业务 printf(“ 5.退出系统 printf(”-------------n“); do { printf(”请选择(1-5):“); scanf(”%s“,s); c=atoi(s); } while(c<1||c>6); return c; n”);n“);n”);n“); n”); } int main(){ struct airline air[MAXSIZE]= { {“harbin”,“beijing”,“1”,“12:00”,“14:00”,30,30},{“harbin”,“shanghai”,“2”,“10:00”,“13:00”,20,20},{“harbin”,“beijing”,“3”,“13:30”,“10:00”,50,50},{“harbin”,“guangzhou”,“4”,“17:00”,“21:00”,50,50},{“harbin”,“dalian”,“5”,“14:00”,“17:00”,40,40} }; start=air; while(1) { system(“cls”); switch(menu_select()) { case 1: list(); break; case 2: search(); break; case 3: order(); break; case 4: returnticket(); break; case 5: exit(0); } getch(); } } 经验体会 1、通过设计飞机订票系统,加深了对链表的运用和理解。 2、通过多组测试数据,发现了程序的问题,并做了调整、3、通过设计选择菜单,对选择结构有更深刻的了解。 飞机订票系统 1.概述(设计题目与可行性分析) 1.1设计题目:飞机订票系统 1.2可行性分析 飞机订票系统是为机场工作人员和客户提供订票退票等与机票相关内容的管理系统,方便机场工作人员对机票的管理,以提高机场工作人员对机票管理工作的效率。当前飞机订票问题:手工订票所产生的客座率低。而我们的目标是:建立一个飞机订票系统数据库。 1.2.1研究现有系统,画现有系统的流程图 了解当前系统能够完成的功能及组成 航班管理:票据管理 售票点:直接面向用户 航班管理 票据管理 票库 订票库 订票管理 出售管理 打印机票 售票点1 售票点n 现有系统:票据都分布在各个售票点 1.2.2导出新系统的高层逻辑结构 数据流图的基本符号: 数据源/终点(人机界面): 加工处理: 文件名 文件: 数据流名 数据流: 票价信息 机票 查订票号 订票处理 客户信息 出票处理 订票记录 顾客 订票信息 订票号 库存信息 票价信息 票价管理 航班管理 航班信息 操作员 航班信息 保存 新系统的数据流图: 说明:流向文件的数据流的名可以省略 1.2.3可行性分析报告 随着Internet的迅速发展和用户数量的急剧增加,互联网对于企业和事业单位的运营和发展日益重要,网上交易也逐渐被人们认可,并成为未来交易的发展方向。在这种情况下,很多原有的C/S模式的系统也逐步向B/S模式靠拢,飞机订票系统也不例外。 飞机订票系统是飞机旅游服务信息系统的一个重要组成部分。为旅客提供优质便捷的服务,为了提高飞机客运的售票效率,丰富飞机客运的营销手段,飞机售票总站的下属代售点可以通过公用的互联网资源,建立数据库,实现网上的售票,查询及管理工作。 2.系统目标和设计原则 2.1系统目标: 建立一个飞机订票系统数据库。 2.1.1系统简介: 本系统是专为乘坐飞机的旅客准备的,旅客只需把自己的信息(姓名.性别.工作单位.身份证号.旅行时间.旅行目的地)预先交给旅行社,旅行社就可以将信息输入本系统,系统就可以为旅客安排航班,打印出取票通知和帐单。旅客只要在飞机起飞的前一天凭取票通知单和帐单交款取单,系统校对无误即印出机票给旅客。 2.2设计原则 2.2.1根据实际情况考虑三种可行性 技术可行性、经济可行性、操作可行性 2.2.2提出侯选方案、提出各种各样的实现方案 主机(纯主机型、C/S型)、开发环境、网络方案、对提出的每个方案进行成本估计 硬件、软件费用投资(根据各公司的报价)开发成本估计(任务估算法) 运行费用、投资回收期 纯收入:通过本系统的运行、投资回收后的收入 3、描述推荐理由:分别从技术、经济、用户、投资方的不同角度考虑 3.支撑环境规划 3.1整体系统运作图 3.2运行环境 服务器:硬件配置:CPU Intel P4 1.2G以上 内存256 硬盘 80G以上 软件配置:Windows 2000/2003 SERVER SQL SERVER 2000 4.系统功能结构 1、录入:可以录入航班情况(数据可以存储在一个数据文件中,数据结构、具体数据自定) 2、查询:可以查询某个航线的情况(如,输入航班号,查询起降时间,起飞抵达城市,航班票价,票价折扣,确定航班是否满仓);可以输入起飞抵达城市,查询飞机航班情况; 3、订票:(订票情况可以存在一个数据文件中,结构自己设定)可以订票,如果该航班已经无票,可以提供相关可选择航班; 4、退票:可退票,退票后修改相关数据文件; 客户资料有姓名,证件号,订票数量及航班情况,订单要有编号。 5、修改航班信息:当航班信息改变可以修改航班数据文件。 5.数据库设计 5.1概念结构设计 E-R图如下: 5.2逻辑结构设计 1.航空公司表:AIRLINE 2.客户表CUSTOMER 3、飞机表PLANE 4.航线表LINE 5.航班表FLIGHT 6.订票表BOOKTICKET 5.3实现设计 实现以下操作: 1、注册航空公司: 2、增加飞机: 3、增加航线: 4、增加航班: 5、增加客户: 6、建立一个订票的存储过程,存储过程名为Book_Ticket,请完成以下存储过程,实现订票的操作: a)指定要订的航班号(HID)及客户的编号(KID); b)先查看客户是否为特殊客户,如果不是,票价不打折扣; c)否则如果客户航程超过5万公里,票价7折,超过15万公里,票价打5折; d)查看客户订票以后,所有乘客的票数是否超过总的座位数,如果超过,回滚订票操作; e)要求在操作过程中使用到事务技术。 CREATE PROCEDURE Book_ticket @HID VARCHAR(20) @HID VARCHAR(20) AS DECLARE @TRANS_NAME VARCHAR(20)select @TRANS_NAME=’ ’ BEGIN TRANSACTION DECLARE @Bookid int,@seats int,@IsSpec char(1)/*定义订票里程DIST、折扣率discount、总的订票里程distance、票价PRICE(实型)*/ select @Isspec=Isspec,@distance=Points FROM Customer where select @discount=1 IF @ BEGIN END /*选择出票价*/ SELECT @PRICE=PRICE FROM FLIGHT WHERE /*加入客户订票信息*/ /*将客户新订票里程的信息累计到用户信息里面*/ UPDATE SET WHERE /*查看客户订票后,是否超过可容纳的座位数目,如果超过,取消所有操作*/ SELECT booked=count(*)FROM WHERE FID= /*查看额定座位容量*/ SELECT @seats=seatsnum FROM WHERE IF @BOOKED>@SEATS ELSE COMMIT TRANSACTION GO 7.运行这个订票操作的存储过程(自己设定客户及航班) book_ticket , 8.事务运行成功后,再显示各表的数据,按表分别写出来。 6.总体实施计划 6.1可行性研究: 研究现有系统,画现有系统的流程图,编写可行性分析报告 6.2进行数据库设计: 概念结构设计,逻辑结构设计,实现设计 6.3概要设计: 从数据流图导出初始结构图,设计优化 6.4详细设计: 结构化的程序设计,采用流程图的形式 6.5保密设计 1.每个用户需要注册才能进入航空订票信息系统,并进行网上订票的。用户必须 用自己真实的身份进行注册。 2.系统要另外在备一份数据库,防止系统出现错误而使数据信息丢失的可能性。 3.系统要安装防火墙,防止黑客入侵破坏系统。还有就是安装杀毒软件,防止 病毒入侵而导致系统瘫痪。 6.6维护设计 系统设置提供管理员操作页面: 1.提供管理员密码,方便维护操作.2.固定时间对系统进行维护和检测.3.若系统出现瘫痪时,可出动备用系统维持运转.4.定期对系统进行更新整顿清空.7.总结 这次数据库课程设计的“飞机订票系统”,通过近一周的上机操作,充分应用了所学的数据库的知识,并去图书馆查阅了一些书集和上网搜索一部分相当资料,粗略设计出该系统。总体上来说,这次课程设计还是比较成功的,充分运用了所学的软件工程设计、数据库的设计,设计出E-R图、流程图、数据库基本表,从整体规划出了系统的运行环境和系统实现的功能。 当然,由于学艺不精,在课程设计的过程也碰到的一些问题。其中,画E-R图时,各实体中的关系的确定,由于对系统还不够了解而找不到一个准确的词来形容;总体规划时,材料太多,不易整理;相关数据库技术方面没有多注意,这次课程设计的重点只在对整个系统的总体思路设计。 其实这些通过最近的课程设计觉得最重要一点就是:我们一定要自己动手,这样才能真正的学到东西。书本知识固然重要,但我们更要学会将书本知识应用到实际的工作中。实践中才会发现错误,也才能改进,才能达到学习的最终目的。 最后感谢在这次课程设计中帮助过我的老师,同学!8.参考文献 物流信息系统 赵刚 四川大学人民出版社 2002/9 物流信息管理 尹涛 东北财经大学出版社 2005/1 数据库系统概论 王珊 萨师煊 高等教育出版社 2006/5 数据库技术与应用-Access2000篇 郭力平人民邮电出版社 2002/8 软件设计师教程 陈平禇华 清华大学出版社 2006/6 文章引用自: #include //包含access函数的头文件 #define N 9999 //定义最多的航班数 #define PRINT “%dtt%stt%stt星期%stt%dn ”,s[i].num,s[i].start,s[i].over,s[i].time,s[i].count //宏定义输出格式 struct air //定义结构体数组 { int num; //定义航班号 char start[20];//航班起始站 char over[20];//终点站 char time[10];//飞行时间 int count; //机票数量 }s[N]; int i,m=0; //定义全局变量 char ii[10]; void add();//函数声明增加航班信息函数 void print(); //显示航班信息 void search();//查找航班信息 void dingpiao();//订票业务 void tuipiao();//退票 void read();//读取文件 void save();//保存文件 void output();//输出格式 void paixu();//航班排序 void chushihua();//系统初始化 void build();//建立数据文件 void paixu1();//按航班号从小到大排序 void paixu2();//从大到小 void main()//主函数 { int j; chushihua();//系统初始化判断是否存在原始数据文件 printf(“ 欢迎使用飞机订票系统n”);//打印出系统主界面 do { printf(“================================== ”); printf(“1.增加航班信息n” “t2.浏览航班信息n” “tt3.查找航班信息(按航班号)tt╮(╯_╰)╭n” “ttt4.航班排序(按航班号)n” “tttt5.订票业务n” “to(︶︿︶)ottt6.退票业务n” “tttttt0.退出n”);printf(“================================== ”); printf(“请在0-6中选择以回车键结束: ”);scanf(“%d”,&j);switch(j){ case 1: add();//调用增加航班函数 break; case 2:print();//调用显示模块 break; case 3:search();//调用查找模块 break; case 4:paixu();//调用排序函数 break; case 5:dingpiao();//调用订票模块 break; case 6:tuipiao();//调用退票模块 break; case 0: //退出系统 save(); printf(“谢谢使用,再见!”); break;} }while(j!=0);//判断是否调用其他函数 } void chushihua()//定义系统初始化函数 { if(access(“hangban.dat”,0)){ build();} else read();} void build()//定义建立数据文件函数 { FILE *fp;//定义文件指针 if((fp=fopen(“hangban.dat”,“wb”))==NULL)//打开文件并判定是否出错 { printf(“创建文件失败!”);//打印出错提示 getchar(); return;} printf(“请依次输入航班信息(以回车键结束):n”); //打印提示信息 printf(“------------n”);for(i=0;i printf(“请输入航班号: ”); scanf(“%d”,&s[i].num);//输入航班号 printf(“请输入起始站: ”); scanf(“%s”,s[i].start);//输入起始站 printf(“请输入终点站: ”); scanf(“%s”,s[i].over);//输入终点站 printf(“请输入时间(星期几): ”); scanf(“%s”,s[i].time);//输入时间 printf(“请输入机票数: ”); scanf(“%d”,&s[i].count);//输入机票数 fwrite(&s[i],sizeof(struct air),1,fp); m++; printf(“添加完毕,是否继续添加?请键入y或n以回车键结束:”); scanf(“%s”,ii); if(strcmp(ii,“y”)!=0) //判断是否继续添加航班信息 { fclose(fp); //关闭文件 return; } } } void read() //定义读取文件函数 { FILE *fp;if((fp=fopen(“hangban.dat”,“r”))==NULL){ printf(“创建文件失败!”); getchar(); return;} i=0;while(!feof(fp)){ fread(&s[i],sizeof(struct air),1,fp);//逐块读取数据 i++; m++;//计算存在航班数 } m--;fclose(fp);} void save()//定义保存函数 { FILE *fp;if((fp=fopen(“hangban.dat”,“wb”))==NULL) { printf(“创建文件失败!”); getchar(); return;} for(i=0;i //逐块保存数据 fwrite(&s[i],sizeof(struct air),1,fp);fclose(fp);} void add()//定义增加航班信息函数 { do{ printf(“请依次输入您要增加的航班信息(以回车键结束): n”); //打印提示信息 printf(“------------n”); printf(“请输入航班号: ”); scanf(“%d”,&s[m].num);//读取航班号 printf(“请输入起始站: ”); scanf(“%s”,s[m].start);//读取起始站 printf(“请输入终点站: ”); scanf(“%s”,s[m].over);//读取终点站 printf(“请输入时间: ”); scanf(“%s”,s[m].time);//读取时间 printf(“请输入机票数: ”); scanf(“%d”,&s[m].count);//读取机票数 m++; printf(“添加完毕,是否继续添加?请键入y或n以回车键结束:”); scanf(“%s”,ii);}while(!strcmp(ii,“y”));//判断是否继续添加 } void output()//定义输出格式函数 { printf(“航班号tt起始站tt终点站tt时间tt机票数n”);//信息标题 for(i=0;i printf(PRINT);//打印出信息 } void print()//定义显示航班信息函数 { printf(“n目前我们有如下航班:n”);output(); //调用输出格式函数 printf(“n请按回车键返回上层菜单 ”);getchar();getchar();} void search()//定义查询函数 { int n; do { printf(“n请输入航班号: ”); scanf(“%d”,&n);//输入查询的航班号 for(i=0;i { if(s[i].num==n)//按航班号判定输出条件 { printf(“n您所查找的航班信息为:n ”); printf(“航班号tt起始站tt终点站tt时间tt机票数 nn”); printf(PRINT);//显示信息 printf(“n查询完毕,按回车键继续”); getchar(); getchar(); return; } } printf(“n对不起,没有您需要的信息!n ”);printf(“是否重新查找?请键入y或n以回车键结束 ”);scanf(“%s”,ii);}while(!strcmp(ii,“y”));//判定是否重新查找 } void dingpiao()//定义订票业务函数 { int n;char a[10]=“y”;do { search();//调用查询模块 if(!strcmp(ii,“n”)) { printf(“对不起!没有找到您所需要的航班,所以不能订票。n”);//未查找到所需航班 printf(“n请按回车键返回上层菜单 ”); getchar(); getchar(); strcpy(ii,“n”); break; } do { printf(“请输入您要订的机票数(以回车键结束): ”); scanf(“%d”,&n);//输入所订机票数 if(n<=0) //判定机票数是否出错 { printf(“输入错误!至少需订1张机票。n”); } else if(s[i].count==0)//判定机票是否售完 { printf(“对不起,你所选择的航班的机票已售完!n”); break; } else if(s[i].count!=0&&s[i].count>=n)//判定机票数是否大于等于订票数 { s[i].count=s[i].count-n; printf(“订票成功!”); break; } else if(s[i].count { printf(“对不起,你所选择的航班只剩 %d张机票n”, s[i].count); printf(“是否需要重新输入机票数?请输入y或n以回车键结束: ”);//判定是否重新输入订票数 scanf(“%s”,a); } }while(!strcmp(a,“y”)); printf(“是否需要订其他航班的机票?请输入y或n以回车键结束: ”); scanf(“%s”,a);}while(!strcmp(a,“y”));//判定是否继续订票 } void tuipiao()//定义退票函数 { int n;char a[10];do { search();//调用查询函数 if(!strcmp(ii,“n”)) { printf(“对不起!没有找到您所需要的航班,所以不能退票。n”); printf(“n请按回车键返回上层菜单 ”); getchar(); getchar(); strcpy(ii,“n”); break; } printf(“请输入您要退的机票数目: ”); scanf(“%d”,&n);//输入所退票数 if(n<=0) //判定票数是否有效 printf(“输入错误!至少需退1张机票。”); else { s[i].count=s[i].count+n; printf(“退票成功!”); } printf(“是否继续? 请键入y或n以回车键结束: ”);//判定是否继续退票 scanf(“%s”,a);}while(!strcmp(a,“y”));//判定并跳出循环 } void paixu()//定义排序函数 { int n; printf(“n******************************************************************************** ”); printf(“1.按航班号从小到大排序n” “t2.按航班号从大到小排序n”);printf(“******************************************************************************** ”); printf(“请在1-2中选择以回车键结束: ”);scanf(“%d”,&n);//输入排序方式 switch(n){ case 1:paixu1();//调用从小到大排序函数 break; case 2:paixu2();//调用从大到小排序函数 break;} printf(“排序后的航班信息为:n”);output(); //显示排序后航班信息 printf(“n请按回车键返回上层菜单 ”); getchar(); getchar();} void paixu1()//定义从小到大排序函数 { int k,j;struct air t;for(i=0;i { k=i; for(j=i+1;j if(s[k].num>s[j].num) k=j; if(i!=k) { t=s[k]; s[k]=s[i]; s[i]=t; } } } void paixu2()//定义从大到小排序函数 { } int k,j;struct air t;for(i=0;i if(s[k].num k=j;if(i!=k){ t=s[k]; s[k]=s[i]; s[i]=t;} } 软件工程专业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 #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(i { 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(amount<=info->tkt_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;i /*输出座位号*/ 户名单链表中*/ int i;back->next=t->next;printf(“%s订票成功!n”,t->name);for(i=0;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(c<1||c>6);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语言课程设计——飞机订票系统源代码
第五篇:数据结构课程设计c语言版《飞机订票系统》