火车票管理系统课程设计报告
更新时间:2023-11-14 03:01:01 阅读量: 教育文库 文档下载
程序设计报告
( 2014 / 2015 学年 第 一 学期)
题 目:火车票管理系统
专 业 通信工程 学 生 姓 名 班 级 学 号 指 导 教 师
指 导 单 位 计算机学院计算机软件教学中心 日 期
评 评分项 优秀 -
良好 中等 差
遵守机房规章制度 上机时的表现 学习态度 程序准备情况 程序设计能力 团队合作精神 课题功能实现情况 算法设计合理性 用户界面设计 报告书写认真程度 内容详实程度 文字表达熟练程度 回答问题准确度 简短评语 教师签名: 年 月 日 评分等级备注 评分等级有五种:优秀、良好、中等、及格、不及格
-
火车票务管理系统
一、 课题内容和要求
(一)课题内容
该系统要求实现一个简单、实用的火车票管理程序,主要功能包括火车票数据的录入、查找、删除、显示、售票、退票等。所有火车票数据都要利用文件系统保存,以备系统下次运行时使用。通过此课题,熟练掌握文件、数组、指针的各种操作,以及一些基本算法思想的应用。 (二)课题要求
(1)火车票数据由多条记录组成,其信息包括:
车次,发车时间,起点站,终点站,行车时间,额定载量,已售票人数等。 (2)数据保存形式:
所有火车票数据要以文本或二进制文件保存。 (3)需要实现的功能
1) 新增火车票数据记录。
2) 查找火车票数据(可按车次,发车时间、起点站、终点站等查找)。
3) 删除火车票数据记录(先查找,再删除。若查找出多条记录,则进一步提示用户选择记录的车次,再删除)。
4) 对火车票排序(可按车次、发车时间、起点站、终点站等排序。)。 5) 显示当前所有火车票信息列表。 6) 售票(先查找,当确定车次后,根据售票张数对该车次的已售票人数进行修改)。 7) 退票(售票的逆处理,过程与售票类似)。 8) 保存火车票数据到文件中。 9) 从文件中读入火车票数据。 (4)界面功能要求:
1) 采用友好的字符界面,实现一个功能控制菜单。
2) 每次操作都从该菜单选择,利用循环结构使得一次运行程序可进行多次操作。
需求分析
一、功能分析图
-
票务管理系统 录入班次信息 浏览班次信息 按班次号查询路线 按起点站查询路线 按终点站查询路线 发车时间表 售票退票
以随时增加新的班次信息。
二、 录入班次信息:依次输入班次、起点站和终点站等信息同时保存在文件中,并可
三、 浏览班次信息:输出保存在文件中的全部班次信息,并区分当前的车次是否已发
出,如发出则标记“此车已发出”。
四、 按班次号查询路线:以输入的班次号为依据进行查找,找到匹配项则输出该项完
整的班次信息;未找到则显示“未找到该车次信息!”
五、 按起点站查询路线:输入的起点站为依据进行查找,找到匹配项则输出该项完整
的班次信息;未找到则显示“未找到该车次信息!”
六、 按终点站查询路线:输入的终点站为依据进行查找,找到匹配项则输出该项完整
的班次信息;未找到则显示“未找到该车次信息!”
七、 排列发车时间表:按照发车时间从早到晚的顺序逐条显示车次信息。
八、 售票功能:依次输入“售票数目”和“班次号”可出售未发出的班次的车票。 九、 退票功能:依次输入“退票数目”和“班次号”可退距发车时间大于半小时的班
次的车票。
三、概要设计
(1)类:
#include
-
#include
char no[20];
char name_b[20]; char name_e[20]; 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 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; }
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、浏览班次信息
显示所有的班次信息,并标记已发出的车次, 如图2
3、按班次号查询路线
根据用户输入的班次号查找匹配项的班次信息。 4、按起点站查询路线
根据用户输入的起点站查找匹配项的班次信息。 5、按终点站查询路线
根据用户输入的终点站查找匹配项的班次信息。 6、排列发车时间表
利用冒泡法按照发车时间的升序排列车次信息 7、售票
用户输入指定的班次和售票数目进行售票 如图3 8、退票
用户输入指定的班次和售票数目进行售票, 如图4
-
开始 打开文件 输入售票数目 输入班次号 是否找到? 否 余票 是 数目 是否 为零 票已售完否 未找到该 车次信息 售票 更新后的票 数写入文件 关闭文件 结束 开始 打开文件 输入退票数目 输入班次号 是 是 否 是否找到? 否 车是否已发出? 是 距离发车时间是否否 大于半小时? 是 未找到该车次信息! 此车已发出 退票失败! 退票 更新后的票数写入文件 关闭文件 结束 图3
图4
-
四、源程序代码
#include
char name_b[20]; char name_e[20]; 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 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<<(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; } };
ostream&operator<<(ostream&out,const Ticket&t)//打印车次表格 {
if(t.minute>=10) { out< void Ticket::liulan(fstream&f) { int i=0; struct tm *local; long t; time(&t); local = localtime(&t); cout<<\车次\发车时间\起点站\终点站\ <<\行车时间\额定载量\余票数量\ 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 Ticket[c]; while(!f.eof()) f.read((char*)&T[i++],sizeof(Ticket)); for(int j=0;j - if((local->tm_hour>T[j].hour)||(T[j].hour==local->tm_hour)&&(local->tm_min >T[j].minute)) { cout< void Ticket::shoupiao(fstream&f) { const int NUM=sizeof(Ticket); int n; long t; char m[20]; Ticket T; struct tm *local; cout<<\请输入售票的数目:\ cin>>n; cout<<\请输入售票的班次:\ cin>>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.yupiao)//判断余票数量是否大于零 { if((local->tm_hour f.seekg(-1*NUM,ios::cur);//从当前位置向前移动(-1*sizeof(Ticket))个字节 f.write((char*)&T,NUM); cout<<\已售出\张该车次的车票!\ } else - cout<<\该车次已发出!\ } else cout<<\票已售完!\ } } if(!fd) cout<<\未找到该车次信息!\} void Ticket::tuipiao(fstream&f) { const int NUM=sizeof(Ticket); int n; long t; char m[20]; Ticket T; struct tm *local; cout<<\请输入退票的数目:\ cin>>n; cout<<\请输入退票的班次:\ cin>>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)*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<<\已退\张该车次的车票!\ } else cout<<\退票失败!\ } } - if(!fd) cout<<\未找到该车次信息!\} void Ticket::paixu(fstream&f) { int i=0; f.seekg(0,ios::end); int b=f.tellg(); f.seekg(0,ios::beg);//把文件指针移到文件头 int a=f.tellg(); int num=(b-a)/sizeof(Ticket);//得到文件内班次信息总数num Ticket*t=new Ticket[num+1]; Ticket*T=new Ticket[num+1]; for(i=0;i f.read((char*)&t[i],sizeof(Ticket)); } for(i=0;i - } cout<<\发车时间表: \ for(i=0;i for(i=0;i void Ticket::searchbynumber(fstream&f) { char n[10]; Ticket t; cout<<\请输入你要查找的班次号:\ cin>>n; f.seekg(0,ios::beg); bool fd=false; while(!f.eof()&&!fd) { f.read((char*)&t,sizeof(Ticket)); if(fd=t.findno(n)) { cout<<\车次\发车时间\起点站\\终点站\ <<\行车时间\额定载量\余票数量\ cout< void Ticket::searchbybeginplace(fstream&f) { char n[10]; Ticket t; cout<<\请输入你要查找的班次的起点站:\ cin>>n; f.seekg(0,ios::beg); bool fd=false; while(!f.eof()&&!fd) { f.read((char*)&t,sizeof(Ticket)); if(fd=t.findname_b(n)) { cout<<\车次\发车时间\起点站\ - \终点站\ <<\行车时间\额定载量\余票数量\ cout< void Ticket::searchbyendplace(fstream&f) { char n[10]; Ticket t; cout<<\请输入你要查找的班次的终点站:\ cin>>n; f.seekg(0,ios::beg); bool fd=false; while(!f.eof()&&!fd) { f.read((char*)&t,sizeof(Ticket)); if(fd=t.findname_e(n)) { cout<<\车次\发车时间\起点站\\终点站\ <<\行车时间\额定载量\余票数量\ cout< void Ticket::luru(fstream&f) { int num; int i; cout<<\请输入你要录入的班次信息数量:\ cin>>num; Ticket*t=new Ticket[num]; cout<<\请依次输入\车次、发车时间(时)、发车时间(分)、起点站、终点站、行车时间、额定票数和余票数量 \ for(i=0;i - cin>>t[i].name_e; cin>>t[i].tra_time; cin>>t[i].eding; cin>>t[i].yupiao; } f.seekg(0,ios::end);//文件指针指向文件尾 for(i=0;i void Ticket::zengjia(fstream&f) { int num; int i; cout<<\请输入你要增加的班次信息数量:\ cin>>num; Ticket*t=new Ticket[num]; cout<<\请依次输入\车次、发车时间(时)、发车时间(分)、起点站、终点站、行车时间、额定票数和余票数量 \ for(i=0;i f.seekg(0,ios::end);//文件指针指向文件尾 for(i=0;i void Ticket::xiugai(fstream&f) { char n[10]; Ticket t; cout<<\请输入你要修改的班次:\ cin>>n; f.seekg(0,ios::beg); bool fd=false; while(!f.eof()&&!fd) { f.read((char*)&t,sizeof(Ticket)); if(fd=t.findno(n)) - { cout<<\请依次输入\发车时间(时)、发车时间(分)、起点站、终点站、行车时间、额定票数和余票数量 \ cin>>t.no; cin>>t.hour; cin>>t.minute; cin>>t.name_b; cin>>t.name_e; cin>>t.tra_time; cin>>t.eding; cin>>t.yupiao; } } f.seekg(0,ios::end);//文件指针指向文件尾 f.write((char*)&t,sizeof(Ticket)); } void menu()//菜单函数 { cout<<\菜单********************************\ cout<<\ 1:录入车次信息\ cout<<\ 2:浏览车次信息\ cout<<\ 3:根据车次号查询路线\ cout<<\ 4:根据起点站查询路线\ cout<<\ 5:根据终点站查询路线\ cout<<\ 6:排列发车时间表\ cout<<\ 7:售票\ cout<<\ 8:退票\ cout<<\ 9:增加车次\ cout<<\ 10:修改车次\ cout<<\ 0:退出菜单\ cout<<\请选择您需要操作的选项:\} void main() { int x; Ticket T; fstream file; cout<<\欢迎您使用票务管理系统!**********************\ menu(); while(x) { cin>>x; - file.open(\创建并打开二进制文件schedule.dat switch(x) { case 1: T.luru(file);break; case 2: T.liulan(file);break; case 3: T.searchbynumber(file);break; case 4: T.searchbybeginplace(file);break; case 5: T.searchbyendplace(file);break; case 6: T.paixu(file);break; case 7: T.shoupiao(file);break; case 8: T.tuipiao(file);break; case 9: T.zengjia(file);break; case 10: T.xiugai(file);break; case 0: break; } cout<<\操作已完成,请继续!\ file.close();//关闭二进制文件schedule.dat } cout<<\欢迎您下次使用!****************************\} 五、测试数据及其结果分析 1、录入班次信息 输入:1 输出:请输入你要录入的班次信息数量: 输入:4 输出: 请依次输入 车次、起点站、终点站、发车时间(时)、发车时间(分)、行车时间、额定票数 - 和余票数量 输入: G111 南京 扬州 8 0 20 100 30 G222 南京 北京 10 30 21 120 35 G333 南京 上海 11 0 22 140 50 G444 南京 广州 9 30 22 160 40 输出:操作已完成,请继续! 2、浏览班次信息 输入:2 输出: G111 南京 扬州 8 0 20 100 30 G222 南京 北京 10 30 21 120 35 G333 南京 上海 11 0 22 140 50 G444 南京 广州 9 30 22 160 40 操作已完成,请继续! 3、根据车次号查询路线 输入:3 输出:请输入你要查找的班次号: 输入:G111 输出:G111 南京 扬州 8 0 20 100 30 操作已完成,请继续! 4、根据起点站查询路线 输入:4 输出:请输入你要查找的班次的起点站: 输入:南京 输出: G111 南京 扬州 8 0 20 100 30 G222 南京 北京 10 30 21 120 35 G333 南京 上海 11 0 22 140 50 - G444 南京 广州 9 30 22 160 40 操作已完成,请继续! 5、根据终点站查询路线 输入:5 输出:请输入你要查找的班次的终点站: 输入:上海 输出:G333 南京 上海 11 0 22 140 50 操作已完成,请继续! 6、排列发车时间表 输入:6 输出: G111 南京 扬州 8 0 20 100 30 G444 南京 广州 9 30 22 160 40 G222 南京 北京 10 30 21 120 35 G333 南京 上海 11 0 22 140 50 操作已完成,请继续! 7、售票 输入:7 输出:请输入售票的数目: 输入:1 输出:请输入售票的班次: 输入:G333 输出:已售出1张该车次的车票! 操作已完成,请继续退票 8、退票 输入:8 输出:请输入退票的数目: 输入:1 输出:请输入退票的班次: 输入:G444 - 输出:已退1张该车次的车票! 操作已完成,请继续! 9、退出菜单 输入:0 输出: ************************欢迎您下次使用!**************************** 结果分析: (1)按照车次号、起点站或终点站查询班次时,如输入的车次信息不在数据库里或该车次已发出,则显示“未找到该车次信息!该车次不存在或已发出!” (2)售票的班次如已发出,则显示“该车次已发出!”如无余票则提示“票已售完”。 (3)退票的班次如在半小时内发车或已发出,则显示“退票失败!” 六、调试过程中的问题 1、录入班次信息的操作完成时,必须调用函数f.seekg(0,ios::end)令文件指针指向文件尾,否则下次录入新的数据时会覆盖之前的信息,造成班次信息的丢失。 2、调用while(!f.eof())f.read((char*)&T[i++],sizeof(Ticket));浏览班次信息后,文件中的班次信息的最后一条会被读两次,所以把班次信息显示在屏幕时利用 f.seekg(0,ios::end); int b=f.tellg(); f.seekg(0,ios::beg); int a=f.tellg(); int c=(b-a)/sizeof(Ticket);获得文件内包含的班次信息总数c,调用for(int j=0;j 3、在主函数中的swicth()循环函数外层加上一个while()循环可连续多次对菜单进行操作,从而提高了运行效率。 - 七、课程设计总结 通过将近两周的程序设计实习,我首先认识到自己编程水平的有限,十分后悔当初没有学好C++,其次我也意识到编程是件很严谨的工作,一点点小的错误都会引起不可想象的连锁反应。 实践出真知,我觉得这两个星期的学习,自己收获很大,对我自己来说也是一种锻炼,不仅在一定程度上增长了我对编程的认识,我也学会了团队合作,学会了坐冷板凳一行一行敲代码。 当然,我自己身上依然存在着不少的问题。比如对于一些难懂的代码,还是参考了网上的程序,比如录入数据的时候一开始不知道怎么让各组信息整齐地排列。 我们大学生学编程,实践真的是很好的方式,我非常感谢学校给我们安排这样一次珍贵的实习机会,让我们第一次面对问题、解决问题,在实战中真正地提高了自己对编程的理解和编程的能力,真心希望学校多给我们提供这样书本之外的考核和锻炼。 指导老师吴老师不仅提供给我们好的方法,更给我们信心,再次真的非常感谢吴老师的耐心教导! -
正在阅读:
火车票管理系统课程设计报告11-14
中级配电线路工技能题库06-10
第7课 辛亥革命04-07
10复习题1010-20
公主日记650字10-29
2023年办公室主任个人工作总结范文03-23
2018-2025年沙棘种植及加工产业市场研究与发展前景预测报告04-26
幼儿园一日活动常规实施细则心得体会08-07
全国2009年4月自考网络操作系统试题05-13
- exercise2
- 铅锌矿详查地质设计 - 图文
- 厨余垃圾、餐厨垃圾堆肥系统设计方案
- 陈明珠开题报告
- 化工原理精选例题
- 政府形象宣传册营销案例
- 小学一至三年级语文阅读专项练习题
- 2014.民诉 期末考试 复习题
- 巅峰智业 - 做好顶层设计对建设城市的重要意义
- (三起)冀教版三年级英语上册Unit4 Lesson24练习题及答案
- 2017年实心轮胎现状及发展趋势分析(目录)
- 基于GIS的农用地定级技术研究定稿
- 2017-2022年中国医疗保健市场调查与市场前景预测报告(目录) - 图文
- 作业
- OFDM技术仿真(MATLAB代码) - 图文
- Android工程师笔试题及答案
- 生命密码联合密码
- 空间地上权若干法律问题探究
- 江苏学业水平测试《机械基础》模拟试题
- 选课走班实施方案
- 火车票
- 管理系统
- 课程
- 报告
- 设计
- 川大《保险经营管理》16秋在线作业2
- 2018年秋九年级数学上册 第二十二章 二次函数 22.2 二次函数与一元二次方程课后作业(新版)新人教版
- 02389建筑材料 全国2013年7月自考 试题
- 内部化理论的例子
- 公共基础知识题本 - 图文
- 六年级奥数之逻辑推理(一)
- 绩效加薪的六种方式
- 光彩促进会三届理事名单
- (小五号)四川省标准农田建设技术规程汇编(排)
- 2018-2024年中国摊铺机行业发展现状与投资战略规划可行性报告(目录)
- 民航法律法规1-4周试卷
- 射频整理
- 会计从业资格考试《会计基础》填表题复习资料
- 小学四年级数学拓展题
- 2017年双十一物流行业现状及发展前景趋势展望分析报告
- 人教版四年级数学上册课课练(56页)
- 彭山岷江大桥维修加固工程监理总结
- D8完成载波聚合指导 - 图文
- 2019届河北省衡水同卷新高考原创考前提分信息卷(二十三)语文试卷
- 员工主人翁意识及成长的土壤