车票管理系统课程设计报告书
发布时间:2024-11-21
发布时间:2024-11-21
车票管理系统课程设计报告书
合肥学院
计算机科学与技术系
课程设计报告
2010~2011学年第二学期
课学学专指
业导
班教生
姓
程名号级师
C++课程设计车票管理系统汪青松100403101010网络工程1班项响琴、徐静
课程设计名称
2011年6月
车票管理系统课程设计报告书
目录
一需求分析......................................................二算法设计......................................................三用户手册......................................................四调试及测试..................................................五小结..............................................................六参考文献......................................................226788
车票管理系统课程设计报告书
一、需求分析
为了便于车站管理部门对汽车班次信息的统计和管理,提高车站部门的工作效率,能够更好的为市民服务,同时也便于旅客了解相关的信息,方便出行,设计一个车票管理系统,该系统对车票信息进行管理和维护。要求:
(1)录入班次信息(信息用文件保存),可不定时地增加班次数据
(2)浏览班次信息,可显示出所有班次当前状总(如果当前系统时间超过了某班次的发车时间,则显示“此班已发出”的提示信息)。(3)查询路线:可按班次号查询,可按终点站查询(4)售票和退票功能
A:当查询出已定票人数小于额定载量且当前系统时间小于发车时间时才能售票,自动更新已售票人数
B:退票时,输入退票的班次,当本班车未发出时才能退票,自动更新已售票人数
二、算法设计
1.设计思想:A.
bus
-*head:bus++++++++++++++
input():voidappend():void
voidmodify():voidvoiddel():void
idfind(**p:bus,n:int):bool
endfind(**p:bus,e:string):boolsearch():voidshow():voidorder():voidreorder():voidfload():voidsave():voidmenu():voidmenu_1():void
-------+++++++++++++
id:int
start:stringend:stringts:datetime:doublemax:intorder:int
*next:busbus()~bus()
load(in:ifstream&):voidoutput():void
write(out:ofstream&):voidordert(n:int)voidreordert(n:int):voidjudge():boolgetid():intgetmax():intgethave():intgetend():string
图2link类UML图
bus
图1bus类UML图
车票管理系统课程设计报告书
B.数据结构:自定义数据类型:Structdate:
在bus类实现过程中定义了时间date结构体类型,其中包括hour和minute成员,用来表示车次的发车时间。
C.算法设计:
a.载入函数(链表创建):利用fload进行链表创建时,首先*p=head(head->next为NULL),然后q=newbus;再读入数据信息,p->next=q;q->next=NULL;指针后移p=p->next;b.追加信息:先将整个链表从头开始走到尾,p->next==NULL结束,q=p->next找到最后一个节点时,再调用input函数录入车次信息增加到q,并且q->next=NULL结束;
c.删除信息:
从链表头开始扫描整张表,利用函数idfind判断是否找到车次信息,如果找到则*p=q记下当前找到的节点,然后del函数中利用q=p->next;p->next=q->next;将p->next断掉,然后删除q;d.修改信息:
同上,找到节点后,利用input对该节点信息进行重写;
2.各类中的成员函数:Classbus中的各成员函数
录入车次信息(数据操作):voidinput();
函数形参为空,返回类型为void
主要实现对bus类中的私有数据成员的数据录入功能;从文件中载入信息(数据操作):voidload(ifstream&in);
函数形参为输入流对象,返回值类型为void
从文件中读取数据对bus类中的私有数据成员进行初始化;输出车次信息(数据操作):voidoutput();
将bus类中的私有数据成员按照一定格式输出到显示器上;写入文件中(数据操作):voidwrite(ofstream&out);
函数形参为输出流对象,返回值类型为void将车次信息写入到文本文档中;
车票管理系统课程设计报告书
订票、退票:
voidordert(intn);voidreordert(intn);
函数形参为票的数量,返回类型为void
订、退票函数对私有成员已定票数order进行加减;
判断是否已经发车:booljudge();
函数形参为空,返回类型bool类型
根据车次的发车时间与系统时间进行对比,判读本班车是否已经发车,如果已经发车返回0,如未发车返回1;获取班次:
intgetid(){returnid;};获取额定量:
intgetmax(){returnmax;};获取已定票数:
intgethave(){returnorder;};获取终点站:
stringgetend(){returnend;};Link类中的成员函数
追加信息函数:voidappend();
函数形参为空,返回值为void
根据用户需求可以在车次信息的结尾调用input()新增加车次信息,并根据用户选择是否继续执行添加信息;
修改车次信息函数voidmodify();
函数形参为空,返回值为void
先根据用户提供的车次,然后调用idfind(bus**p,intn)函数在所有车次信息中查找,如果找到该车次信息,则再次调用input()重新为此节点录入车次信息;
删除车次信息函数:voiddel();
函数形参为空,返回值为void
根据用户提供的车次信息,在总信息中删除此车次的信息;根据车次查询函数:
车票管理系统课程设计报告书
boolidfind(bus**p,intn);
函数形参为**p和车次n,返回值为bool类型
由用户给出需要查询车次信息和链表首地址,然后进行整张表对车次进行查找,如果找到用户所提供的车次,输出该车次详细信息,记下当前节点并且输出需要查询车次的信息,返回true,否则返回false;
根据终点查询函数:
boolendfind(bus**p,stringe);
函数形参为**p和车次n,返回值为bool类型
由用户给出需要查询终点信息和链表首地址,然后进行整张表班车信息中的终点进行查找,如果找到用户所提供的站点信息,输出该车次的详细信息,返回true,否则返回false;
查询车票信息函数voidsearch();
函数形参为空,返回类型为viod
实现用户自己选择按照车次查找或是按照终点查处,并且相应的由用户输入车次信息或终点信息,再相应的调用idfind(bus**p,intn)和endfind(bus**p,stringe)再链表中查找信息
显示所有车票信息函数:voidshow();
函数形参为空,返回类型为void输出全部的班车详细车次信息,且函数中调用bus类中的judge()函数判断当前车次是否已经出发,如果出发则输出“该车次已经出发”提示订票函数:voidorder();
函数形参为空,返回类型为void
该函数首先读取用户提供的终点信息,并调用endfind函数搜索,列出车次信息后,再从用户读取需要订购的车次和所需要订购的票数n,调用bus类中的order订票函数将私有成员已订购的票数order加n
退票函数:
voidreorder();
函数形参为空,返回类型为void
该函数首先从用户读取需要退订车票的车次信息,然后调用idfind函数搜索车次是否存在,如果存在再调用judge函数判断退订车次是否已经发车,如果未发车,再比较该车次所剩余票数max-order与所需退订的票数accout的关系,如果所需退订的票数大于剩余票数,则提示只能退订剩余的票数数目
文件加载函数:voidfload();
函数形参为空,返回类型为void
打开文本文档,从中读取车次信息,结束后返回主菜单
车票管理系统课程设计报告书
写入文件函数:voidsave();
函数形参为空,返回类型为void
函数将链表中所存储的全部车次信息写到指定的文本文档中菜单函数:
voidmenu();//菜单
函数形参为空,返回类型为voidvoidmenu_1();//一级子菜单函数形参为空,返回类型为void
3、实现情况:
(1)系统可以实现手动添加或者从文件中读取车次信息,本系统初始化使默认从文档中读取车次信息,之后可以随时添加车次信息,操作的同时还可以实现修改和删除车次信息;
(2)系统可以浏览全部车次信息,输出信息的同时可以提示已经发车的班次,同时可以将所有车次信息导出;
(3)系统可以根据用户提供的车次或者目的地进行查询并反馈给用户;(4)系统可以先根据用户提供的目的地信息检索出所有班次的车,然后由用户选择,并且当前售票数大于额定数时以或超过发车时间时,停止本班次车售票。系统同时可以根据用户提供的班次信息提供退票服务,当提供的班次已经发车,系统不受理退票任务。
三、用户手册
该系统是出了对班车的各种信息进行管理和维护,并可以实简单的订票和退票功能
1、系统说明:系统首先从文本文档中读取车次信息,文本文档中的的车次信息应按照车次(类型:int)发车时间小时(类型:int0-24之间)发车时间分钟(类型:int0-60之间)起始站(类型:字符串)终点站(类型:字符串)行车用时(类型:int)额定载量(int)2、车次信息操作
A.增加车次信息需要您提供需要增加的车次信息并且相应的按照上面的数据顺序和格式进行手动录入信息;
B.修改车次信息也是需要您提供已有的车次信息并且相应的按照上面的数据顺序和格式手动录入信息;
C.删除车次信息需要你提供已有的车次
3、订票功能:首先需要您提供目的地信息,然后帮您检索可供选择的车次,之后再提供所用乘用的车次和所需要订购的票数
4、退票功能:需要您首先提供需要退订票的车次信息及退订票的数量。说明:如果所退车次已经发车,本系统不受理退票服务;所退票数大于剩余座位数,系统
车票管理系统课程设计报告书
只能提供剩余座位数订票服务。
四、调试及测试
1、调试过程中遇到的问题:
(1)类中的成员函数的操作不能从链表的头部开始,*head指针不能被所有成员函数所共享
之后将*head定义bus类中的静态数据成员,然后再类外初始化,这样类中的全部成员函数就可以共享头指针,但是在定义和初始化过程中出现了问题,随后将load定义为创建链表的函数从文件中读取信息并且返回head,在各个成员函数中定义对象时将直接利用load函数对首地址进行初始化,但是随后订票函数和退票函数出现问题并且报错不是一个函数体,停止编译,于是又将链表操作独立出了,重新定义了一个新类link,将head作为私有成员,所有操作功能定义为link类的成员函数,这样各成员函数就可以轻松访问head了,从而对整个链表进行操作了;
(2)增加、删除和修改功能出错
增加、删除和修改操作都时利用链表对单个节点操作并且都是要求用户手动录入各组信息,开始经常出现增加、删除和修改稿错位状况。分析原因:Load函数从文件中读取车次信息创建的时带有头指针head的链表,而再增删改成员函数中首先都时用指针p指向head,接下来的操作应该时从p->next开始,并且对整张链表进行扫描时也是判断p->next的数据空否;
(3)链表创建后,输出整张表信息或写入文本文档,总是多了一组数据在利用show函数输出整张链表中的车次信息时,总是在最后多出一组随机数,开始以为是show函数中链表的移动出现错误,但是写入到文件中也出现了同样的状况,反复画图理解确定所有操作都是对p->next进行的,随后又想到是不是链表创建出现错误,于是直接在创建函数中加入了输出函数进行验证,果真出现再链表创建过程中,经过老师的帮助下找到了问题原因:文本文件最后出现了空格,这样链表创建读取时多读了一组数据,删除文档中空格,成功完整正确输出;
2、设计回顾分析:
拿到任务书后看到需求,首先就各个数据类型进行分析,想到的是将时间定义成结构类型,起始和终点站之间用string类表示,还有注意路程用时是小数,其次是设计各个功能,常见的增删改肯定要有,但是订票和退票功能麻烦,条件比较多,在订退票功能中由于判断条件众多,考虑将对条件的判断也写成成员函数封装到类中,方便各个成员函数间的调用。
其次,就是要求用链表操作,首先链表的创建也是类中一个各成员函数,将*next作为公有成员,将*head作为私有成员,准备在构造函数中对head进行初始化,但是老师说这种设计不行,head不会出现在此类中作为数据成员出现,于是尝试利用静态数据成员和用链表创建函数来带回head的方法,但最后都因订票函数无法识别而放弃,最终把链表操作从类中独立出来了,bus类的成员函数全部对车次所包含的信息数据成员进行操作。3、测试数据:
追加车次:52334合肥苏州345
车票管理系统课程设计报告书
查询车次:2黄山订票:黄山23退票:22
4、运行实例:见附录截图
五、小结
经过本次课程设计之后,深刻意识到面向对象的程序设计前类的设计的重要性,好的设计方式可以很好的服务于功能的实现,经过一星期的设计,最后参照现有的类的设计方式将这个小系统做出来了,基本可以正确实现要求的功能,并且多加入了删除、修改和导出信息的操作,但是按ESC退出这个功能自己不清楚为什么实现不了。
这个小系统目前来说还是由很多缺陷的,比如对数据的读入不能作很好的判读,比还有判读读入的数据是否符合要求类型、是否超出数据范围等,以及软件界面设计的不是太人性化等。
结束了这次的课程设计后,深深感觉到编写程序的艰辛,这次的课程设计不但学到的是专业知识,更重要的是明白了很多道理,在实际操作过程中,问题渐渐地突显,找到不足之处,努力完善才是最终的学习目的。在以后的学习道路上,自己要付出更多的努力了,增强自己的综合素质水平。
六、参考文献
[1]郑莉等编著《C++语言程序设计(第4版)》北京:清华大学出版社[2]苏小红等编著《C大学实用教程(第2版)》北京:电子工业出版社
附录:
1、源程序清单:
#include"fstream"
#include"iostream"#include"string"#include"time.h"#include"iomanip"#include"stdlib.h"#include"windows.h"#include"conio.h"usingnamespacestd;#defineNULL0structdate{
//时间
inthour;intminute;};
车票管理系统课程设计报告书
classbus{
intid;//班次号stringstart;//起点stringend;//终点datets;//发车时间
doubletime;//行车用时intmax;//额定载量intorder;//已定票数public:
bus*next;
bus(){order=0;};~bus(){};
voidinput();//录入车次信息voidload(ifstream&in);//从文件中载入信息voidoutput();//输出车次信息
voidwrite(ofstream&out);//写到文件中voidordert(intn);//订票voidreordert(intn);//退票
booljudge();//判断是否已经发车intgetid(){returnid;};//获取班次
intgetmax(){returnmax;};//获取额定量intgethave(){returnorder;};//已定票数stringgetend(){returnend;};//获取终点站};
//从键盘录入信息
voidbus::input(){
cout<<"\t\t\t请按照下面提示依次输入信息"<<endl;cout<<"\t\t\t请输入班次";
cin>>id;
cout<<"\t\t\t请输入发车时间(小时分钟)";lab1:cin>>ts.hour>>ts.minute;
if(ts.hour==24&&ts.minute<=60||ts.hour<24){
cout<<"\t\t\t请输入起点站和终点站(起点终点)";
cin>>start>>end;
cout<<"\t\t\t请输入行车所需时间";cin>>time;
cout<<"\t\t\t请输入额定载量";cin>>max;}
车票管理系统课程设计报告书
else{
cout<<"\t\t\t您输入的时间格式不对,请重新输入";gotolab1;}}
//输出信息到显示器
voidbus::output(){
cout<<"\t\t--------------------------------------------------------"<<endl;
cout<<"\t\t"<<setw(4)<<id<<setw(6)<<ts.hour<<":"<<ts.minute<<setw(6)<
<start<<setw(8)<<end<<setw(8)<<time<<setw(8)<<max<<setw(8)<<order;
cout<<endl;}
//从文件中载入信息
voidbus::load(ifstream&in){
in>>id>>ts.hour>>ts.minute>>start>>end>>time>>max;}
//写到文件中去
voidbus::write(ofstream&out){
out<<id<<""<<ts.hour<<":"<<ts.minute<<"
"<<time<<""<<max<<""<<order<<endl;
}
"<<start<<""<<end<<"
//订票函数
voidbus::ordert(intn){
order+=n;}
//退票函数
voidbus::reordert(intn){
order-=n;}
//判断本车次是否出发boolbus::judge(){
车票管理系统课程设计报告书
SYSTEMTIMEsys;//使用了windowsAPI函数
GetLocalTime(&sys);
if(sys.wHour<ts.hour||(sys.wHour==ts.hour&&sys.wMinute<=ts.minute))
return1;//比较当前时间与发车时间,获得班次的当前
状况,返回表示1班次未出发
else
return0;
}
classlink{
private:bus*head;public:
link(){
head=newbus;head->next=NULL;};
~link(){deletehead;};
voidinput();//录入车次信息voidappend();//追加信息
voidmodify();//修改车次信息voiddel();//删除车次信息
boolidfind(bus**p,intn);//根据车次查询车次是否存在
boolendfind(bus**p,stringe);//根据终点查询车次是否存在voidsearch();//查询车票信息voidshow();//显示所有车票信息voidorder();//订票voidreorder();//退票
voidfload();//从文件中读取voidsave();//文件保存车票信息voidmenu();//菜单
voidmenu_1();//一级子菜单};
//追加信息
voidlink::append(){
bus*p=head,*q;charop;
车票管理系统课程设计报告书
while(1){
while(p->next!=NULL){
p=p->next;}
q=newbus;
cout<<"\t\t\t请输入追加的信息"<<endl;q->input();p->next=q;q->next=NULL;
cout<<"\t\t\t增加信息完成";
cout<<"继续增加(Y),否则返回主菜单"<<endl;cin>>op;
if(op=='Y'||op=='y')
continue;else
menu();}
}//显示
voidlink::show(){
bus*p=head;charop;cout<<"\t\t
所有车次信息如下
"<<endl;
cout<<"\t\t--------------------------------------------------------"<<endl;
cout<<"\t\t班次发车时间起点站终点站行车时间额定载量已定票数
"<<endl;
do{
//未解决多输出了一组信息
if(!p->next->judge()){
车票管理系统课程设计报告书
cout<<"\t\t--------------------------------------------------------"<<endl;
cout<<"\t\t"<<setw(4)<<p->next->getid()<<"\t此班次已经出发
"<<endl;
}else
p->next->output();
p=p->next;}while(p->next!=NULL);
cout<<"\t\t\t退出系统(E),或者任意键返回主菜单:";cin>>op;switch(op){
case'R':menu();break;case'E':exit(1);
default:menu();break;}
}//修改
voidlink::modify(){
intn;
bus*p=head;
cout<<"\t\t\t请输入你要修改的车次";
cin>>n;
if(idfind(&p,n))
p->next->input();
cout<<"\t\t\t修改成功"<<endl<<endl<<endl;cout<<"\t\t\t信息更新为"<<endl;p->next->output();cout<<endl;}//删除
voidlink::del(){
bus*p=head,*q;intn;
车票管理系统课程设计报告书
strings;
cout<<"\t\t\t请输入你想删除的班次号";cin>>n;
if(!idfind(&p,n))
cout<<"\t\t\t你要删除的数据不存在"<<endl;cout<<"\t\t\t确认删除?(Y/N)";charop;cin>>op;
if(op=='Y'||op=='y'){
q=p->next;
//记下删除的节点位置
p->next=q->next;deleteq;}
cout<<"\t\t\t删除成功"<<endl;menu();
}
//判断查询信息是否存在boollink::idfind(bus**p,intn){
bus*q=head;boolflag=0;while(q->next){
if((q->next->getid())==n){
*p=q;//标记找到的节点位置
cout<<"\t\t--------------------------------------------------------"<<endl;
cout<<"\t\t班次发车时间起点站终点站行车时间额定载量已定票
数"<<endl;
q->next->output();}
q=q->next;flag=1;}
车票管理系统课程设计报告书
returnflag;}
boollink::endfind(bus**p,stringe){
bus*q=head;boolflag=0;while(q->next){
*p=q;//记下找到的节点位置
if(((q->next)->getend())==e){
cout<<"\t\t--------------------------------------------------------"<<endl;cout<<"\t\t班次发车时间起点站终点站行车时间额定载量已定票
数"<<endl;
(q->next)->output();}
q=q->next;flag=1;
}
returnflag;}
//查询车票信息voidlink::search(){
bus*p=head;intop,n;strings;
cout<<"\t\t\t1.按照班次查询"<<endl;cout<<"\t\t\t2.按照终点查询"<<endl;cout<<"\t\t\t3.返回上级菜单"<<endl;cout<<"\t\t\t请按照提示输入....";cin>>op;
switch(op){
case1:cout<<"\t\t\t请输入您要查询的班次:";
cin>>n;
if(!idfind(&p,n)){
cout<<"\t\t\t没有找到您要查询的班次信息"<<endl;}