数据结构课程设计报告
专业 计算机科学与技术
石岩 B计算机071 0710604117 胡 波 张静林 2009年01月10日
学生姓名 班学
级 号
指导教师 完成日期
信息工程学院
一、问题描述与分析:
飞机订票系统
任务:通过此系统可以实现如下功能:
录入:可以录入航班情况(数据可以存储在一个数据文件中,数据结构、具体数据自定)
查询:可以查询某个航线的情况(如,输入航班号,查询起降时间,起飞抵达城市,航班票价,票价折扣,确定航班是否满仓);可以输入起飞抵达城市,查询飞机航班情况; 订票:(订票情况可以存在一个数据文件中,结构自己设定)可以订票,如果该航班已经无票,可以提供相关可选择航班; 退票: 可退票,退票后修改相关数据文件;客户资料有姓名,证件号,订票数量及航班情况,订单要有编号。 修改航班信息:当航班信息改变可以修改航班数据文件 基本要求:
(1)根据以上功能说明,设计航班信息,订票信息的存储结构,设计程序完成功能;
(2)界面要求:有合理的提示,每个功能可以设立菜单,根据提示,可以完成相关的功能要求。
二、数据结构设计描述:
本次数据结构课程设计所制作的航空客运订票系统主要运用了链式存储结构来实现。我们知道线性表以及队列的存储结构主要用到了链式结构存储,因而此系统也应考虑使用这两种存储方式。
在航班信息方面,要对航班进行添加、删除、查询等操作。由于链表的优势就在于便于进行添加、删除和查找,因此有关航班信息方面的部分可以由链表来实现。但是为了更便于添加和删除,因此为链表设置了首、尾指针。
而对于订票、退票来说,其中要讲一个先来后到的道理。基于这一点的要求,队列的存储方式再合适不过了,其“先进先出”(FIFO)的特点恰恰可以满足订票、退票的要求。
在结构定义方面,本系统定义了四个结构,分别用来储存航班信息、乘客信息、替补乘客信息以及结点信息。而在航班信息定义中,分别将乘客信息、替补乘客信息引入其中,以供储存乘客信息和替补乘客信息。
根据本系统中的功能以及所定义的数据结构,特编写如下函数: 1. 2. 3. 4. 5. 6. 7. 8.
FlightInsert() //添加航班信息 FlightSearch() //查询航班信息 FlightRework() //修改航班信息 FlightDelete() //删除航班信息 FlightBuyticket() //订票 FlightCancelticket()//退票
Buyticket(PFlight q,int Ticket_Amount)//用队列买票 Buyreplace(PFlight q,int Ticket_Amount,int n)//利用队列进行替补买票 9.
MainMenu() //主菜单
10. Main() //主函数 各个函数间的关系如下:
Main() FlightInsert() FlightSearch() FlightRework() FlightDelete() FlightBuyticket() Buyticket() Buyreplace() FlightCanceltickeMainMenu() 三、软件结构设计:
用简单的等式以及图表加以解释:
航班基本信息=航班号+日期+时间+身份证号+票数+起点站+终点站
管理员信息=登陆密码+用户描述
客户信息=普通登陆+用户描述
航空订票管理系统 返回主界面 管理员(权限) 订购机票 退还机票 修改信息 查看信息 查询信息 客户 返回主界面 返回上一级 航班号 航班信息 日期 时间 起飞站 终点站 售 票 信 息 航班号 日期 时间 身份证 票数 起飞点 终点
四、算法设计:
本航空客运售票系统分为两个文件:1. 头文件Ticket.h,用来
存放系统中数据结构的结构体,以及所要到的方法及函数。 2.C++文件 Ticket.cpp.,本文件主要是本系统的主函数,其中调用头文件,来实现系统的功能。具体实现如下:
(一) Ticket.h,: 在前文中已介绍过,本文件是头文件,将售票系统的数据中的结构体定义在其中,并且利用所定义的结构来编写函数、方法来实现系统的功能。
首先采用链式结构,定义出三个结构体:
1.
航线的结构体:
typedef struct Flight //航线信息
{char Des[10]; //终点站名 char FlightNum[10];
//航班号 char PlaneNum[10]; //飞机号
char Week; //飞行周日 int Ration; //乘员定额 int FreeTicket; //剩余
票数
float Price[3]; //舱位等级的价格
int ReplacePas; //候补乘客数 Replace
*ReplName;
//该航班的候补乘客名单 Customer
*CustName;
//该航班的已定票乘客名单 struct Flight *next; //指示下一航线结点 }Flight,*PFlight; 2.
乘客结构体:
typedef struct Customer //已定票乘客信息 {char Name[10]; //姓名 int Amount; //定票数 int Level; //舱位等级 int SeatNum; //座位号
char FlightNum[10]; Flight *head; //建立航//所定航班号
struct Customer *next; }Customer; 3.
替补乘客结构体:
typedef struct Replace //替补乘客信息
{char Name[10]; //姓名 int Amount; //定票数 int Level; //舱位等级 char
FlightNum[10];
//所定航班号
struct Replace *next; }Replace;
以上三个结构体是以乘客信息、替补乘客信息为基础、再此之上有定义了飞机航线的结构体以及结点类型指针的结构体。并在后者结构中引入了前两种结构体。并且单独定义了两个指向Flight的指针,作为头只指针和尾指针:
线头结点
Flight *rear; //建立航线尾结点
以及乘客队列的指针:
Customer *Cusrear; Replace *Reprear; 为今后的程序设计奠定了基础。其次,编写实现各个功能的函数与方法:
1.
MainMenu()——系统
主菜单
此函数设计了本系统的界面,是程序的开始,具体实现如下:
void MainMenu() {char i='0'; while (i!='8') {cout<<\" ***************航空公司客运定
票
系
统
***************\"< cout<<\" * 2、查询航线 ; 6、退订机票 *\"< cout<<\" * 3、修改航线 '6':FlightCancelticket();br7、清空系统 *\"< '1':FlightInsert();break; case '2':FlightSearch();break; case '3':FlightRework();break; case '4':FlightDelete();break; eak; case '7':Flightclean();break; case '8':;break; default:cout<<\"error\\n\";break;} } } 2.void FlightInsert()——添加航班信息 此方法主要用到链表的思想,类似于链表中的插入属性。与一般链表不同的是,此方法设置了一个表尾指针,便于航班信息的添加,具体实现如下: void FlightInsert() //添加航班信息 { Flight *p; p=new Flight; cout<<\"请输入终点站名:\"< cout<<\"请输入舱位等级的价格:\"< p->ReplacePas=0; rear->next=p; rear=p; rear->next=NULL;} 2. FlightDelete()—— 删除航班信息 类比于上述的添加航班信息,删除航班同样是依靠了链表的思想来完成。不同的是,在删除方面用到了表头指针这个工具,来定位索要删除的航班信息,具体实现如下: void FlightDelete() // 删除航班信息 { Flight *p,*q; char FlightNum[10]; p=head; int i=0; while (i!=1){ cout<<\"请输入需要删除的航班号:\"< while (p->next&&strcmp(p->next->FlightNum,FlightNum)) {p=p->next; } q=p->next; if (q!=NULL) { if(q->next==NULL) { rear=p; } p->next=p->next->next; delete q; } else { cout<<\"你所要删除的航班不存在\"< FlightLookup()—— 查询航班信息 其实,查询航班的原理与删除原理相似,最中心的环节就是现对指定的航班进行定位。与删除不同的是,查询不涉及到指针的变换,仅仅输出要查询的信息就可以了,具体实现如下: void FlightLookup() //查询航班 { Flight *p,*q; char FlightNum[10]; p=head; int i=0; while (i!=1) { cout<<\"请输入需要查询的航班号:\"< while (p->next&&strcmp(p->next->FlightNum,FlightNum)) { p=p->next; } q=p->next; if (q==NULL) { cout<<\"对不起不存在此航班\"< 航 班 号:\"< 飞 机 号:\"< 的 地:\"< 格:\"< FlightRework()—— 修改航线信息 在修改航线信息方面,中心思想依旧类似于删除和查找。只不过定位到所需信息之后要做的是重新给这些信息赋值。在功能方面,为了使用户便于操作,因此需要一个界面来使程序更直观化一些,具体实现如下: void FlightRework() //修改航线信息 {int Customer_Number ; Flight *p,*q; char FlightNum[10]; char i='0'; p=head; cout<<\"请输入需要修改的航班号:\"< (p->next&&strcmp(p->next->FlightNum,FlightNum)) { p=p->next; } q=p->next; if (q==NULL) { cout<<\"对不起不存在此航班\"< while(i!='9') { cout<<\" *****请输入需要修改的数据*****\"< cin>>q->FlightNum;break; case '2':cout<<\" *3、目的地 4、飞行周日 请输入飞机号:\"< * 9、退出 *\"< case '1':cout<<\" cin>>q->PlaneNum;break; case '3':cout<<\" 请输入目的地:\"< case '4':cout<<\" 请输入飞行周日:\"< case '5':cout<<\" 请输入乘员定额:\"< cin>>q->Ration;q->FreeTicket=q->Ration-Customer_Number;break; case '6':cout<<\"请输入头等舱价格:\"< case '7':cout<<\" 订票,如果航班中的空余票数大于用户所要订的票数,则订票成 请输入普通舱价格:\"< case '8':cout<<\" 请输入经济舱价格:\"< case '9': break; default:cout<<\"error\\n\";break; } } } } 5. FlightBuyTicket() ——订票 订票是本系统的核心功能,本系统的一切功能都是围绕“订票”这个关键词来进行的。用户确定所要乘坐的航班之后,进行 乘客名单。其原理是运用链表的来添加乘客信息,运用队列来使 替补乘客入队。其中,还调用了另外两函数:BuyTicket()和Buyreplace()来实现订票成功 和进入替补乘客名单。具体实现如下: void FlightBuyTicket()//订票{ int Ticket_Amount; void BuyTicket(PFlight ,int ); void Buyreplace(PFlight ,int ,int ); Flight *p,*q; char Des[10]; int i=2; while (i!=1) { cout<<\"请输入目的地:\"< (p->next&&strcmp(p->next->Des,Des)) { p=p->next; } q=p->next; if (q==NULL) { cout<<\"对不起不存在此航班\"< while(i!=1) { cout<<\"输入 需要够买的票数\"< { cout<<\"请输入一个非零数:\"< } if (Ticket_Amount<=q->FreeTicket) { BuyTicket(q,Ticket_Amount); //买 票,详细介绍见下文 } else {int n; cout<<\"剩余票数小于定票数,是否需要列 入候补名单?(1、是 2、否)\"< Buyreplace(q,Ticket_Amount,n); //进入替补名单,详细介绍见下文 } cout<<\"1、返回主菜单 2、继续\"< FlightCancelTicket ()——退票 作为人性化的航空客运订票系统,不但要实现订票,还要实现退票。在退票方面,仍旧是利用链表,将乘客信息删除。但删除之后,如若有替补乘客,还 要使其依照进入替补乘客的队列的次序出队来实现订票。其具体实现代码如下: void FlightCancelTicket() //退票 { void BuyTicket(PFlight ,int ); Flight *p,*q; Customer *h,*j; char FlightNum[6]; char Customer_Name[10]; int Replace1_Amount; //候补第一个人的定票数 int i; while (i!=1) { cout<<\"请输入需要 退定的航班号:\"< while (p->next&&strcmp(p->next->FlightNum,FlightNum)) { p=p->next; } q=p->next; if (q==NULL) { cout<<\"对不起不存在此航班\"< while (i!=2) { cout<<\"请输入姓名:\"< h=q->CustName; while (h->next&&strcmp(h->next->N ame,Customer_Name)) { h=h->next; } j=h->next; if(j==NULL) { cout<<\"查无此人\"< if(j->next==NULL){ //当删除最后一个结点 Cusrear=h; } h->next=h->next->next; q->FreeTicket+=j->Amount; delete j; cout<<\"删除成功!\"< Replace1_Amount=q->ReplName->next->Amount; if (Replace1_Amount<=q->FreeTicket) { Replace *rep; rep=q->ReplName->next; Customer *Cus2; Cus2=new Customer; Cus2->SeatNum=q->Ration-q->FreeTicket+1; strcpy(Cus2->FlightNum, q->FlightNum ); strcpy(Cus2->Name, rep->Name ); Cus2->Amount=rep->Amount; Cus2->Level=rep->Leve l; cout<<\" 乘 客 \"< i=1;i<=(rep->Amount);i++) { cout< } cout< { Cusrear=q->CustName; Cusrear->next=Cus2; Cusrear=Cus2; Cusrear->next=NULL; } else { Cusrear->next=Cus2; Cusrear=Cus2; Cusrear->next=NULL; } q->FreeTicket-=rep->Amount; q->ReplName->next=q->ReplName->next->next; q->ReplacePas--; delete rep; } } } cout<<\"2、退出姓名录入\"< cout<<\"1、返回主菜单\"< BuyTicket(PFlight q,int Ticket_Amount)——买票 作为订票功能实现的核心之一,其思想是利用链表结构将买票乘客的信息添加到表中,具体实现如下: void Buyticket(PFlight q,int Ticket_Amount) //买票 { int n=Ticket_Amount; Customer *Cus2; Cus2=new Customer; Cus2->SeatNum=q->Ration-q->FreeTicket+1; strcpy(Cus2->FlightNum, q->FlightNum ); Cus2->Amount=Ticket_Amount; cout<<\"请输入姓名:\"< i=1;i<=Ticket_Amount;i++) { cout< } cout< { Cusrear=q->CustName; Cusrear->next=Cus2; Cusrear=Cus2; Cusrear->next=NULL; } else{ Cusrear->next=Cus2; Cusrear=Cus2; Cusrear->next=NULL; } q->FreeTicket-=Ticket_Amount; } 8. Buyreplace (PFlight q,int Ticket_Amount)——进入替补队列 同样是订票功能实现的核心之一,此方法利用队列的存储结构是要等候机票的乘客按照先来后到的次序入队,然后将这部分信息储存。在有已订票乘客退票时,根据队列中的信息依次出队,具体实现如下: void Buyreplace(PFlight q,int Ticket_Amount,int n) //进入候补队列 { Replace *Rep2; Rep2=new Replace; if(n==1) { q->ReplacePas+=Ticket_Amount; strcpy(Rep2->FlightNum,q->FlightNum); Rep2->Amount=Ticket_Amount; cout<<\"请输入姓名:\"< if(q->ReplName->next==NULL) { Reprear=q->ReplName; Reprear->next=Rep2; Reprear=Rep2; Reprear->next=NULL; } else{ Reprear->next=Rep2; Reprear=Rep2; Reprear->next=NULL; } } } 9. Flightclean()—— 系统清空 本方法是将航班信息清空,主要思想是将头指针赋予下一个结点,然后将原来的头指针删除,具体代码如下: void Flightclean() { head->next=rear->next ; cout<<\"系统已经清空!\"< 作为本程序的主函数,其完成的是各个函数的调用,来具体实现系统的功能: #include \"ticket.h\" void main() //主程序 {Cusrear=new Customer; Reprear=new Replace; head=rear=new Flight; head->next=NULL; void FlightInsert(); void FlightDelete(); void FlightLookup(); void FlightRework(); void FlightBuyticket(); void FlightCancelticket(); void Flightclean(); void MainMenu(); MainMenu(); } 至此,本航空客运订票系统的详细设计介绍完毕。 五、调试分析: 运行后,界面如下: (一) 添加航线 在以上界面中,先键入一,按照提示分别输入信息,如下图所示: (二) 查询航线 返回主菜单后,键入2,进行查询,按照提示出入信息,若输入的航班信息存在,如图: 若输入的信息不存在,则如图: 返回主菜单后,操作其他功能 (三) 修改航线 在主菜单下键入3,根据提示输入航班号出现另一个菜单,如图 根据提示,修改航班信息,如下图所示: 返回主菜单,查询已修改的航班信息,结果吻合,如图示: (四) 删除航线 在主菜单下,键入4,根据提示输入航班号后,进行删除,如图 之后,退出到主菜单,进行查询,可以发现刚才的操作已将航班信息删除,如图: (五) 预定机票 先重复(一)操作,添加目的地为yancheng的航班,然后执行预定机票操作,根据提示,分别令三个乘客购票,第一个乘客将票买光,第二位乘客与第三位乘客座位替补乘客候票,如图: (六) 退订机票 在主菜单下,键入6,令刚才的三名乘客中的第一名退票,退票后第二名乘客购买成功如图: (七) 清空系统 在主菜单下,键入7,执行清空,如图 在清空后,查询航班,根据提示输入航班号0351,查询结果如图: (八) 退出系统 在主菜单下,键入8,即可退出: 六.总结 通过这次课程设计,我才深知数据结构灵活,对于相同的问题模型可以用多种不同的存储结构来实现。在刚刚结束的一个学期里,我对数据结构的学习才仅仅是个入门,通过这次的课程设计,我才发现自己在以往学习中的诸多问题,比如对队列的学习不够深入,只是局限于书本上的某一种队列的理论学习,对循环队列的学习和应用还远远不够,对于同一问题没有多角度的思考,仅仅局限于一种方法,根本没有思考是否还有别的更简单更快捷的方法,不能做到举一反三,还有太注重理论学习而忽视了上机实践,结果就是理论知识不扎实上机动手能力差,编译出现错误时不能很快的找出错误。在这次课设的编程过程中,我尽量把以往学过的知识全部用上,对于同一个问题从不同的角度考虑实现方法,所以我才发现了自己很多的问题,而且借此寒假,我会改正这些问题,并且深入学习数据结构和C++。在这次课程中,除了达到了课设目的,我想我最大的收获就是以上的发现并且能及时的解决 七.参考文献 (1)徐孝凯 《数据结构实用教程》清华大学出版社 (2)王育坚 《Visusl C++面向对象编程教程》清华大学出版社 因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- shangjiatang.cn 版权所有 湘ICP备2022005869号-4
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务