数据结构与算法设计课程设计【设计题目】航空公司订票系统【问题描述】编写一个航空公司订票大厅的一个订票系统,可以在系统中录入并修改各个航班的具体情况,帮助乘客准确的查询各航班的最新信息(包括航班号、航班的起始时间和地点、票价)和各项业务的及时办理(包括订票、退票等)。
该系统用可以用C++的类编写。
【软件功能】1.输入航班信息并保存到磁盘2.浏览航班信息3.修改航班信息并保存到磁盘4.查找航班5.删除航班信息6.订票7.退票【算法思想】1先定义一个乘客基本信息的类包含乘客的、证件号、订票数量及所乘的航班号(注:每个航班有固定的人数限制,若满额则提示其他可供选择的航班。
2建立一个功能类,包括对航班信息和乘客订票信息的录入及修改的函数,其中订票信息采用单链表的顺序存储方式存储。
另外还包括对信息的查询和修改的功能函数,乘客退票的函数。
并将最终的改动结果通过i/O流写入磁盘文件保存。
3编写主函数,对编写的航班系统进行全面测试,对用户界面采用人性化的菜单方式。
【类的设计】定义一个航班的类class plane{friend class customer;//友元类public:void input(); //插入航班信息void print(); //打印航班信息void save(); //保存航班信息void read(); //读取航班信息void search(); //查找航班信息void Delete(); //删除航班信息void book(); //订票void back(); //退票void xiugai(); //修改航班信息private:int num;//航班号char start_place[20];//起点站char arrive_place[20];//终点站char time[10];//起降时间int count;//机票数量}];定义一个顾客信息的类class customer{friend class plane;//友元类protected:I nt id;//号char name[10];//int customer_num;//订票数量public:void read1();//读取数据void save1();//保存数据};【存储结构设计】采用顺序存储结构,利用动态申请空间实现信息的存储。
【模块划分及调用关系】定义了两个类class plane和class customer,分别实现顾客及航班的信息操作。
在两个类的后面分别定义了类中的各个函数。
另外在主函数中分别调用函数,实现各个功能。
【模块流程图】1.主函数main()2.void search()//查询函数3.void book()//订票函数4.void back()//退票函数不存在该用户存在【界面设计】采用人性化的菜单提示语,让用户很容易的操作;【用户手册】用户只需要在vc环境下就可以操作,具体步骤可见菜单提示就可以顺利操作。
另外,再加入、删除、修改航班信息时必须以管理员的身份进去,所以必须要有密码,在这里初始密码事:xinxi0701.您的使用!!1、程序上机调试报告【语法错误及其排除】两个类的公有函数中,在循环嵌套调用时总是受阻,不能执行。
所以我把两个类都定义为相互的有元类。
这样问题就解决了。
【算法错误及其排除】在订票与退票函数中,要核对用户信息如、ID等,开始是自己定义一个函数进行字符间的比较,在调用时总是出现语法错误,最后想到可以用一个函数库中的函数strcmp(char,char).把问题简单化,而且语法错误也解决了。
2、程序测试结果输入您的姓名、ID、要退票数提示:退票成功进入退票系统【测试数据】说明:测试数据都是输入数据,见输出结果。
【输出结果】【程序性能评价】该程序可以查询航班的信息、修改信息,查询顾客的信息,订票、退票等,界面采用人性化的提示,可以让用户很容易的操作。
另外在修改信息、添加航班信息时必须要以管理员的身份进入即必须要有密码才能进入。
保证了系统的安全。
【性能改进方向】该系统在操作中要是不按照菜单的有关提示操作,而进行非法操作,可能会导致系统的死循环。
在这点该系统还有待改进。
【收获及体会】事实总比想象的难,刚开始编写这个程序的时候思路比较清晰。
可是编写的时候遇到了很多难题,譬如将顾客的信息及航班的信息保存到文件中,不知道用那种方式更简便,最后仔细思考,阅读课本资料,选择了用流的形式输出到文件中,感觉用起来特别方便简洁。
完成了程序的编写后又对该程序进行了大量的修改,调试,使程序更加简明,并添加了不少提示用户操作的语句,使用户使用该系统时更加方便。
对自己的这个程序还是比较满意的,可以说已经超出了自己当初的设想。
从编写这个程序的过程中不但发现了许多自己没学明白的地方,而且锻炼了自己的耐心。
刚调试时有很多错误,我逐个仔细的修改、排除,最终成功的完成了调试。
进过这次实习,我更加深刻的体会到,作任何事情要仔细,要静下心来认真思考,只要努力了,必定会有回报。
3、源程序代码#include<iostream.h>#include<string.h>#include<stdio.h>#include<iomanip.h>#include<stdlib.h>#define N 1000 //宏定义class customer;//申明顾客信息类//---------定义航班信息类----------------class plane{friend class customer;//有元类public:void insert(); //加入航班信息void print(); //输出航班信息void save(); //保存航班信息void read(); //读取航班信息void search(); //查找航班信息void Delete(); //删除航班信息void book(); //订票void back(); //退票void xiugai(); //修改航班信息private:int num;//航班号char start[10];//起点站char arrive[10];//终点站char time[20];//起降时间int plane_num;//机票数量}s[N];//------定义顾客信息类---------------------------class customer{friend class plane;//有元类protected:int id;//号char name[20];//int pshu;//用户订票数量public:void read1();//读取数据void save1();//保存数据}yh[N];int i,j;//全局变量int m=0,y=0;//宏定义一个输出#define PRINT s[i].num<<setw(13)<<s[i].start<<setw(13)<<s[i].arrive<<setw(13)<<s[i].time<<setw(13)<<s[i].pl ane_num<<endl //定义输出格式//-------------主函数------------void main(){plane abc;//定义一个航班类的对象int j;do{cout<<" 管理员密码:xinxi0701 "<<endl;cout<<" "<<endl;cout<<" -----------欢迎进入航空订票菜单------------"<<endl; //主界面cout<<"|============================================|"<<endl;cout<<" | 1.新增航班|"<<endl;cout<<" | 2.浏览航班信息|"<<endl;cout<<" | 3.修改航班信息|"<<endl;cout<<" | 4.查找航班信息|"<<endl;cout<<" | 5.删除航班|"<<endl;cout<<" | 6.订票|"<<endl;cout<<" | 7.退票|"<<endl;cout<<" | 0.退出|"<<endl;cout<<" |=====================================|"<<endl;cout<<"请选择(0~7):";cin>>j;switch(j){case 1:abc. insert();//调用插入函数break;case 2:abc.print();//调用打印函数break;case 3:abc.xiugai();//调用修改函数break;case 4:abc.search();//调用查找函数break;case 5:abc.Delete(); //调用删除函数break;case 6:abc.book();//调用订票函数break;case 7:abc.back();//调用退票函数break;case 0:;break;}}while(j!=0); //判断结束cout<<"使用,再见!\n";}//--------------主函数结束---------------//定义类中各个函数void plane::insert()//打印函数{char f[]="xinxi701"; //设置密码char y;cout<<"请输入密码:";cin>>f; //读取密码if(strcmp(f,"xinxi0701")==0){cout<<"--------------------------------------------------------------------------\n";for(i=0;i<N;i++){cout<<"航班号出发地点到达地点起降时间满载人数"<<endl;cout<<"|-------------------------------------------------|"<<endl;cin>>s[i].num>>s[i].start>>s[i].arrive>>s[i].time>>s[i].plane_num;cout<<"|-------------------------------------------------|"<<endl;m++;cout<<"第"<<m<<"个信息已经输入,是否继续(y/n)?";cin>>y;cout<<endl;if(y=='y')continue;else{save();//将结构体信息存盘cout<<"刚刚存盘的信息是:"<<endl;print();//输出输入的航班信息break;}}}elsecout<<"密码错误,您不能使用此项功能,强制推出!!!"<<endl;}void plane::save()//保存函数{FILE *fp,*fp1;//定义文件指针if((fp=fopen("chen.txt","wb"))==NULL)//打开文件并判断是否出错{cout<<"创建文件失败!"<<endl;//出错提示getchar();return;}if((fp1=fopen("hao.txt","wb"))==NULL)//打开文件并判断是否出错{cout<<"创建文件失败!"<<endl;//出错提示getchar();return;}for(i=0;i<m;i++)if(fwrite(&s[i],sizeof(class plane),1,fp)==0)//向文件写入数据,并判断是否出错cout<<"向文件输入数据失败!"<<endl;fprintf(fp1,"%d",m);fclose(fp);//关闭文件fclose(fp1);//关闭文件}//-------------------------------------------void plane::read()//从文件读取信息{FILE *fp,*fp1;//定义文件指针if((fp=fopen("chen.txt","rb"))==NULL)//打开文件,并判断是否出错{cout<<"出现错误,请检查文件是否存在!!";//出错提示getchar();}if((fp1=fopen("hao.txt","rb"))==NULL)//打开文件并判断是否出错{cout<<"创建文件失败!\n\n";//出错提示getchar();return;}fscanf(fp1,"%d",&m);fclose(fp1);//关闭文件for(i=0;i<m;i++){fread(&s[i],sizeof(plane),1,fp);//从文件中读取信息}fclose(fp);//关闭文件}//-----------------------------------void plane::print()//输出函数{char w[10];read();//调用读取文件函数cout<<"航班号起始站终点站时间机票数\n";for(i=0;i<m;i++){cout<<PRINT;//打印信息}cout<<"******************************************** "<<endl;cout<<"///请按任意键返回主菜单///"<<endl;cin>>w;//控制返回主菜单}//-----------------------------------------void plane::search()//查询函数{char name1[10];char name2[12];char ii[10];int n,no;do{cout<<" 欢迎进入查询菜单"<<endl;//查询方式菜单cout<<" "<<endl;cout<<" 1.按航班号查找\n\n"" 2.按终点站查找\n\n"" 3.按航线查找\n\n"" 0.返回"<<endl;cout<<"请选择(0~3):";cin>>n;if(n==0)break;switch(n){case 1:cout<<"请输入航班号:";cin>>no;//航班号break;case 2:cout<<"请输入终点站名称:";cin>>name2;//读取终点站break;case 3:cout<<"请输入起始站名称:\n";cin>>name1;//读取起始站cout<<"请输入终点站名称:\n";cin>>name2;//终点站break;}read();//调用读取函数for(i=0;i<m;i++){if(strcmp(s[i].arrive,name1)==0||strcmp(s[i].arrive,name2)==0)//按终点站起始站判断输出条件{cout<<"\n查找航班信息成功!"<<endl;cout<<"航班号起始站终点站时间机票数"<<endl;cout<<PRINT;//打印信息break;}if(s[i].num==no)//按航班号判断输出条件{cout<<"\n查找航班信息成功!\n";cout<<"航班号起始站终点站时间机票数"<<endl;cout<<PRINT;//打印信息break;}}no=0;//将航班号赋值为0if(i>m)cout<<"该航班不存在,是否继续查找(y/n)?";cin>>ii;}while(strcmp(ii,"y")==0);//判断结束}//------------------------------------void plane::Delete()//删除函数{char name1[10];char name2[12];char ii[12];char f[]="xinxi701";//设置密码int no,n;cout<<"请输入密码:";cin>>f;//读取密码if(strcmp(f,"xinxi0701")==0) //判断密码是否正确{do{cout<<" 欢迎进入删除菜单"<<endl;//删除方式菜单cout<<" "<<endl;cout<<" *1.按航班号删除\n\n"" *2.按航线删除\n\n"" *0.返回"<<endl;cout<<"请选择(0~2)";cin>>n;//读取删除方式if(n==0)break; //跳出循环switch(n){case 1:cout<<"请输入航班号:";cin>>no;//读取航班号read();//调用读取函数break;//跳出循环case 2:cout<<"请输入起始站名称:";cin>>name1;//读取起始站cout<<"请输入终点站名称:";cin>>name2;//读取终点站read();//调用读取函数break;//跳出循环}for(i=0;i<m;i++){if(s[i].num==no||strcmp(s[i].start,name1)==0&&strcmp(s[i].arrive,name2)==0)//判断输入信息是否存在{s[i]=s[m-1];m--;}}cout<<"没有该信息,是否继续删除(y/n):";cin>>ii; //读取是否继续信息save(); //调用读取函数if(!strcmp(ii,"y")) //判断是否继续删除cout<<"请按任意键返回删除菜单!!";break;}while(n!=1&&n!=2&&n!=3&&n!=4&&n!=0); //判断结束}elsecout<<"密码错误,不能使用此项功能,强行退出!!\n\n";}//------------------------------------------------void plane::book()//订票函数{customer abc;int n;char a[12];do{cout<<"各位用户你好!请你先选择您要乘的航班"<<endl;search();abc.save1();abc.read1();y=y+1;cout<<" 欢迎进入订票系统!!!!"<<endl;cout<<"请输入你的ID号:";cin>>yh[y].id;cout<<"请输入你的:";cin>>yh[y].name ;cout<<"请输入您要订的机票数:";fai: cin>>n;//读取所订机票数if(n<=0)goto fai;yh[y].pshu=n;s[i].plane_num=s[i].plane_num-n;abc.save1();save();//调用保存函数cout<<"订票成功!\n\n";break;cout<<"是否继续(y/n)?";//判断是否继续订票cin>>a;}while(!strcmp(a,"y"));//判断结束}//-------------------------------------void plane::back()//退票函数{customer abc;int n;char a[12];do{cout<<"各位用户你好!请你先选择您要退的航班"<<endl;search();cout<<"请输入你的ID:"<<endl;cin>>abc.id;cout<<"请输入你的:"<<endl;cin>> ;cout<<"请输入您要退的机票数目:"<<endl;cin>>n;//输入所退票数if(n<0) //判断票数是否有效{cout<<"请输入有效的机票数!"<<endl;cin>>n;}abc.read1();for(i=0;i<y;i++){if((yh[i].id=abc.id)==0&&strcmp(yh[i].name,)==0)//按终点站起始站判断输出条件{cout<<"该顾客存在!"<<endl;cout<<"号订票数"<<endl;cout<<yh[i].id<<setw(8)<<yh[i].name<<setw(8)<<yh[i].pshu<<endl;//打印信息break;}}for(;i<y;i++){yh[i].id=yh[i+1].id;strcpy(yh[i].name,yh[i+1].name);yh[i].pshu=yh[i+1].pshu;}abc.save1();s[i].plane_num=s[i].plane_num+n;save(); //调用保存cout<<"退票成功!\n\n";cout<<"是否继续(y/n)?";//判断是否继续退票cin>>a;}while(!strcmp(a,"y"));//判断并跳出循环getchar();}//---------------------------------void plane::xiugai() //修改信息函数{class xiu //定义一个类{public:int no;char name1[12];char name2[12];char time[12];int plane_num;}x[1];char j[10];char f[]="xinxi701";//设置密码int n;cout<<"请输入密码:";cin>>f;//读取密码if(strcmp(f,"xinxi0701")==0)//判断是否出错{read();//调用读取do{cout<< " 欢迎进入修改系统"<<endl;cout<< " *1,按航班号修改"<<endl;cout<< " *2,按航线修改"<<endl;cout<<"请选择(1~2)";cin>>n;//读取修改方式switch(n){case 1:cout<<"请输入航班号:";cin>>x[0].no;//读取航班号break;case 2:cout<<"请输入起始站:";cin>>x[0].name1;//读取起始站cout<<"请输入终点站:";cin>>x[0].name2;//读取终点站break;}for(i=0;i<m;i++){if(strcmp(s[i].arrive,x[0].name1)==0&&strcmp(s[i].arrive,x[0].name2)==0)//判断输出条件{cout<<"航班号起始站终点站时间机票数\n";cout<<PRINT;break;}if(s[i].num==x[0].no)//判断输出条件{cout<<"航班号起始站终点站时间机票数\n";cout<<PRINT;break;}}x[0].no=0; //将结构体中的号为零cout<<"请输入新航班号起始站终点站时间机票数"<<endl;cin>>x[0].no>>x[0].name1>>x[0].name2>>x[0].time>>x[0].plane_num;s[i].num=x[0].no;//替换航班号strcpy(s[i].start,x[0].name1);//替换其始站strcpy(s[i].arrive,x[0].name2);//替换终点站strcpy(s[i].time,x[0].time);//替换时间s[i].plane_num=x[0].plane_num;//替换机票数save();//调用保存cout<<"是否继续(y/n)?";cin>>j;}while(strcmp(j,"y")==0); //判断结束}elsecout<<"密码错误,不能使用此项功能,强行退出!!\n\n";}//--------------------------------------------void customer::read1(){FILE *ff,*ff1;//定义文件指针if((ff=fopen("xinx.txt","rb"))==NULL)//打开文件,并判断是否出错{cout<<"出现错误,请检查文件是否存在.";//打印出错提示getchar();}if((ff1=fopen("shu.txt","rb"))==NULL)//打开文件并判断是否出错{cout<<"创建文件失败!"<<endl;//打印出错提示getchar();return;}fscanf(ff1,"%d",&y);fclose(ff1);//关闭文件for(j=0;j<y;j++){fread(&yh[j],sizeof(customer),1,ff);//从文件中读取信息}fclose(ff);//关闭文件}//----------------------------------------void customer::save1()//保存函数{FILE *ff,*ff1;//定义文件指针if((ff=fopen("xinx.txt","wb"))==NULL)//打开文件并判断是否出错{cout<<"创建文件失败!"<<endl;//出错提示getchar();return;}if((ff1=fopen("shu.txt","wb"))==NULL)//打开文件并判断是否出错{cout<<"创建文件失败!"<<endl;//打印出错提示getchar();return;}for(j=0;j<m;j++)if(fwrite(&yh[j],sizeof(class customer),1,ff)==0)//向文件写入数据,并判断是否出错cout<<"向文件输入数据失败!\n\n";fprintf(ff1,"%d",y);fclose(ff);//关闭文件fclose(ff1);//关闭文件}。