车票管理系统.docx
《车票管理系统.docx》由会员分享,可在线阅读,更多相关《车票管理系统.docx(26页珍藏版)》请在冰豆网上搜索。
![车票管理系统.docx](https://file1.bdocx.com/fileroot1/2023-5/23/b2ab2020-bbba-4311-8552-aae7d96190ba/b2ab2020-bbba-4311-8552-aae7d96190ba1.gif)
车票管理系统
/*车票管理系统*/
#include//数据流输入输出
#include//字符串操作
#include//文件输入输出
#include//时间库函数
#include//输入输出格式符
usingnamespacestd;//命名空间
classBus_infor//车辆信息类
{
protected:
intnum;//班次
stringstart;//起点站
stringend;//终点站
intall_tickted;//额定载量
inttickted;//已定票人数
intHour,Minute;//发车时间
floatGoHour;//行车时间
public:
Bus_infor*next;
voidinput();//录入函数
voidinput(ifstream&infile);//读取函数
voidoutput();//输出函数
voidoutput(ofstream&outfile);//写入函数
voidOrder_tickt(intn);//定票函数
voidUnorder_tickt(intn);//退票函数
voidGo_start();//获取发车时间函数
boolGo();//判断当前班次状况函数
intGet_all_tickted(){returnall_tickted;}//返回额定载量
intGet_tickted(){returntickted;}//返回已定票人数
intGet_bus_num(){returnnum;}//返回班次号
stringGet_end();//返回终点站的字符串
};
classBus_do//信息处理类
{
public:
Bus_do(){head=newBus_infor;head->next=NULL;g=0;}//带参数的构造函数
~Bus_do(){deletehead;}//析构函数
voidinput();//录入车票信息
voidmend();//修改车票信息
voiddel();//删除车票信息
Bus_infor*find(intnum);//查找函数
Bus_infor*find(stringgold);
voidfound();//查询车票信息
voidshow();//显示车票信息
voidOrder();//定购车票信息
voidUnorder();//退还车票信息
voidsave();//保存车票信息
voidbegin();//初始化车票信息
voidclear();//清除函数
voidabout();//关于车票信息
charmainmenu();//主菜单函数
voidsetg(intk){g=k;}//设置系统修改标志
intgetg(){returng;}//返回系统修改标志
boolland();//管理员登陆
voidselect(int);//选择功能
private:
intg;//系统修改标志
Bus_infor*head;
};
Bus_dod;
voidBus_do:
:
about()//系统说明
{
system("cls");//清屏
cout<<<"──────────────────────────────"<cout<<"使用说明:
"<<<"\t1.请按照操作提示正确输入,以保证系统正常运行。
"<<<"\t2.管理员登陆时,需输入密码。
"<<<"\t3.车票信息保存于本程序目录下,可以参考。
"<<<"\t4.如果密码输入错误三次则系统自动退出,防止他人乱改信息导致系统瘫痪。
"<<<"\t5.录入信息后记得保存,系统不会自动保存。
"<<<"\t6.本系统并非对所有的误输都有恰当的处理,还请按提示输入。
"<<<"\t7.可以多次订票,班次也可以有多种。
"<<<"\t8.作者水平不高,还请多提建议,以便日后改进。
"<<<"──────────────────────────────"<}
boolBus_do:
:
land()//管理员登录
{
Bus_dob;//定义处理类对象
b.about();//输出系统说明
strings;
inti=0;//计数变量
cout<<"请输入管理员密码:
"<while
(1)
{
cin>>s;
if(s=="123456")//输入正确
returntrue;//返回正确
else//输错了
{
cout<<"输入密码错误,请重新输入:
";//输出提示信息
i++;//计数变量自加
if(i>=3)//连输三次错误
break;//跳出循环
}
}
cout<<"输入错误三次!
系统自动退出!
"<system("pause");//显示暂停
returnfalse;//返回错误
}
voidBus_do:
:
begin()//文件初始化链表
{
Bus_infor*p,*p2;//定义两信息类指针
p=head;//p指向头结点
ifstreaminfile("bus.txt",ios:
:
in);//文件以输入方式打开
if(!
infile)//文件打开失败
{
ofstreamoutfile("bus.txt",ios:
:
out);//若无此文件文件以输出方式打开为了建立新文档
outfile.close();//关闭文件
return;//函数调用结束
}
while(!
infile.eof())
{
p2=newBus_infor;
p2->input(infile);
p->next=p2;
p2->next=NULL;
p=p->next;
}
infile.close();
p=head;
while(p->next)
{
p2=p;
p=p->next;
}
p2->next=NULL;
}
voidBus_do:
:
select(intk)
{
chars;
d.begin();
while(k)
{
system("cls");//清屏
s=d.mainmenu();//调用主菜单函数
switch(s)
{
case'1':
d.input();break;//录入车票信息
case'2':
d.show();break;//浏览车票信息
case'3':
d.found();break;//查询车票信息
case'4':
d.del();break;//删除车票信息
case'5':
d.mend();break;//修改车票信息
case'6':
d.Order();break;//保存车票信息
case'7':
d.Unorder();break;//退还车票信息
case'8':
d.save();break;//保存车票信息
case'9':
d.about();break;//关于车票系统
case'0':
return;//退出系统
}
cout<<"\n\t\t\t是否返回主菜单?
1┄是0┄不是:
";
cin>>k;
}
}
voidBus_infor:
:
input()//无参输入函数用于录入班次信息
{
cout<<"请输入班次:
";//设置班次
while
(1)
{
cin>>num;//输入班次
if(cin.fail())//判断输入的数据类型是否有错
{
cout<<"\n班次输入错误,请重新输入:
";
cin.clear();//清除错误状态
cin.get();//重输
}
elsebreak;//输入正确则跳出循环
}
cout<<"请输入车的额定座位数:
";//设置额定座位
while
(1)
{
cin>>all_tickted;//输入额定座位
if(cin.fail())//判断输入的数据类型是否有错
{
cout<<"\n座位数输入错误,请重新输入:
";
cin.clear();//清除错误状态
cin.get();//重输
}
elsebreak;//输入正确则跳出循环
}
Go_start();//调用始发时间函数设置始发时间
cout<<"请输入行车时间:
";//设置行车时间
while
(1)
{
cin>>GoHour;
if(cin.fail())//判断输入的数据类型是否有错
{
cout<<"\n行车时间输入错误,请重新输入:
";
cin.clear();
cin.get();
}
elsebreak;
}
cout<<"请输入起始站:
";//设置起始站
while
(1)
{
cin>>start;
if(cin.fail())//判断输入的数据类型是否有错
{
cout<<"\n起点输入错误,请重新输入:
";
cin.clear();
cin.get();
}
elsebreak;
}
cout<<"请输入终点站:
";//输入终点站
while
(1)
{
cin>>end;
if(cin.fail())//判断输入的数据类型是否有错
{
cout<<"\n终点站输入错误,请重新输入:
";
cin.clear();
cin.get();
}
elsebreak;
}
cout<<"请输入已售票数:
";//输入已售票数
while
(1)
{
cin>>tickted;
if(cin.fail()||tickted>all_tickted)
{
cout<<"\n已售票数输入错误,请重新输入:
";
cin.clear();
cin.get();
}
elsebreak;
}
}
voidBus_infor:
:
input(ifstream&infile)//带参录入函数向链表输入
{
infile>>num>>Hour>>Minute>>start>>end>>GoHour>>all_tickted>>tickted;
}
voidBus_infor:
:
output()
{
cout<cout<(2)<"<(2)<cout<if(!
Go())//调用Go函数判断汽车状态
cout<<"\t此班已出发"<else
cout<<"\t此班未出发"<}
voidBus_infor:
:
output(ofstream&outfile)//向文件输出信息
{
outfile<<<<<<<<<}
voidBus_infor:
:
Go_start()//设置始发时间
{
cout<<"请输入始发时间(时分24h制):
";//输出提示信息
while
(1)
{
cin>>Hour>>Minute;
if(cin.fail())//判断输入的数据类型是否有错
{
cout<<"\n时间输入错误,请重新输入:
";
cin.clear();
cin.get();
}
elseif(Hour<0||Hour>24||Minute<0||Minute>60)
cout<<"\n时间格式出错,请重新输入:
";//判断时间格式是否出错,小时不能小于0大于24,分钟不能小于0大于60
else
break;
}
}
boolBus_infor:
:
Go()//判断汽车是否发出
{
structtm*local;//定义tm结构体指针
time_tt;//定义time_t类型指针
t=time(NULL);//初始化为空指针
local=localtime(&t);//获取当前系统时间,并赋值给local指针
if(local->tm_hourtm_hour==Hour&&local->tm_min<=Minute))returntrue;
else
returnfalse;//返回表示班次已出发
}
voidBus_infor:
:
Order_tickt(intn)//订票处理函数
{
tickted=tickted+n;//已定票数加上刚定票数
}
voidBus_infor:
:
Unorder_tickt(intn)//退票处理函数
{
tickted=tickted-n;//已定票数更改
}
stringBus_infor:
:
Get_end()//获取终点站
{
strings=end;
returns;//返回end
}
voidBus_do:
:
input()//向链表尾部录入车票信息
{
system("cls");//清屏
cout<<"当前车票销售信息:
"<Bus_do:
:
show();//调用show函数显示当前车辆信息
Bus_infor*p1,*p2=NULL;//定义对象指针
p1=head;//将头指针赋给p1
intn=1;//定义循环控制变量
while(p1->next)//当头结点后有数据时执行循环,头结点为空也不会执行循环
p1=p1->next;
while(n){
p2=newBus_infor;
p2->input();
p1->next=p2;p2->next=NULL;
p1=p1->next;
Bus_do:
:
setg
(1);
cout<<"\t\t\t按1继续,按0返回:
";cin>>n;
if(!
cin)
throwstring("输入错误");
}
}
voidBus_do:
:
show()//显示车辆信息
{
system("cls");//清屏
cout<<"客车基本信息如下:
"<<<"班次发车时间起点站终点站行车时间额定载量已定票人数当前状况"<Bus_infor*p;//定义车辆信息类对象指针
p=head;//指向链表头部,启用链表信息
while(p->next)//只要下一结点不为空则执行循环
{//此循环功能在于输出所有车辆信息
p=p->next;//P指向下一节点
p->output();//调用next所指对象的输出信息函数,头结点未存放数据只是初始化了next
}
}
voidBus_do:
:
found()//信息分类查找函数
{
system("cls");//清屏
intm,n;//定义辅助变量
stringgold;//定义字符串存放终点站
cout<<"\t\t1:
按班次查找,2:
按终点站查找:
";//输出提示信息
cin>>n;//输入选择
if(!
cin)
throwstring("输入错误");
if(n==1)//表示按班次查找
{
cout<<"\t\t\t输入班次:
";//输出提示信息
cin>>m;
if(!
cin)
throwstring("输入错误");
if(!
find(m))//调用find函数查找
{
cout<<"\t\t找不到你要查找的内容!
"<return;//函数调用结束
}
return;//函数调用结束
}
if(n==2)//表示按终点站查找
{
cout<<"\t\t\t输入终点站:
";//输出提示信息
cin>>gold;//输入终点站
if(!
find(gold))//调用find函数,完成查找和输出
{
cout<<"\t\t找不到你要查找的内容!
"<return;//函数调用结束
}
return;//函数调用结束
}
}
Bus_infor*Bus_do:
:
find(intnum)
{
system("cls");//清屏
Bus_infor*p;//定义辅助指针
p=head;//指向链表头结点
while(p->next)//当链表未至尾部时执行循环
{
if((p->next)->Get_bus_num()==num)//班次匹配上则输出所查到的车辆信息
{
cout<<"客车基本信息如下:
"<<<"班次发车时间起点站终点站行车时间额定载量已定票人数当前状况"<(p->next)->output();//调用输出函数
returnp;//表示找到,返回的是目标结点的前一结点
}
p=p->next;//指向下一节点
}
returnNULL;
}
Bus_infor*Bus_do:
:
find(stringgold)
{
system("cls");//清屏
Bus_infor*p;//定义辅助指针
p=head;//指向链表头结点
while(p->next)//当链表未至尾部时执行循环
{
if((p->next)->Get_end()==gold)//班次匹配上则输出所查到的车辆信息
{
cout<<"客车基本信息如下:
"<<<"班次发车时间起点站终点站行车时间额定载量已定票人数当前状况"<(p->next)->output();//调用输出函数
returnp;//表示找到,返回的是目标结点的前一结点
}
p=p->next;//指向下一节点
}
returnNULL;
}
voidBus_do:
:
del()//删除车辆信息函数
{
system("cls");//清屏
Bus_infor*p1,*p2,*p3;//定义两对象指针用于链表操作
intm;
stringgold;//定义相应变量
cout<<"\t\t\t输入班次号:
";//输出提示信息
cin>>m;
if(!
cin)
throwstring("输入错误");
p1=find(m);//调用查找函数
if(!
p1)//判断函数返回值是否为NULL
{
cout<<"\t\t找不到你要删除的内容!
"<return;//函数调用结束
}
cout<<"\n\t\t\t确定删除(y/n)?
";//显示将要删除数据信息供用户核对
chara;
cin>>a;//输入指示
if(a=='y'||a=='Y')
{//因为头结点为空仅有next域所以只要考虑被删结点是中间结点和尾结点情况
if((p1->next)->next==NULL)//目标结点为尾结点时
{
p2=p1->next;//p2指向目标结点
p1->next=NULL;//p1连接目标结点的next域重新赋值为空指针
deletep2;//释放目标空间
}
else
{//目标结点为中间节点时
p2=p1->next;//p2指向目标结点
p3=(p1->next)->next;//p3指向目标结点下一结点
p1->next=p3;//连接目标结点前后结点
deletep2;//释放目标结点
}
Bus_do:
:
setg
(1);//标记为修改
}
}
voidBus_do:
:
mend()//修改函数
{
system("cl