《信息与计算数学专业毕业设计—订票系统课程设计报告书.doc》由会员分享,可在线阅读,更多相关《信息与计算数学专业毕业设计—订票系统课程设计报告书.doc(29页珍藏版)》请在三一办公上搜索。
1、 工业学院课 程 设 计 报 告 课程名称: 数据结构与算法课程设计 题 目: 订票系统 院 系: 数理系 专 业: 信息与计算数学 班 级: 一班 学 号: 姓 名: 时 间: 2013.6 目 录1问题描述12基本功能要求13概要设计13.1程序设计思路23.2存储结构设计23.3主要算法设计23.3.1链表数据类型的定义33.3.2本程序的结构33.4测试用例设计64详细设计原程序代码65调试分析206程序说明207经验和体会207.1经验207.2体会218程序结果219附 录27订票系统1问题描述设计一个模拟飞机订票系统,通过此系统可以录入、查询、修改航班情况,完成用户订票和退票功能
2、,并且可以保存客户和航班的资料。2基本功能要求设计航班信息,订票信息的存储结构,设计程序完成如下功能:1.录入航班信息。 可以录入航班情况:航班号,起飞、抵达城市,座位总数,剩余座位数。(数据可以存储在一个数据文件txt中,采用线性表的链式结构、具体数据用户输入) 2.加载航班与客户信息。 可以自动加载保存在txt文件中的航班与客户的信息。3. 查询航班信息。 可以输入航班号,查询该航线的情况(起降时间,起飞抵达城市,航班票价,票价折扣,确定航班是否满仓); 可以输入起飞抵达城市,查询飞机航班情况;4. 订票。 客户资料包括:姓名,证件号,订票数量及航班情况,座位号。订单要有订单号。用户输入要
3、订票的航班号,如果该航班有余票,则订票成功,并记录客户的信息。 如果该航班已经无票,则订票失败。输出所有有余票的航班信息,提供用户可以选择的航班。5. 退票 删除退票用户的订票信息,相应的航班的余票数量增加1。6. 修改航班信息用户输入要修改的航班号,和要修改的内容,修改该航班的相应信息。7. 保存数据文件。把当前的航班信息,和用户信息分别保存在txt文件中。8. 输出所有客户信息。 按一定的格式输出用户的姓名,证件号码,订票数量及航班情况,座位号。9.输出所有航班信息。 按一定的格式输出所有的航班的航班号,起飞抵达城市,座位总数,剩余座位数。0. 退出系统3概要设计3.1程序设计说明图.主菜
4、单1234567890录入航班的信息加载航班与客户信息。查询航班信息订票退票修改航班信 息保存数据文 件输出所有客户信息输出所有航班信息退出3.2程序设计思路.对于航班和用户分别定义不同的数据结构,并且采用线性表的链式结构进行存储。所用到的算法包括:链表的创建 ,增加,遍历,插入和删除。3.3存储结构设计由于航空公司的航班保持基本不变,所以应该采用顺序存储结构将各条航线的基本情况登陆在一张线性表上,按照终点站名有序排列。在客票预定这一环节里将出现两个客户名单:已定票客户名单和需定票客户名单。两客户名单可分别由线性表和队列实现。为查找方便,已定票客户的线性表应按姓名有序,同时为了插入和删除方便,
5、应以链表作为存储结构。由于无法知道预约的人数,队列也应该以链表作为存储结构。 我们需要做的是建立一个可以插入和删除节点的链表,并能检索这个链表,在必要的时候将链表的内容保存到文件中。3.3主要算法设计3.3.1链表数据类型的定义:因为采用的逻辑结构是线性结构,存储结构是链式结构。/航线结构体typedef struct airline char line_num10;/航班号 char start_place20;/起飞地 char end_place20;/目的地 int total;/座位总数 int left;/剩余座位 struct airline *next;/下一个节点airlin
6、e;/航线结构体的头结点typedef struct airlinehead int count; airline *next;airlinehead;/客户结构体typedef struct client char name20;/乘客姓名 char id10;/乘客证件号 char line_num;/航班号 int seat_num;/座位号 struct client *next;/下一个节点client;/客户结构体的头结点typedef struct clienthead int count; client *next;clienthead;3.3.2本程序的结构1)主程序模块:v
7、oid main()初始化;向屏幕输出输入提示;选择输入要进行操作的菜单项(1,2,3,4,5,6,7,8,9,0);1、 输入录入的航班信息,输出航班信息录入成功。 2、加载航班与客户信息,加载成功。 3、查询航班信息,输出显示航班信息。 4、订票,输出订票成功 5、退票 ,输出退票成功。 6、修改航班信息,输出修改成功。 7、保存数据文件,输出保存成功。 8、输出所有客户信息,输出显示所有客户信息 。 9、输出所有航班信息,输出显示所有航班信息。 0、退出系统 ,退出界面。2)对航班的操作; airlinehead *import(int n,airlinehead *pheadline)
8、/录入航班函数,n为所要录入航班的数量airline* query(airlinehead *phead)/查询航班情况 void display_line(airline *node)/输出一个航班节点的所有信息到屏幕上 void display_all_line(airlinehead *headline)/输出所有航班的所有信息到屏幕上 int change_line(airlinehead *headline)/修改航班的信息3) 对客户的操作void display_client(client *node=null)/输出一个客户节点的信息到屏幕void display_all_cl
9、ient(clienthead *headclient)/输出所有客户的信息到屏幕int bookticket(airlinehead *headline,clienthead *headclient)/订票int returnticket(airlinehead *headline,clienthead *headclient)/退票4) 对文件的操作 int savemessage(airlinehead *headline,clienthead *headclient)/保存航班和客户信息到相应的txt文件中int loadmessage(airlinehead *headline,cl
10、ienthead *headclient)/加载保存在文件中的信息 5)函数模块之间的调用图6) 程序流程图3.4测试用例设计航班号起飞地目的地座位总数123ChinaAmerica30456BeijingShanghai30789JapanBeijing30101AustraliaBeijing50姓名证件号码航班蔡会丽2012123张长德2013456李毓芬2014789钱玉芬2015101单丹宇20161234详细设计原程序代码#include#includeusing namespace std;#include#includetypedef struct client char na
11、me20;/乘客名 char id10;/乘客证件号 char line_num10;/航班号 int seat_num;/座位号 struct client *next;/下一个结点client;typedef struct clienthead int count; client *next;clienthead;typedef struct airline char line_num10;/航班号 char start_place20;/起飞地 char end_place20;/目的地 int total;/座位总数 int left;/剩余座位 struct airline *nex
12、t;/下一个结点airline;typedef struct airlinehead int count; airline *next;airlinehead;airlinehead *import(int n,airlinehead *pheadline)/录入航班函数,n为所要录入航班的数量; airline *temp=new airline; temp-next=NULL; pheadline-next=temp; pheadline-count=n; for(int i=0;in;i+) cout请输入第i+1temp-line_num; cout请输入第i+1temp-start_
13、place; cout请输入第i+1temp-end_place; cout请输入第i+1temp-total; temp-left=temp-total; cout第i+1个航班成功录入.endl; if(inext=new airline; if(temp-next=NULL) cout分配内存失败next-next=NULL; temp=temp-next; return pheadline;airline* query(airlinehead *phead)/查询航班情况 airline *find=NULL; airline *temp;cout*endl;cout*1,按航线查询航
14、班情况。*endl;cout2,按起飞抵达城市查询航班情况。 *endl;cout*endl;coutselect;coutendl;switch(select)case 1: coutline_num; temp=phead-next; while(temp) if(strcmp(temp-line_num,line_num)=0) find=temp; /displayline(find); return temp; break; else temp=temp-next; if(!temp) cout没有找到该航班的信息。endl; return NULL;break; case 2: c
15、har start_place20;/起飞地char end_place20;/目的地coutstart_place;coutend_place;/ airline *temp;temp=phead-next;while(temp) if(strcmp(temp-start_place,start_place)=0 & strcmp(temp-end_place,end_place)=0) find=temp;/return temp; break; temp=temp-next; if(!temp) cout没有找到该航班的信息。endl; return NULL; break; defau
16、lt: cout输入错误。endl; break;return find;void display_line(airline *node)/输出一个航班结点的所有信息到屏幕 if(node=NULL) cout参数为空,输出失败。endl; return; coutendl;cout航班号tt起飞地tt目的地tt座位总数t剩余座位tendl;coutline_numtt start_placett end_placett totalt leftt endl;void display_all_line(airlinehead *headline)/输出所有航班的信息到屏幕 coutnext;if
17、(!node) cout当前没有航班信息endl; return;cout航班数目: countnext;int change_line(airlinehead *headline)/修改航班信息cout当前所有航班的信息为:next;while(temp) display_line(temp); temp=temp-next;coutendl;cout请选择你要进行的操作endl;cout1,增加航班。endl;cout2,删除航班。endl;cout3,修改当前航班的信息。select; cout3 | select1) cout输入错误。next=(airline。)malloc(siz
18、eof(airline) temp-next=new airline; temp=temp-next;couttemp-line_num;couttemp-start_place;couttemp-end_place;couttemp-total;temp-left=temp-total;temp-next=NULL;headline-count+;cout增加成功。endl;break; case 2: coutline_num;airline *delline;delline=headline-next;while(delline) if(strcmp(delline-next-line_
19、num,line_num)=0) airline *plink; plink=delline-next-next; / free(delline-next); delete delline-next; delline-next=plink;headline-count-; delline=delline-next;if(delline=0) cout没有找到输入的航班号。endl; return 0;break; case 3: coutline_num3;temp=headline-next;while(temp) if(strcmp(temp-next-line_num,line_num3
20、)=0) cout请选择要修改的内容:endl; cout-1,座位总数。-endl; cout-2,起始地址。-endl; cout-3,目的地址。-next;if(temp=0) cout没有找到输入的航班号。endl;return 0;break; return 1;void display_client(client *node=NULL)/输出一个客户节点的信息到屏幕。 if(node=NULL)cout参数为空,输出失败。endl;return;coutendl;cout姓名tt证件号码t座号t航班ttendlendl;coutnamett idtt seat_numtt line
21、_numtt next; if(!node) cout当前没有客户信息。next;void display_left_airline(airlinehead *headline)/输出未售完票的航班的信息。airline *node=headline-next;if(!node) cout当前没有航班。left!=node-total;node=node-next) display_line(node);int bookticket(airlinehead *headline,clienthead *headclient)/订票 / headclient-count=0;coutline_nu
22、m;airline *temp;temp=headline-next;while(temp) if(strcmp(temp-line_num,line_num)=0) break; temp=temp-next;if(!temp) cout未找到该航班left=0) cout对不起,该航班票已经售完。endl; cout请选择其他合适的航班:;client *custom=new client;coutcustom-id;coutendl;coutcustom-name;coutseat_num=temp-total-temp-left+1;custom-next=NULL;strcpy(cu
23、stom-line_num,line_num);/*client *clienttemp=NULL;clienttemp=headclient-next;if(clienttemp=NULL)/线性表为空表的时候 headclient-next=custom; temp-left-; headclient-count+; cout”订票成功,祝您旅途愉快。”next)/线性表不为空表时,寻找最后结点。 clienttemp-next=custom;temp-left-;headclient-count+;cout订票成功,祝您旅途愉快。left-;headclient-count+;custo
24、m-next=headclient-next;headclient-next=custom;cout订票成功,祝您旅途愉快。;return 1;int returnticket(airlinehead *headline,clienthead *headclient)/退票。coutid;airline *airlinetemp=headline-next;client *clienttemp=headclient-next;if(NULL=airlinetemp) cout当前没有航班信息。id,id)=0)/要删除的节点为第一个时 strcpy(line_num,clienttemp-li
25、ne_num); headclient-next=clienttemp-next; delete clienttemp; while(airlinetemp)/修改对票客户所对应的航班的售票信息。 if(strcmp(line_num,airlinetemp-line_num)=0) airlinetemp-left+; break; airlinetemp=airlinetemp-next; coutnext)/要删除的节点不是第一个时if(strcmp(clienttemp-next-id,id)=0)strcpy(line_num,clienttemp-next-line_num);de
26、lnext=clienttemp-next-next;delete clienttemp-next;clienttemp-next=delnext;/while(airlinetemp)/修改对票客户所对应的航班的售票信息。 if(strcpy(line_num,airlinetemp-line_num)=0) airlinetemp-left+; break; airlinetemp=airlinetemp-next;cout退票成功,欢迎下次合作!endlnext;cout未找到该客户的信息。endl;return 0;int savemessage(airlinehead *headli
27、ne,clienthead *headclient)/保存航班和客户的信息到相应的txt文件中。ofstream outline(airline.txt);if(!outline) cout航班信息文件打开失败。endl; return 0;cout正在保存航班信息endl;outlinecountnext;while(linetemp) outlineline_num start_place end_place total left next;outline.close(); cout航班信息保存成功endl;ofstream outclient(client.txt);if(!outcli
28、ent) cout客户信息文件打开失败。endl; return 0;cout正在保存客户信息文件endl;outclientcountnext;while(clienttemp) outclientname id line_num seat_num next;outclient.close();cout客户信息保存成功。next=NULL;headclient-next=NULL;ifstream inair(airline.txt);if(!inair) cout航班文件不能打开,信息加载失败endl; return 0;cout正在加载航班信息headline-count;for(int
29、 i=0;icount;i+) airline *nodeline=new airline; inairnodeline-line_num nodeline-start_placenodeline-end_placenodeline-totalnodeline-left; nodeline-next=headline-next; headline-next=nodeline;inair.close();cout航班信息加载完毕endl;ifstream inclient(client.txt);if(!inclient) cout客户文件不能打开,信息加载失败endl; return 0;cout正在加载客户信息headclient-count;for(i=0;icount;i+) client *nodeline=new client; inclientnodeline-namenodeline-idnodeline-line_numnodeline-seat_num; nodeline-next=headclient-next; headcl