C++车票管理系统

#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;
}

猜你喜欢

转载自blog.csdn.net/weixin_41215479/article/details/80888763