#include<iostream> //数据流输入/输出
#include<fstream> //文件输入/输出
#include<string> //字符串操作
#include<iomanip> //参数化输入/输出
#include<time.h> //时间库函数
using namespace std; //命名空间
class Bus_infor
{
private:
static int Bus_No; //静态数据成员,统计当前所有的Bus_infor对象的数目
char start[20]; //起点站
char end[20]; //终点站
int Bus_order; //班次号
int all_tickted; //额定载量
int tickted; //已定票人数
int Hour_start,Minute_start; //发车时间
float GoHour; //行车时间
public:
Bus_infor();
~Bus_infor();
Bus_infor *next;
void input(); //录入函数
void input(ifstream & is); //读取函数
void output(); //输出函数
void output(ofstream & os); //写入函数
void Order_tickt(int n); //定票函数
void Unorder_tickt(int n); //退票函数
void GetTime_start(); //获取发车时间函数
bool GetTime(); //判断当前班次状况函数
int Get_all_tickted() { return all_tickted; } //内联函数,返回额定载量
int Get_tickted() { return tickted; } //返回已定票人数
int Get_bus_order() { return Bus_order; } //返回班次号
string Get_end()const; //返回终点站的字符串
};
int Bus_infor::Bus_No=1;
Bus_infor::Bus_infor()
{
Bus_No++;
tickted=0;
}
Bus_infor::~Bus_infor()
{
Bus_No--;
}
void Bus_infor::input()
{
cout<<"\t\t\t按提示输入:"<<endl;
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<<"是否清空售票(y/n)?";
char a;cin>>a;
if(a=='y'||a=='Y') tickted=0;
}
void Bus_infor::input(ifstream & is)
{
is>>Bus_order>>Hour_start>>Minute_start>>start>>end>>GoHour>>all_tickted>>tickted;
is.get();
}
void Bus_infor::output()
{
cout<<" "<<Bus_order<<"\t";
if(Minute_start==0) //判断发车时的分钟时刻,若为0分则在后面多显示个0,以符合时间格式
{
cout<<Hour_start<<":"<< Minute_start<<"0\t";
}
else
{
cout<<Hour_start<<":"<< Minute_start<<"\t";
}
cout<<start<<"\t"<<end<< "\t"<<GoHour<<"\t "<<all_tickted<<"\t "<<tickted;
if(!GetTime())
cout<<"\t 此班已出发"<<endl;
else
cout<<"\t 此班未出发"<<endl;
}
void Bus_infor::output(ofstream & os)
{
os<<setw(6)<<Bus_order //setw()设置输出宽度
<<setw(15)<<Hour_start
<<setw(15)<<Minute_start
<<setw(15)<<start
<<setw(6)<<end
<<setw(15)<<GoHour
<<setw(15)<<all_tickted
<<setw(15)<<tickted
<<endl;
}
void Bus_infor::GetTime_start()
{
cout<<"请输入始发时间(时 分):";
while(1)
{
cin>>Hour_start>>Minute_start;
if (cin.fail()) //判断输入的数据类型是否有错
{
cout << "\n时间输入错误,请重新输入:";
cin.clear();
cin.get();
}
else if(Hour_start<0||Hour_start>24||Minute_start<0||Minute_start>60)
cout<<"\n时间格式出错,请重新输入:"; ////判断时间格式是否出错,小时不能小于0大于24,分钟不能小于0大于60
else
break;
}
}
bool Bus_infor::GetTime()
{
struct tm *local;
time_t t;
t=time(NULL);
local=localtime(&t); //获取当前系统时间
if(local->tm_hour<Hour_start||(local->tm_hour==Hour_start && local->tm_min<=Minute_start))
return 1; //比较当前时间与发车时间,获得班次的当前状况,返回1表示班次未出发
else
return 0; //返回0表示班次已出发
}
void Bus_infor::Order_tickt(int n)
{
tickted=tickted+n;
}
void Bus_infor::Unorder_tickt(int n)
{
tickted=tickted-n;
}
string Bus_infor::Get_end()const
{
string s=end;
return s;
}
class Bus_link
{
public:
Bus_link(){head=new Bus_infor;head->next=NULL;key=0;} //带参数的构造函数
~Bus_link(){delete head;} //析构函数
void input(); //录入车票信息
void mend(); //修改车票信息
void del(); //删除车票信息
int find(Bus_infor **p1,int num,char *pn); //查找函数,找出所有符合的
int find1(Bus_infor **p1,int num,char *pn); //查找函数,找到符合的返回
void found(); //查询车票信息
void show(); //显示车票信息
void Order(); //定购车票信息
void Unorder(); //退还车票信息
void save(); //保存车票信息
void begin(); //初始化车票信息
void clear(); //清除函数
void about(); //关于车票信息
char mainmenu(); //主菜单函数
void setkey(int k){ key=k; } //设置系统修改标志
int getkey(){ return key;} //返回系统修改标志
private:
Bus_infor *head; //链表指针
int key; //系统修改标志
int password; //管理员登陆标志
};
void Bus_link::input()
{
if(password==1)
{
Bus_infor *p,*p2=NULL;
p=head;
int n=1;
while(p->next)
p=p->next;
while(n)
{
p2=new Bus_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)
throw string("\n数据输入错误");
Bus_link::setkey(1);
}
}
else
cout<<"\n\t\t对不起,游客不能录入车票信息"<<endl;
}
void Bus_link::show()
{
cout<<"客车基本信息如下:"<<endl
<<"班次 发车时间 起点站 终点站 行车时间 额定载量 已定票人数 当前状况"<<endl;
Bus_infor *p;
p=head;
while(p->next)
{
(p->next)->output();
p=p->next;
}
}
void Bus_link::found()
{
Bus_infor *p;
int num,n;
char name[20];
do
{
cout<<"\t\t1:按班次查找,2:按终点站查找: ";
cin>>n;
if(!cin)
throw string("\n数据输入错误");
}while(n<1||n>2);
if(n==1)
{
cout<<"\t\t\t输入班次: ";
cin>>num;
if(!cin)
throw string("\n数据输入错误");
}
if(n==2)
{
cout<<"\t\t\t输入终点站: ";
cin>>name;
}
if(!find(&p,num,name))
{
cout<<"\t\t找不到你要查找的内容!"<<endl;
return;
}
}
int Bus_link::find(Bus_infor **p1,int num,char *pn)
{
Bus_infor *p;
p=head;
int t=0;
while(p->next)
{
(*p1)=p;
if( (p->next)->Get_bus_order()==num|| (p->next)->Get_end()==pn )
{
cout<<"客车基本信息如下:"<<endl
<<"班次 发车时间 起点站 终点站 行车时间 额定载量 已定票人数 当前状况"<<endl;
(p->next)->output();
t=1;
}
p=p->next;
}
return t;
}
int Bus_link::find1(Bus_infor **p1,int num,char *pn)
{
Bus_infor *p;
p=head;
while(p->next)
{
(*p1)=p;
if( (p->next)->Get_bus_order()==num|| (p->next)->Get_end()==pn )
{
cout<<"客车基本信息如下:"<<endl
<<"班次 发车时间 起点站 终点站 行车时间 额定载量 已定票人数 当前状况"<<endl;
(p->next)->output();
return 1;
}
p=p->next;
}
return 0;
}
void Bus_link::del()
{
if(password==1)
{
Bus_infor *p,*p2;
int num;char name[20];
cout<<"\t\t\t输入班次号: ";
cin>>num;
if(!cin)
throw string("\n数据输入错误");
if( !find1(&p,num,name) )
{
cout<<"\t\t找不到你要删除的内容!"<<endl;
return;
}
cout<<"\n\t\t\t确定删除(y/n)?";
char a;cin>>a;
if(a=='y'||a=='Y')
{
p2=p->next;
p->next=p2->next;
delete p2;
Bus_link::setkey(1);
}
}
else
cout<<"\n\t\t对不起,游客不能删除车票信息"<<endl;
}
void Bus_link::mend()
{
if(password==1)
{