当前位置:文档之家› 车票管理系统

车票管理系统

一、课程设计的内容车票管理系统一车站每天有n个发车班次,每个班次都有一班次号(1、2、3…n),固定的发车时间,固定的路线(起始站、终点站),大致的行车时间,固定的额定载客量。

如班次发车时间起点站终点站行车时间额定载量已定票人数1 8:00 郫县广汉2 45 302 6:30 郫县成都 0.5 40 403 7:00 郫县成都 0.5 40 204 10:00 郫县成都 0.5 40 2…(一)功能要求:用c/c++设计一系统,能提供下列服务:(1)录入班次信息(信息用文件保存),可不定时地增加班次数据(2)浏览班次信息,可显示出所有班次当前状总(如果当前系统时间超过了某班次的发车时间,则显示“此班已发出”的提示信息)。

(3)查询路线:可按班次号查询 ,可按终点站查询(4)售票和退票功能A:当查询出已定票人数小于额定载量且当前系统时间小于发车时间时才能售票,自动更新已售票人数B:退票时,输入退票的班次,当本班车未发出时才能退票,自动更新已售票人数二、课程设计的要求与数据1、进一步掌握和利用C语言进行程设计的能力;2、进一步理解和运用结构化程序设计的思想和方法;3、初步掌握开发一个小型实用系统的基本方法;4、学会调试一个较长程序的基本方法;5、学会利用流程图或N-S图表示算法;6、掌握书写程序设计开发文档的能力。

三、课程设计应完成的工作1、编写完成相应题目的程序;2、编写课程设计报告,课程设计报告的内容应包括以下6个部分:1) 需求分析:包括设计题目、设计要求以及系统功能需求分析;2) 总体设计:包括系统总体设计框架和系统功能模块图;3) 详细设计:包括主要功能模块的算法设计思路以及对应的工作流程图;4) 调试分析过程描述:包括测试数据、测试输出结果,以及对程序调试过程中存在问题的思考(列出主要问题的出错现象、出错原因、解决方法及效果等,适当的包含结果截图);5) 总结:课程设计完成了哪些功能,有没有什么扩展功能?还有哪些地方需要改进?课程设计过程中的学习体会与收获、对本次课程设计的认识以及自己的建议等内容;6) 附录:主要源程序代码,含必要的注释。

3、答辩:在实验室建立程序运行的环境,并在指导教师的监督下,独立解决问题、运行程序和回答教师提出的问题。

目录第一章目的与要求 (5)第二章总体设计 (6)第三章详细设计 (9)3.1功能模块设计 (9)3.2数据结构设计 (11)第四章调试分析 (12)第五章总结 (14)第六章附录 (15)参考文献 (25)第一章目的与要求编写目的:便于车站管理部门对汽车班次信息的统计和管理,提高车站部门的工作效率,能够更好的为市民服务,同时也便于旅客了解相关的信息,方便出行。

要求:1.能够录入汽车班次信息,如班次号,发车时间,起点站,终点站,行车时间,额载量,已订票人数等。

2.能够浏览班次信息,显示信息总和(如果已发出站的要要显示“已经开出”)。

3.查询路线:可按班次号查询 ,可按终点站查询。

4.售票功能:当查询出已定票人数小于额定载量且当前系统时间小于发车时间才能售票,自动更新已售票人数。

5.退票功能:输入退票的班次,当本班车未发出时才能退票,自动更新已售票人数。

第二章总体设计1)系统总体设计框架2)主要功能流程图:录入班次信息功能流程图:浏览班次功能流程图:第三章详细设计3.1功能模块设计3.1.1售票函数while(选择的是“Y”){打印当前时间打印“班次发车时间起点站终点站行车时间额定载量已定票人数”for(){输出班次信息』提示输入车的班次}if(当查询出已定票人数小于额定载量且当前系统时间小于发车时间时){提示售票成功!订票人数加1;}IF(额定载量小于订票人数){提示票已售完!;}else if(输入的班次号小于零){该车不存在!}else if(当前系统时间晚于发车时间){提示车已发出!}提示继续售票按Y,按任意键返回主菜单!输入一个字符;}}3.1.2退票函数while(输入的是Y的时候){提示输入要退票的车次;输入一个字符;}if(输入的班次号存在和系统时间比发车时间晚) {订票人数-1;提示退票成功!}else if(输入的班次号小于零)提示该班次不存在!;)else if(要退票的那辆车的发车时间早过现在系统时间) {提示车已发出不能退票!;提示继续退票请按(Y),返回主菜单按任意键;输入一个字符;}}3.1.3菜单函数{打印“车票管理系统”;打印“系统时间”;打印“录入班次信息”;打印“查询班次信息”;打印“售票”;打印“退票”;打印“保存车次信;";打印“退出系统”;打印“请选择(0--6)”;打印“车票管理系统;得到一个字符;返回值;}3.2数据结构设计(可选)程序中涉及的数据过多,本人决定采用两个结构体处理数据。

其中时间为一个数据结构体(即结构1),它又是汽车结构体(即结构2)的一个成员元素,这样处理数据容易些。

第四章调试分析本人在写代码的过程中觉得难控制的是那个班次数。

因为本系统提供了个录入信息功能,可以不定时的增加班次,即这个班次数是不确定的。

而这个班次数又影响到查询函数,退票函数,售票函数等,另外还影响到一些功能小函数,如比较时间函数等。

经过上网查找资料,我发现有一个巧妙的方法可以解决这个问题,即设定一个静态局部变量(即代码中的H),这样每当班次号改变之后这个H的值就和它的班次号一样大,这样就可以解决之前提到的问题了。

另外,这个系统要有一个保存文件功能,由于本人对文件保存处理不清楚,设计过程中一直搞不明白。

最后在网上查到了相关信息才可以弄出。

以下是该程序运行的部分结果:主界面:信息录入图和浏览时刻表:查询售票图:退票图:保存信息图:第五章总结经历近几天的学习和锻炼,这个车票管理系统算是做出来了(不过我承认我是参考网上代码所得,我基本能看懂)。

它基本有前面提到过的功能,即录入班次信息,浏览班次信息,售票和退票,保存文件。

有一个扩展功能,即可以退出系统(代码中的sys_exit()函数)。

不过目前我发现它一个不足之出,就是不能对输入时间的格式起限制作用。

如我可以输入26:30:00,它系统不会提示说输入错误提示再输入一个正确的时间。

还有,就是整个代码条理不够清晰,只是用到一个主函数和调用其他函数,可读性差!我认为最好是能分模块化处理,分文件处理,这样条理性强,可读性高,再者修改也容易。

不过由于本人水平有限,不能这样处理。

经历这近几天的锻炼,我也比较满意自己的表现。

在这过程中我查阅了很多书,学到了很多课堂上没有的东西。

很多知识我之前不知道的现在大部分都知道了,不过理解不够深透,,导致在这近几天里碰了不少壁!近几天我觉得编程既是一项费时费力但也是有趣的事。

说它费时费力是因为它繁琐,而有趣是因为我很享受一段段的小程序编成功之后的喜悦,苦尽干来啊。

我觉得编程是一件快乐的差事,我想我今后会加把时间学习它,把它学好。

第六章附录程序代码:#include"stdio.h"#include"time.h"#include"windows.h"#include"string.h"#include"dos.h"#include"stdlib.h"#include"ctype.h"#define Max 50//最大贮赌量#define null 0static int H=0;struct Times{//定义时钟int hour;int min;int sec;};struct Buses{//定义汽车int number;struct Times time;char start[30];char end[30];float time_cost;int carry_number;int booK_number;};struct Buses bus[Max];time_t now = time(0);tm *tnow =localtime(&now);void load();//载入车次信息void lu(void);//声明录入函数void chaxun(struct Buses bus[]);//声明查询路线函数void save(struct Buses bus[]);//声明保存函数int caidan();//声明菜单录数void liulan(struct Buses bus[]);//声明浏览函数void tuipiao(struct Buses bus[]);//退票void shoupiao(struct Buses bus[]);//声明售票函数void xitongtuichu();//声明退出函数//工具函数struct Buses copy(struct Buses b1,struct Buses b2);//赋值void sort_time(struct Buses bus[]);//声明按时间发车的先后顺序排序int compare_time(struct Times t1,struct Times t2);//时间比较函数int compare_systime(struct Buses bus,tm *T);//比较发车时间与当前系统时间的函数void print(struct Buses bus);//声明输入出函数int number_search(struct Buses bus[],int num);//声明按班次查询函数int end_search(struct Buses bus,char ends[]);//声明按终点查询函数void main(){//主函数while(1){system("cls");switch(caidan()){case 1: lu(); break;case 2: liulan(bus); break;case 3: chaxun(bus); break;case 4: shoupiao(bus); break;case 5: tuipiao(bus); break;case 6: save(bus); break;case 0: xitongtuichu(); break;}}}int compare_systime(struct Buses bus,tm *T){//与系统时间的比较函数if(bus.time.hour>=T->tm_hour){return 1;if(bus.time.min>=T->tm_min){return 1;if(bus.time.sec>T->tm_sec)return 1;else return 0;}return 0;}return 0;}struct Buses copy(struct Buses b1,struct Buses b2){b1.booK_number=b2.booK_number;b1.carry_number=b2.carry_number;strcpy(b1.end,b2.end);b1.number=b2.number;strcpy(b1.start,b2.start);b1.time.hour=b2.time.hour;b1.time.min=b2.time.min;b1.time.sec=b2.time.sec;b1.time_cost=b2.time_cost;return b1;}void liulan(struct Buses bus[]){//浏览车次getchar();system("cls");int i;printf("\n\t\t\t\t车辆时刻表\n");printf("\t\t\t**************************\n");printf("\t班次发车时间起点站终点站行车时间额定载量已定票人数");printf("\n\t--------------------------------------------------------------\n");sort_time(bus);for(i=0;i<H;i++){print(bus[i]);}printf("\t--------------------------------------------------------------\n");printf("\t\t\t\t%d条记录!\n",H);printf("\t按任意键返回主菜单...");getchar();}int compare_time(struct Times t1,struct Times t2){//比较时间大小if(t1.hour>t2.hour){return 1;if(t1.min>=t2.min){return 1;if(t1.sec>=t2.sec)return 1;else return 0;}return 0;}return 0;}void sort_time(struct Buses bus[]){//按发车时间排序int i,j,k;struct Buses b={0};for(i=0;i<H-1;i++){k=i;for(j=i+1;j<H;j++){if(compare_time(bus[i].time,bus[j].time)){k=j;if(k!=i){b=copy(b,bus[i]);bus[i]=copy(bus[i],bus[k]);bus[k]=copy(bus[k],b);}}}}}int number_search(struct Buses bus[],int n){//按班次查询int i;for(i=0;i<H;i++){if(bus[i].number==n)return i;}return -1;}int end_search(struct Buses bus,char ends[]){//按终点站查询if(strcmp(bus.end,ends)==0)return 1;elsereturn -1;}void print(struct Buses bus){if(!compare_systime(bus,tnow))printf("\t%-6d%-2d:%-2d:%-2d%6s%8s%8.1f%10d%10d(已发出)\n",bus.number,bus.time.hour,bus.time.min,bus.time.sec,bus.start,bus.end,bus.time_cost,b us.carry_number,bus.booK_number);elseprintf("\t%-6d%-2d:%-2d:%-2d%6s%8s%8.1f%10d%10d\n",bus.numb er,bus.time.hour,bus.time.min,bus.time.sec,bus.start,bus.end,bus.time_cost,b us.carry_number,bus.booK_number);}int caidan(){int a;system("cls");//以下是菜单图案printf("\n\n");printf("\t\t 车票管理系统 \n");printf("\t\t ***************** (%d年%d月%d日)\n",1900+tnow->tm_year,tnow->tm_mon+1,tnow->tm_mday);printf("\t\t|----------------------------------------------|\n");printf("\t\t| 菜单 |\n");printf("\t\t|----------------------------------------------|\n");printf("\t\t| (1) 录入班次信息 |\n");printf("\t\t|----------------------------------------------|\n");printf("\t\t| (2) 显示班次信息 |\n");printf("\t\t|----------------------------------------------|\n");printf("\t\t| (3) 查询班次信息 |\n");printf("\t\t|----------------------------------------------|\n");printf("\t\t| (4) 售票 |\n");printf("\t\t|----------------------------------------------|\n");printf("\t\t| (5) 退票 |\n");printf("\t\t|----------------------------------------------|\n");printf("\t\t| (6) 保存车次信息 |\n");printf("\t\t|----------------------------------------------|\n");printf("\t\t| (0) 退出系统 |\n");printf("\t\t|----------------------------------------------|\n");printf("\n\t\t请选择(0-6):");scanf("%d",&a);return(a);}void save(struct Buses bus[]){//保存函数体getchar();FILE *fp;int i;if((fp=fopen("Bus_system","wb"))==null){printf("不能打开文件\n");return;}for(i=0;i<H;i++)if(fwrite(&bus[i],sizeof(struct Buses),1,fp)!=1)printf("文件保存出错!\n");fclose(fp);printf("文件保存成功!");getchar();}void lu(){//录入函数int i=H,f=1;char flag='Y';while(toupper(flag)=='Y'){system("cls");printf("\n\t\t车次信息录入\n请输入车的班次:");scanf("%d",&bus[i].number);getchar();while(number_search(bus,bus[i].number)>=0){printf("你输入的班次已存在请重新输入!:");scanf("%d",&bus[i].number);getchar();}printf("请输入时间如:(20:30:00) :");scanf("%d:%d:%d",&bus[i].time.hour,&bus[i].time.min,&bus[i] .time.sec);getchar();printf("请输入车的起点站:");scanf("%s",bus[i].start);getchar();printf("请输入车的终点站:");scanf("%s",bus[i].end);getchar();printf("请输入行车时间:");scanf("%f",&bus[i].time_cost);getchar();printf("请输入车的额定载量:");scanf("%d",&bus[i].carry_number);getchar();bus[i].booK_number=0;H++;i++;printf("信息录入成功!\n");printf("继续录入请按(Y),返回主菜单按任意键...");flag=getchar();}}void chaxun(struct Buses bus[]){//查询路线int a,i=0;int m=0;char flag='Y';while(toupper(flag)=='Y'){char end[30];system("cls");printf("\n按班次查询请按 1\n终点站查询请按 2\n请选择(1-2):");scanf("%d",&a);while(a!=1&&a!=2){printf("注意只能选择1或2!\n请重新输入:");scanf("%d",&a);getchar();}switch(a){case 1:{printf("请输入车次号:");scanf("%d",&m);getchar();i=number_search(bus,m);if(i>=0){printf("\n\t\t\t\t车辆时刻表\n");printf("\t\t\t**************************\n");printf("\t班次发车时间起点站终点站行车时间额定载量已定票人数");printf("\n\t--------------------------------------------------------------\n");print(bus[i]);printf("\t--------------------------------------------------------------\n");}elseprintf("\n\t\t\t没有你要查找的记录!\n");}break;case 2:{printf("请输入车的终点站:");scanf("%s",end);getchar();while(i<H){if((m=end_search(bus[i],end))==1){printf("\n\t\t\t\t车辆时刻表\n");printf("\t\t\t**************************\n");printf("\t班次发车时间起点站终点站行车时间额定载量已定票人数");printf("\n\t--------------------------------------------------------------\n");print(bus[i]);i++;}break;}for(i;i<H;i++){if(end_search(bus[i],end)==1)print(bus[i]);}if(m==1)printf("\t--------------------------------------------------------------\n");}for(i=0;i<H;i++){if(end_search(bus[i],end)!=1)printf("\n\t\t\t没有到该站的车!\n");break;}}printf("\t\t继续查找请按(Y),返回主菜单按任意键...");flag=getchar();}}void shoupiao(struct Buses bus[]){//售票函数int i,n;char flag='Y';while(toupper(flag)=='Y'){system("cls");printf("\n\t\t\t\t车辆时刻表\n");printf("\t\t\t************************** 当前时间(%d:%d:%d)\n",tnow->tm_hour,tnow->tm_min,tnow->tm_sec);printf("\t班次发车时间起点站终点站行车时间额定载量已定票人数");printf("\n\t--------------------------------------------------------------\n");for(int j=0;j<H;j++){print(bus[j]);}printf("\t--------------------------------------------------------------\n");printf("\t请输入车的班次:");scanf("%d",&i);n=number_search(bus,i);getchar();if(n>=0&&bus[n].carry_number>bus[n].booK_number&&compare_sy stime(bus[n],tnow)){printf("\n\t\t\t售票成功!\n");bus[n].booK_number++;printf("\t班次发车时间起点站终点站行车时间额定载量已定票人数");printf("\n\t--------------------------------------------------------------\n");print(bus[n]);printf("\n\t--------------------------------------------------------------\n");}if(bus[n].carry_number<=bus[n].booK_number)printf("\n\t\t\t该次车的票已售完!\n");else if(n<0)printf("\n\t\t\t该次车不存在!\n");else if(!compare_systime(bus[n],tnow))printf("\n\t\t\t该次已发出!\n");printf("\t\t继续售票请按(Y),返回主菜单按任意键...");flag=getchar();}}void tuipiao(struct Buses bus[]){//退票函数int n,i;char flag='Y';while(toupper(flag)=='Y'){system("cls");printf("\n\n请输入车次:");scanf("%d",&n);getchar();i=number_search(bus,n);if(i>=0&&compare_systime(bus[i],tnow)){bus[i].booK_number--;printf("\n\t\t\t退票成功!\n");}else if(i<0)printf("\n\t\t\t该车次不存在!\n");else if(!compare_systime(bus[n],tnow))printf("\n\t\t\t车已发出不能退票!\n");printf("\t继续退票请按(Y),返回主菜单按任意键...");flag=getchar();}}void load()//载入车次信息{ FILE *fp;int i=0;while((fp=fopen("Bus_system","rb"))==NULL) //以rb形式打开文件return;for(i;!feof(fp);i++,H++){if(fread(&bus[H],sizeof(struct Buses),1,fp)!=1){}if(feof(fp)){fclose(fp);return;}}fclose(fp);}void xitongtuichu(){//退出函数system("cls");getchar();char flag=null;printf("\n\n\t\t你确定要退出并保存信息吗?(Y/N)");flag=getchar();if(toupper(flag)=='Y'){save(bus);exit(0);}else if(toupper(flag)=='N')exit(0);elsereturn;}参考文献1、谭浩强编著, C程序设计 1991年7月2、裘宗燕著,从问题到程序科学出版社,北京大学出版社,1999年4月。

相关主题