火车票管理系统课程设计报告

更新时间: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

-

#include #include class Ticket {

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 #include #include #include class Ticket { 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 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_hourtm_hour)&&(local->tm_min

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;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(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+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; }//利用冒泡法将发车时间相对早的班次信息往文件头移

-

}

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>t[i].no; cin>>t[i].hour; cin>>t[i].minute; cin>>t[i].name_b;

-

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>t[i].no; cin>>t[i].hour; cin>>t[i].minute; cin>>t[i].name_b; 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::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++,其次我也意识到编程是件很严谨的工作,一点点小的错误都会引起不可想象的连锁反应。

实践出真知,我觉得这两个星期的学习,自己收获很大,对我自己来说也是一种锻炼,不仅在一定程度上增长了我对编程的认识,我也学会了团队合作,学会了坐冷板凳一行一行敲代码。

当然,我自己身上依然存在着不少的问题。比如对于一些难懂的代码,还是参考了网上的程序,比如录入数据的时候一开始不知道怎么让各组信息整齐地排列。

我们大学生学编程,实践真的是很好的方式,我非常感谢学校给我们安排这样一次珍贵的实习机会,让我们第一次面对问题、解决问题,在实战中真正地提高了自己对编程的理解和编程的能力,真心希望学校多给我们提供这样书本之外的考核和锻炼。

指导老师吴老师不仅提供给我们好的方法,更给我们信心,再次真的非常感谢吴老师的耐心教导!

-

本文来源:https://www.bwwdw.com/article/hb4v.html

Top