1、二一三 二一四学年第 二 学期车票管理系统实验报告物理与电子工程学院课程名称: 数据结构班级: 学号: 姓名: 二一四 年 六 月(1) 题目:车票管理系统(2) 系统功能模块结构图(3) 各模块的功能1. 信息输入模块即录入班次信息:完成班次信息的输入功能,输入信息包括班次、发车时间、起点站、终点站、行车时间、额定载量、已定票人数等;2. 信息浏览模块即浏览班次信息:完成已录入信息的显示;3. 信息查询模块即查询班次信息:完成班次信息的查询,查询时对应有按班次查询和按终点站查询两种方式;4. 售票和退票模块:完成车票的购买和退订的功能;5. 菜单选择模块即主菜单:完成用户命令的接收,此模块也
2、是车票管理系统的入口,用户所要进行的各种操作均需在此模块中进行选择并进而调用其他模块实现相应的功能。(4) 数据结构设计及用法说明头文件,一个名 TICKET 的结构体进行定义:typedef struct ticket/用 typedef 定义结构体为 TICKETint num;/班次char starttime10;/发车时间char begin21;/起始站char end21;/终点站float lasttime;/行车时间int CarryNumber;/额定载量int SellNumber;/已定票人数struct ticket *next;/结点的指针域TICKET,*Tick
3、et;/结构体类型指针然后对各调用函数进行定义:void InsertTicket()/录入班次void FileRead()/班次信息文件读入void Keep()/保存数据void ScanTicket()/浏览信息void ScanTicket()/浏览信息void SearchbyNum()/按班次查询班次void SearchbyEnd()/按终点站查询班次void Buyticket()/预定车票void ReturnTicket()/退订车票int GetHour(char *s)/获取班次小时int GetMinute(char *s)/获取班次分钟void exit()/退出
4、该系统最后定义 main()函数,利用函数调用,实现程序的各种功能。将其放在系统文件 ticket.txt 中。(5) 画出各函数流程图(6) 实验结果(包括输入数据和输出结果)0)主菜单1).录入界面2).浏览界面3).查询界面1. 按班次查询2. 按终点站查询4).订票界面5).退票界面6).退出系统Ticket 文件截图:(7) 体会经过两周的数据结构设计训练,让我们独立完成一个小系统,让我学到很多东西:(1) 巩固和加深了对链表,指针的理解,提高综合运用所学知识的能力。(2) 培养了我独立思考,深入研究,分析问题、解决问题的能力;通过实践解决实际问题,并学会了很多实用的函数。(3) 在
5、编辑程序代码的时候,这是一个至关重要、复杂而且需要反复修改的环节,在此环节中我发现存在很多问题,需不断改进。如何实现各函数功能, 达到预期效果也将是一项繁复的工作。(4) 代码的调试在Visual C+6.0环境下输入代码并进行调试和正确运行。在调试过程中会遇到很多需要精化的地方,需要十足的耐心与细心,不断改进 完善程序。(5) 最后,程序可以正确运行之后,在不影响程序功能的情况下,运用各种辅助性符号,使界面更加美观漂亮,操作更人性化增强程序的新意与可行性。而其中我发现system(cls)命令特别好用,因为之前在不知道system(cls)有清屏的功能时,在运行程序时,重复操作一些功能的时候
6、,每次进行一项操作,运行窗口里的内容会一直保留着,感觉很杂乱,知道可以使用system(cls);这一语句可以解决这个问题,里面的内容很多,很繁琐,让人有点眼花缭乱,就是说全部的操作都显示在屏幕中。但是,在用了system(cls)命令之后,程序显得更加清楚,更加简洁美观,就是在执行完一个功能之后就把内容都清理掉,然后再返回主菜单或返回其它功能的界面,是操作者更好的操作。不过,程序中还存在一些问题,当要求用户输入数字选择,若输入字符型数据或其他非整型数据时,还是存在系统不能运行的问题。但是,因为写程序时是要求用户输入数字的时候是必须用整型的,所以只要用户按要求输入正确的数据,程序是能正确运行的
7、。通过这次训练,使我更加熟悉的掌握了C语言的运用。帮助我熟悉了更多C 语言的功能,提高了我的动手能力,学到了许多解决实际问题的宝贵经验。另外,在这次课程设计中我也遇到许多问题和麻烦,得到了老师的帮助和指导, 才能够使得这次课程设计顺利的进行下去,另外,在程序调试过程中,也得到很多同学的帮助,给我及时指出错误,提出许多宝贵意见。(8)参考文献一:C 程序设计(第四版) 谭浩强 著 清华大学出版社二:数据结构(C 语言版) 严蔚敏 著 人民邮电出版社三:C 语言项目案例分析 明日科技 著 清华大学出版社(9)附录:源程序:#include/宏定义函数#include/标准库文件#include/时
8、间库函数#include/串操作及内存操作函数typedef struct ticket/用 typedef 定义结构体为 TICKETint num;/班次char starttime10;/发车时间char begin21;/起始站char end21;/终点站float lasttime;/行车时间int CarryNumber;/额定载量int SellNumber;/已定票人数struct ticket *next;/结点的指针域TICKET,*Ticket;/结构体类型指针TICKET *head;/班次头结点TICKET *rear;/班次尾结点/*录入班次信息*/void In
9、sertTicket()/录入班次FILE *fp;/定义文件型指针变量system(cls);/清屏fp=fopen(ticket.txt,r+);/fopen 打开文件,读写TICKET *T;T=(TICKET *)malloc(sizeof(TICKET);/开辟内存空间printf(请输入班次信息(输入完成后请按回车键)n); scanf(%d,&T-num);printf(请输入发车时间n);scanf(%s,&T-starttime);printf(请输入起点站n); scanf(%s,&T-begin);printf(请输入终点站n);scanf(%s,&T-end);prin
10、tf(请输入行车时间n); scanf(%f,&T-lasttime);printf(请输入额定载量n);scanf(%d,&T-CarryNumber);printf(请输入已定票人数n); scanf(%d,&T-SellNumber);rear-next=T;/在 TICKET 单链表中依次插入下一结点rear=T;T-next=NULL;/指针域置空rear-next=NULL;/班次尾结点的指针域置空fclose(fp);/文件关闭printf(信息已保存!n);/*文件读入*/void FileRead()/班次信息文件读入FILE *fp;/定义文件型指针变量system(cls
11、);/清屏if(fp=fopen(ticket.txt,r+)=0)/如果文件内容为空printf(n 打开文件错误!n);exit(0);while(!feof(fp)/读取文件并判断是否抵达文件尾TICKET *T;T=(TICKET *)malloc(sizeof(TICKET);/开辟内存空间fscanf(fp,%d%s%s%s%f%d%dn,&T-num,&T-starttime,&T-begin,&T-end,&T-lasttime,&T-CarryNumber,&T-SellNumber);/根据指定格式从指定文件读取信息rear-next=T;/在 TICKET 单链表中依次插
12、入下一结点rear=T;rear-next=NULL;/班次尾结点的指针域置空fclose(fp);/文件关闭/*文件数据保存*/void Keep()/保存数据FILE *fp;/定义文件型指针变量if(fp=fopen(ticket.txt, r+)=0)/如果文件内容为空printf(n 打开文件错误!n);exit(0);Ticket T=head-next; while(T!=NULL)fprintf(fp,%dt%st%st%st%.2ft%dt%dn,T-num,T-starttime,T-begin,T-end,T-lasttime,T-CarryNumber,T-SellNu
13、mber); T=T-next;/根据指定格式发送信息到指定文件fclose(fp);/文件关闭/*浏览班次信息*/void ScanTicket()/浏览信息system(cls);/清屏Ticket T=head-next;printf(n 各班次信息如下:n);printf(n 班次t 发车时间t 起点站t 终点站t 行车时间额定载量已定票人数n);printf( n); while(T!=NULL)printf(%dt%stt%st%st%.2ftt%dtt%dn,T-num,T-starttime,T-begin,T-end,T-lasttime,T-CarryNumber,T-Se
14、llNumber); T=T-next;printf( n);/*查询信息*/void SearchTicket()/查询班次信息system(cls);/清屏void SearchbyNum();/函数声明 按班次查询void SearchbyEnd();/函数声明 按终点站站查询int i,j=0; while(j!=1)system(cls);/清屏printf(n);printf(查 询 子 菜 单 n); printf(=n);printf(1.按班次查询tn);printf(2.按终点站站名查询tn); printf(=n);printf(请选择查询方式(12):);scanf(%
15、d, &i); switch(i)case 1: SearchbyNum(); break; case 2: SearchbyEnd(); break;default : printf(n 输入错误!请确保你的输入为 1 或 2.n);break; printf(=n);printf(n1.返回主菜单 2.继续查询 : );scanf(%d,&j);/*按班次查询信息*/void SearchbyNum()/按班次查询班次int GetHour(char *s); int GetMinute(char *s);system(cls);/清屏Ticket p,q;/定义两个结点int num;/
16、要查询的班次int j=0;/判断班次p=head-next;printf(n 请输入需要查询的班次: ); scanf(%d,&num);while(p!=NULL)if(p-num-num=0)/班次和查询的班次相同q=p;printf(n);printf(班次: t);printf(%dn,q-num);printf(发车时间:t);printf(%sn,q-starttime);printf(起点站: t);printf(%sn,q-begin);printf(终点站: t);printf(%sn,q-end);printf(行车时间: t);printf(%.2fn,q-lastti
17、me);printf(额定载量: t);printf(%dn,q-CarryNumber);printf(已定票人数: t);printf(%dn,q-SellNumber);置日历时间time_t t;/得到机器的日历时间或者设struct tm *timeinfo;/返回一个以 tm 结构表达的机器时间信息time(&t);/调用 time()函数timeinfo = localtime(&t);/函数需要传递进去的参数是&t,也就是之前 t 的地址,localtime()的返回值是一个 structtm 结构,于是返回值用 timeinfo 保存if(GetHour(q-starttim
18、e)tm_hour)/系统时间超过班次出发时间printf(n 此班次车已发出!n); elseif(GetHour(q-starttime) = timeinfo-tm_hour)/小时正好钟未到if(GetMinute(q-starttime)tm_min)/分printf(n 此班次车已发出!n); elseprintf(n 此班次车尚未发出!n);elseprintf(n 此班次车尚未发出!n); j+;p=p-next;/while(p!=NULL) if(j=0)printf(n 对不起,不存在此班次!n);/*按终点站查询信息*/void SearchbyEnd()/按终点站查询
19、班次system(cls);/清屏int GetHour(char *s); int GetMinute(char *s);Ticket p,q;/定义两个结点char end21;/要查询的终点站站名int j=0;p=head-next;printf(n 请输入需要查询的终点站站名: ); scanf(%s,end);while(p!=NULL)if(strcmp(p-end,end)=0)/比较 2 个字符串的大小是否一样q=p;printf(n);printf(班次: t);printf(%dn,q-num);printf(发车时间:t);printf(%sn,q-starttime)
20、;printf(起点站: t);printf(%sn,q-begin);printf(终点站: t);printf(%sn,q-end);printf(行车时间: t);printf(%.2fn,q-lasttime);printf(额定载量: t);printf(%dn,q-CarryNumber);printf(已定票人数: t);printf(%dn,q-SellNumber); time_t t;/得到机器的日历时间或者设置日历时间struct tm *timeinfo;/返回一个以 tm 结构表达的机器时间信息time(&t);/调用 time()函数timeinfo=localti
21、me(&t);/函数需要传递进去的参数是&t,也就是之前 t 的地址,localtime()的返回值是一个 structtm 结构,于是返回值用 timeinfo 保存if(GetHour(q-starttime)tm_hour)/系统时间超过班次出发时间printf(n 此班已发出!n); elseif(GetHour(q-starttime)=timeinfo-tm_hour)/小时正好钟未到if(GetMinute(q-starttime)tm_min)/分printf(n 此班已发出!n); elseprintf(n 此班次车尚未发出!n);elseprintf(n 此班次车尚未发出!
22、n); j+;p=p-next;/while(p!=NULL) if(j=0)printf(n 对不起,不存在此班次!n);/*预定车票*/void Buyticket()/预定车票int GetHour(char *s); int GetMinute(char *s); int i=0;system(cls);/清屏ScanTicket();/调用浏览信息函数while(i!=1)int num,j=0;Ticket p,q;/定义两个结点p=head-next;time_t t;/得到机器的日历时间或者设置日历时间struct tm *timeinfo;/返回一个以 tm 结构表达的机器时
23、间信息time(&t);/调用 time()函数timeinfo=localtime(&t);/函数需要传递进去的参数是&t,也就是之前 t 的地址,localtime()的返回值是一个 structtm 结构,于是返回值用 timeinfo 保存printf(n 请输入你要购买的班次:); scanf(%d,&num);while(p!=NULL)if(p-num-num=0)/班次和预订的班次相同q=p; j+;if(q-SellNumberCarryNumber)/如果已定票人数少于额定载量时间未到if(GetHour(q-starttime)timeinfo-tm_hour)/系统pr
24、intf(n 订票成功!n); q-SellNumber+;elseif(GetHour(q-starttime)=timeinfo-tm_hour)&(GetMinute(q-starttime)timeinfo-tm_min)/系统小时正好, 分钟未到票人数增 1printf(n 订票成功!n);q-SellNumber+;/已定elseelseprintf(n 该班次车已经发出!n);printf(n 该班次车人数已满!n);p=p-next;if(j=0)printf(n 不 存 在 此 班 次 !n); printf(=n);printf(n1. 返回主菜单 2. 继续订票 : );
25、scanf(%d,&i);/while(i!=1)/*退订车票*/void ReturnTicket()/退订车票int GetHour(char *s); int GetMinute(char *s); int i=0;system(cls);/清屏ScanTicket();/调用浏览信息函数while(i!=1)Ticket p,q; p=head-next; int num,j=0;time_t t;/得到机器的日历时间或者设置日历时间struct tm *timeinfo;/返回一个以 tm 结构表达的机器时间信息time(&t);/调用 time()函数timeinfo=localtime(&t);/函数需要传递进去的参数是&t,也就是之前 t 的地址,localtime()的返回值是一个 s