#include<iostream>
#include<fstream>
#include<string>
#include<iomanip>
#include<time.h>
using namespace std;
class Bus_infor{
private:
static int Bus_no;
char start[20],end[20];
int Bus_order,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();
inline 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)
{
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(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输入时间格式出错,请重新输入:";
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;
else return 0;
}
void Bus_infor::Order_tickt(int n){
tickted+=n;
}
void Bus_infor::Unorder_tickt(int n){
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 **p,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请继续,按返回:";
cin>>n;
if(!cin)throw string("输入数据错误");
}
}
else cout<<"\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("数据输入错误");
}while(n<1||n>2);
if(n==1){
cout<<"\t\t\t输入班次:";
cin>>num;
if(!cin)throw string("数据输入错误");
}
if(n==2){
cout<<"\t\t\t输入终点站:";
cin>>name;
if(!cin)throw string("数据输入错误");
}
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;
}
void Bus_link::del(){
if(password==1){
Bus_infor *p,*p2;
int num;char name[20];
cout<<"\t\t输入班次号";
cin>>num;
if(!cin)throw string("数据输入错误");
if(!find(&p,num,name)){
cout<<"\t\t找不到你要删除的内容!"<<endl;
return;
}
cout<<"\n\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对不起,游客不能删除车票信息"<<endl;
}
void Bus_link::mend() {
if(password==1){
Bus_infor *p;
int num;
char name[20];
cout<<"\t\t\t输入班次号:";
cin>>num;
if(!cin)throw string("数据输入错误!");
if(!find(&p,num,name)){
cout<<"\t\t找不到你要想修改的内容!"<<endl;
return;
}
(p->next)->input();
Bus_link::setkey(1);
}
else cout<<"\n\t对不起,游客不能删除车票信息"<<endl;
}
void Bus_link::Order(){
if(password==1){
Bus_infor *p;
cout<<"\n\t\t确定购票(Y/N)?";
char a;cin>>a;
if(a=='y'||a=='Y'){
int num;
cout<<"\n\t\t输入班次号:";
cin>>num;
if(!cin)throw string("输入数据错误");
if(!find(&p,num,"^")){
cout<<"\n\t\t找不到你要订票的车辆信息!"<<endl;return;
}
p=p->next;
if(!(p->Gettime())){
cout<<"\n\t\t你要订票的车辆已经出发"<<endl;return;
}
cout<<"\n\t\t输入要定的票数:";
int n;cin>>n;
if(!cin)throw string("输入数据错误");
if((p->Get_tickted()+n)<=p->Get_all_tickted())
p->Order_tickt(n);
else cout<<"\n\t\t对不起,没有足够的票数"<<endl;
}
else if(a=='n'||a=='N')cout<<"谢谢使用"<<endl;
else cout<<"\n\t\t输入字符不确定"<<endl;
Bus_link::setkey(1);
}
else cout<<"\n\t\t对不起,订购车票请在管理员处购买"<<endl;
}
void Bus_link::Unorder()
{
if(password==1){
Bus_infor *p;
cout<<"\n\t\t确定退票(Y/N)?";
char X;cin>>X;
if(X=='Y'||X=='y'){
int num;
cout<<"\n\t\t输入班次号:";
cin>>num;
if(!cin)throw string("数据输入错误");
if(!find(&p,num,"^")){
cout<<"\n\t\t找不到你要退票的车辆内容!"<<endl;return;
}
if(!(p->Gettime())){
cout<<"\n\t\t你要退票的车辆已经出发!"<<endl;
return;
}
cout<<"\n\t\t输入要退的票数 ";
int n;cin>>n;
if(!cin)throw string("数据输入错误");
p=p->next;
if((p->Get_tickted()-n)>=0)p->Unorder_tickt(n);
else cout<<"\n\t\t对不起,数据出错!"<<endl;
}
else if(X=='n'||X=='N')cout<<"谢谢使用"<<endl;
else cout<<"\n\t\t输入字符不确定"<<endl;
Bus_link::setkey(1);
}
else cout<<"\n\t\t对不起,退还车票请在管理员处退还"<<endl;
}
void Bus_link::save(){
if(password==1){
Bus_infor *p;
p=head;
ofstream os("bus.txt",ios::out|ios::binary|ios::ate);//文件以输出方式打开
if(Bus_link::getkey()==1) {
while(p->next){
(p->next)->output(os);
p=p->next;
}
}
cout<<"\t\t\t文件已保存"<<endl;
Bus_link::setkey(0);
}
else cout<<"\n\t\t对不起,游客无法保存车票信息"<<endl;
}
void Bus_link::about() {
cout<<endl<<"关于车票保管系统"<<endl<<"-------------"<<endl;
cout<<"使用说明:"<<endl;
cout<<"\t1.请按照提示输入正确格式,以保证系统正常运行;"<<endl;
}
void Bus_link::begin(){
password=0;
Bus_infor *p,*p2;
p=head;
clear();
long t;
ifstream is("bus.txt",ios::in|ios::binary|ios::ate);//以输入方式打开
if(!is){
ofstream os("bus.txt",ios::out);//以输出方式打开
os.close() ;//关闭文件
return;
}
int num=-1;
while(1){
num=-1;
t=is.tellg();//记录当前位置
is>>num;
is.seekg(t);//移动到当前位置
if(num<0){
is.close();
return ;
}
p2=new Bus_infor;
p2->input(is);//输入is对象内容
p->next=p2;
p2->next=NULL;
p=p->next;
}
}
void Bus_link::clear(){
Bus_infor *p,*p2;
p=head->next;
while(p){
p2=p;
p=p->next;
delete p2;
}
}
char Bus_link::mainmenu(){
struct tm *local;
char s1[128];
time_t t;
t=time(NULL);
local=localtime(&t);
strftime(s1,128,"%Y-%m-%d %H:%M",local);//按照指定的格式,把 时间保存在s1字符串中
string s;//定义字符串,来判断功能选择是否输入错误
cout<<"\n\n--------欢迎使用车票管理系统----------"<<endl<<endl;
cout<<"==========================================="<<endl;
cout<<"||========================================||"<<endl;
cout<<"||1.录入车票信息 2.浏览车票信息 ||"<<endl;
cout<<"||3.查询车票信息 4.删除车票信息 ||"<<endl;
cout<<"||5.修改车票信息 6.订购车票信息 ||"<<endl;
cout<<"||7.退还车票信息 8.保存车票信息 ||"<<endl;
cout<<"||9.关于车票系统 0.退出系统 ||"<<endl;
cout<<"||========================================||"<<endl;
cout<<"============================================"<<endl;
cout<<"\t\t\t\t "<<s1<<endl<<endl;
while(password==0){
cout<<"\t\t请选择用户(1。管理员;2.游客):";
int n;cin>>n;
if(!cin)throw string("数据输入错误");
if(n==1){
cout<<"\n\t\t请输入管理员密码:";
int m;cin>>m;
if(m==123456){
password=1;
cout<<endl;
break;
}
else cout<<"\n\t\t密码输入不正确\n"<<endl;
}
else {
password=2;//游客身份
break;
}
}
cout<<" 请选择功能按钮:";
while(true){
cin>>s;
if(s.length()!=1||s[0]<'0'||s[0]>'9')//s.length()返回字符串长度
cout<<"输入错误,请重新选择功能按钮:";
else break;
}
return s[0];
}
//============================主函数来啦================
int main(){
Bus_link pp;
int k=1;
string s;
pp.begin();
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':k=0;break;
}
if(k==1){
cout<<"\n\t\t\t是否返回主菜单? (1.是 2.不是):";
cin>>k;
if(!cin)throw string ("数据输入错误");
}
if(k==0){
if(pp.getkey()==1){
cout<<"\t\t\t是否保存?(1.保存 0.不保存):";
cin>>k;
if(!cin)throw string("数据输入错误");
if(k==1)
pp.save();
pp.clear();
k=0;
}
}
}
}
catch(string s){
cout<<s<<"为保护系统不崩溃,将自退出系统!"<<endl;
system("pause");
}
return 0;
}