软件课程设计报告飞机票销售系统.doc
软件课程设计报告班级:光信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 设计思想本程序分为四个模块,即航班信息查询模块,订票模块,机票信息模块,退票模块。通过建立plane.txt和ticket.txt两个文本文档来储存航班信息和已售出的机票信息。程序中,定义了airline和ticket两个结构体来分别储存航班和机票信息,再使用struct airline *list1()和struct ticket *list2()来从文档中读取信息储存在链表中,并输出链表头指针。航班信息查询模块功能由函数airline()实现,再分为按航班编号,目的地,起飞时间三种查找方式。通过airline()调用menu1(struct airline *)目录函数,再选择进入search11(struct airline *),search12(struct airline *),search13(struct airline *)三个函数,来进行信息查询。订票模块功能由函数book()实现,通过对输入的航班编号的判断,来决定是否能够订票,订票成功后将添加的机票信息回写入ticket.txt中,并改动plane.txt中相应的航班剩余机票信息。机票信息查询模块功能由ticketsearch()实现,再分为按机票编号和旅客姓名两种查找方式。通过ticketsearch()调用menu2(struct ticket)目录函数,再选择进入search21(struct ticket)和search22(struct ticket)两个函数,来进行信息的查询。退票模块功能由refund()函数来实现,通过对输入机票编号的判断,来决定是否退票,退票成功后将退除的机票信息从ticket.txt中删除,并改动plane.txt中相应的航班剩余机票信息。1.4 流程图主菜单流程图airlinesearch()为航班查询函数,book()为机票订购函数,ticketsearch()为机票查询函数,refund()为退票函数。航班信息查询菜单menu1(struct airline *p)search11(struct airline *)为按航班编号查询信息,search12(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 航班信息查询模块测试进入程序,首先进入主菜单界面。选择1,进入航班信息查询菜单界面选择1,按航班编号查询航班信息,输入“ZH9658”。查到的航班信息如下所示:输入“a”,返回菜单后,如果选择2,就按航班目的地查找,输入“南京”。查到相应的机票信息为:按”a”返回菜单后,如果选择3,就按起飞时间查找,输入“07:00”。查到的信息如下:2.2 订票模块测试 在主菜单中选择2,进行机票购买,显示购票界面,按前面测试的,输入到广州的航班号“ZH9658”,输入姓名“李俊彦”,性别“男”。如果剩余票,则显示订票成功,并显示机票信息:再回主菜单对“ZH9658”的航班信息进行查询,结合前面的测试,剩余票数由“5”变成了“4”。2.3 机票信息查询模块测试返回主菜单,选择“3”进入机票信息查询模块。选择“1”,按机票编号查询,输入李俊彦的机票编号“51”.之后显示其机票信息:返回机票信息查询的菜单后,选择“2”,按购票人姓名查询机票信息,输入“李俊彦”。之后显示其机票信息:2.4 退票模块测试回到主菜单,选择“4”,进入退票模块,输入要退机票的编号“51”.显示所退票的信息后,再输入“1”确认退票。再回到退票部分,输入机票编号“51”。再回到航班信息查询,查询ZH9658航班的信息,剩余机票数由“4”变回了“5”。若进行多张机票的订购与退票,也能正常运行。3 算法改进改进一:在读取机票信息,并储存在链表的过程中,开始时,固定了循环读入的次数,则当删除机票信息或者添加机票信息后,会导致文件中的信息不能完全读入到链表中。之后发现其问题,改为了用while(feof(fp)=0)循环,边将数据读入链表,边创建下一个链表节点,直至文件末尾。改进二:在各个目录的选择过程时,先使用了int型的choice来储存客户的选择,但当客户不按照提示,输入char型的数据时,会导致程序不能识别,进入死循环。发现这个问题后,我将choice改为了char型。但又由于输入时的回车号,会被读入下次的choice=getchar(),使程序运行出错。最后,我在choice=getchar()的前面加了getchar()来储存回车,改进了这个问题。改进三:在book()和refund()模块中,由于要回写,会有if(fp1=fopen("plane.txt","wt+")=NULL),但当用户执行到一半直接关闭程序时,由于未执行回写部分的语句,将导致txt文档中的信息会没有。之后,我将打开文档的语句刚放在回写的前面,这样当用户关闭时,txt里面的信息不会丢失。4 开发体会经过了这次的飞机票销售系统程序的开发,让我深刻地明白了,软件的开发是一个体力活,是对眼力和脑力的一次考验。开始时,由于对文件和链表的极度不熟悉,会对编写这个程序感到十分的茫然。但当慢慢地了解了动态链表的建立过程,熟悉了用fscanf和fprintf对文件的写出和写入,我觉得自己应该可以做了。程序功能模块的划分还算比较简单,接下来就是一块一块的做。上学期在学c语言时,所编的程序一般就只有主函数,即使是在学函数这块,一般也就调用一两个简单的函数,最多的程序也就100行。这次的最后有600多行,对函数的调用也是挺复杂的,其间还有许多对输入输出信息的处理,对文件及链表的操作。整个这次微型软件的编写过程,让我对软件的编写有了一定的认识,同时自己程序的编写能力也是得到了极大的提升,对结构化的程序编写方法有了很深的理解和体会。开始对文件打开时,不了解“a”,“r”,“w”等打开方式,会导致txt中的信息被清空。后来经过了单独的测试,才体会到了各种方式的用法,以及在程序中的位置不同而对程序的运行造成不同的影响,最终能够对文件按自己的想法去进行操作。将文件中的信息储存到建立的链表中后,不知道如何在各个功能模块中调用链表,觉得如果一个函数中建立一次就太麻烦了。后来想到了将建立链表的过程单独的做成函数,输出链表的头指针,再在函数中调用时,将头指针赋给相应的结构指针就可以对整个链表进行操作了。编写到退票模块时,才突然发现在订票模块没有修改订票后的航班信息。再重新考虑回写问题时,经常出现文件回写未成功时,文件中的信息被清空了,挺让人郁闷的。这就是将航班和机票信息直接写到txt中的坏处吧!不过在编写大型软件时,或许只能把信息存在文档中,这就要求编写人员在编写时考虑到各种各样的问题,防止出现将程序信息清空的现象吧。这个事情让我了解到,编程序需要十分的细心,且要考虑很多的细节,确实是个体力活。在编写过程中,也发现了一些VC的类似bug的东西。比如:如果fprintf后面有scanf等一些等待输入的指令时,会回写不进去,即便它跟fprintf回写的东西完全无关;一些循环,有的只能用for,有的又只能用while;在使用scanf和gets输入字符和字符串时,有非常容易读入错误,要在%c前加空格等等。这次的程序由于不再只是自己使用,所以需要人性化的输入界面。这也是第一次设定界面,因此在设计输入和输出界面时,费了不少精力,也因此调试了不少时间。虽然最后的界面与一般的程序界面还是有很大的差距,但也算是稍微人性化了吧,仿佛感受到了上个世纪人们的用电脑的过程。经过这次软件设计,感觉自己对软件编写有了初步的认识,对电脑上的一些程序有了一些新的认识。比如机房上机登陆时的界面,应该就是用C的吧;用鼠标操作软件,只是把输入设备扩展到了鼠标;使用一些程序时,基本地把其分解为几个功能模块等。总之,经过三个星期的努力,虽然辛苦,但真真实实地学到了很多的东西,这个过程也挺让人难忘的。附录:源代码清单#include<stdio.h>#include<malloc.h>#include<time.h>#include<windows.h>#include<conio.h>struct airline/储存航班信息char number8;char place5;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(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 *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;n<10;n+)/建立链表以储存航班信息p2->next=p1;p2=p1;if(p1=(struct airline *)malloc(sizeof(struct airline)=NULL)printf("内存分配失败n");exit(0);p2->next=NULL;p1=head;while(p1!=NULL)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(struct 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);free(p1);fclose(fp);void menu()/主菜单int n;char choice;printf(" 欢迎使用飞机票销售系统nn");printf("请选择您要进行的服务nn");for(n=0;n<20;n+)printf(" ");printf("*n");printf(" 1.航班信息查询n");printf(" 2.订票 n");printf(" 3.机票信息查询n");printf(" 4.退票 n");for(n=0;n<20;n+)printf(" ");printf("*n");printf("提示:如果是第一次输入,请先按“space”再选择n");getchar();dochoice=getchar();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 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;n<20;n+)printf(" ");printf("n");printf(" 1.按航班编号查找 n");printf(" 2.按航班目的地查找 n");printf(" 3.按航班起飞时间查找n");printf(" 4.返回上级 n");for(n=0;n<20;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 airline *phead)/按航班编号查找struct airline *p1,*p2;char planenum8,in;int n,flag=0;printf("请输入所要查询的航班编号n");scanf("%s",planenum);/输入航班号p1=p2=phead;for(n=0;n<10;n+)/循环与链表中航班号比较if(strcmp(p1->number,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->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");menu1(phead);/回到航班信息查询目录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;n<10;n+)/循环与链表中航班目的地比较if(strcmp(p1->place,place)=0)flag=1;Sleep(2000); system("cls"); printf("您查询的航班信息如下所示:nnnn");printf(" *n");printf(" 航班号t目的地t起飞时间 剩余票数 总票数t机票价格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(1000);system("cls");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;n<10;n+)/循环与链表中航班时间比较if(strcmp(p1->time,time)=0)flag=1;Sleep(2000); system("cls");printf("您查询的航班信息如下所示:nnnn");printf(" *n");printf(" 航班号t目的地t起飞时间 剩余票数 总票数t机票价格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(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)=NULL)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("请输入您的姓名: ");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;/新建刚订的机票信息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 起飞时间 姓名 性别 机票价格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");