火车票管理系统课程设计报告.docx
《火车票管理系统课程设计报告.docx》由会员分享,可在线阅读,更多相关《火车票管理系统课程设计报告.docx(52页珍藏版)》请在冰豆网上搜索。
火车票管理系统课程设计报告
程序设计报告
(2014/2015学年第一学期)
题目:
火车票管理系统
学
生
姓
名
班
级
学
号
指
导
教
师
指
日
导
单
位计算机学院计算机软件教学中心
期
评
遵守机房规章制度上机时的表现
学习态度
程序准备情况程序设计能力团队合作精神
课题功能实现情况算法设计合理性用户界面设计
报告书写认真程度
内容详实程度文字表达熟练程度回答问题准确度
简短
评教师签名:
语年月日
评分等级
备评分等级有五种:
优秀、良好、中等、及格、不及格注
火车票务管理系统
一、课题内容和要求
(一)课题内容
该系统要求实现一个简单、实用的火车票管理程序,主要功能包括火车票数据的录入、查找、删除、显示、售票、退票等。
所有火车票数据都要利用文件系统保存,以备系统下次运行时使用。
通过此课题,熟练掌握文件、数组、指针的各种操作,以及一些基本算法思想的应用。
(二)课题要求
(1)火车票数据由多条记录组成,其信息包括:
车次,发车时间,起点站,终点站,行车时间,额定载量,已售票人数等。
(2)数据保存形式:
所有火车票数据要以文本或二进制文件保存。
(3)需要实现的功能
1)新增火车票数据记录。
2)查找火车票数据(可按车次,发车时间、起点站、终点站等查找)。
3)删除火车票数据记录(先查找,再删除。
若查找出多条记录,则进一步提示用户选择记录的车次,再删除)。
4)对火车票排序(可按车次、发车时间、起点站、终点站等排序。
)。
5)显示当前所有火车票信息列表。
6)售票(先查找,当确定车次后,根据售票张数对该车次的已售票人数进行修改)。
7)退票(售票的逆处理,过程与售票类似)。
8)保存火车票数据到文件中。
9)从文件中读入火车票数据。
(4)界面功能要求:
1)采用友好的字符界面,实现一个功能控制菜单。
2)每次操作都从该菜单选择,利用循环结构使得一次运行程序可进行多次操作。
需求分析
一、功能分析图
录
浏
按
按
按
发
售
入
览
班
起
终
车
票
班
班
次
点
点
时
退
次
次
号
站
站
间
票
信
信
查
查
查
表
息
息
询
询
询
路
路
路
线
线
线
二、录入班次信息:
依次输入班次、起点站和终点站等信息同时保存在文件中,并可以随时增加新的班次信息。
三、浏览班次信息:
输出保存在文件中的全部班次信息,并区分当前的车次是否已发出,如发出则标记“此车已发出”。
四、按班次号查询路线:
以输入的班次号为依据进行查找,找到匹配项则输出该项完整的班次信息;未找到则显示“未找到该车次信息!
”
五、按起点站查询路线:
输入的起点站为依据进行查找,找到匹配项则输出该项完整的班次信息;未找到则显示“未找到该车次信息!
”
六、按终点站查询路线:
输入的终点站为依据进行查找,找到匹配项则输出该项完整的班次信息;未找到则显示“未找到该车次信息!
”
七、排列发车时间表:
按照发车时间从早到晚的顺序逐条显示车次信息。
八、售票功能:
依次输入“售票数目”和“班次号”可出售未发出的班次的车票。
九、退票功能:
依次输入“退票数目”和“班次号”可退距发车时间大于半小时的班
次的车票。
三、概要设计
(1))类:
#include#include
#include#includeclassTicket
{
charno[20];charname_b[20];charname_e[20];inthour;
intminute;
inttra_time;inteding;intyupiao;
public:
voidshoupiao(fstream&f);voidtuipiao(fstream&f);
voidsearchbynumber(fstream&f);voidsearchbybeginplace(fstream&f);voidsearchbyendplace(fstream&f);voidluru(fstream&f);
voidliulan(fstream&f);voidpaixu(fstream&f);
friendostream&operator<<(ostream&out,constTicket&t);//定义重载输出运算符的友元函数
boolfindno(charn[])//用于判断输入的字符串是否与查找区域中的某个字符串一致
{
if(strcmp(no,n)==0)returntrue;
else
}
{
returnfalse;
boolfindname_b(charn[])
if(strcmp(name_b,n)==0)returntrue;
else
}
returnfalse;
boolfindname_e(charn[])
{
if(strcmp(name_e,n)==0)returntrue;
else
}
};
returnfalse;
(2))主要函数流程图:
1、录入班次信息函数:
用户根据提示信息逐项输入班次信息各项数据,
利用read()函数把要录入的信息写入文件。
开始
如图1
开始打开文件
打开文件读出数据
申请空间读入数据
写入文件
关闭文件
是
输出车次信息,输出“此车已发出”
车次发出否?
关闭文件
否
输出车次信息
结束
结束
图1图2
2、浏览班次信息
显示所有的班次信息,并标记已发出的车次,
如图2
3、按班次号查询路线
根据用户输入的班次号查找匹配项的班次信息。
4、按起点站查询路线
根据用户输入的起点站查找匹配项的班次信息。
5、按终点站查询路线
根据用户输入的终点站查找匹配项的班次信息。
6、排列发车时间表
利用冒泡法按照发车时间的升序排列车次信息
7、售票
用户输入指定的班次和售票数目进行售票如图3
8、退票
用户输入指定的班次和售票数目进行售票,如图4
开始
打开文件输入售票数目
开始
打开文件
输入班次号
否是否找到?
是
输入退票数目输入班次号
余票
是数目
是否为零
否
车是否已发
是
距离发车
是否找到?
否
票已售完否出?
未找到该是
时间是否
否大于半小
时?
是
未找到该车次信息!
车次信息
售票
更新后的票数写入文件
此车已发出
退票
退票失败!
更新后的票数写入文件
关闭文件
关闭文件
结束
结束
图3
图4
四、源程序代码
#include#include#include#includeclassTicket
{
public:
charno[20];charname_b[20];charname_e[20];
inthour;intminute;
inttra_time;inteding;intyupiao;
voidshoupiao(fstream&f);
voidtuipiao(fstream&f);
voidsearchbynumber(fstream&f);voidsearchbybeginplace(fstream&f);voidsearchbyendplace(fstream&f);voidluru(fstream&f);
voidzengjia(fstream&f);voidxiugai(fstream&f);
voidliulan(fstream&f);voidpaixu(fstream&f);
friendostream&operator<<(ostream&out,constTicket&t);//定义重载输出运算符的友元函数
boolfindno(charn[])//用于判断输入的字符串是否与查找区域中的
某个字符串一致
}
{
}
{
if(strcmp(no,n)==0)returntrue;
else
returnfalse;
boolfindname_b(charn[])
if(strcmp(name_b,n)==0)returntrue;
else
returnfalse;
boolfindname_e(charn[])
{
if(strcmp(name_e,n)==0)
returntrue;else
returnfalse;
}
};
ostream&operator<<(ostream&out,constTicket&t)//打印车次表格
{
if(t.minute>=10)
{
out<"<"<<<""<"<}
else
{out<"<<"0"<"<<<""<"<
}
}
returnout;
voidTicket:
:
liulan(fstream&f)
{
终点站"<<""
while(!
f.eof())
inti=0;
structtm*local;longt;
time(&t);
local=localtime(&t);
cout<<"车次"<<""<<"发车时间"<<""<<"起点站"<<""<<"
<<"行车时间"<<""<<"额定载量"<<""<<"余票数量"<:
end);
intb=f.tellg();f.seekg(0,ios:
:
beg);inta=f.tellg();
intc=(b-a)/sizeof(Ticket);//获得文件内包含的班次信息总数
Ticket*T=newTicket[c];
f.read((char*)&T[i++],sizeof(Ticket));
for(intj=0;j{
if((local->tm_hour>T[j].hour)||(T[j].hour==local->tm_hour)&&(local->tm_min>T[j].minute))
{
cout<"<}
else
{
cout<}
}
}
voidTicket:
:
shoupiao(fstream&f)
{
constintNUM=sizeof(Ticket);
intn;
longt;
charm[20];TicketT;
structtm*local;
cout<<"请输入售票的数目:
"<cin>>n;
cout<<"请输入售票的班次:
"<>m;
time(&t);
local=localtime(&t);f.seekg(0,ios:
:
beg);//从文件头开始boolfd=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{
T.yupiao-=n;
f.seekg(-1*NUM,ios:
:
cur);//从当前位置向前移动
(-1*sizeof(Ticket))个字节
f.write((char*)&T,NUM);
cout<<"已售出"<"<}
else
cout<<"该车次已发出!
"<}
}
}
if(!
fd)
else
cout<<"票已售完!
"<cout<<"未找到该车次信息!
"<}
voidTicket:
:
tuipiao(fstream&f)
{
constintNUM=sizeof(Ticket);
intn;
longt;
charm[20];TicketT;
structtm*local;
cout<<"请输入退票的数目:
"<cin>>n;
cout<<"请输入退票的班次:
"<>m;
time(&t);
local=localtime(&t);
f.seekg(0,ios:
:
beg);//把文件指针移到文件头
boolfd=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)>3
0)
{
T.yupiao+=n;
f.seekg(-1*NUM,ios:
:
cur);//从当前位置向前移动
(-1*sizeof(Ticket))个字节
f.write((char*)&T,NUM);//更新退票后的班次信息
cout<<"已退"<"<}
else
cout<<"退票失败!
"<}
}
if(!
fd)
cout<<"未找到该车次信息!
"<}
voidTicket:
:
paixu(fstream&f)
{
inti=0;f.seekg(0,ios:
:
end);
intb=f.tellg();
f.seekg(0,ios:
:
beg);//把文件指针移到文件头
inta=f.tellg();
intnum=(b-a)/sizeof(Ticket);//得到文件内班次信息总数numTicket*t=newTicket[num+1];
Ticket*T=newTicket[num+1];for(i=0;i{
f.read((char*)&t[i],sizeof(Ticket));
}
for(i=0;i{
if(((t+i)->hour>(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;ifil.open("d:
\\sort.dat",ios:
:
in|ios:
:
out|ios:
:
binary);//创建
并打开二进制文件"sort.dat"for(i=0;ifil.close();
}
voidTicket:
:
searchbynumber(fstream&f)
{
charn[10];Tickett;
cout<<"请输入你要查找的班次号:
"<>n;
f.seekg(0,ios:
:
beg);boolfd=false;while(!
f.eof()&&!
fd)
{
f.read((char*)&t,sizeof(Ticket));if(fd=t.findno(n))
{
"<<"终点站"<<""
cout<<"车次"<<""<<"发车时间"<<""<<"起点站"<<"
<<"行车时间"<<""<<"额定载量"<<""<<"余票数量"<}
}
if(!
fd)
cout<<"未找到该车次信息!
该车次不存在或已发出!
"<}
voidTicket:
:
searchbybeginplace(fstream&f)
{
charn[10];Tickett;
cout<<"请输入你要查找的班次的起点站:
"<>n;
f.seekg(0,ios:
:
beg);boolfd=false;while(!
f.eof()&&!
fd)
{
f.read((char*)&t,sizeof(Ticket));if(fd=t.findname_b(n))
{
"<<"终点站"<<""
cout<<"车次"<<""<<"发车时间"<<""<<"起点站"<<"
<<"行车时间"<<""<<"额定载量"<<""<<"余票数量"<cout<}
}
if(!
fd)
cout<<"未找到该车次信息!
该车次不存在或已发出!
"<}
voidTicket:
:
searchbyendplace(fstream&f)
{
charn[10];Tickett;
cout<<"请输入你要查找的班次的终点站:
"<cin>>n;f.seekg(0,ios:
:
beg);boolfd=false;while(!
f.eof()&&!
fd)
{
f.read((char*)&t,sizeof(Ticket));if(fd=t.findname_e(n))
{
"<<"终点站"<<""
cout<<"车次"<<""<<"发车时间"<<""<<"起点站"<<"
<<"行车时间"<<""<<"额定载量"<<""<<"余票数量"<}
}
if(!
fd)
cout<<"未找到该车次信息!
该车次不存在或已发出!
"<}
voidTicket:
:
luru(fstream&f)
{
intnum;inti;
cout<<"请输入你要录入的班次信息数量:
"<>num;
Ticket*t=newTicket[num];
cout<<"请依次输入"<for(i=0;i{
cin>>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;if.write((char*)&t[i],sizeof(Ticket));
}
voidTicket:
:
zengjia(fstream&f)
{
intnum;inti;
cout<<"请输入你要增加的班次信息数量:
"<>num;
Ticket*t=newTicket[num];
cout<<"请依次输入"<for(i=0;i{
cin>>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;if.write((char*)&t[i],sizeof(Ticket));
}
voidTicket:
:
xiugai(fs