车票管理系统毕业课程设计报告.docx
《车票管理系统毕业课程设计报告.docx》由会员分享,可在线阅读,更多相关《车票管理系统毕业课程设计报告.docx(40页珍藏版)》请在冰豆网上搜索。
车票管理系统毕业课程设计报告
(此文档为word格式,下载后您可任意编辑修改!
)
课程设计报告
2011~2012学年第二学期
课程
C++课程设计
课程设计名称
车票管理系统
学生姓名
刘吉喆
学号
专业班级
1210
指导教师
2013年9月17日星期二
一、系统的需求分析:
需求分析是一项重要的工作,也是最困难的工作。
它指对要解决的问题进行详细的分析,弄清楚问题的要求,包括需要输入什么数据,要得到什么结果,最后应输出什么。
可以说,“需求分析”就是确定要计算机“做什么”。
车票管理系统是典型的管理信息系统(MIS),其开发主要包括后台数据库的建立和维护以及前端应用程序的开发两个方面。
车票管理系统可以实现对车票的科学化、规范化、查询车票情况、定票信息、以及路线信息等。
车票管理系统是根据某车站对这票管理的实际情况进行编写的,主要目的是为了方便车站对车票的实际情况进行集中的查询与管理工作,以提高整个车站的工作。
经过电脑及生活的调查研究,根据车辆的运行状态和车站的管理模式,车票管理系统需要管理的东西主要有:
车辆的班次,车辆的线路,售票和退票等等。
车辆是一个对外服务的内容,为了乘客的乘车要求,所以系统需要实现售票信息的录入、修改和删除功能。
乘客对剩余车票需要进行选择,系统必须实现相应的查询和输出功能,使乘客择优而乘。
本次课程设计需要实现的是——车票管理系统的链表实现。
主要实现的功能包括:
车票信息的录入、修改、删除、剩余车票信息的查询、输出。
车票信息可写入文件,也可从文件中读取。
车票信息涉及的数据有班次号、发车时间、起点站、终点站、行车时间、额定载量、已定票人数等。
按照需求分析所得,车票管理系统有以下几个功能模块:
(1)录入班次信息(信息用文件保存),可不定时地增加班次数据
(2)浏览班次信息,可显示出所有班次当前状总(如果当前系统时间超过了某班次的发车时间,则显示“此班已发出”的提示信息)。
(3)查询路线:
可按班次号查询,可按终点站查询
(4)售票和退票功能
A:
当查询出已定票人数小于额定载量且当前系统时间小于发车时间时才能售票,自动更新已售票人数。
B:
退票时,输入退票的班次,当本班车未发出时才能退票,自动更新已售票人数。
(5)退出
在界面状态下,按下“ESC”会退出该系统。
返回源程序。
由上述需求分析可得,系统的功能模块图如图1所示。
图1系统功能模块图
二、系统的设计与实现
根据第一章的需求分析,接下来给出的是系统的设计和实现。
1、类的设计
根据上述需求分析,有车票信息类和链表类。
(1)车票信息类
系统研究车票系统Bus_infor类中成员:
Bus_order是班次编号,start[20]是车票信息的起点站,end[20]是车票信息的终点站,all_tickted是总共要发售的票数,tickted是已经被订购的票数,Hour_start,Minute_start是车票的发车时间,GoHour表示行车时间,构造函数Bus_infor(),析构函数~Bus_infor(),录入函数input(),读取函数input(ifstream&is),输出函数output(),写入函数output(ofstream&os),定票函数Order_tickt(intn),获取发车时间函数GetTime_start(),判断当前班次状况函数GetTime(),内联函数,返回额定载量Get_all_tickted(){returnall_tickted;},返回已定票人数Get_tickted(),返回班次号Get_bus_order(),返回终点站的字符串Get_end()const。
车票类的UML图如(图2)所示:
图2客房类的UML图
(2)链表类
在Bus_link类中,有成员:
构造函数Bus_link(),析构函数~Bus_link(),录入车票信息的函数input(),修改车票信息的函数mend(),删除车票信息的函数del(),查找函数find(Bus_infor**p,intnum,char*pn),查询车票信息found(),显示车票信息show(),定购车票信息Order(),退还车票信息Unorder(),保存车票信息save(),初始化车票信息begin(),清除函数clear(),关于车票信息about(),主菜单函数mainmenu(),设置系统修改标志voidsetkey(intk){key=k;},返回系统修改标志intgetkey(){returnkey;},头节点head,系统修改标志key,管理员登陆标志password。
链表类的UML图如(图3)所示:
2.界面设计:
分界面:
车票信息的查询的设计
提示进入查询界面,选择按班次查找或按终点站查询车票信息。
车票信息的查询界面如图所示。
分界面:
车票信息的删除的设计
在录入或修改错误的车票信息后,想删除错误的车票信息,按提示按提示输入班次号,程序会显示该班次的信息并提示用户是否确定删除,输入y则删除。
删除车票的信息界面如图所示。
修改车票信息的设计
按提示进行车票信息的修改,本系统中只有管理员身份才可以修改车票,显示屏幕如图所示。
分界面:
订购车票信息的设计
在管理员身份下按提示在剩余未出发的班次中,输出车票的信息,以判断是否可以订票,已出发的和已定票人数已满的情况下是不能订票的。
定购车票信息输出界面如图所示。
分界面:
退订车票信息的设计
在管理员身份下按提示在剩余未出发的班次中,输出车票的信息,以判断是否可以退票,已出发的和没人定票的情况下是不能退票的。
退定信息输出界面如图所示。
分界面:
介绍车票信息的设计
在程序中输出使用说明。
介绍信息界面如图所示。
3.关键程序代码的分析:
(1)系统的登录
在主函数中,先输出车票管理系统的欢迎界面。
调用一个对象的mainmenu函数来输出主菜单,按照提示选择需要执行功能的序号,由switch判断和选择所需要执行的功能。
选择1:
执行车票信息的录入;
选择2:
执行车票信息的浏览;
选择3:
执行查询车票信息;
选择4:
执行车票信息的删除;
选择5:
执行车票信息的修改;
选择6:
执行定购车票;
选择7:
执行退定车票;
选择8:
执行车票信息的保存;
选择9:
输出关于车票管理系统的信息;
选择0:
退出;
主函数:
intmain()
{
Bus_linkpp;
intk=1;
charc;
strings;
pp.begin();
cout<<"\n\n→→→→→→→→→→→→→→欢迎进入车票管理系统←←←←←←←←←←←←←←←←"<cout<<"*******************************************************************************"<<<"系统说明:
"<<<"*******************************************************************************"<<<"**\t本系统为课程设计作品,可以简易的进行车票管理,欢迎提出意见和建议!
**"<<<"**\t合肥学院计算机科学与技术系11网工二班\t**"<<<"**\t作者:
孙乐\t\t学号:
**"<<<"*******************************************************************************"<cout<<"\n\t\t是否进入系统?
\n\n\t\t按Enter进入主菜单,按Esc键退出:
";
do利用一个do-while循环来判断输入是否进入系统
{
c=getch();
if(c==27)
exit(0);
elseif(c==13)
break;
else
{
cout<<"\n\n\t\t按键错误!
请重新输入:
";
}
}while((c!
=13)||(c!
=27));
try
{
while(k==1)
{
system("cls");
s=pp.mainmenu();调用主菜单函数
switch(s[0])
{
case'1':
pp.input();break;录入车票信息
case'2':
pp.show();break;浏览车票信息
case'3':
pp.found();break;查询车票信息
case'4':
pp.del();break;删除车票信息
case'5':
pp.mend();break;修改车票信息
case'6':
pp.Order();break;保存车票信息
case'7':
pp.Unorder();break;退还车票信息
case'8':
pp.save();break;保存车票信息
case'9':
pp.about();break;关于车票系统
case'0':
cout<<"\n\t\t是否退出系统?
\n\n\t\t按Enter返回主菜单,按Esc键退出:
";
do利用一个do-while循环来判断输入是否退出系统
{
c=getch();
if(c==27)
{
k=0;
break;
}
elseif(c==13)
{
k=1;
break;
}
else
{
cout<<"\n\n\t\t按键错误!
请重新输入:
";利用循环防止误操作而引起的退出系统
}
}while((c!
=13)||(c!
=27));
break;
}
if(k==1)
{
cout<<"\n\t\t\t是否返回主菜单?
1.是0.不是:
";
cin>>k;
if(!
cin)
throwstring("数据输入错误");
cout<<"\n\t\t是否退出系统?
\n\n\t\t按Enter返回主菜单,按Esc键退出:
";
do利用一个do-while循环来判断输入是否退出系统
{
c=getch();
if(c==27)
{
k=0;
break;
}
elseif(c==13)
{
k=1;
break;
}
else
{
cout<<"\n\n\t\t按键错误!
请重新输入:
";利用循环防止误操作而引起的退出系统
}
}while((c!
=13)||(c!
=27));
}
if(k==0)
{
if(pp.getkey()==1)
{
cout<<"\t\t\t是否保存?
1.保存0.不保存:
";
cin>>k;
if(!
cin)
throwstring("数据输入错误");
if(k==1)
pp.save();
pp.clear();
k=0;
}
}
}
}
catch(strings)
{
cout<
"<system("pause");
}
return0;
}
在读取数据库中,可以从以有的文件中读取数据到程序中,避免了程序的重复输入数据,有利于后面的信息修改、删除等功能。
读取数据库:
voidBus_link:
:
begin()
{
password=0;
Bus_infor*p,*p2;
p=);文件以输入方式打开
if(!
is)
{
ofstreamos("bus.txt",ios:
:
out);文件以输出方式打开
os.close();关闭文件
return;
}
intnum=-1;
while
(1)
{
num=-1;
t=is.tellg();记录下当前位置
is>>num;
is.seekg(t);移动到原来位置
if(num<0)
{
is.close();
return;
}
p2=newBus_infor;
p2->input(is);输入is对象内容
p->next=p2;
p2->next=NULL;
p=p->next;
}
}
(2)信息的添加
车票信息的录入,创建Bus_infor类和Bus_link对象,调用构造函数,输入车票的班次、额定座位数、始发时间、行车时间、起始站与终点站、,通过input函数实现。
voidBus_link:
:
input()
{
if(password==1)
{
Bus_infor*p,*p2=NULL;
p==1;intn;
while(p->next)
p=p->next;
while(n)
{
p2=newBus_infor;
p2->input();
p->next=p2;
p2->next=NULL;
p=p->next;
Bus_link:
:
setkey
(1);
cout<<"\t\t\t按1继续,按0返回:
";
cin>>n;
if(!
cin)
throwstring("数据输入错误");
}
}
else
cout<<"\n\t\t对不起,游客不能录入车票信息"<}
voidBus_infor:
:
GetTime_start()
{
cout<<"请输入始发时间(时分):
";
while
(1)
{
cin>>Hour_start>>Minute_start;
if(cin.fail())判断输入的数据类型是否有错
{
cout<<"\n时间输入错误,请重新输入:
";
cin.clear();
cin.get();
}
elseif(Hour_start<0||Hour_start>24||Minute_start<0||Minute_start>60)
cout<<"\n时间格式出错,请重新输入:
";判断时间格式是否出错,小时不能小于大于24,分钟不能小于大于60
else
break;
}
}
voidBus_infor:
:
input()Bus_infor类中成员函数input的函数体
{
cout<<"\t\t\t按提示输入:
"<cout<<"输入班次:
";
while
(1)
{
cin>>Bus_order;
if(cin.fail())判断输入的数据类型是否有错
{
cout<<"\n班次输入错误,请重新输入:
";
cin.clear();清除刚才输入的数据
cin.get();重新输入
}
else
break;
}
cout<<"请输入车的额定座位数:
";
while
(1)
{
cin>>all_tickted;
if(cin.fail())判断输入的数据类型是否有错
{
cout<<"\n座位数输入错误,请重新输入:
";
cin.clear();
cin.get();
}
else
break;
}
GetTime_start();
cout<<"请输入行车时间:
";
while
(1)
{
cin>>GoHour;
if(cin.fail())判断输入的数据类型是否有错
{
cout<<"\n行车时间输入错误,请重新输入:
";
cin.clear();
cin.get();
}
else
break;
}
cout<<"请输入起始站与终点站:
";
cin>>start;cin>>end;
cout<<"是否清空售票(yn)?
";
chara;cin>>a;
if(a=='y'||a=='Y')tickted=0;
}
(3)信息的浏览
浏览客房信息,如果之前有文件信息,则直接输出,如果没有则需录入后才能输出。
所以,先得有一个读取函数begin,再有一个浏览函数show。
voidBus_link:
:
begin()
{
password=0;
Bus_infor*p,*p2;
p=);文件以输入方式打开
if(!
is)
{
ofstreamos("bus.txt",ios:
:
out);文件以输出方式打开
os.close();关闭文件
return;
}
intnum=-1;
while
(1)
{
num=-1;
t=is.tellg();记录下当前位置
is>>num;
is.seekg(t);移动到原来位置
if(num<0)
{
is.close();
return;
}
p2=newBus_infor;
p2->input(is);输入is对象内容
p->next=p2;
p2->next=NULL;
p=p->next;
}
}
voidBus_link:
:
show()
{
cout<<"*******************************************************************************"<<<"客车基本信息如下:
"<<<"*******************************************************************************"<<<"班次发车时间起点站终点站行车时间额定载量已定票人数当前状况"<<<"*******************************************************************************"<Bus_infor*p;
p=)
{
Bus_infor*p;
p=)
{
cout<<"客车基本信息如下:
"<<<"班次发车时间起点站终点站行车时间额定载量已定票人数当前状况"<(p->next)->output();
t=1;
}
p=p->next;
}
returnt;
}
voidBus_link:
:
mend()
{
if(password==1)
{
Bus_infor*p;
intnum;
charname[20];
cout<<"\t\t\t输入班次号:
";
cin>>num;
if(!
cin)
throwstring("数据输入错误");
if(!
find(&p,num,name))
{
cout<<"\t\t找不到你要修改的内容!
"<return;
}
(p->next)->input();
Bus_link:
:
setkey
(1);
}
else
cout<<"\n\t\t对不起,游客不能修改车票信息"<}
(5)信息的查询
按提示输入要查询的班次或者终点站,定义一个指向链表第一个节点的指针p。
如果指针创建成功,开始用while和if语句实现p指向的节点的班次与存在的班次比较。
如果相同,则输出车票的各个信息;如果没有相同,提示没有所查询的车票。
voidBus_link:
:
found()
{
Bus_infor*p;
intnum,n;
charname[20];
do
{
cout<<"\t\t1:
按班次查找,2:
按终点站查找:
";
cin>>n;
if(!
cin)
throwstring("数据输入错误");
}while(n<1||n>2);
if(n==1)
{
cout<<"\t\t\t输入班次:
";
cin>>num;
if(!
cin)
throwstring("数据输入错误");
}
if(n==2)
{
cout<<"\t\t\t输入终点站:
";
cin>>name;
}
if(!
find(&p,num,name))
{
cout<<"\t\t找不到你要查找的内容!
"<return;
}
}
(6)信息的删除
按提示输入要删除的班次,定义一个指向链表第一个节点的指针p。
如果指针创建成功,开始用while和if语句实现p指向的节点的班次与存在的班次比较。
如果相同,输出车票的各个信息并提示是否确定删除;如果没有相同,提示没有所查询的车票。
voidBus_link:
:
del()
{
if(password==1)
{
Bus_infor*p,*p2;
intnum;charname[20];
cout<<"\t\t\t输入班次号:
";
cin>>num;
if(!
cin)
throwstring("数据输入错误");
if(!
find(&p,num,name))
{
cout<<"\t\t找不到你要删除的内容!
"<return;
}
cout<<"\n\t\t\t确