票务管理系统程序的设计说明.docx
《票务管理系统程序的设计说明.docx》由会员分享,可在线阅读,更多相关《票务管理系统程序的设计说明.docx(47页珍藏版)》请在冰豆网上搜索。
票务管理系统程序的设计说明
程序设计报告
〔2014/2015学年第一学期〕
题目:
票务管理系统
专业理工科强化班
组长学号某某
组员学号某某
指导教师
指导单位计算机学院软件教学中心
日期2014年10月23日
成员分工
组长〔〕
主要负责类的建立、车票类链表与链表相关功能的实现和主函数主题的构建,扩展功能的实现,撰写设计报告。
组员〔〕
主要负责输入输出流的控制以与文件流的实现,与相关资料的查找与收集,撰写设计报告。
组员〔〕
主要负责购票、售票、与改签功能的实现,与对应数据的读写,撰写设计报告。
评分细如此
评分项
优秀
良好
中等
差
遵守机房规章制度
上机时的表现
学习态度
程序准备情况
程序设计能力
团队合作精神
课题功能实现情况
算法设计合理性
用户界面设计
报告书写认真程度
内容详实程度
文字表达熟练程度
回答如下问题准确度
简短评语
教师签名:
年月日
评分等级
备注
评分等级共五种:
优秀、良好、中等、与格、不与格
票务管理系统的实现
一、课题容和要求
票务管理系统
一课题内容和要求
〔1〕录入班次信息(信息用文件保存),可随时增加新车次数据
〔2〕浏览班次信息,可显示出所有车次当前状况(显示车辆是否发出的提示信息)。
〔3〕查询路线:
可按班次号、终点站查询售票情况。
〔4〕根据发车时间给出顺序的发车时间表,存入文件保存〔sort.dat〕。
〔5〕售票和退票功能
当查询出已定票人数小于额定载量且当前系统时间小于发车时间时才能售票,自动更某某票数量。
退票时,输入退票的班次,当本车次发出前半小时才可以退票,自动更新已售票人数。
〔6〕改签功能
改签时,输入改签目标班次,退原来的票,功能实现见上。
2、扩展功能要求
〔1〕角色区分:
以上的功能〔1〕只有管理员凭密码才能操作;其余所有的功能管理员和普通访客均可操作。
〔2〕管理员提供密码找回服务。
〔3〕每人限购置一X。
二、需求分析
票管理系统的功能框架图如图1、2所示。
(1)提供一个入口,针对用户和管理员,可分别选择登录方式并进展操作。
(2)通过数据库文件对车票信息与提示信息进展管理、储存、输入和输出;
车票管理系统〔用户〕
主菜单
浏览总班次信息
按发车时间和目的地查询班次
按发车时间顺序显示班次
购票
、
退票
、
改签
按目的地查询班次
图1功能框架图
车票管理系统〔管理员〕
主菜单
增加班次信息
图2功能框架图
三、概要设计
1主要的类内变量的定义和函数的声明:
classchepiao
{
public:
stringCC,QD,ZD;//车票类的数据成员车次,起点站,终点站
intFCSJh,FCSJm,XCSJ,EDZL,YPSL;//车票类的数据成员发车时间〔小时〕、〔分钟〕、行车时间、额定载量、余票数量
chepiao*left;//链表的指针
chepiao(stringA,intAA,intAA2,stringAAA,stringAAAA,intAAAAA,intAAAAAA,intAAAAAAA)
{
CC=A;FCSJh=AA;FCSJm=AA2;QD=AAA;ZD=AAAA;XCSJ=AAAAA;EDZL=AAAAAA;YPSL=AAAAAAA;left=NULL;
}
chepiao()
{
left=NULL;
}
};
函数:
voidFind(chepiao*start);//按目的地和车次查询车票信息
voidSort(chepiao*start);//按发车时间排序车票信息
voidBuy(chepiao*start);//购票操作
voidBuy2(chepiao*start);//改签中的购票操作
voidRefund(chepiao*start);//退票操作
voidRefund2(chepiao*start);//改签中退票操作
voidDelete(chepiao*start);//释放内存中车票所占空间
voidShow1();//输出欢迎的选择界面
voidShow2();//输出用户的选择界面
voidShout();//防“熊孩子〞设定
voidGetpassword();//读入文件中的密码
voidResetpassword();//将修改的密码重新读入文件储存
boolCheck();//是否买过票检查
voidSetnumber();//记录买过票的某某
stringinnumber;//记录某某号
boolmp=false;//判断是否能购置
stringpassword;//临时储存读入的密码和修改的新密码
intsj;//当前的小时数*60+分钟数,用于时间比拟
intsj2;//车票的发车时间的小时数*60+分钟数,用于时间比拟
boolgq=false;//用于传递改签过程中第一步购票是否成功的信息
stringname="admin";//默认的管理员账号
stringQ1="中国某某找南邮";//默认的管理员密保问题
2主要函数流程图
四、源程序代码
#include
#include
usingnamespacestd;
intsum=0;
classchepiao
{
public:
stringCC,QD,ZD;//车票类的数据成员车次,起点站,终点站
intFCSJh,FCSJm,XCSJ,EDZL,YPSL;//车票类的数据成员发车时间〔小时〕、〔分钟〕、行车时间、额定载量、余票数量
chepiao*left;//链表的指针
chepiao(stringA,intAA,intAA2,stringAAA,stringAAAA,intAAAAA,intAAAAAA,intAAAAAAA)
{
CC=A;FCSJh=AA;FCSJm=AA2;QD=AAA;ZD=AAAA;XCSJ=AAAAA;EDZL=AAAAAA;YPSL=AAAAAAA;left=NULL;
}
chepiao()
{
left=NULL;
}
};
#include"车票类.h"
#include
#include
usingnamespacestd;
voidFind(chepiao*start);//按目的地和车次查询车票信息
voidSort(chepiao*start);//按发车时间排序车票信息
voidBuy(chepiao*start);//购票操作
voidBuy2(chepiao*start);//改签中的购票操作
voidRefund(chepiao*start);//退票操作
voidRefund2(chepiao*start);//改签中退票操作
voidDelete(chepiao*start);//释放内存中车票所占空间
voidShow1();//输出欢迎的选择界面
voidShow2();//输出用户的选择界面
voidShout();//防“熊孩子〞设定
voidGetpassword();//读入文件中的密码
voidResetpassword();//将修改的密码重新读入文件储存
boolCheck();//是否买过票检查
voidSetnumber();//记录买过票的某某
stringinnumber;//记录某某号
boolmp=false;//判断是否能购置
stringpassword;//临时储存读入的密码和修改的新密码
intsj;//当前的小时数*60+分钟数,用于时间比拟
intsj2;//车票的发车时间的小时数*60+分钟数,用于时间比拟
boolgq=false;//用于传递改签过程中第一步购票是否成功的信息
stringname="admin";//默认的管理员账号
stringQ1="中国某某找南邮";//默认的管理员密保问题
intmain()
{
Getpassword();
intways;//登陆方式
Show1();
cin>>ways;
if(ways==1)
{
stringinname;//键盘输入的管理员账号
stringinpassword;//用于键盘输入管理员密码
stringinQ1;//用于键盘输入管理员密保问题
charbbb='N';//用于键盘输入是否使用密保问题
intaaa=1;//用于循环,每三次密码错误,提示一次是否使用密保问题
booljudge=false;//用于判断是否输入正确
cout<<"请输入管理员账号:
";
cin>>inname;
if(inname==name)
judge=true;
else
{
while(!
judge)
{
cout<<"输入错误,请重新输出管理员账号:
";
cin>>inname;
if(inname==name)
judge=true;
}
}
judge=false;
cout<<"请输入管理员密码:
";
cin>>inpassword;
if(inpassword==password)
judge=true;
else
{
while(!
judge)
{
if(aaa%3==0)
{
cout<<"是否使用密保问题重置密码?
〔Y/N〕";
cin>>bbb;
if(bbb=='Y'||bbb=='y')
{
cout<<"编程技术哪家牛?
"<cin>>inQ1;
if(inQ1==Q1)
{
cout<<"回答正确!
请输入新密码"<cin>>password;
Resetpassword();
cout<<"请牢记密码"<break;
}
else
{
cout<<"密保问题验证失败。
"<}
}
}
cout<<"密码错误,请重新输入管理员密码:
";
cin>>inpassword;
aaa++;
}
}
//*****************************分割线**********************************
//*****************************分割线**********************************
ofstreamfout("number.dat",ios:
:
out|ios_base:
:
app);//定义输出数据流,以输出方式打开,打开位于文件尾
if(!
fout)
{
cerr<<"openerror!
"<exit
(1);
}
//*****************************分割线**********************************
//*****************************分割线**********************************
stringa,b,c;//用于储存即将输入的车票的车次、起点和重点
intd1,d2,e,f,g;//用于储存即将输入的发车时间小时、分钟、行车时间、额定载量、余票数量
cout<<"请输入需要增加的车票数"<intx,i;//用于循环判断是否输入完毕
cin>>i;
cout<<"请逐个输入车票的如下信息"<cout<<"车次发车时间〔小时〕发车时间〔分钟〕起点站终点站行车时间额定载量余票数量"<for(x=0;x
{
cin>>a>>d1>>d2>>b;
cin>>c>>e>>f>>g;
fout<fout<<"";
fout<fout<<"";
fout<fout<<"";
fout<
fout<<"";
fout<fout<<"";
fout<fout<<"";
fout<fout<<"";
fout<fout<<"";
}
cout<<"录入成功"<
//*****************************分割线**********************************
//*****************************分割线**********************************
fout.close();//关闭文件
return0;
}
elseif(ways==2)
{
chepiaocp;//车票类链表的第一个空链对象,仅为了方便操作,无实际意义
chepiao*start=&cp;//用于储存链表头
chepiao*p=start;//用于对链表进展操作
//*****************************分割线**********************************
//*****************************分割线**********************************
structtm*newtime;//时间类对象
time_tlong_time;
time(&long_time);//Gettimeaslonginteger
newtime=localtime(&long_time);
inth=newtime->tm_hour;//得到当前时间的小时
intm=newtime->tm_min;//得到当前时间的分钟
sj=60*h+m;
//*****************************分割线**********************************
//*****************************分割线**********************************
ifstreaminfile("number.dat",ios:
:
out);//定义输入数据流,以输入方式打开
if(!
infile)
{
cerr<<"openerror!
"<exit
(1);
}
chepiao*q=start;//用于对链表进展操作
intnum=1;//用于记录这是读入的第N个数据,用于判断数据类型
stringy;//用于记录第一个读入的车次
for(;;num++)
{
if(num%8==1)
if(!
(infile>>y))
break;
else
{
q->left=newchepiao[1];
sum++;
q=q->left;
q->CC=y;
}
switch(num%8)
{
case2:
infile>>q->FCSJh;break;
case3:
infile>>q->FCSJm;break;
case4:
infile>>q->QD;break;
case5:
infile>>q->ZD;break;
case6:
infile>>q->XCSJ;break;
case7:
infile>>q->EDZL;break;
case0:
infile>>q->YPSL;break;
}
}
infile.close();//关闭文件
//*****************************分割线**********************************
//*****************************分割线**********************************
intyh;//用于读入用户需要的操作的序号
while
(1)
{
Show2();
cin>>yh;
switch(yh)
{
case1:
Output();break;
case2:
Find(start);break;
case3:
;Sort(start);Write2(start);Output2();break;
case4:
if(Check()){Buy(start);}if(mp){Setnumber();}Write(start);break;
case5:
Refund(start);Write(start);break;
case6:
Buy2(start);if(gq){Refund2(start);}Write(start);gq=false;break;
case7:
break;
default:
Shout();system("pause");return0;
}
if(yh==7)
{
Delete(start);
break;
}
}
return0;
}
else
{
Shout();
system("pause");
}
return0;
}
//*****************************分割线**********************************
//*****************************分割线**********************************
voidWrite(chepiao*start)
{
chepiao*p=start->left;//用于对链表进展操作
ofstreamfout("number.dat",ios:
:
out|ios:
:
trunc);//定义输出数据流,清空并打开
if(!
fout)
{
cerr<<"openerror!
"<exit
(1);
}
while(p!
=NULL)
{
fout<CC<<""<FCSJh<<""<FCSJm<<""<QD<<""<ZD<<""<XCSJ<<""<EDZL<<""<YPSL<p=p->left;
}
fout.close();//关闭文件
}
//*****************************分割线**********************************
//*****************************分割线**********************************
voidWrite2(chepiao*start)//本函数内各变量作用同前
{
chepiao*p=start->left;
ofstreamfout("sort.dat",ios:
:
out|ios:
:
trunc);//定义输入数据流,清空并打开
if(!
fout)
{
cerr<<"openerror!
"<exit
(1);
}
while(p!
=NULL)
{
fout<CC<<""<FCSJh<<""<FCSJm<<""<QD<<""<ZD<<""<XCSJ<<""<EDZL<<""<YPSL<p=p->left;
}
fout.close();//关闭文件
}
//*****************************分割线**********************************
//*****************************分割线**********************************
voidSort(chepiao*start)
{
chepiao*L;//用于链表排序的交换步骤
chepiao*M;//用于
chepiao*N;//用于
inti,j;//用于排序
L=start;
M=start->left;
N=M->left;
for(i=0;i{
for(j=0;j{
if(((M->FCSJh*60)+M->FCSJm)>((N->FCSJh*60)+N->FCSJm))
{
if(N->left!
=NULL)
{
L->left=N;
M->left=N->left;
N->left=M;
L=N;
M=L->left;
N=M->left;
}
else
{
L->left=N;
N->left=M;
M->left=NULL;
continue;
}
}
else
{
if(N->left!
=NULL)
{
L=M;
M=L->left;
N=M->left;
}
else
{
continue;
}
}
}
L=start;
M=L->left;
N=M->left;
}
}
//*****************************分割线**********************************
//*****************************分割线**********************