2836.车票管理系统实验报告.doc
车票管理系统本文源码索取,请联系qq:68661508一 车票管理系统功能描述(1)录入班次信息(信息用文件保存),可不定时地增加班次数据(2)浏览班次信息,可显示出所有班次当前状总(如果当前系统时间超过了某班次的发车时间,则显示“此班已发出”的提示信息)。(3)查询路线(起点、终点):可按班次号查询 ,可按终点站查询(4)售票和退票功能 当查询出已定票人数小于额定载量且当前系统时间小于发车时间时才能售票,自动更新已售票人数退票时,输入退票的班次,当本班车未发出时才能退票,自动更新已售票人数二 结构图开始车票管理系统按任意键从文本录入班次信息输入选择买卖票系统查询班次信息浏览班次信息查询方法选择买卖票选择买 卖 票查询主菜单结 束三模块设计: 1.头文件,定义所需结构体,全局变量 #include"stdio.h"#include"string.h"#include"malloc.h"#include"windows.h"struct time /定义记录时间的结构体 int hour; /包含小时 int minute; /分钟 ;struct ticket /定义记录车票信息的结构体 int number; /定义车次struct time ft ; /记录发车时间char origin_station20; /起始站名称数组char last_station20; /终点站名称数组float last_time; /持续时间int max_number; /车次最大运载量int sold_ticket; /已售车票train100; int i; int syshour; /记录系统时间小时 int sysminute; /记录系统时间分钟 char filename50; /文件名数组 int record; /记录条数记录 2.开始菜单printf("*欢迎使用车票管理系统*n");显示开始菜单,欢迎使用系统;3.主菜单显示(mainmenu): void mainmenu() system("cls"); printf("当前时间:"); system_time(); printf("*主菜单*n"); printf("* 1.录入班次信息 *n"); printf("* 2.浏览班次信息 *n"); printf("* 3.查询班次信息 *n"); printf("* 4.售票 *n"); printf("* 5.退票 *n"); printf("* 0.退出系统 *n"); printf("*n");其中加入显示系统时间函数(system_time())int system_time() SYSTEMTIME sys; GetLocalTime( &sys ); /调用系统时间 printf( "%4d /%02d/%02d %02d:%02d:%02d 星期%1dn", sys.wYear, sys.wMonth, sys.wDay, sys.wHour, sys.wMinute, sys.wSecond, sys.wDayOfWeek); syshour=sys.wHour; sysminute=sys.wMinute; return 0;主菜单运行结果: 其中第一行调用时间函数显示当前时间4主菜单选择函数(chose()) void chose() int n; printf(" 请输入您想做的操作: ");scanf("%d",&n);switch(n)case 1:load(); system("cls"); /每次进入主菜单清空 mainmenu(); break; case 2:show();break; case 3:searsh();break; case 4:buy_system();break; case 5:back_ticket();break; case 0:exit(0); /调用系统函数退出程序主菜单选择模块要求输入0-5选择用户想做操作。5输入数据模块(load())void load(void) /载入文件 char n; /定义变量记录输入字符 FILE *fp; int i; sin : printf("请输入文件名或者文件路径名:"); /标记当前位置 scanf("%s",filename); getchar(); printf("您确定您输入的文件路径(y/n):"); /确定文件输入正确 scanf("%c",&n); if(n='y') if(fp=fopen(filename,"r")=NULL) /判断文件的存在,是否可读 printf("文件%s不可读,请确认文件%s存在或者文件路径正确.nn",filename,filename); system("pause"); /暂停显示文件状态 else /文件载入成功 printf("!录入成功!n"); system("pause"); for(i=0; !feof(fp)&&!ferror(fp);i+) /*将文件数据读出,数据给数组,一直到文件中数据结尾*/ fscanf(fp,"%03d",&traini.number); if(traini.number=0)i-;continue; fscanf(fp,"%d%02d",&traini.ft.hour,&traini.ft.minute); fscanf(fp,"%s%s%f",&traini.origin_station,&traini.last_station,&traini .last_time); fscanf(fp,"%d%d",&traini.max_number,&traini.sold_ticket); /*数据按格式化到数组*/ record=i; /将数据条数给record 记录 fclose(fp); /关闭文件 else goto sin; /当文件名输入错误时,选择n可返回标记处6浏览数据模块(show()) void show() int i; printf("班次t发车时间t起点t终点t行车时间(小时)t额定载量t已定票人数t状态n"); for(i=0;i<record;i+) printf("%03dt%d:%02dtt",traini.number,traini.ft.hour,traini.ft.minute); printf("%st%stt",traini.origin_station,traini.last_station);printf("%.1ft %2dtt%2d",traini.last_time,traini.max_number, traini.sold_ticket); /*格式化打印数据*/if(syshour>traini.ft.hour)|(syshour=traini.ft.hour) &&(sysminute>traini.ft.minute) /判断发车时间与当前时间前后关系 printf(" 车已开出"); else printf(" ");/*当发车时间没有超过当前时间,打印空格,当发车时间超过当前时间时,打印车已开出*/ printf("n"); system("pause");7.查询模块 A显示查询菜单(searsh()) void searsh() system("cls"); /显示菜单时清空 int s; printf("*查询菜单*n"); printf("* 1.按车次查询 *n"); printf("* 2.精确查询 *n"); printf("* 3.粗略查询 *n"); printf("* 0.返回主菜单 *n"); printf("*n"); /打印查询菜单 printf("请选择: n"); scanf("%d",&s); /选择数字输入 if(s=1)searsh1(); else if(s=2) searsh2(); else if(s=3)searsh3(); else mainmenu() ;查询菜单包括4个选项,0-3,用户按需要输入数字B(按车次查询)模块(searsh1()) void searsh1() int m; /定义变量记录输入班次bool f=false; printf("请您输入你的班次: n");scanf("%d",&m);int flag = 1;for(int i=0;i<record;i+) if (m=traini.number) if(flag = 1) printf("班次t发车时间t起点t终点t行车时间(小时)t额定载量t已定票人数t状态n"); flag = 0; printf("%dt%d:%02dtt",traini.number,traini.ft.hour,traini.ft.minute); printf("%st%stt",traini.origin_station,traini.last_station); printf("%.1ft %dtt%dt",traini.last_time,traini.max_number,traini.sold_ticket); if(syshour>traini.ft.hour)|(syshour=traini.ft.hour)&&(sysminute>traini.ft.minute) printf(" 车已开出"); else printf(" "); printf("n"); system("pause"); f=true; else continue; /*从数组起始处比较,找到与用户输入车次相同的打印出来*/ if(!f) printf(" 没有此条车次记录!n"); system("pause"); searsh();/*输入车次,打印" 没有此条车次记录!n"*按车次查询要求用户输入要查询车次,查询成功打印车次的各种信息,同时可以打印车次是否出发。C(精确查询)模块(searsh2()) void searsh2() char b20; /定义输入起始站名称字符串数组char c20; /定义输入起终点站名称字符串数组bool f=false; printf("请您输入你的起始站,终点站: n");scanf("%s",&b);scanf("%s",&c);int flag = 1;for(int i=0;i<record;i+) if (strcmp(b,traini.origin_station)=0)&&(strcmp(c,traini.last_station)=0)/*起始站字符串数组,终点站字符串数组与原结构体中起始站,终点站是否相同*/ if(flag = 1) printf("班次t发车时间t起点t终点t行车时间(小时)t额定载量t已定票人数t状态n"); flag = 0; printf("%dt%d:%02dtt",traini.number,traini.ft.hour,traini.ft.minute); printf("%st%stt",traini.origin_station,traini.last_station); printf("%.1ft %dtt%dt",traini.last_time,traini.max_number,traini.sold_ticket); if(syshour>traini.ft.hour)|(syshour=traini.ft.hour)&&(sysminute>traini.ft.minute) printf(" 车已开出"); else printf(" "); printf("n"); f=true; else continue;/*找到条件符合的车次打印其信息*/system("pause"); if(!f) printf(" 没有此条车次记录!n"); system("pause"); searsh(); /*循环结束没找到,打印" 没有此条车次记录!n"*/ 精确查询要求用户输入起始站,终点站,同样打印符合条件车次的全部信息 D(粗略查询)模块(searsh3()) void searsh3() char b20; /定义字符串数组bool f=false; printf("请您输入你的起始站或终点站: n");scanf("%s",&b); int flag = 1;for(int i=0;i<record;i+) if (strcmp(b,traini.origin_station)=0)|(strcmp(b,traini.last_station)=0)/*将输入数据与原数组中起始站,终点站比较,只需与其中一个一样相同则满足条件*/ if(flag = 1) printf("班次t发车时间t起点t终点t行车时间(小时)t额定载量t已定票人数t状态n"); flag = 0; printf("%dt%d:%02dtt",traini.number,traini.ft.hour,traini.ft.minute); printf("%st%stt",traini.origin_station,traini.last_station); printf("%.1ft %dtt%dt",traini.last_time,traini.max_number,traini.sold_ticket); if(syshour>traini.ft.hour)|(syshour=traini.ft.hour)&&(sysminute>traini.ft.minute) printf(" 车已开出"); else printf(" "); printf("n"); f=true; else continue; /*打印满足条件车次信息*/system("pause"); if(!f) printf(" 没有此条车次记录!n"); system("pause");searsh();/*找不到打印 没有此条车次记录!*/ 粗略查询要求用户输入起始站或终点站,而查询到的是起始站或终点站为所输入相同的车次的全部信息。8售票系统模块(buy_system())void buy_system() int a; /定义记录输入班次号码 char n; printf("请输入您想买车票的班次: "); scanf("%d",&a); getchar(); bool f=false; for(i=0;i<record;i+) /又数组起始开始查找 if(a=traini.number)&&(traini.max_number<=traini.sold_ticket) printf(" 票已卖完 "); f=true; break;/*输入班次与数组中的班次相同,但已买票大于或等于最大人数是打印 票已卖完*/ else if(a=traini.number)&&(traini.max_number>traini.sold_ticket)&&(canpan() printf(" 此车已开 ");f=true; break; /*输入班次与数组中的班次相同,已买票小于最大人数,但函数canpan()返回1,即发车时间大于当前时间时打印此车已开*/ else if(a=traini.number)&&(traini.max_number>traini.sold_ticket)&&(!canpan() printf(“您确定要买%d:%02d由%s到%s的车票(y/n):",traini.ft.hour,traini.ft.minute, traini.origin_station,traini.last_station); /*给出确认信息,包括发车时间,起始站终点站,让用户确认*/ scanf("%c",&n); if(n='y') printf(" 购买成功,请按时乘车! "); system("pause"); traini.sold_ticket=traini.sold_ticket+1; /购买成功已买票加一f=true; else printf("售票失败!n"); system("pause"); return ; break; if(!f)printf(" 没有此车次信息,请确认! ");/没有输入车次打印 save(); /将要修改的信息保存到文件中 system("pause");当满足输入车次与已有车次号码相同,当前时间大于发车时间,且已售车票小于最大人数时,进入确认信息,当用户看完确认信息同意后,购买成功,购买成功后,已售车票加一,并记录到文件中,答应购买成功信息。不满足时打印相应提示信息。此模块调用save(),canpan()两个函数,在退票模块中同样包含9.退票系统模块(back_ticket())void back_ticket() int a; /记录输入数字 char n; /记录输入字符 bool f=false; printf("请输入您要退的班次: "); scanf("%d",&a); getchar(); for(i=0;i<record;i+) if(a=traini.number)&&(canpan() printf(" the train is started ");f=true; break;/*当车次号码与输入号码相同,canpan()函数返回1,既发车时间大于当前时间时打印the train is started */ else if(a=traini.number)&&(!canpan()/*车次号码与输入号码相同,canpan()函数返回0,既发车时间小于当前时间*/ printf("您确定要退%d:%02d由%s到%s的车票(y/n):",traini.ft.hour,traini.ft.minute, traini.origin_station,traini.last_station);/*用户确认信息,确认时间,起始站终点站*/ scanf("%c",&n); if(n='y') printf(" 退票成功! n"); system("pause"); traini.sold_ticket=traini.sold_ticket-1;/退票成功已售票数减一 f=true; else printf("退票失败!n"); system("pause"); return ; break; if(!f) printf(" 没有此车次信息,请确认! "); /不存在车次信息打印 save(); /保存修改信息到文本 system("pause");当满足输入车次与已有车次号码相同,当前时间大于发车时间,进入确认信息,当用户看完确认信息同意后,退票成功,退票成功后,已售车票减一,并记录到文件中,不满足时打印相应提示信息。10.时间比较模块(canpan())int canpan()if(syshour>traini.ft.hour)|(syshour=traini.ft.hour)&&(sysminute>traini.ft.minute)/*分别比较小时,分钟*/ return 1; else return 0;当系统时间小时大于发车时间小时返回1,既系统时间大于发车时间当系统时间小时等于发车时间小时,且系统时间分钟大于发车时间分钟返回1其他返回011.存储模块(save())void save() FILE *fp; if(fp=fopen(filename,"w")=NULL) /判断文件存在和是否可写printf("%s 文件不可写"); for(i=0;i<record-1;i+) fprintf(fp,"%d %d %2d ",traini.number,traini.ft.hour,traini.ft.minute); fprintf(fp,"%s %s %.1ft %d %dn",traini.origin_station,traini.last_station,traini.last_time, traini.max_number,traini.sold_ticket);fprintf(fp,"%d %d %2d ",traini.number,traini.ft.hour,traini.ft.minute); fprintf(fp,"%s %s %.1ft %d %d",traini.origin_station,traini.last_station,traini.last_time, traini.max_number,traini.sold_ticket);/*将数组中的数据按格式化写入文件中*/fclose(fp); /关闭文件存储模块将已更改数据,一般是买卖票信息存储到文件中,这样就使文件中的信息是最新的。12.主函数(main()void main() printf("*欢迎使用车票管理系统*n"); system("pause"); while(1) mainmenu(); chose(); 四.系统测试测试数据1 6 00 郫县 广汉 2 45 302 6 30 郫县 成都 0.5 40 403 7 00 郫县 成都 0.5 40 204 10 00 郫县 成都 0.5 40 205 12 20 长沙 北京 10 40 106 15 00 长沙 南京 5 40 407 16 00 广州 北京 3 45 408 17 20 长沙 北京 10 40 49 17 50 武汉 长沙 3 40 510 18 00 长沙 广州 5 50 5011 18 20 长沙 深圳 5 50 4512 18 30 长沙 广州 5 50 4013 18 50 长沙 广州 5 50 4014 22 00 长沙 广州 5 50 4015 22 20 长沙 广州 5 50 2016 10 20 长沙 广州 5 50 2017 10 50 长沙 广州 5 50