航空客运订票系统
本次课程设计做的航空客运订票系统,主要用到了,线性表、链表、图的存储结构,本次课程设计仍然使用多文件组织工程,点击此处参考(编码工具:code::blocks 12.04)
工程文件视角图如下:
实现源代码如下:
1.mainFram.h
//*Copyright (c)2017,烟台大学计算机与控制工程学院* //*All rights reservrd.* //*文件名称 :mainFram.h* //*作者:田长航* //*完成时间:2017年12月21日* //*版本号:v1.0* //*问题描述:定义界面实现的部分宏定义、要实现算法的函数的声明* //*输入描述:无* //*程序输出:无* #ifndef MAINFRAM_H_INCLUDED #define MAINFRAM_H_INCLUDED #define flight_max 5//最大航班数 struct passanager //乘客信息结构体 { char name[10];//名字 char id[20];//身份证号 float money; //资产 int ifstu; //是否学生认证 char airnum[10]; //航班号 int sex; //性别,男1女0 char phone[15]; //预留手机号 }; typedef struct passanager pass; struct airplane//航班信息 { char num[10]; //航班号 float price; //票价 float discount; //折扣 char start[10]; //起始地 char arrive[10]; //目的地 int count; //余票数 int min,sec; //时间 }; typedef struct airplane air; int setdiscount(air *a); //设定折扣函数,只需要传递air指针即可,包含这些函数的模块只能对航班操作 void disairline(air *a);//显示航班信息,顺序结构,顾客用 bool stu_confrim(pass *p); //学生认证函数,传递pass指针,只需对乘客操作 #endif // MAINFRAM_H_INCLUDED
2.mainFram.cpp
//*Copyright (c)2017,烟台大学计算机与控制工程学院* //*All rights reservrd.* //*文件名称 :mainFrame.h* //*作者:田长航* //*完成时间:2017年12月21日* //*版本号:v1.0* //*问题描述:界面实现函数以及各模块功能的实现函数代码* //*输入描述:air型指针,pass型指针,Dlinklist型指针,ALGRAPH型指针 //*程序输出:各模块实现功能* #include "mainFram.h" #include "linklist.h" #include <malloc.h> #include <cstdio> #include <iostream> #include <conio.h> #include <string.h> #include <fstream> #include <stdlib.h> #include "graph.h" using namespace std; /*********************************************************** * 功能描述:主函数 * 输入参数:air型指针,pass型指针,Dlinklist型指针,ALGRAPH型指针 * 输出参数:无 * 返回值 :无 * 其他说明:入口函数 ************************************************************/ void mainFram(DLinkList *L,pass *p,air *a,ALGraph *&G) { system("cls");//清屏 system("color 9f");//改变界面颜色,管理颜色为红色背景,普通服务为蓝色背景 cout<<endl<<endl; cout<<" ** * ** ****** * **** **** * * ******"<<endl; cout<<" ** *** ** * * * * * * * * * * "<<endl; cout<<" ** ** ** ** ***** * * * * * * * * ***** "<<endl; cout<<" ** ** ** ** * * * * * * * * * * "<<endl; cout<<" *** *** * * * * * * * * * * "<<endl; cout<<" * * ****** ****** **** **** * * * ******"<<endl; cout<<endl<<endl<<endl; cout<<" ☆☆☆☆☆☆☆☆☆☆☆☆☆ TCH Airplane Synthetic System ☆☆☆☆☆☆☆☆☆☆☆☆☆☆"<<endl; cout<<endl; cout<<" ┏━━━━━━━━━━━━━┓\n"; cout<<" ┃ 航空客运订票综合系统 ┃\n"; cout<<" ┃━━━━━━━━━━━━━┃\n"; cout<<" ┃1.用户服务系统 ┃\n"; cout<<" ┃━━━━━━━━━━━━━┃\n"; cout<<" ┃2.管理员管理系统 ┃\n"; cout<<" ┃━━━━━━━━━━━━━┃\n"; cout<<" ┃3.关于我们 ┃\n"; cout<<" ┃━━━━━━━━━━━━━┃\n"; cout<<" ┃0.退出 ┃\n"; cout<<" ┗━━━━━━━━━━━━━┛\n"; cout<<"请输入数字实现功能:"<<endl; int n; cin>>n; switch(n) { case 1: mainFram_pa(L,p,a,G);//调用用户服务认证界面 break; case 2: if(rootlog(L,p,a,G)) //由函数返回的布尔值继续进行 { getch(); mainFram_ma(L,p,a,G); //登录成功之后,进入管理主界面 } else { cout<<"密码或用户名不对!登陆失败"<<endl; getch(); } break; case 3: system("cls");//清屏 cout<<endl<<endl<<endl; cout<<" ☆☆☆☆☆☆☆☆☆☆☆☆☆ TCH Airplane Synthetic System ☆☆☆☆☆☆☆☆☆☆☆☆☆☆"<<endl;//我的信息 cout<<" ☆☆☆☆☆☆☆☆☆☆☆☆☆ 航空客运订票综合系统 ☆☆☆☆☆☆☆☆☆☆☆☆☆☆"<<endl; cout<<" ☆☆☆☆☆☆☆☆☆☆☆☆版本号:V1.0 联系邮箱:153199613@qq.com☆☆☆☆☆☆☆☆☆☆☆"<<endl; cout<<" ☆☆☆☆☆☆☆☆☆☆☆☆☆ 烟台大学计算机与控制工程学院 ☆☆☆☆☆☆☆☆☆☆☆☆☆☆"<<endl; getch(); break; default: break; } } /*********************************************************** * 功能描述:用户服务系统主界面 * 输入参数:air型指针,pass型指针,Dlinklist型指针,ALGRAPH型指针 * 输出参数: 认证界面 * 返回值 :无 * 其他说明:入口函数 ************************************************************/ void mainFram_pa(DLinkList *L,pass *p,air *a,ALGraph *&G) { int i1;//此变量用于存储LocateElem返回的值,判断认证顾客在链表中的位置 pass pa1;//用于传递参数 char name1[10]; system("cls"); cout<<"请输入您的身份证号来验证身份:"<<endl; cin>>pa1.id; i1=LocateElem(L,1,pa1); if(i1!=0) { cout<<"已确认身份合法,请输入您的姓名完成身份鉴定。"<<endl<<"请输入您的用户名:"<<endl; cin>>name1; int j=0; DLinkList *c=L; while (j<i1) { j++; c=c->next; } strcpy(pa1.name,c->data.name); if(!strcmp(name1,pa1.name)) { pass *wo; wo=&c->data; cout<<"鉴定成功,您的信息如下:"<<endl; mainFram_pa_su(L,wo,a,G);//compare success } else { cout<<"鉴定故障,原因可能是您输入的用户名与您的身份证号不匹配。\nPress any key to continue..."<<endl; getch(); mainFram(L,p,a,G); } } else { cout<<"该身份证号不存在,您的信息没有在数据库中,如有需要请联系管理员及时添加。"<<endl; cout<<"Press any key to continue..."<<endl; getch(); mainFram(L,p,a,G); } } /*********************************************************** * 功能描述:用户服务系统主界面1 * 输入参数:air型指针,pass型指针,Dlinklist型指针,ALGRAPH型指针 * 输出参数: 用户服务主界面 * 返回值 :无 * 其他说明:用户服务入口窗口 ************************************************************/ void mainFram_pa_su(DLinkList *L,pass *p, air *a,ALGraph *&G)//认证之后的p指针是认证时的顾客,这样进行操作时,就会有目的进行修改 { system("cls");//清屏 system("color 9f");//改变界面颜色 cout<<endl<<endl; cout<<" ** * ** ****** * **** **** * * ******"<<endl; cout<<" ** *** ** * * * * * * * * * * "<<endl; cout<<" ** ** ** ** ***** * * * * * * * * ***** "<<endl; cout<<" ** ** ** ** * * * * * * * * * * "<<endl; cout<<" *** *** * * * * * * * * * * "<<endl; cout<<" * * ****** ****** **** **** * * * ******"<<endl; cout<<endl<<endl<<endl; cout<<" ☆☆☆☆☆☆☆☆☆☆☆☆☆ TCH Airplane Servervice System ☆☆☆☆☆☆☆☆☆☆☆☆☆☆"<<endl; cout<<endl; cout<<" ┏━━━━━━━━━━━━━┓\n"; cout<<" ┃ 欢迎使用航空客运订票系统 ┃\n"; cout<<" ┃━━━━━━━━━━━━━┃\n"; cout<<" ┃1.购买机票 ┃\n"; cout<<" ┃━━━━━━━━━━━━━┃\n"; cout<<" ┃2.查询航班信息 ┃\n"; cout<<" ┃━━━━━━━━━━━━━┃\n"; cout<<" ┃3.学生认证 ┃\n"; cout<<" ┃━━━━━━━━━━━━━┃\n"; cout<<" ┃0.退出 ┃\n"; cout<<" ┗━━━━━━━━━━━━━┛\n"; cout<<"请输入数字实现功能:"<<endl; int me; cin>>me; switch(me) { case 0: break; case 1: system("cls"); if(!purtic(p,a))//根据返回的布尔值进行下列程序 { cout<<"购买失败,给自己节省点时间吧,看看别的航班,请不要购买没有余票的航班!"<<endl; getch(); purtic(p,a); } mainFram_pa_su(L,p,a,G); break; case 2: system("cls"); cout<<endl<<endl; cout<<"\t\t"<<"*****航班信息表*****"<<endl; disairline(a); getch(); mainFram_pa_su(L,p,a,G); break; case 3: if(stu_confrim(p))//此处进行学生认证 { p->ifstu=1; cout<<"认证成功,您在购买机票的时候将享受半价优惠。\n"; getch(); mainFram_pa_su(L,p,a,G); } else { cout<<"您所在的大学不存在或者未与我方合作,认证失败!\n"; getch(); mainFram_pa_su(L,p,a,G); } break; } } /*********************************************************** * 功能描述:学生认证函数 * 输入参数:air型指针,pass型指针,Dlinklist型指针,ALGRAPH型指针 * 输出参数: 认证界面 * 返回值 :认证结果 * 其他说明:使用文件输入流 ************************************************************/ bool stu_confrim(pass *p)//学生认证函数 { ifstream infile; infile.open("G://大学.txt"); //此处文件保存学校信息,只有在文件中的学校才能获得认证资格 if(!infile) cout<<"error"<<endl; //文件读入数据操作 char school[20]; char input[20]; cout<<"请输入您所在的大学:"<<endl; cin>>input; while(infile.getline(school,sizeof(school))) //以循环的方式 { if(!strcasecmp(school,input)) return true; } return false; } bool purtic(pass *p,air *a)//购票函数 { system("cls"); int i; cout<<endl<<endl; cout<<"#####欢迎来到购票系统#####"<<endl; cout<<"请您选择购票的航班"<<endl; for(i=1;i<=flight_max;i++) { cout<<i<<"."<<(a+i-1)->num<<" "<<(a+i-1)->start<<"-->"<<(a+i-1)->arrive<<" 票数剩余:"<<(a+i-1)->count<<endl; cout<<"单价:"<<(a+i-1)->price<<endl; } cout<<"输入0取消购买。"<<endl; cin>>i; if(i==0) { return true; } if((a+i-1)->count!=0) { float in;//purchase sucess if((strcmp(p->airnum,"无"))!=0)//判断该用户是否已经购买机票 { cout<<"您已经买过票了,给别人个机会吧,有钱也不要任性啊!"<<endl; return false; } if(p->ifstu==1)//判断是否是在校学生 { cout<<"您是在校学生,享有半价优惠。"<<endl; in=p->money-(a+i-1)->price*0.5; if(in<0)//确保不赊账 { cout<<"大哥,没钱就别出来混了,快去充点钱吧,要不连家都回不去了。\n"; return false; } in=p->money; cout<<"购买成功,账单明细:"; p->money=p->money-(a+i-1)->price*0.5; strcpy(p->airnum,(a+i-1)->num); printf("\n您购票前账户余额:%0.2f\n您花费的金额为:%0.2f\n您当前余额为:%0.2f\n",in,(a+i-1)->price,p->money); cout<<"Press any key to continue..."<<endl; (a+i-1)->count--; getch(); return true; } in=p->money-(a+i-1)->price; if(in<0) { cout<<"大哥,没钱就别出来混了,快去充点钱吧,要不连家都回不去了。\n"; return false; } in=p->money; cout<<"购买成功,账单明细:"; p->money=(p->money-(a+i-1)->price); strcpy(p->airnum,(a+i-1)->num); printf("\n您购票前账户余额:%0.2f\n您花费的金额为:%0.2f\n您当前余额为:%0.2f\n",in,(a+i-1)->price,p->money); cout<<"Press any key to continue..."<<endl; (a+i-1)->count--; getch(); return true; } else return false; } /*g管理界面系统*/ /*********************************************************** * 功能描述:管理系统主界面 * 输入参数:air型指针,pass型指针,Dlinklist型指针,ALGRAPH型指针 * 输出参数: 主界面 * 返回值 :无 * 其他说明:管理员入口函数 ************************************************************/ void mainFram_ma(DLinkList *&L,pass *p,air *a,ALGraph *&G)//管理界面 { system("cls");//清屏 system("color 4f");//改变界面颜色 cout<<endl<<endl; cout<<" ** * ** ****** * **** **** * * ******"<<endl; cout<<" ** *** ** * * * * * * * * * * "<<endl; cout<<" ** ** ** ** ***** * * * * * * * * ***** "<<endl; cout<<" ** ** ** ** * * * * * * * * * * "<<endl; cout<<" *** *** * * * * * * * * * * "<<endl; cout<<" * * ****** ****** **** **** * * * ******"<<endl; cout<<endl<<endl<<endl; cout<<" ☆☆☆☆☆☆☆☆☆☆☆☆☆ TCH Airplane Reservation System ☆☆☆☆☆☆☆☆☆☆☆☆☆☆"<<endl; cout<<endl; cout<<" ┏━━━━━━━━━━━━━┓\n"; cout<<" ┃ 航空订票服务高级管理系统 ┃\n"; cout<<" ┃━━━━━━━━━━━━━┃\n"; cout<<" ┃1.用户信息管理 ┃\n"; cout<<" ┃━━━━━━━━━━━━━┃\n"; cout<<" ┃2.设置票价优惠 ┃\n"; cout<<" ┃━━━━━━━━━━━━━┃\n"; cout<<" ┃3.管理航班信息 ┃\n"; cout<<" ┃━━━━━━━━━━━━━┃\n"; cout<<" ┃0.退出 ┃\n"; cout<<" ┗━━━━━━━━━━━━━┛\n"; cout<<"请输入数字实现功能:"<<endl; int m; cin>>m; switch(m) { case 1: chapass(L,p,a,G); //更改用户信息 break; case 2: float pr; pr=setdiscount(a);//设置折扣 if(pr!=0) { cout<<"打折之后的票价为:"<<endl; cout<<pr<<endl; cout<<endl<<endl<<"Press any key to continue..."<<endl; } else { cout<<"设置失败!"<<endl; } getch(); mainFram_ma(L,p,a,G); break; case 3: maairline(a,L,G);//管理航班信息 mainFram_ma(L,p,a,G); break; case 0: break; default: cout<<"您的输入有误,系统无法提供服务,按任意键返回。"<<endl; mainFram_ma(L,p,a,G); } } /*********************************************************** * 功能描述:查看航班信息 * 输入参数:air型指针 * 输出参数: 航班的详细信息 * 返回值 :无 * 其他说明:入口函数 ************************************************************/ void disairline(air *a) //用户查看航班信息,表格形式,顺序结构 { int i; printf("|航班号| | 票价 | |折扣| |起始地| |目的地| | 发车时间 | |余票|\n"); for(i=0;i<flight_max;i++) { printf("|%-6s| |%-6.2f| |%-4.2f| |%-6s| |%-6s| | %-2d : %-2d | |%-4d|\n",(a+i)->num,(a+i)->price,(a+i)->discount,(a+i)->start,(a+i)->arrive,(a+i)->min,(a+i)->sec,(a+i)->count); } printf("\nPress any key to continue..."); } /* 用户信息管理界面 */ /*********************************************************** * 功能描述:用户信息更改实现界面 * 输入参数:air型指针,pass型指针,Dlinklist型指针,ALGRAPH型指针 * 输出参数: 选择功能 * 返回值 :无 * 其他说明:更改信息,实现增删改查 ************************************************************/ void chapass(DLinkList *L,pass *p,air *a,ALGraph *&G)//更改顾客信息 { system("cls");//清屏 cout<<endl<<endl<<endl; cout<<" ☆☆☆☆☆☆☆☆☆☆☆☆☆ TCH Airplane Reservation System ☆☆☆☆☆☆☆☆☆☆☆☆☆☆"<<endl; cout<<endl; cout<<" ┏━━━━━━━━━━━━━┓\n"; cout<<" ┃ 用户信息管理界面 ┃\n"; cout<<" ┃━━━━━━━━━━━━━┃\n"; cout<<" ┃1.查看所有用户信息 ┃\n"; cout<<" ┃━━━━━━━━━━━━━┃\n"; cout<<" ┃2.添加一个用户 ┃\n"; cout<<" ┃━━━━━━━━━━━━━┃\n"; cout<<" ┃3.删除一个用户 ┃\n"; cout<<" ┃━━━━━━━━━━━━━┃\n"; cout<<" ┃4.更改用户信息 ┃\n"; cout<<" ┃━━━━━━━━━━━━━┃\n"; cout<<" ┃5.查找用户 ┃\n"; cout<<" ┃━━━━━━━━━━━━━┃\n"; cout<<" ┃0.退出 ┃\n"; cout<<" ┗━━━━━━━━━━━━━┛\n"; cout<<"请输入数字实现功能:"<<endl; int m; cin>>m; switch(m) { case 1: system("cls");//清屏 DispList(L); getch(); chapass(L,p,a,G); break; case 2: system("cls"); int i; cout<<"请输入您要插入的位置:"<<endl; cin>>i; pass e; if(ListInsert(L,i,e)) cout<<"信息添加成功,请按任意键返回。。。"<<endl;//插入一个节点 else cout<<"添加失败,可能是超过最大名额限制或者插入的位置超过上限,请联系开发人员(17865569098)。"<<endl; getch(); chapass(L,p,a,G); break; case 3: int i1; pass e1; system("cls"); cout<<endl<<endl; cout<<"warning : Your action is sensitive operation !"<<endl<<"警告:您现在的操作为敏感操作,请慎重考虑后再行删除!"<<endl; cout<<"请选择删除模式"<<endl<<"1.按照身份证号删除"<<endl<<"2.按照预留手机号删除"<<endl; int mode; cin>>mode; //此处的mode变量为模式,将模式的值传递给LocateElem函数,进行相应的操作 if(mode==1) { cout<<"请输入您要删除用户的身份证号:"<<endl; cin>>e1.id; i1=LocateElem(L,mode,e1); //查找一个节点 if(i1!=0) { if(ListDelete(L,i1,e1)) //删除一个节点 { cout<<"删除该用户信息成功!按任意键退回。。。"<<endl; getch(); chapass(L,p,a,G); } else { cout<<"删除失败,没有找到该身份证号对应的用户。。。"<<endl; getch(); chapass(L,p,a,G); } } else { cout<<"未找到符合条件的用户,查找失败。。。"<<endl; getch(); chapass(L,p,a,G); } } else if(mode==2) { cout<<"请输入您要删除用户的手机号:"<<endl; cin>>e1.phone; i1=LocateElem(L,mode,e1); //查找一个节点 if(i1!=0) { if(ListDelete(L,i1,e1)) //删除一个节点 { cout<<"删除该用户信息成功!按任意键退回。。。"<<endl; getch(); chapass(L,p,a,G); } else { cout<<"删除失败,没有找到该手机号对应的用户。。。"<<endl; getch(); chapass(L,p,a,G); } } else { cout<<"未找到符合条件的用户,查找失败。。。"<<endl; getch(); chapass(L,p,a,G); } } break; case 4: int i3; pass e3; system("cls");//清屏 cout<<endl<<endl<<"warning : Your action is sensitive operation !"<<endl<<"警告:您现在的操作为敏感操作,请谨慎操作!"<<endl; //敏感操作要警告 cout<<endl<<"####更改用户信息####"<<endl; cout<<"请输入您要更改的用户的身份证号:"<<endl; cin>>e3.id; i3=LocateElem(L,1,e3); if(i3!=0) { cout<<"查找成功,可以进行修改操作,请谨慎进行!"<<endl; if(ListInsert(L,i3,e3)) { cout<<"修改成功,Press any key to continue..."<<endl; getch(); chapass(L,p,a,G); } else { cout<<"修改失败,可能是您没有操作权限或者操作非法!"<<endl; getch(); chapass(L,p,a,G); } } else { cout<<"未能找到符合条件的用户,Press any key to continue..."<<endl; getch(); chapass(L,p,a,G); } break; case 5: system("cls"); cout<<endl<<endl<<"#####查找用户信息#####"<<endl; int i2,mode2; pass e2; cout<<endl<<"请选择查找方式:"<<endl<<"1.按照身份证号查找"<<endl<<"2.按照预留手机号查找"<<endl; cin>>mode2; cout<<endl; if(mode2==1) { cout<<"请输入您要找的用户身份证号:"<<endl; cin>>e2.id; i2=LocateElem(L,mode2,e2); if(i2!=0) { cout<<"查找成功!以下是身份证为"<<e2.id<<"的信息:"<<endl; GetElem(L,i2,e2); cout<<"|姓名\t| | 身份证号 | |性别| | 电话号码 | |航班号\t| |学生认证|"; printf("\n"); printf("%-10s",e2.name); printf(" %-20s",e2.id); if(e2.sex==1) cout<<" 男\t"; else cout<<" 女\t"; printf("%-11s",e2.phone); printf(" %-12s",e2.airnum); if(e2.ifstu==1) cout<<" 是"<<"\t"; else cout<<" 否"<<"\t"; cout<<endl<<endl<<"按任意键继续。。。"<<endl; getch(); chapass(L,p,a,G); } else { cout<<"未能查到符合条件的用户信息,Press any key to continue..."<<endl; getch(); chapass(L,p,a,G); } } else { cout<<"请输入您要找的手机号:"<<endl; cin>>e2.phone; i2=LocateElem(L,mode2,e2); if(i2!=0) { cout<<"查找成功!以下是手机号为"<<e2.phone<<"的信息:"<<endl; GetElem(L,i2,e2); cout<<"|姓名\t| | 身份证号 | |性别| | 电话号码 | |航班号\t| |学生认证|"; printf("\n"); printf("%-10s",e2.name); printf(" %-20s",e2.id); if(e2.sex==1) cout<<" 男\t"; else cout<<" 女\t"; printf("%-11s",e2.phone); printf(" %-12s",e2.airnum); if(e2.ifstu==1) cout<<" 是"<<"\t"; else cout<<" 否"<<"\t"; cout<<endl<<endl<<"按任意键继续。。。"<<endl; getch(); chapass(L,p,a,G); } else { cout<<"未能查到符合条件的用户信息,Press any key to continue..."<<endl; getch(); chapass(L,p,a,G); } } break; case 0: mainFram_ma(L,p,a,G); break; default: cout<<"您的指令有误,请按正确的格式输入!Press any key to continue!"<<endl; getch(); chapass(L,p,a,G); break; } } /*********************************************************** * 功能描述:设置折扣 * 输入参数:air型指针与折扣 * 输出参数:折扣后的票价 * 返回值 :票价 * 其他说明:入口函数 ************************************************************/ int setdiscount(air *a) { int i; float dis; system("cls"); cout<<"请输入您想设置优惠的航班号:"<<endl; char hang[10]; cin>>hang; for(i=0;i<flight_max;i++) { if(!strcmp(((a+i)->num),hang)) { cout<<"请输入您要设置的优惠:"<<endl; cin>>dis; (a+i)->discount=dis; cout<<"设置成功。"<<endl; (a+i)->price=(a+i)->price*(a+i)->discount; getch(); return (a+i)->price; } } cout<<"没有该航班。"<<endl; getch(); return 0; } /*航班管理函数*/ /*********************************************************** * 功能描述:管理航班信息函数 * 输入参数:air型指针,Dlinklist型指针,ALGRAPH型指针 * 输出参数: 功能实现 * 返回值 :无 * 其他说明:入口函数 ************************************************************/ void maairline(air *a,struct DNode *L,ALGraph *&G) { system("cls"); cout<<endl<<endl; cout<<" ** * ** ****** * **** **** * * ******"<<endl; cout<<" ** *** ** * * * * * * * * * * "<<endl; cout<<" ** ** ** ** ***** * * * * * * * * ***** "<<endl; cout<<" ** ** ** ** * * * * * * * * * * "<<endl; cout<<" *** *** * * * * * * * * * * "<<endl; cout<<" * * ****** ****** **** **** * * * ******"<<endl; cout<<endl<<endl<<endl; cout<<" ☆☆☆☆☆☆☆☆☆☆☆☆☆ TCH Airplane Airline System ☆☆☆☆☆☆☆☆☆☆☆☆☆☆"<<endl; cout<<endl; cout<<" ┏━━━━━━━━━━━━━┓\n"; cout<<" ┃ 航空订票航班管理系统 ┃\n"; cout<<" ┃━━━━━━━━━━━━━┃\n"; cout<<" ┃1.更改航班信息 ┃\n"; cout<<" ┃━━━━━━━━━━━━━┃\n"; cout<<" ┃2.显示所有航班信息 ┃\n"; cout<<" ┃━━━━━━━━━━━━━┃\n"; cout<<" ┃0.退出 ┃\n"; cout<<" ┗━━━━━━━━━━━━━┛\n"; cout<<endl<<endl<<"请输入数字以实现功能:"<<endl; int me5; cin>>me5; switch(me5) { case 0: break; case 1: chairline(a,L,G); getch(); break; case 2: DispAdj(G); getch(); break; default: cout<<"您的指令有误,请重新输入。"<<endl; getch(); maairline(a,L,G); break; } } /*********************************************************** * 功能描述:更改航班信息界面 * 输入参数:air型指针,Dlinklist型指针,ALGRAPH型指针 * 输出参数: 实现界面与修改实现 * 返回值 :无 * 其他说明:入口函数 ************************************************************/ void chairline(air *a,struct DNode *L,ALGraph *&G) { system("cls"); cout<<endl<<endl; cout<<" ☆☆☆☆☆☆☆☆☆☆☆☆☆ TCH Airplane Airline System ☆☆☆☆☆☆☆☆☆☆☆☆☆☆"<<endl; cout<<endl; cout<<" ┏━━━━━━━━━━━━━┓\n"; cout<<" ┃1.更改航班号 ┃\n"; cout<<" ┃━━━━━━━━━━━━━┃\n"; cout<<" ┃2.放票、收票 ┃\n"; cout<<" ┃━━━━━━━━━━━━━┃\n"; cout<<" ┃0.退出 ┃\n"; cout<<" ┗━━━━━━━━━━━━━┛\n"; cout<<endl<<endl<<"请输入数字以实现功能:"<<endl; int me4; cin>>me4; switch(me4) { case 0: break; case 1: system("cls"); if(chline(a,L,G)) cout<<"修改成功!按任意键继续!"<<endl; else cout<<"您输入的航班号不存在,修改失败!"<<endl; getch(); chairline(a,L,G); break; case 2: system("cls"); if(chticcount(a,L,G)) cout<<"修改成功!按任意键继续!"<<endl; else cout<<"您输入的航班号不存在或者操作非法,修改失败!"<<endl; getch(); chairline(a,L,G); break; default: cout<<"您的指令有误,请重新输入。"<<endl; getch(); maairline(a,L,G); break; } } /*变更航班号函数*/ /*********************************************************** * 功能描述:变更航班号 * 输入参数:air型指针,Dlinklist型指针,ALGRAPH型指针 * 输出参数: 认证界面 * 返回值 :无 * 其他说明:入口函数 ************************************************************/ bool chline(air *a,struct DNode *L,ALGraph *&G) { system("cls"); cout<<endl<<endl; cout<<"请输入您要更改的航班号:"<<endl; char hangn[10]; cin>>hangn; int i; ArcNode *p; //创建节点 for (i=0; i<G->n; i++) //用循环进行遍历 { p=G->adjlist[i].firstarc; while (p!=NULL) { if(!strcmp(G->adjlist[i].data.num,hangn)) { char nnum[10]; cout<<"请输入新的航班号:"<<endl; cin>>nnum; strcpy(G->adjlist[i].data.num,nnum); strcpy(a[i].num,nnum); cout<<"修改成功!"; return true; } p=p->nextarc; } } return false; } /*变更航班票数函数*/ /*********************************************************** * 功能描述:放票收票函数 * 输入参数:air型指针,Dlinklist型指针,ALGRAPH型指针 * 输出参数: 实现界面 * 返回值 :实现结果 * 其他说明: ************************************************************/ bool chticcount(air *a,struct DNode *L,ALGraph *&G) { system("cls"); cout<<endl<<endl; cout<<"请输入您要更改的航班号:"<<endl; char hangn[10]; cin>>hangn; int i; ArcNode *p; for (i=0; i<G->n; i++) { p=G->adjlist[i].firstarc;//给p初始值 while (p!=NULL) { if(!strcmp(G->adjlist[i].data.num,hangn)) { int ncount; cout<<"请选择模式:1.放票 2.收票"<<endl; cout<<"当前此航班剩余票数:"<<G->adjlist[i].data.count<<endl; int sel; cin>>sel; if(sel==1) { cout<<"请输入放票数量:"<<endl; cin>>sel; ncount=G->adjlist[i].data.count+sel; //条件判断值 if(ncount>60) { cout<<"大哥,飞机不是货车,哪有那么多票啊!"<<endl; return false; } G->adjlist[i].data.count=ncount;//同步图结构的值与线性表中的一致!!!!重要 a[i].count=ncount; cout<<"放票成功!"<<endl; return true; } else if(sel==2) { cout<<"请输入收票数量:"<<endl; cin>>sel; ncount=G->adjlist[i].data.count-sel; if(ncount<0) { cout<<"大哥,票都收没了,别收了!"<<endl; return false; } G->adjlist[i].data.count=ncount; a[i].count=ncount; cout<<"收票成功!"<<endl; return true; } else { cout<<"error!错误输入!"<<endl; return false; } } p=p->nextarc; } } return false; } /*管理员登录函数*/ /*********************************************************** * 功能描述:管理员登录 * 输入参数:air型指针,pass型指针,Dlinklist型指针,ALGRAPH型指针 * 输出参数: 认证界面 * 返回值 :无 * 其他说明:管理员入口函数 ************************************************************/ bool rootlog(struct DNode *L,pass *p,air *a,ALGraph *&G) { system("cls"); char username[10]="root"; char password[10]="123456"; char username1[10]; char password1[10]; cout<<endl<<endl<<endl<<endl; cout<<" ********************************************"<<endl; cout<<" * *"<<endl; cout<<" * 欢迎进入管理登录系统 *"<<endl; cout<<" * *"<<endl; cout<<" ********************************************"<<endl; cout<<endl<<endl<<endl<<endl; cout<<" 请输入用户名:"; cin>>username1; cout<<endl; cout<<" 请输入密码:"; cin>>password1; if((!strcmp(username1,username))&& (!strcmp(password1,password))) //匹配固定密码 { cout<<"登录成功!"<<endl; return true; } else return false; }
3.linklist.h
//*Copyright (c)2017,烟台大学计算机与控制工程学院* //*All rights reservrd.* //*文件名称 :linklist.h* //*作者:田长航* //*完成时间:2017年12月21日* //*版本号:v1.0* //*问题描述:定义双链表数据结构的代码、宏定义、要实现算法的函数的声明* //*输入描述:无* //*程序输出:无* #ifndef LINKLIST_H_INCLUDED #define LINKLIST_H_INCLUDED #include "mainFram.h" #include "graph.h" typedef struct passanager NewType; typedef struct DNode //定义双链表结点类型 { NewType data; struct DNode *prior; //指向前驱结点 struct DNode *next; //指向后继结点 } DLinkList; void CreateListF(DLinkList *&L,NewType a[],int n);//头插法建双链表 void CreateListR(DLinkList *&L,NewType a[],int n);//尾插法建双链表 void InitList(DLinkList *&L); //初始化双链表 void DestroyList(DLinkList *&L); //销毁双链表 bool ListEmpty(DLinkList *L); //判断链表是否为空 int ListLength(DLinkList *L); //求链表的长度 void DispList(DLinkList *L); //输出链表 bool GetElem(DLinkList *L,int i,NewType &e); //获取节点的值,并按要求输出输出 int LocateElem(DLinkList *L,int mode,NewType e); //查找一个节点 bool ListInsert(DLinkList *&L,int i,NewType e) ;//插入一个节点 bool ListDelete(DLinkList *&L,int i,NewType &e); //删除一个节点 #endif // LINKLIST_H_INCLUDED
4.linklist.cpp
//*Copyright (c)2017,烟台大学计算机与控制工程学院* //*All rights reservrd.* //*文件名称 :linklist.cpp* //*作者:田长航* //*完成时间:2017年12月21日* //*版本号:v1.0* //*问题描述:双链表数据结构的函数实现代码* //*输入描述:Dlinklist型指针以及air、pass型指针* //*程序输出:无* #include <stdio.h> #include <malloc.h> #include <conio.h> #include <iostream> #include "linklist.h" #include <string.h> using namespace std; /*********************************************************** * 功能描述:头插法创建双链表 * 输入参数:Dlinklist 型引用指针,NewType 型数组首地址,插入数量 * 输出参数: 创建结果 * 返回值 :无 * 其他说明:无 ************************************************************/ void CreateListF(DLinkList *&L,NewType a[],int n) //头插法建双链表 { DLinkList *s; int i; L=(DLinkList *)malloc(sizeof(DLinkList)); //创建头结点 L->prior=L->next=NULL; for (i=0; i<n; i++) { s=(DLinkList *)malloc(sizeof(DLinkList));//创建新结点 s->data=a[i]; s->next=L->next; //将*s插在原开始结点之前,头结点之后 if (L->next!=NULL) L->next->prior=s; L->next=s; s->prior=L; } } /*********************************************************** * 功能描述:尾插法创建双链表 * 输入参数:Dlinklist 型引用指针,NewType 型数组首地址,插入数量 * 输出参数: 创建结果 * 返回值 :无 * 其他说明:无 ************************************************************/ void CreateListR(DLinkList *&L,NewType a[],int n) //尾插法建双链表 { DLinkList *s,*r; int i; L=(DLinkList *)malloc(sizeof(DLinkList)); //创建头结点 L->prior=L->next=NULL; r=L; //r始终指向终端结点,开始时指向头结点 for (i=0; i<n; i++) { s=(DLinkList *)malloc(sizeof(DLinkList));//创建新结点 //a[i].signinfo(); s->data=a[i]; r->next=s; s->prior=r; //将*s插入*r之后 r=s; } r->next=NULL; //终端结点next域置为NULL } /*********************************************************** * 功能描述:插入链表 * 输入参数:Dlinklist 型引用指针 * 输出参数:Dlinklist 型指针引用 * 返回值 :无 * 其他说明:无 ************************************************************/ void InitList(DLinkList *&L) { L=(DLinkList *)malloc(sizeof(DLinkList)); //创建头结点 L->prior=L->next=NULL; } /*********************************************************** * 功能描述:销毁链表 * 输入参数:Dlinklist 型引用指针 * 输出参数:Dlinklist 型指针引用 * 返回值 :无 * 其他说明:无 ************************************************************/ void DestroyList(DLinkList *&L) { DLinkList *p=L,*q=p->next; while (q!=NULL) { free(p); p=q; q=p->next; } free(p); } /*********************************************************** * 功能描述:判断链表是否为空 * 输入参数:Dlinklist 型指针 * 输出参数: * 返回值 :bool型变量表示结果 * 其他说明:无 ************************************************************/ bool ListEmpty(DLinkList *L) { return(L->next==NULL); } /*********************************************************** * 功能描述:求链表长度 * 输入参数:Dlinklist 型指针 * 输出参数:长度 * 返回值 :int整形长度信息 * 其他说明:无 ************************************************************/ int ListLength(DLinkList *L) { DLinkList *p=L; int i=0; while (p->next!=NULL) { i++; p=p->next; } return(i); } /*********************************************************** * 功能描述:按格式显示链表内容 * 输入参数:Dlinklist 型指针 * 输出参数:显示列表 * 返回值 :无 * 其他说明:无 ************************************************************/ void DispList(DLinkList *L) { DLinkList *p=L->next; cout<<"|姓名\t| | 身份证号 | |性别| | 电话号码 | |航班号\t| |学生认证| |用户资产|";//按格式输出 while (p!=NULL) { printf("\n"); printf("%-10s",p->data.name); printf(" %-20s",p->data.id); if(p->data.sex==1) cout<<" 男\t"; else cout<<" 女\t"; printf("%-11s",p->data.phone); printf(" %-12s",p->data.airnum); if(p->data.ifstu==1) cout<<" 是"; else cout<<" 否"; printf(" %0.2f",p->data.money);//p->data.display(); //一定要回头改,将全局变量问题解决之后 p=p->next; } printf("\n信息显示完毕,请按任意键继续。。。\n"); getch(); } /*********************************************************** * 功能描述:获取节点值 * 输入参数:Dlinklist 型指针,位置,NewType型引用结构体 * 输出参数:无 * 返回值 :bool型结果 * 其他说明:无 ************************************************************/ bool GetElem(DLinkList *L,int i,NewType &e) { int j=0; DLinkList *p=L; while (j<i && p!=NULL) { j++; p=p->next; } if (p==NULL) return false; else { e=p->data; return true; } } /*********************************************************** * 功能描述:获取用户位置 * 输入参数:Dlinklist 型引用指针,模式,NewType 型 * 输出参数:Dlinklist 型指针引用 * 返回值 :int型位置 * 其他说明:无 ************************************************************/ int LocateElem(DLinkList *L,int mode,NewType e) { int n=1; DLinkList *p=L->next; if(mode==1) { while (p!=NULL && (strcmp(p->data.id,e.id))) { n++; p=p->next; } if (p==NULL) return(0); else return(n); } else if(mode==2) { while (p!=NULL && (strcmp(p->data.phone,e.phone))) { n++; p=p->next; } if (p==NULL) return(0); else return(n); } else { cout<<"您输入的模式有误,不能完成您的要求。。。"<<endl; getch(); return(0); } } bool ListInsert(DLinkList *&L,int i,NewType e) { cout<<endl<<endl<<endl; cout<<"请输入该用户的用户名:"<<endl; cin>>e.name; cout<<"请输入该用户的身份证号:"<<endl; cin>>e.id; cout<<"请输入该用户的缴存金额:"<<endl; cin>>e.money; cout<<"请输入该用户的性别(男为1,女为0):"<<endl; cin>>e.sex; cout<<"请输入该用户的预留手机号:"<<endl; cin>>e.phone; strcpy(e.airnum,"无"); e.ifstu=0; int j=0; DLinkList *p=L,*s; while (j<i-1 && p!=NULL) { j++; p=p->next; } if (p==NULL) //未找到第i-1个结点 return false; else //找到第i-1个结点*p { s=(DLinkList *)malloc(sizeof(DLinkList)); //创建新结点*s s->data=e; s->next=p->next; //将*s插入到*p之后 if (p->next!=NULL) p->next->prior=s; s->prior=p; p->next=s; return true; } } /*********************************************************** * 功能描述:删除用户实现 * 输入参数:Dlinklist 型引用指针 int型位置 NewType临时 * 输出参数:删除后的链表 * 返回值 :bool型结果 * 其他说明:无 ************************************************************/ bool ListDelete(DLinkList *&L,int i,NewType &e) { int j=0; DLinkList *p=L,*q; while (j<i-1 && p!=NULL) { j++; p=p->next; } if (p==NULL) //未找到第i-1个结点 return false; else //找到第i-1个结点*p { q=p->next; //q指向要删除的结点 if (q==NULL) return false; //不存在第i个结点 e=q->data; p->next=q->next; //从单链表中删除*q结点 if (p->next!=NULL) p->next->prior=p; free(q); //释放*q结点 return true; } }
5.graph.h
//*Copyright (c)2017,烟台大学计算机与控制工程学院* //*All rights reservrd.* //*文件名称 :graph.h* //*作者:田长航* //*完成时间:2017年12月21日* //*版本号:v1.0* //*问题描述:定义图数据结构的代码、宏定义、要实现算法的函数的声明* //*输入描述:无* //*程序输出:无* #ifndef GRAPH_H_INCLUDED #define GRAPH_H_INCLUDED #define MAXV 5 //最大顶点个数 #define INF 32767 //INF表示∞ #include "mainFram.h" #include "linklist.h" //0烟1德2聊3菏 //0-1 0-2 1-3 2-3 3-0 typedef char InfoType; //以下定义邻接矩阵类型 typedef struct { int no; //顶点编号 InfoType info[10]; //顶点其他信息,在此存放带权图权值 } VertexType; //顶点类型 typedef struct //图的定义 { int edges[MAXV][MAXV]; //邻接矩阵 int n,e; //顶点数,弧数 VertexType vexs[MAXV]; //存放顶点信息 } MGraph; //图的邻接矩阵类型 //以下定义邻接表类型 typedef struct ANode //弧的结点结构类型 { int adjvex; //该弧的终点位置 struct ANode *nextarc; //指向下一条弧的指针 int info; //该弧的相关信息,这里用于存放权值 } ArcNode; typedef struct airplane Vertex; typedef struct Vnode //邻接表头结点的类型 { Vertex data; //顶点信息 int count; //存放顶点入度,只在拓扑排序中用 ArcNode *firstarc; //指向第一条弧 } VNode; typedef VNode AdjList[MAXV]; //AdjList是邻接表类型 typedef struct { AdjList adjlist; //邻接表 int n,e; //图中顶点数n和边数e } ALGraph; //图的邻接表类型 //功能:由一个反映图中顶点邻接关系的二维数组,构造出用邻接矩阵存储的图 //参数:Arr - 数组名,由于形式参数为二维数组时必须给出每行的元素个数,在此将参数Arr声明为一维数组名(指向int的指针) // n - 矩阵的阶数 // g - 要构造出来的邻接矩阵数据结构 void ArrayToList(int *Arr, int n, ALGraph *&,air *&a); //用普通数组构造图的邻接表 void MatToList(MGraph g,ALGraph *&G);//将邻接矩阵g转换成邻接表G void DispAdj(ALGraph *G);//输出邻接表G /*航班信息管理函数声明*/ //此处函数传值为airline结构体类型指针,将存放航班信息的头指针传递过来,进而可以实现遍历操作,增删改查 //传值还有DNode型指针,由于使用别名会造成其他头文件无法识别,故此处用前向声明,解决此矛盾,此为顾客链表的头结点 //图结构ALGraph型指针,传递此参数便于对图结构存储的信息进行操作,要注意与airline的数据统一 void maairline(air *a,struct DNode *L,ALGraph *&G);//航班管理界面,界面函数无需返回值 void chairline(air *a,struct DNode *L,ALGraph *&G);//更改航班信息界面 bool chline(air *a,struct DNode *L,ALGraph *&G);//更改航班号实现,返回布尔值判断是否修改成功 bool chticcount(air *a,struct DNode *L,ALGraph *&G);//放票收票实现,返回布尔值判断是否修改成功 /*主界面函数声明*/ //此处函数传值多一个passanager型指针,将乘客的头结点传入可以,对乘客进行修改及其他操作 void mainFram(struct DNode *L,pass *p,air *a,ALGraph *&G); //系统主界面 void mainFram_ma(struct DNode *&L,pass *p,air *a,ALGraph *&G);//管理员管理主界面 void chapass(struct DNode *L,pass *p,air *a,ALGraph *&G); //用户信息管理界面 void mainFram_pa(struct DNode *L,pass *p,air *a,ALGraph *&G);//顾客服务主界面认证 void mainFram_pa_su(struct DNode *L,pass *p,air *a,ALGraph *&G);//顾客服务主界面 bool rootlog(struct DNode *L,pass *p,air *a,ALGraph *&G);//管理员登录函数,此处声明为布尔型,返回登录成功与否的状态 bool purtic(pass *p,air *a); //购票实现,返回布尔型值判断是否购票成功 #endif // GRAPH_H_INCLUDED
6.graph.cpp
//*Copyright (c)2017,烟台大学计算机与控制工程学院* //*All rights reservrd.* //*文件名称 :graph.cpp* //*作者:田长航* //*完成时间:2017年12月21日* //*版本号:v1.0* //*问题描述:定义栈数据结构的代码、宏定义、要实现算法的函数的声明* //*输入描述:ALgraph型指针* //*程序输出:各种实现* #include <stdio.h> #include <malloc.h> #include "graph.h" #include <iostream> using namespace std; //功能:由一个反映图中顶点邻接关系的二维数组,构造出用邻接矩阵存储的图 //参数:Arr - 数组名,由于形式参数为二维数组时必须给出每行的元素个数,在此将参数Arr声明为一维数组名(指向int的指针) // n - 矩阵的阶数 // g - 要构造出来的邻接矩阵数据结构 /*********************************************************** * 功能描述:数组转邻接表 * 输入参数:air型指针,pass型指针,Dlinklist型指针,ALGRAPH型指针 * 输出参数: 认证界面 * 返回值 :无 * 其他说明:入口函数 ************************************************************/ void ArrayToList(int *Arr, int n, ALGraph *&G, air *&a) { int i,j,count=0; //count用于统计边数,即矩阵中非0元素个数 ArcNode *p; G=(ALGraph *)malloc(sizeof(ALGraph)); G->n=n; for (i=0; i<n; i++) //给邻接表中所有头节点的指针域置初值 G->adjlist[i].firstarc=NULL; for (i=0; i<n; i++) //检查邻接矩阵中每个元素 for (j=n-1; j>=0; j--) if (Arr[i*n+j]!=0) //存在一条边,将Arr看作n×n的二维数组,Arr[i*n+j]即是Arr[i][j] { p=(ArcNode *)malloc(sizeof(ArcNode)); //创建一个节点*p p->adjvex=j; p->info=Arr[i*n+j]; p->nextarc=G->adjlist[i].firstarc; //采用头插法插入*p G->adjlist[i].firstarc=p; G->adjlist[i].data=a[i]; } G->e=count; } /*********************************************************** * 功能描述: * 输入参数:Dlinklist 型引用指针 * 输出参数:Dlinklist 型指针引用 * 返回值 :无 * 其他说明:图算法库 ************************************************************/ void DispAdj(ALGraph *G) //输出邻接表G { cout<<endl<<endl; cout<<"当前的航班信息为:"<<endl; int i; ArcNode *p; for (i=0; i<G->n; i++) { p=G->adjlist[i].firstarc; printf("%5s: ",G->adjlist[i].data.start);//首先输出起始地点 while (p!=NULL) { printf("-->终止地:%s/里程:%dkm/余票:%d/票价:%0.2f ",G->adjlist[i].data.arrive,p->info,G->adjlist[i].data.count,G->adjlist[i].data.price);//按格式输出 p=p->nextarc;//实现循环 } printf("\n"); } }
7.main.cpp
//*Copyright (c)2017,烟台大学计算机与控制工程学院* //*All rights reservrd.* //*文件名称 :main.cpp* //*作者:田长航* //*完成时间:2017年12月21日* //*版本号:v1.0* //*问题描述:主函数,用于初始化某些存储结构,并对各个源文件进行传值* //*输入描述:各类初始数据* //*程序输出:无* #include <iostream> #include <cstdio> #include <malloc.h> #include <conio.h> #include "mainFram.h" #include "linklist.h" #include "graph.h" using namespace std; /*********************************************************** * 功能描述:主函数 * 输入参数:无 * 输出参数:无 * 返回值 :int * 其他说明:给所有功能实现主界面函数传值,并初始化一些数据 ************************************************************/ int main() { ALGraph *G;//图结构传值使用该指针,ALGraph型 int gr[4][4]= //此数组存储航班路线信息,弧权值为里程 { {0,200,300,0}, {0,0,0,50}, {0,0,0,100}, {700,0,0,0} }; air *conver;//传递航班信息 air a[flight_max]= { {"SD001",200,0,"烟台","德州",22,10},//航班信息SD001烟台-->德州,SD002德州-->菏泽,SD003德州-->烟台 {"SD002",200,0,"烟台","聊城",17,55}, {"SD003",200,0,"聊城","菏泽",01,16}, {"SD004",200,0,"德州","菏泽",06,30}, {"SD005",200,0,"菏泽","烟台",02,22}, };//初始化赋值 conver=a; ArrayToList(gr[0],4,G,conver); //将数组转换为邻接表形式,存储航班路线信息,其顶点信息为航班信息 pass p[5]= { {"tch","37256464467464655",300,0,"无",1,"17888888888"}, {"zx","372458199823236636",1000,1,"无",1,"17899999999"}, {"hcj","375864645531154566",600,1,"无",0,"17854545454"}, {"zqb","376545555578951323",500,0,"无",0,"17877777777"}, {"zkw","371165456486453125",1500,1,"无",0,"17892229222"} };//初始化乘客链表 DLinkList *l; InitList(l); CreateListR(l,p,5); //创建双链表 while(1) mainFram(l,p,a,G); return 0; }
运行结果截图如下: