一.课程设计目的
1. 数据结构课程设计是综合运用数据结构课程中学到的几种典型数据结构,以及程序设计语言,自行实现一个较为完整的应用系统的设计与开发。
2. 通过课程设计,自己通过系统分析、系统设计、编程调试,写实验报告等环节,进一步掌握应用系统设计的方法和步骤,灵活运用并深刻理解典型数据结构在软件开发中的应用 。
3. 学会将知识应用于实际的方法,提高分析和解决问题的能力,增加综合能力。
二.课程设计内容
1)、录入:
可以录入航班情况(数据可以存储在一个数据文件中,数据结构、具体数据自定)
2)、查询:
可以查询某个航线的情况(如,输入航班号,查询起降时间,起飞抵达城市,航班票价,票价折扣,确定航班是否满仓);
可以输入起飞抵达城市,查询飞机航班情况;
3)、订票:(订票情况可以存在一个数据文件中,结构自己设定)
可以订票,如果该航班已经无票,可以提供相关可选择航班;
4)、退票: 可退票,退票后修改相关数据文件;
客户资料有姓名,证件号,订票数量及航班情况,订单要有编号。
5)、修改航班信息:
当航班信息改变可以修改航班数据文件
三.系统功能模块设计
本系统分为五个模块:录入新航班模块、浏览航班模块、查找航班模块、订票模块、退票模块。得到如图所示系统功能模块图。
系统功能模块图
四.程序源代码
#ifndef FLIGHTINFO_H
#define FLIGHTINFO_H
#include #include using namespace std; //记录已订票的旅客及信息 class PsgOn { public: char Name[20]; int Booknum; int Rank; PsgOn *next; PsgOn(char N[20],const int B,const int R,PsgOn *Ne=NULL); PsgOn(PsgOn *Ne=NULL); }; //记录,处理每条航线信息的类 class FlightNode { public: char Terminus[20]; int Flight; int Plane; int Day; int Maxnum; int Left; FlightNode(char T[20]="",const int F=0,const int P=0,const int D=0,const int M=0,const int L=0); }; //对已订票的客户的信息的操作的类 class POList { private: void init(); public: PsgOn *head; PsgOn *tail; PsgOn *fence; int leftcnt; int rightcnt; int Fli; POList(int size=10); void clear(); bool insert(char N[20],const int B,const int R); bool append(char N[20],const int B,const int R); bool remove(char *N,int &B); void setStart(); void setEnd(); void prev(); void next(); int leftLength()const; int rightLength()const; bool gerValue(char *N,int &B,int &R)const; }; int n=0; void ShowAllFlight(FlightNode *F,POList *B); void addFlight(FlightNode *F,POList *B); void ShowOneFlight(FlightNode *F); void BookTicket(FlightNode *F,POList *B) ; void ReturnTicket(FlightNode *F,POList *B); #endif //PsgOn中的函数的实现 PsgOn::PsgOn(char N[20],const int B,const int R,PsgOn *Ne) { for(int i=0;i<=20;i++) { Name[i]=N[i]; } Booknum=B;Rank=R;next=Ne; } PsgOn::PsgOn(PsgOn *Ne) { next=Ne; } //POList中的函数的实现 void POList::init() { fence=tail=head=new PsgOn; leftcnt=rightcnt=0; } POList::POList(int size){ init(); } bool POList::insert(char N[20],const int B,const int R) { fence->next=new PsgOn(N,B,R,fence->next); if(tail==fence)tail=fence->next; rightcnt++; return true; } bool POList::append(char N[20],const int B,const int R) { tail=tail->next=new PsgOn(N,B,R,NULL); rightcnt++; return true; } bool POList::remove(char *N,int &B) { if(fence->next==NULL)return false; N=fence->next->Name;B=fence->next->Booknum; PsgOn *ltemp=fence->next; fence->next=ltemp->next; if(tail==ltemp)tail=fence; delete ltemp; rightcnt--; return true; } void POList::setStart() { fence=head;rightcnt+=leftcnt;leftcnt=0;} void POList::setEnd() { fence=tail;leftcnt+=rightcnt;rightcnt=0;} void POList::prev() { PsgOn *temp=head; if(fence==head)return; while(temp->next!=fence)temp=temp->next; fence=temp; leftcnt--;rightcnt++; } void POList::next() { if(fence!=tail) {fence=fence->next;rightcnt--;leftcnt++;} } int POList::leftLength()const {return leftcnt;} int POList::rightLength()const {return rightcnt;} bool POList::gerValue(char *N,int &B,int &R)const { if(rightLength()==0)return false; N=fence->next->Name;B=fence->next->Booknum;R=fence->next->Rank; return true; } FlightNode::FlightNode(char T[20],const int F,const int P,const int D,const int M,const int L) { for(int i=0;i<=20;i++) { Terminus[i]=T[i]; } Flight=F;Plane=P;Day=D;Maxnum=M;Left=L; } //列举全部航线 void ShowAllFlight(FlightNode *F,POList *B) { cout<<"---------------------------------------------"< cout< cout<<"---------------------------------------------"< <<"2.录入新的航班信息"<<"3.返回上一级.\\n" <<"请选择:"; int chioce; top2: cin>>chioce; if(chioce==1) { ShowOneFlight(F); } else if(chioce==2) addFlight(F,B); else if(chioce==3) { return; } else { cout<<"输入错误!请重新选择:"; goto top2; } } void addFlight(FlightNode *F,POList *B) { int i=0; while(n<50){ cout<<"请输入航班的信息:"< cin>>F[n].Terminus; do{cout<<"请输入新航班的航班号:"; cin>>F[n].Flight; if(F[n].Flight%5!=0) {cout<<"输入有误,请重新输入."; i=1;} else { for(int j=0;j {cout<<"航班号已存在,请重新输入。"; i=1;break;} } }while(i); cout<<"请输入新航班的飞机号:"; cin>>F[n].Plane; cout<<"请输入新航班的飞行日:"; cin>>F[n].Day; cout<<"请输入新航班的成员定额:"; cin>>F[n].Maxnum; cout<<"请输入如新航班的余票量:"; cin>>F[n].Left; B[n].Fli=F[n].Flight; cout<<"录入成功"; n++; cout<<"是否继续录入(y/n)"; char ch; top10: cin>>ch; if(ch=='y') { i=1; } else if(ch=='n') return; else { cout<<"输入错误!请重新选择:"; goto top10; } } } //查询单条航线 void ShowOneFlight(FlightNode *F) { char T[20]; int choice; cout<<"请输入终点站名称:\\n"; cin>>T; FlightNode temp[50]; int m=0; for(int i=0;i<=n;i++) { if(strcmp(T,F[i].Terminus)==0) {temp[m]=F[i];m++;} } if(m==0)cout<<"无此终点站"< { FlightNode temp1=temp[0]; cout<<"航班号:"< if(temp[j].Day!=0) { cout<<"航班号:"< } } cout<<"最近一天的航班:\\n" <<"航班号:"< cout<<"请选择所要的操作:,继续查询2.返回上一级\\n"; top3: cin>>choice; if(choice==1) { ShowOneFlight(F); } else if(choice==2) { return; } else { cout<<"输入错误!请重新选择:"; goto top3; } } void BookTicket(FlightNode *F,POList *B) { int flag=0; int Fl; int N; char Na[20]; int choice; int temp; cout<<"请输入需乘坐的航班号:\\n"; top6: cin>>Fl; if(!(Fl%5==0)) { cout<<"输入错误!无此航班号,请重新输入:"; goto top6; } cout<<"请输入订票额:\\n"; cin>>N; cout<<"请输入您的名字:\\n"; cin>>Na; for(int i=0;i if(Fl==B[i].Fli){temp=i;flag=1;} } if(flag==0){cout<<"无此航班\\n";return;} if(F[temp].Left>=N) { char choice1; cout<<"尚有余票,"< switch(choice1) { case 'Y': case 'y':B[temp].append(Na,N,1);F[temp].Left=F[temp].Left-N;cout<<"订票成功!\\n";break; default:return ; } } else { cout<<"余票不足,订票失败"< cout<<"请选择下一步操作:,继续订票 2,退票3.返回上一级\\n"; top4: cin>>choice; if(choice==1) { BookTicket(F,B); } else if(choice==2) { ReturnTicket(F,B); } else if(choice==3) { return; } else { cout<<"输入错误!请重新选择:"; goto top4; } } void ReturnTicket(FlightNode *F,POList *B) { int Ftemp; char Ntemp[20]; int BoNum; int flag=0; int flag1=0; int temp; int choice; bool flag2; flag=0; int Length; int LengthR; cout<<"请输入要退票的航班号:"; cin>>Ftemp; cout<<"请输入你的名字:"; cin>>Ntemp; for(int i=0;i if(Ftemp==B[i].Fli){temp=i;flag1=1;} } if(flag1==0){cout<<"无此航班\\n";return;} B[temp].setEnd(); Length=B[temp].leftLength(); cout< for(int j=0;j<=Length;j++) { if(strcmp(B[temp].fence->Name,Ntemp)==0) { B[temp].prev(); B[temp].remove(Ntemp,BoNum); F[temp].Left+=BoNum; flag=1; } B[temp].next(); } if(flag==1) cout<<"退票成功!"< cout<<"请选择下一步操作:,继续退票2,订票3,返回上级菜单\\n"; top5: cin>>choice; if(choice==1) { ReturnTicket(F,B); } else if(choice==2) { BookTicket(F,B); } else if(choice==3) { return; } else { cout<<"输入错误!请重新选择:"; goto top5; } } void main() { FlightNode F[50]; POList B[50]; //定义各条航线的详细信息 F[0]=FlightNode("NULL",1000,1,1,0,0); B[0]=100; F[1]=FlightNode("北京",1005,100,4,100,100); B[1].Fli=1005; F[2]=FlightNode("哈尔滨",1010,101,5,100,100); B[2].Fli=1010; F[3]=FlightNode("长春",1015,102,4,100,100); B[3].Fli=1015; F[4]=FlightNode("天津",1020,103,2,100,100); B[4].Fli =1020; F[5]=FlightNode("西安",1025,104,1,100,100); B[5].Fli =1025; F[6]=FlightNode("拉萨",1030,105,6,100,100); B[6].Fli =1030; F[7]=FlightNode("杭州",1035,106,7,100,100); B[7].Fli =1035; F[8]=FlightNode("海口",1040,107,1,100,100); B[8].Fli =1040; F[9]=FlightNode("台北",1045,108,2,100,100); B[9].Fli =1045; F[10]=FlightNode("东京",1050,109,3,100,100); B[10].Fli =1050; F[11]=FlightNode("伦敦",1055,110,4,100,100); B[11].Fli =1055; F[12]=FlightNode("纽约",1060,111,5,100,100); B[12].Fli =1060; F[13]=FlightNode("巴黎",1060,112,6,100,100); B[13].Fli =1060; F[14]=FlightNode("悉尼",1065,113,7,100,100); B[14].Fli =1065; F[15]=FlightNode("温哥华",1070,114,1,100,100); B[15].Fli =1070; F[16]=FlightNode("华盛顿",1075,115,2,100,100); B[16].Fli =1075; F[17]=FlightNode("新加坡",1080,116,3,100,100); B[17].Fli =1080; F[18]=FlightNode("平壤",1085,117,4,100,100); B[18].Fli =1085; F[19]=FlightNode("汉城",1090,118,5,100,100); B[19].Fli =1090; n=20; int choice; while(1) { cout<<"++++++++++++++++++++++++++++++++++++++++++++++++++"< <<"1==>查询已有航线\\n" <<"2==>录入新的航线信息\\n" <<"3==>查询单条航线\\n" <<"4==>订票\\n" <<"5==>退票\\n" <<"6==>退出.\\n" <<"----------------------------------------"< cout<<"请选择:"; top: cin>>choice; switch(choice) { case 1 : ShowAllFlight(F,B);break; case 2 : addFlight(F,B);break; case 3 : ShowOneFlight(F);break; case 4 : BookTicket(F,B) ;break; case 5 : ReturnTicket(F,B) ;break; case 6 : cout<<"退出系统!多谢使用!";return; default : cout<<"输入错误,请重新输入:\\n";goto top; } } } 五.实验结果 1.当运行程序时,会出现如下界面 2.通过选择1可以查询现在已有的航线 3. 通过选择2可以录入新的航班 4.选择4可以进入订票系统 5. 选择5可以进入退票系统 5.选择6则可以退出系统 心得体会 在这次程序编制的过程中出现了很多问题,主要原因是自己以前接触的关于编制程序的知识的缺乏,通过航班订票系统的开发让我知道了自己的不足和缺点,写出一个好的程序需要合作精神,一个人的力量毕竟是有限的团队力量才是无穷的。一个好的程序员一定是从程序堆里走出来的,只有通过参与具体程序的开发才知道自己知识的有限,才会学会具体的分析问题,是自己的逻辑性和层次性得到良好的锻炼,经过这次课程设计,我对调试掌握的更加熟练了,改变了过去只调试不知道如何对照程序语言修改程序的坏习惯,意识到了程序语言的规范性以及我们在编程时要有严谨的态度,同时在写程序时如果加一定量的注释,既增加了程序的可读性,也可以使自己在读程序时更容易。 课程设计是一门专业课,给我很多专业知识以及专业技能上了提升,同时又是一门思辨课,让我感触很深,是我对抽象的理论有了具体的认识,在这次课程设计中知道了以前没有接触过的很多函数,在以后的学习中自己要加强程序的锻炼,多参考好的程序和各种各样的函数,建立起自己的函数库,为以后学习打下良好的基础。