1、火车票管理系统课程设计报告火车票管理系统课程设计报告程序设计报告( 2014 / 2015 学年 第 一 学期)题 目:火车票管理系统 专 业 通信工程 学 生 姓 名 班 级 学 号 指 导 教 师 指 导 单 位 计算机学院计算机软件教学中心日 期 评 分 细 则评分项优秀良好中等差遵守机房规章制度上机时的表现学习态度程序准备情况程序设计能力团队合作精神课题功能实现情况算法设计合理性用户界面设计报告书写认真程度内容详实程度文字表达熟练程度回答问题准确度简 短 评 语教师签名: 年 月 日评分等级备注评分等级有五种:优秀、良好、中等、及格、不及格火车票务管理系统一、 课题内容和要求(一)课题
2、内容该系统要求实现一个简单、实用的火车票管理程序,主要功能包括火车票数据的录入、查找、删除、显示、售票、退票等。所有火车票数据都要利用文件系统保存,以备系统下次运行时使用。通过此课题,熟练掌握文件、数组、指针的各种操作,以及一些基本算法思想的应用。 (二)课题要求(1)火车票数据由多条记录组成,其信息包括:车次,发车时间,起点站,终点站,行车时间,额定载量,已售票人数等。(2)数据保存形式:所有火车票数据要以文本或二进制文件保存。(3)需要实现的功能1) 新增火车票数据记录。2) 查找火车票数据(可按车次,发车时间、起点站、终点站等查找)。3) 删除火车票数据记录(先查找,再删除。若查找出多条
3、记录,则进一步提示用户选择记录的车次,再删除)。4) 对火车票排序(可按车次、发车时间、起点站、终点站等排序。)。5) 显示当前所有火车票信息列表。6) 售票(先查找,当确定车次后,根据售票张数对该车次的已售票人数进行修改)。7) 退票(售票的逆处理,过程与售票类似)。8) 保存火车票数据到文件中。9) 从文件中读入火车票数据。(4)界面功能要求:1) 采用友好的字符界面,实现一个功能控制菜单。2) 每次操作都从该菜单选择,利用循环结构使得一次运行程序可进行多次操作。需求分析一、功能分析图 二、 录入班次信息:依次输入班次、起点站和终点站等信息同时保存在文件中,并可以随时增加新的班次信息。三、
4、 浏览班次信息:输出保存在文件中的全部班次信息,并区分当前的车次是否已发出,如发出则标记“此车已发出”。四、 按班次号查询路线:以输入的班次号为依据进行查找,找到匹配项则输出该项完整的班次信息;未找到则显示“未找到该车次信息!”五、 按起点站查询路线:输入的起点站为依据进行查找,找到匹配项则输出该项完整的班次信息;未找到则显示“未找到该车次信息!”六、 按终点站查询路线:输入的终点站为依据进行查找,找到匹配项则输出该项完整的班次信息;未找到则显示“未找到该车次信息!”七、 排列发车时间表:按照发车时间从早到晚的顺序逐条显示车次信息。八、 售票功能:依次输入“售票数目”和“班次号”可出售未发出的
5、班次的车票。九、 退票功能:依次输入“退票数目”和“班次号”可退距发车时间大于半小时的班次的车票。三、概要设计(1)类:#include#include#include#include class Ticket char no20; char name_b20; char name_e20; int hour; int minute; int tra_time; int eding; int yupiao;public: void shoupiao(fstream&f); void tuipiao(fstream&f); void searchbynumber(fstream&f); void
6、 searchbybeginplace(fstream&f); void searchbyendplace(fstream&f); void luru(fstream&f); void liulan(fstream&f); void paixu(fstream&f); friend ostream&operator(ostream&out,const Ticket&t);/定义重载输出运算符的友元函数 bool findno(char n)/用于判断输入的字符串是否与查找区域中的某个字符串一致 if(strcmp(no,n)=0) return true; else return false;
7、 bool findname_b(char n) if(strcmp(name_b,n)=0) return true; else return false; bool findname_e(char n) if(strcmp(name_e,n)=0) return true; else return false;(2)主要函数流程图:1、录入班次信息函数:用户根据提示信息逐项输入班次信息各项数据,利用read()函数把要录入的信息写入文件。如图1 图1 图2 2、浏览班次信息显示所有的班次信息,并标记已发出的车次,如图23、按班次号查询路线根据用户输入的班次号查找匹配项的班次信息。4、按起点
8、站查询路线根据用户输入的起点站查找匹配项的班次信息。5、按终点站查询路线根据用户输入的终点站查找匹配项的班次信息。6、排列发车时间表利用冒泡法按照发车时间的升序排列车次信息7、售票用户输入指定的班次和售票数目进行售票如图38、退票用户输入指定的班次和售票数目进行售票,如图4 图3 图4 四、源程序代码 #include#include#include#include class Ticket char no20; char name_b20; char name_e20; int hour; int minute; int tra_time; int eding; int yupiao;pub
9、lic: void shoupiao(fstream&f); void tuipiao(fstream&f); void searchbynumber(fstream&f); void searchbybeginplace(fstream&f); void searchbyendplace(fstream&f); void luru(fstream&f); void zengjia(fstream&f); void xiugai(fstream&f); void liulan(fstream&f); void paixu(fstream&f); friend ostream&operator(
10、ostream&out,const Ticket&t);/定义重载输出运算符的友元函数 bool findno(char n)/用于判断输入的字符串是否与查找区域中的某个字符串一致 if(strcmp(no,n)=0) return true; else return false; bool findname_b(char n) if(strcmp(name_b,n)=0) return true; else return false; bool findname_e(char n) if(strcmp(name_e,n)=0) return true; else return false;o
11、stream&operator=10) outt.no t.hour : t.minute t.name_b t.name_e t.tra_time t.eding t.yupiaoendl; else outt.no t.hour : 0t.minute t.name_b t.name_e t.tra_time t.eding t.yupiaoendl; return out;void Ticket:liulan(fstream&f) int i=0; struct tm *local; long t; time(&t); local = localtime(&t); cout车次 发车时间
12、 起点站 终点站 行车时间 额定载量 余票数量endl; f.seekg(0,ios:end); int b=f.tellg(); f.seekg(0,ios:beg); int a=f.tellg(); int c=(b-a)/sizeof(Ticket);/获得文件内包含的班次信息总数 Ticket*T=new Ticketc; while(!f.eof() f.read(char*)&Ti+,sizeof(Ticket); for(int j=0;jtm_hourTj.hour)|(Tj.hour=local-tm_hour)&(local-tm_min Tj.minute) coutT
13、j 此车已发出!endl; else coutTjendl; void Ticket:shoupiao(fstream&f) const int NUM=sizeof(Ticket); int n; long t; char m20; Ticket T; struct tm *local; cout请输入售票的数目:n; cout请输入售票的班次:m; time(&t); local = localtime(&t); f.seekg(0,ios:beg);/从文件头开始 bool fd=false; while(!f.eof()&!fd) f.read(char*)&T,NUM); if(fd
14、=T.findno(m)/判断是否找到匹配班次 if(T.yupiao)/判断余票数量是否大于零 if(local-tm_hourtm_hour)&(local-tm_min T.minute) T.yupiao-=n; f.seekg(-1*NUM,ios:cur);/从当前位置向前移动(-1*sizeof(Ticket)个字节 f.write(char*)&T,NUM); cout已售出n张该车次的车票!endl; else cout该车次已发出!endl; else cout票已售完!endl; if(!fd) cout未找到该车次信息!endl;void Ticket:tuipiao(
15、fstream&f) const int NUM=sizeof(Ticket); int n; long t; char m20; Ticket T; struct tm *local; cout请输入退票的数目:n; cout请输入退票的班次:m; time(&t); local = localtime(&t); f.seekg(0,ios:beg);/把文件指针移到文件头 bool fd=false; while(!f.eof()&!fd)/未找到匹配的车次号以及未搜索完所有数据前继续循环 f.read(char*)&T,NUM); if(fd=T.findno(m) if(T.hour)
16、*60+T.minute-(local-tm_hour)*60-(local-tm_min)30) T.yupiao+=n; f.seekg(-1*NUM,ios:cur);/从当前位置向前移动(-1*sizeof(Ticket)个字节 f.write(char*)&T,NUM);/更新退票后的班次信息 cout已退n张该车次的车票!endl; else cout退票失败!endl; if(!fd) cout未找到该车次信息!endl;void Ticket:paixu(fstream&f) int i=0; f.seekg(0,ios:end); int b=f.tellg(); f.see
17、kg(0,ios:beg);/把文件指针移到文件头 int a=f.tellg(); int num=(b-a)/sizeof(Ticket);/得到文件内班次信息总数num Ticket*t=new Ticketnum+1; Ticket*T=new Ticketnum+1; for(i=0;inum;i+) f.read(char*)&ti,sizeof(Ticket); for(i=0;ihour(t+i+1)-hour)|(t+i)-hour=(t+i+1)-hour)&(t+i)-minute(t+i+1)-minute) strcpy(T-no,(t+i)-no); strcpy(
18、T-name_b,(t+i)-name_b); strcpy(T-name_e,(t+i)-name_e); T-hour=(t+i)-hour; T-minute=(t+i)-minute; T-tra_time=(t+i)-tra_time; T-eding=(t+i)-eding; T-yupiao=(t+i)-yupiao; strcpy(t+i)-no,(t+i+1)-no); strcpy(t+i)-name_b,(t+i+1)-name_b); strcpy(t+i)-name_e,(t+i+1)-name_e); (t+i)-minute=(t+i+1)-minute; (t+
19、i)-tra_time=(t+i+1)-tra_time; (t+i)-eding=(t+i+1)-eding; (t+i)-yupiao=(t+i+1)-yupiao; strcpy(t+i+1)-no,T-no); strcpy(t+i+1)-name_b,T-name_b); strcpy(t+i+1)-name_e,T-name_e); (t+i+1)-minute=T-minute; (t+i+1)-tra_time=T-tra_time; (t+i+1)-eding=T-eding; (t+i+1)-yupiao=T-yupiao; /利用冒泡法将发车时间相对早的班次信息往文件头移
20、cout 发车时间表: endl; for(i=0;inum;i+)couttiendl; fstream fil; fil.open(d:sort.dat,ios:in|ios:out|ios:binary);/创建并打开二进制文件sort.dat for(i=0;inum;i+)fil.write(char*)&ti,sizeof(Ticket); fil.close(); void Ticket:searchbynumber(fstream&f) char n10; Ticket t; cout请输入你要查找的班次号:n; f.seekg(0,ios:beg); bool fd=fals
21、e; while(!f.eof()&!fd) f.read(char*)&t,sizeof(Ticket); if(fd=t.findno(n) cout车次 发车时间 起点站 终点站 行车时间 额定载量 余票数量endl; coutt; if(!fd) cout未找到该车次信息!该车次不存在或已发出!endl; void Ticket:searchbybeginplace(fstream&f) char n10; Ticket t; cout请输入你要查找的班次的起点站:n; f.seekg(0,ios:beg); bool fd=false; while(!f.eof()&!fd) f.r
22、ead(char*)&t,sizeof(Ticket); if(fd=t.findname_b(n) cout车次 发车时间 起点站 终点站 行车时间 额定载量 余票数量endl; coutt; if(!fd) cout未找到该车次信息!该车次不存在或已发出!endl;void Ticket:searchbyendplace(fstream&f) char n10; Ticket t; cout请输入你要查找的班次的终点站:n; f.seekg(0,ios:beg); bool fd=false; while(!f.eof()&!fd) f.read(char*)&t,sizeof(Ticke
23、t); if(fd=t.findname_e(n) cout车次 发车时间 起点站 终点站 行车时间 额定载量 余票数量endl; coutt; if(!fd) cout未找到该车次信息!该车次不存在或已发出!endl;void Ticket:luru(fstream&f) int num; int i; cout请输入你要录入的班次信息数量:num; Ticket*t=new Ticketnum; cout请依次输入endl车次、发车时间(时)、发车时间(分)、起点站、终点站、行车时间、额定票数和余票数量 endl; for(i=0;iti.no; cinti.hour; cinti.min
24、ute; cinti.name_b; cinti.name_e; cinti.tra_time; cinti.eding; cinti.yupiao; f.seekg(0,ios:end);/文件指针指向文件尾 for(i=0;inum;i+) f.write(char*)&ti,sizeof(Ticket);void Ticket:zengjia(fstream&f) int num; int i; cout请输入你要增加的班次信息数量:num; Ticket*t=new Ticketnum; cout请依次输入endl车次、发车时间(时)、发车时间(分)、起点站、终点站、行车时间、额定票数和余票数量 endl; for(i=0;iti.no; cinti.hour; cinti.minute; cinti.name_b; cinti.name_e; cinti.tra_time; cinti.eding; cinti.yupiao; f.seekg(0,ios:end);/文件指针指向文件尾 for(i=0;inum;i+) f.write(char*)&ti,sizeof(Ticket);void Ticket:xiugai(fstream&f) char
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1