安徽建筑工业学院课 程 设 计 报 告 课程名称: 数据结构与算法课程设计 题 目: 订票系统 院 系: 数理系 专 业: 信息与计算数学 班 级: 一班 学 号: 12207210148 姓 名: 蔡会丽 时 间: 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基本功能要求设计航班信息,订票信息的存储结构,设计程序完成如下功能:1.录入航班信息 可以录入航班情况:航班号,起飞、抵达城市,座位总数,剩余座位数数据可以存储在一个数据文件txt中,采用线性表的链式结构、具体数据用户输入) 2.加载航班与客户信息 可以自动加载保存在txt文件中的航班与客户的信息3. 查询航班信息 可以输入航班号,查询该航线的情况(起降时间,起飞抵达城市,航班票价,票价折扣,确定航班是否满仓); 可以输入起飞抵达城市,查询飞机航班情况;4. 订票 客户资料包括:姓名,证件号,订票数量及航班情况,座位号订单要有订单号用户输入要订票的航班号,如果该航班有余票,则订票成功,并记录客户的信息 如果该航班已经无票,则订票失败输出所有有余票的航班信息,提供用户可以选择的航班5. 退票 删除退票用户的订票信息,相应的航班的余票数量增加16. 修改航班信息用户输入要修改的航班号,和要修改的内容,修改该航班的相应信息7. 保存数据文件把当前的航班信息,和用户信息分别保存在txt文件中8. 输出所有客户信息 按一定的格式输出用户的姓名,证件号码,订票数量及航班情况,座位号。
9.输出所有航班信息 按一定的格式输出所有的航班的航班号,起飞抵达城市,座位总数,剩余座位数0. 退出系统3概要设计3.1程序设计说明图.主菜单1234567890录入航班的信息加载航班与客户信息查询航班信息订票退票修改航班信 息保存数据文 件输出所有客户信息输出所有航班信息退出3.2程序设计思路.对于航班和用户分别定义不同的数据结构,并且采用线性表的链式结构进行存储所用到的算法包括:链表的创建 ,增加,遍历,插入和删除3.3存储结构设计由于航空公司的航班保持基本不变,所以应该采用顺序存储结构将各条航线的基本情况登陆在一张线性表上,按照终点站名有序排列在客票预定这一环节里将出现两个客户名单:已定票客户名单和需定票客户名单两客户名单可分别由线性表和队列实现为查找方便,已定票客户的线性表应按姓名有序,同时为了插入和删除方便,,应以链表作为存储结构由于无法知道预约的人数,队列也应该以链表作为存储结构 我们需要做的是建立一个可以插入和删除节点的链表,并能检索这个链表,在必要的时候将链表的内容保存到文件中3.3主要算法设计3.3.1链表数据类型的定义:因为采用的逻辑结构是线性结构,存储结构是链式结构。
//航线结构体typedef struct airline{ char line_num[10];//航班号 char start_place[20];//起飞地 char end_place[20];//目的地 int total;//座位总数 int left;//剩余座位 struct airline *next;//下一个节点}airline;//航线结构体的头结点typedef struct airlinehead{ int count; airline *next;}airlinehead;//客户结构体typedef struct client{ char name[20];//乘客姓名 char id[10];//乘客证件号 char line_num;//航班号 int seat_num;//座位号 struct client *next;//下一个节点}client;//客户结构体的头结点typedef struct clienthead{ int count; client *next;}clienthead;3.3.2本程序的结构1)主程序模块:void 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)//录入航班函数,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_client(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,clienthead *headclient)//加载保存在文件中的信息 5)函数模块之间的调用图6) 程序流程图3.4测试用例设计航班号起飞地目的地座位总数123ChinaAmerica30456BeijingShanghai30789JapanBeijing30101AustraliaBeijing50姓名证件号码航班蔡会丽2012123张长德2013456李毓芬2014789钱玉芬2015101单丹宇20161234详细设计——原程序代码#include#includeusing namespace std;#include#includetypedef struct client{ char name[20];//乘客名 char id[10];//乘客证件号 char line_num[10];//航班号 int seat_num;//座位号 struct client *next;//下一个结点}client;typedef struct clienthead{ int count; client *next;}clienthead;typedef struct airline{ char line_num[10];//航班号 char start_place[20];//起飞地 char end_place[20];//目的地 int total;//座位总数 int left;//剩余座位 struct airline *next;//下一个结点}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;i>temp->line_num; cout<<"请输入第"<>temp->start_place; cout<<"请输入第"<>temp->end_place; cout<<"请输入第"<>temp->total; temp->left=temp->total; cout<<"第"<next=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<<"******************************************************"<
"<>select; cout<>line_num; temp=phead->next; while(temp) { if(strcmp(temp->line_num,line_num)==0) { find=temp; //display—line(find); return temp; break; } else { temp=temp->next; } } if(!temp) { cout<<"没有找到该航班的信息。
"<>start_place; cout<<"请输入目的地:"; cin>>end_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<<"没有找到该航班的信息"<
"<line_num<<"\t\t" <start_place<<"\t\t" <end_place<<"\t\t" <total<<"\t" <left<<"\t" <next; if(!node) { cout<<"当前没有航班信息"<count<next; }}int change_line(airlinehead *headline)//修改航班信息{ cout<<"当前所有航班的信息为:"<next; while(temp) { display_line(temp); temp=temp->next; } cout<
"<>select; cout<3 || select<1) { cout<<"输入错误"<next=(airline)malloc(sizeof(airline)) temp->next=new airline; temp=temp->next; cout<<"请输入要增加的航班号: "; cin>>temp->line_num; cout<<"请输入航班的起飞地: "; cin>>temp->start_place; cout<<"请输入航班的目的地: "; cin>>temp->end_place; cout<<"请输入航班的座位总数: "; cin>>temp->total; temp->left=temp->total; temp->next=NULL; headline->count++; cout<<"增加成功。
"<>line_num; airline *delline; delline=headline->next; while(delline) { if(strcmp(delline->next->line_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<<"没有找到输入的航班号"<>line_num3; temp=headline->next; while(temp) { if(strcmp(temp->next->line_num,line_num3)==0) { cout<<"请选择要修改的内容:"<
"<next; } if(temp==0) { cout<<"没有找到输入的航班号"<name<<"\t\t" <id<<"\t\t" <seat_num<<"\t\t" <line_num<<"\t\t" <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; cout<<"请输入航班号: "; char line_num[10]; cin>>line_num; 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<<"对不起,该航班票已经售完。
"<>custom->id; cout<>custom->name; cout<seat_num=temp->total-temp->left+1; custom->next=NULL; strcpy(custom->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++; custom->next=headclient->next; headclient->next=custom; cout<<"订票成功,祝您旅途愉快"; return 1;}int returnticket(airlinehead *headline,clienthead *headclient)//退票{ cout<<"请输入顾客的证件号码(id): "; char id[10]; cin>>id; airline *airlinetemp=headline->next; client *clienttemp=headclient->next; if(NULL==airlinetemp) { cout<<"当前没有航班信息"<id,id)==0)//要删除的节点为第一个时… { strcpy(line_num,clienttemp->line_num); headclient->next=clienttemp->next; delete clienttemp; while(airlinetemp)//修改对票客户所对应的航班的售票信息。
{ if(strcmp(line_num,airlinetemp->line_num)==0) { airlinetemp->left++; break; } airlinetemp=airlinetemp->next; } cout<<"退票成功,欢迎下次合作!"; return 1; } while(clienttemp->next)//要删除的节点不是第一个时… { if(strcmp(clienttemp->next->id,id)==0) { strcpy(line_num,clienttemp->next->line_num); delnext=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<<"退票成功,欢迎下次合作!"<next; } cout<<"未找到该客户的信息"<count<next; while(linetemp) { outline<line_num<<" " <start_place<<" " <end_place<<" " <total<<" " <left<<" " <next; } outline.close(); cout<<"航班信息保存成功"<
"<count<next; while(clienttemp) { outclient<name<<" " <id<<" " <line_num<<" " <seat_num<<" " <next; } outclient.close(); cout<<"客户信息保存成功"<next=NULL; headclient->next=NULL; ifstream inair("airline.txt"); if(!inair) { cout<<"航班文件不能打开,信息加载失败…"<>headline->count; for(int i=0;icount;i++) { airline *nodeline=new airline; inair>>nodeline->line_num >>nodeline->start_place >>nodeline->end_place >>nodeline->total >>nodeline->left; nodeline->next=headline->next; headline->next=nodeline; } inair.close(); cout<<"航班信息加载完毕…"<>headclient->count; for(i=0;icount;i++) { client *nodeline=new client; inclient>>nodeline->name >>nodeline->id >>nodeline->line_num >>nodeline->seat_num; nodeline->next=headclient->next; headclient->next=nodeline; } inclient.close(); cout<<"客户信息加载完毕…"<
"<count=0; headline->next=NULL; clienthead *headclient=new clienthead; headclient->count=0; headclient->next=NULL; while(1) { main_menu(); int n; cout<<"请选择您要进行的操作: "; cin>>n; cout<>num; cout<
"; cout<
2、 程序的性能分析,包括时空分析; 时间复杂度分析:在订票和退票的函数中,都用到了链表的查询算法,时间复杂度为logn 3、上机调试过程中出现的问题及其解决方案 调试过程中经常出现大量的语法小错误,像标点符号、大小写、0与o的相似处,虽然很小的问题,如果不仔细的话,就很难找出来,这培养了我写算法严谨、认真的态度 还有就是逻辑错误,比如指针的声明和内存分配问题 6程序说明1) 录入航班信息: 打开系统会出现主界面,输入1后回车,系统会出现要输入的航班数、航班号、起飞地、目的地、总座位数2) 加载航班信息:打开系统,在主界面输入2,系统会自动加载上次保存的航班和客户信息3) 查询航班信息:选择查询功能后,会出现2个选择:1、按航线查询,2.按起飞抵达城市查询航班情况4) 客户订票:选择4,依次输入航班号、证件号码和姓名订票5) 客户退票:选择5,然后输入证件号,退票6) 保存操作:输出所有航班信息和客户信息选择保存操作后,系统会覆盖源文件的信息,保存信息7经验和体会7.1经验通过这段时间的课程设计,本人对计算机的应用,数据结构的作用以及C语言的使用都有了更深的了解。
尤其是C语言的进步让我深刻的感受到任何所学的知识都需要实践,没有实践就无法真正理解这些知识以及掌握它们,使其成为自己的财富在理论学习和上机实践的各个环节中,通过自主学习和请教老师,我收获了不少当然也遇到不少的问题,也正是因为这些问题引发的思考给我带了收获从当初不喜欢上机写程序到现在能主动写程序,从当初拿着程序不只如何下手到现在知道如何分析问题,如何用专业知识解决实际问题的转变,我发现无论是专业知识还是动手能力,自己都有很大程度的提高在这段时间里,我对for、while等的循环函数用法更加熟悉,逐渐形成了较好的编程习惯在老师的指导帮助下,同学们课余时间的讨论中,这些问题都一一得到了解决在程序的调试能力上,无形中得到了许多的提高例如:头文件的使用,变量和数组的范围问题,定义变量时出现的问题等等在实际的上机操作过程中,不仅是让我们了解数据结构的理论知识,更重要的是培养解决实际问题的能力,所以相信通过此次实习可以提高我们分析设计能力和编程能力,为后续课程的学习及实践打下良好的基础7.2体会我觉得编程过程中,语法的问题一定要注意,如果编写的过程中注意到了,编译就很可能会快一些通过,这样我们有更多的时间来检查程序中的其它问题。
其次我感觉一个好的程序并不只是可以运行,他还可以满足一大堆的条件,如健壮性,可读性,可维护性,高效性,等等要提高自己的编程能力,你必须亲自去体验、去设计、编辑、编译、调试、运行开始的时候没有认识到算法的重要性,以为语言是程序设计的基础和核心,随着学习的深入,我渐渐认识到,只要好的算法才能写出出类拔萃的程序只有对算法的深入理解,和知道如何应用相应的算法设计相应的程序,才能完成程序设计8程序结果1)测试用例12)测试用例23)测试用例34)测试用例45)测试用例56)测试用例67) 测试用例7 8) 测试用例89) 测试用例910) 测试用例1011) 测试用例119附 录报告所附源文件在文件夹中。