《软件课程设计报告飞机票销售系统.doc》由会员分享,可在线阅读,更多相关《软件课程设计报告飞机票销售系统.doc(64页珍藏版)》请在三一办公上搜索。
1、软件课程设计报告班级:光信1005班姓名: 学号:U201013316目录1 软件设计.21.1 设计题目21.2 设计要求21.3 设计思想21.4 流程图42 软件测试122.1 航班信息查询模块测试122.2 订票模块测试172.3 机票信息查询模块测试192.4 退票模块测试233 算法改进254 开发体会26附录:源代码清单28参考文献641 软件设计1.1 设计题目飞机票销售系统1.2 设计要求运用C语言基本知识,结合相关算法思想和数据结构,编写一个单微机系统下运行的飞机票销售系统。飞机票销售系统模拟飞机票销售人员的工作,应实现航班信息查询,订票,机票信息查询,退票等功能。1.3
2、设计思想本程序分为四个模块,即航班信息查询模块,订票模块,机票信息模块,退票模块。通过建立plane.txt和ticket.txt两个文本文档来储存航班信息和已售出的机票信息。程序中,定义了airline和ticket两个结构体来分别储存航班和机票信息,再使用struct airline *list1()和struct ticket *list2()来从文档中读取信息储存在链表中,并输出链表头指针。航班信息查询模块功能由函数airline()实现,再分为按航班编号,目的地,起飞时间三种查找方式。通过airline()调用menu1(struct airline *)目录函数,再选择进入sear
3、ch11(struct airline *),search12(struct airline *),search13(struct airline *)三个函数,来进行信息查询。订票模块功能由函数book()实现,通过对输入的航班编号的判断,来决定是否能够订票,订票成功后将添加的机票信息回写入ticket.txt中,并改动plane.txt中相应的航班剩余机票信息。机票信息查询模块功能由ticketsearch()实现,再分为按机票编号和旅客姓名两种查找方式。通过ticketsearch()调用menu2(struct ticket)目录函数,再选择进入search21(struct tick
4、et)和search22(struct ticket)两个函数,来进行信息的查询。退票模块功能由refund()函数来实现,通过对输入机票编号的判断,来决定是否退票,退票成功后将退除的机票信息从ticket.txt中删除,并改动plane.txt中相应的航班剩余机票信息。1.4 流程图主菜单流程图airlinesearch()为航班查询函数,book()为机票订购函数,ticketsearch()为机票查询函数,refund()为退票函数。航班信息查询菜单menu1(struct airline *p)search11(struct airline *)为按航班编号查询信息,search12(
5、struct airline *)为按航班目的地查询信息,search13(struct airline *)为按起飞时间查询信息,menu()为主菜单。按航班编号查询search11(struct airline *)函数流程图 search12(struct airline *)和search13(struct airline *)同理,只是改了下输入项和比较项。订票book()函数流程图 机票信息查询主菜单menu2(struct ticket *p)流程图 按机票编号查询信息search21(struct ticket *)流程图 退票refund()流程图:2 软件测试2.1 航班信
6、息查询模块测试进入程序,首先进入主菜单界面。选择1,进入航班信息查询菜单界面选择1,按航班编号查询航班信息,输入“ZH9658”。查到的航班信息如下所示:输入“a”,返回菜单后,如果选择2,就按航班目的地查找,输入“南京”。查到相应的机票信息为:按”a”返回菜单后,如果选择3,就按起飞时间查找,输入“07:00”。查到的信息如下:2.2 订票模块测试 在主菜单中选择2,进行机票购买,显示购票界面,按前面测试的,输入到广州的航班号“ZH9658”,输入姓名“李俊彦”,性别“男”。如果剩余票,则显示订票成功,并显示机票信息:再回主菜单对“ZH9658”的航班信息进行查询,结合前面的测试,剩余票数由
7、“5”变成了“4”。2.3 机票信息查询模块测试返回主菜单,选择“3”进入机票信息查询模块。选择“1”,按机票编号查询,输入李俊彦的机票编号“51”.之后显示其机票信息:返回机票信息查询的菜单后,选择“2”,按购票人姓名查询机票信息,输入“李俊彦”。之后显示其机票信息:2.4 退票模块测试回到主菜单,选择“4”,进入退票模块,输入要退机票的编号“51”.显示所退票的信息后,再输入“1”确认退票。再回到退票部分,输入机票编号“51”。再回到航班信息查询,查询ZH9658航班的信息,剩余机票数由“4”变回了“5”。若进行多张机票的订购与退票,也能正常运行。3 算法改进改进一:在读取机票信息,并储存
8、在链表的过程中,开始时,固定了循环读入的次数,则当删除机票信息或者添加机票信息后,会导致文件中的信息不能完全读入到链表中。之后发现其问题,改为了用while(feof(fp)=0)循环,边将数据读入链表,边创建下一个链表节点,直至文件末尾。改进二:在各个目录的选择过程时,先使用了int型的choice来储存客户的选择,但当客户不按照提示,输入char型的数据时,会导致程序不能识别,进入死循环。发现这个问题后,我将choice改为了char型。但又由于输入时的回车号,会被读入下次的choice=getchar(),使程序运行出错。最后,我在choice=getchar()的前面加了getchar
9、()来储存回车,改进了这个问题。改进三:在book()和refund()模块中,由于要回写,会有if(fp1=fopen(plane.txt,wt+)=NULL),但当用户执行到一半直接关闭程序时,由于未执行回写部分的语句,将导致txt文档中的信息会没有。之后,我将打开文档的语句刚放在回写的前面,这样当用户关闭时,txt里面的信息不会丢失。4 开发体会经过了这次的飞机票销售系统程序的开发,让我深刻地明白了,软件的开发是一个体力活,是对眼力和脑力的一次考验。开始时,由于对文件和链表的极度不熟悉,会对编写这个程序感到十分的茫然。但当慢慢地了解了动态链表的建立过程,熟悉了用fscanf和fprint
10、f对文件的写出和写入,我觉得自己应该可以做了。程序功能模块的划分还算比较简单,接下来就是一块一块的做。上学期在学c语言时,所编的程序一般就只有主函数,即使是在学函数这块,一般也就调用一两个简单的函数,最多的程序也就100行。这次的最后有600多行,对函数的调用也是挺复杂的,其间还有许多对输入输出信息的处理,对文件及链表的操作。整个这次微型软件的编写过程,让我对软件的编写有了一定的认识,同时自己程序的编写能力也是得到了极大的提升,对结构化的程序编写方法有了很深的理解和体会。开始对文件打开时,不了解“a”,“r”,“w”等打开方式,会导致txt中的信息被清空。后来经过了单独的测试,才体会到了各种方
11、式的用法,以及在程序中的位置不同而对程序的运行造成不同的影响,最终能够对文件按自己的想法去进行操作。将文件中的信息储存到建立的链表中后,不知道如何在各个功能模块中调用链表,觉得如果一个函数中建立一次就太麻烦了。后来想到了将建立链表的过程单独的做成函数,输出链表的头指针,再在函数中调用时,将头指针赋给相应的结构指针就可以对整个链表进行操作了。编写到退票模块时,才突然发现在订票模块没有修改订票后的航班信息。再重新考虑回写问题时,经常出现文件回写未成功时,文件中的信息被清空了,挺让人郁闷的。这就是将航班和机票信息直接写到txt中的坏处吧!不过在编写大型软件时,或许只能把信息存在文档中,这就要求编写人
12、员在编写时考虑到各种各样的问题,防止出现将程序信息清空的现象吧。这个事情让我了解到,编程序需要十分的细心,且要考虑很多的细节,确实是个体力活。在编写过程中,也发现了一些VC的类似bug的东西。比如:如果fprintf后面有scanf等一些等待输入的指令时,会回写不进去,即便它跟fprintf回写的东西完全无关;一些循环,有的只能用for,有的又只能用while;在使用scanf和gets输入字符和字符串时,有非常容易读入错误,要在%c前加空格等等。这次的程序由于不再只是自己使用,所以需要人性化的输入界面。这也是第一次设定界面,因此在设计输入和输出界面时,费了不少精力,也因此调试了不少时间。虽然
13、最后的界面与一般的程序界面还是有很大的差距,但也算是稍微人性化了吧,仿佛感受到了上个世纪人们的用电脑的过程。经过这次软件设计,感觉自己对软件编写有了初步的认识,对电脑上的一些程序有了一些新的认识。比如机房上机登陆时的界面,应该就是用C的吧;用鼠标操作软件,只是把输入设备扩展到了鼠标;使用一些程序时,基本地把其分解为几个功能模块等。总之,经过三个星期的努力,虽然辛苦,但真真实实地学到了很多的东西,这个过程也挺让人难忘的。附录:源代码清单#include#include#include#include#includestruct airline/储存航班信息char number8;char pl
14、ace5;char time6;int left;int sum;int price;struct airline *next;struct ticket/储存机票信息 int number1;char number28;char place5;char time6;char name10;char sex5;int price;struct ticket *next;struct airline *list1();struct ticket *list2();void airlinesearch();void search11(struct airline *);void search12(
15、struct airline *);void search13(struct airline *);void menu();void menu1(struct airline *);void menu2(struct ticket *);void book();void ticketsearch();void search21(struct ticket *);void search22(struct ticket *);void refund();struct airline *list1()/创建航班信息的链表int n;struct airline *p1,*p2,*head;FILE
16、*fp;if(fp=fopen(plane.txt,r)=NULL)printf(打开文件失败n);exit(0);if(p1=(struct airline *)malloc(sizeof(struct airline)=NULL)/建立头指针printf(内存分配失败n);exit(0);head=p1;p2=p1;for(n=0;nnext=p1;p2=p1;if(p1=(struct airline *)malloc(sizeof(struct airline)=NULL)printf(内存分配失败n);exit(0);p2-next=NULL;p1=head;while(p1!=NU
17、LL)fscanf(fp,%s %s %s %d %d %dn,p1-number,p1-place,p1-time,&p1-left,&p1-sum,&p1-price);p2=p1-next;p1=p2;return(head);free(p1);fclose(fp);struct ticket *list2()/建立机票信息的链表struct ticket *p1,*p2,*head;FILE *fp;if(fp=fopen(ticket.txt,r)=NULL)printf(打开文件失败n);exit(0);if(p1=(struct ticket *)malloc(sizeof(st
18、ruct ticket)=NULL)/建立头指针printf(内存分配失败n);exit(0);head=p1;p2=p1;while(feof(fp)=0)p2-next=p1;p2=p1; fscanf(fp,%d %s %s %s %s %s %dn,&p1-number1,p1-number2,p1-place,p1-time,p1-name,p1-sex,&p1-price);if(p1=(struct ticket *)malloc(sizeof(struct ticket)=NULL)printf(内存分配失败n);exit(0);p2-next=NULL;return(head
19、);free(p1);fclose(fp);void menu()/主菜单int n;char choice;printf( 欢迎使用飞机票销售系统nn);printf(请选择您要进行的服务nn);for(n=0;n20;n+)printf( );printf(*n);printf( 1.航班信息查询n);printf( 2.订票 n);printf( 3.机票信息查询n);printf( 4.退票 n);for(n=0;n20;n+)printf( );printf(*n);printf(提示:如果是第一次输入,请先按“space”再选择n);getchar();dochoice=getch
20、ar();switch(choice)case 1: system(cls);airlinesearch();break;case 2: system(cls);book();break;case 3: system(cls);ticketsearch();break;case 4: system(cls);refund();break;default: printf(您输入的有误); Sleep(2000);system(cls);menu();break;while(choice!=5);void main()menu();void airlinesearch()/航班信息查询struct
21、 airline *head;head=list1();menu1(head);void menu1(struct airline *p)/查询航班信息的主目录int n;char choice;printf( n);printf( n);printf( 航班查询模块 n);printf( n);printf( nn);printf(请按提示选择您要查询的方式nn);for(n=0;n20;n+)printf( );printf(n);printf( 1.按航班编号查找 n);printf( 2.按航班目的地查找 n);printf( 3.按航班起飞时间查找n);printf( 4.返回上级
22、n);for(n=0;n20;n+)printf( );printf(n);dogetchar();choice=getchar();switch(choice)case 1: search11(p);break;case 2: search12(p);break;case 3: search13(p);break;case 4: system(cls);menu();break;default: printf(您输入的有误n);Sleep(2000);system(cls);menu1(p);break;while(choice!=5);void search11(struct airlin
23、e *phead)/按航班编号查找struct airline *p1,*p2;char planenum8,in;int n,flag=0;printf(请输入所要查询的航班编号n);scanf(%s,planenum);/输入航班号p1=p2=phead;for(n=0;nnumber,planenum)=0)flag=1;Sleep(2000); system(cls);printf(您查询的航班信息如下所示:nnnn);printf( *n);printf( 航班号t目的地t起飞时间 剩余票数 总票数t机票价格n);printf( %st%st%st %dtt%dt %dn,p1-nu
24、mber,p1-place,p1-time,p1-left,p1-sum,p1-price);printf( *nnn);printf(输入“a”返回上级n); scanf( %c,&in); while(in!=a) printf(输入不合法n); printf(输入“a”返回上级n); scanf( %c,&in); Sleep(2000); system(cls); menu1(phead);/重新输入break;p2=p1-next;p1=p2;if(flag=0)printf(您输入的信息有误);Sleep(1000);system(cls);menu1(phead);/回到航班信息
25、查询目录void search12(struct airline *phead)/按目的地查找struct airline *p1,*p2;char place5,in;int n,flag=0;printf(请输入所要查询的航班目的地n);scanf(%s,place);/输入目的地p1=p2=phead;for(n=0;nplace,place)=0)flag=1;Sleep(2000); system(cls); printf(您查询的航班信息如下所示:nnnn);printf( *n);printf( 航班号t目的地t起飞时间 剩余票数 总票数t机票价格n);printf( %st%s
26、t%st %dtt%dt %dn,p1-number,p1-place,p1-time,p1-left,p1-sum,p1-price);printf( *nnn);printf(输入“a”返回上级n); scanf( %c,&in); while(in!=a) printf(输入不合法n); printf(输入“a”返回上级n); scanf( %c,&in); Sleep(2000); system(cls); menu1(phead);/重新输入break;p2=p1-next;p1=p2;if(flag=0)printf(您输入的信息有误);Sleep(1000);system(cls
27、);menu1(phead);/回到航班查询目录void search13(struct airline *phead)/按起飞时间查找struct airline *p1,*p2;char time5,in;int n,flag=0;printf(请输入所要查询的航班时间n);scanf(%s,time);/输入航班时间p1=p2=phead;for(n=0;ntime,time)=0)flag=1;Sleep(2000); system(cls);printf(您查询的航班信息如下所示:nnnn);printf( *n);printf( 航班号t目的地t起飞时间 剩余票数 总票数t机票价格
28、n);printf( %st%st%st %dtt%dt %dn,p1-number,p1-place,p1-time,p1-left,p1-sum,p1-price);printf( *nnn);printf(输入“a”返回上级n); scanf( %c,&in); while(in!=a) printf(输入不合法n); printf(输入“a”返回上级n); scanf( %c,&in); Sleep(2000); system(cls); menu1(phead);/重新输入break;p2=p1-next;p1=p2;if(flag=0)printf(您输入的信息有误);Sleep(
29、1000);system(cls);menu1(phead);/回到航班查询目录void book()/订票struct airline *head1,*p1,*p2;struct ticket *head2,*p3,*p4,*add;char planenum8,name10,sex5,in;int flag=0;FILE *fp1,*fp2;if(fp2=fopen(ticket.txt,at+)=NULL)/以追加的形式打开文本文档printf(打开文件失败n);exit(0);if(add=(struct ticket *)malloc(sizeof(struct ticket)=NU
30、LL)printf(内存分配失败n);exit(0);head1=list1();p1=p2=head1;head2=list2();p3=p4=head2;state:printf(*);printf( n);printf( n);printf( 订票模块 n);printf( n);printf( n);printf(*);printf(nn请输入您要乘坐的飞机的航班号n);scanf(%s,planenum);/输入航班号while(p1!=NULL)/与链表中航班编号比较if(strcmp(p1-number,planenum)=0&p1-left!=0)flag=1;printf(请
31、输入您的姓名: );scanf( %s,name);printf(请输入您的性别: );scanf( %s,sex);break;p2=p1-next;p1=p2;if(flag=0)printf(您输入的信息有误);Sleep(2000);system(cls);goto state;/重新输入strcpy(add-number2,p1-number);strcpy(add-place,p1-place);strcpy(add-time,p1-time);strcpy(add-name,name);strcpy(add-sex,sex);add-price=p1-price;/新建刚订的机票
32、信息while(p4-next!=NULL)p3=p4-next;p4=p3;add-number1=p4-number1+1;p4-next=add; add-next=NULL;/将新建的节点与原链表连起来fprintf(fp2,n%d %s %s %s %s %s %d,add-number1,add-number2,add-place,add-time,add-name,add-sex,add-price);/将订票信息写入文件printf(订票成功n);printf(机票信息如下:nnn);printf(*);printf( 机票编号 航班号 目的地t 起飞时间 姓名 性别 机票价格
33、n);printf( %dt%s %st %st %st%st %dn,add-number1,add-number2,add-place,add-time,add-name,add-sex,add-price);printf(*);p1-left=p1-left-1;/该航班剩余机票数减1p1=head1;if(fp1=fopen(plane.txt,wt+)=NULL)printf(打开文件失败n);exit(0);while(p1!=NULL)/将改动后的航班信息写入文本中fprintf(fp1,%s %s %s %d %d %dn,p1-number,p1-place,p1-time,p1-left,p1-sum,p1-price);p2=p1-next;p1=p2;fclose(fp1);fclose(fp2);free(add);printf(输入“a”返回上级n);scanf( %c,&in);/重新输入while(in!=a)printf(输入不合法n);