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