公交车管理系统

案例目的

某公交公司有车辆若干。现在,需要存储这些公交的编号、名称、类型、起点站和终点站,并显示全部信息。 类型包括普通车、空调车、双层车等。

案例覆盖技能点

a) C++基本语法和常用算法

b) 文件操作

c) 面向对象的使用

案例需求 

1)公交编号在生成公交车信息时同时生成,每输入一辆公交车信息编号顺序加1。 

2)能按名称或者编号显示、查找、增加、删除和保存各类公交的信息。 

功能列表:

1)添加车辆

添加车辆由键盘输入进行。输入时,程序会自动判断输入信息是否重复,若输入值不符合要求,则提示无法录入

2)增加车辆信息

在类中包含了增加车辆信息的函数,可以将录入的车辆信息增加到信息总表中。

3)删除车辆信息

删除车辆信息,这个车辆之后的车辆编号会减一。

4)查找车辆信息

查找车辆可以由编号、名称的方式完成。

5)显示所有车辆信息以表格格式显示。


code:

#include <iostream>
#include <cstdlib>
#include <string.h>
#include <stdio.h>
#include<iomanip>
#include <fstream>
using namespace std;
#define N 20    //公交车最多辆数
class Bus
{
    /*
     Bus类,用来描述车辆属性,包括number()
     name()、type()、start()、terminal()
    */
public:
    int number;     //编号
    char name[10];    //名称(即路线)
    char type[10];    //车型
    char start[10];   //起点站
    char terminal[10];//终点站
    /*
    默认构造函数,将对象所有属性赋初值0或空字符串
    */
    Bus()
    {
        number=0;
        name[0]='0';
        type[0]='0';
        start[0]='0';
        terminal[0]='0';
    }
    Bus(int number1,char *name1,char *type1,char *start1,char *terminal1)
    {
        number=number1;
        strcpy(name,name1);
        strcpy(type,type1);
        strcpy(start,start1);
        strcpy(terminal,terminal1);
    }
    ~Bus();    //析构函数

};

class Company
{
    /*
    拥有指向Bus类的对象数组指针,和所有的车辆信息处理函数
    */
public:
    int size;
    Bus *bus[N];
    Bus *bus1;

    Company();
    ~Company();
    void welcome();                            //欢迎界面
    void Keyboard_entry();                     //键盘录入主菜单
    void AddBus();                             //增加车辆
    bool AddBus1(int number,char *name,char *type,char *start,char *terminal); //增加车辆
    void DeleteBus();                          //删除车辆
    bool DeleteBus2(int number);
    void FindBusNum();
    bool FindBusNum1(int number);                       //判断车辆信息是否存在,按序号查找车辆
    void FindBusNam();
    bool FindBusNam1(char *name1);                      //判断车辆信息是否存在,按名称查找车辆
    void FindBusStart();
    bool FindBusStart1(char *start1);                   //判断车辆信息是否存在,按始发站查找车辆
    void FindBusterminal();
    bool FindBusterminal1(char *terminal1);             //判断车辆信息是否存在,按终点站查找车辆
    void DispAll();                                     //显示全部车辆
    void show();                                        //用于删除车辆的显示全部车辆
    void Check_station();                               //查看所有车站
    void Save_file();                                   //存储到文件
    void File_input();                                  //从文件读取
};

Company::Company()                                      //Company类构造函数,初始化bus类
{
    size=0;
    for(int i=0; i<N; i++)
    {
        bus[i]=NULL;
    }
}

Company::~Company() {}                                 //Company类析构函数

void Company::welcome()                                //欢迎界面,主菜单
{
    int choose;
    cout<<"------------------------------"<<endl;
    cout<<"    欢迎使用公交车管理系统    "<<endl;
    cout<<"------------------------------"<<endl<<endl;
    cout<<"请选择数据来源:"<<endl;
    cout<<"1、从文件输入"<<endl;
    cout<<"2、键盘录入"<<endl;
    cin>>choose;
    if(choose==1)
    {
        File_input();                                   //从文件读取信息
    }
    else if(choose==2)
    {
        Keyboard_entry();                               //键盘录入信息
    }
    else
    {
        cout<<"输入有误!请重新输入"<<endl;
        welcome();
    }
}

void Company::Keyboard_entry()                          //键盘录入,主菜单
{

    int order;
    cout<<"请选择您要进行的操作:"<<endl;
    cout<<"    1、添加车辆"<<endl;
    cout<<"    2、删除车辆"<<endl;
    cout<<"    3、显示全部车辆"<<endl;
    cout<<"    4、查找车辆"<<endl;
    cout<<"    5、查看所有车站"<<endl;
    cout<<"    6、存储到文件"<<endl;
    cout<<"    7、退出程序"<<endl;
    cin>>order;
    switch(order)
    {
    case 1:
        AddBus();                    //增加车辆
        break;
    case 2:
        DeleteBus();                 //删除车辆
        break;
    case 3:
        DispAll();                   //显示全部车辆
        break;
    case 4:
        cout<<"请选择查找车辆的方式:"<<endl;
        cout<<"1、按名称查找"<<endl;
        cout<<"2、按编号查找"<<endl;
        cout<<"3、按始发站查找"<<endl;
        cout<<"4、按终点站查找"<<endl;
        cin>>order;
        if(order==1)
            FindBusNam();                   //判断车辆信息是否存在,按名称查找车辆
        else if(order==2)
            FindBusNum();                   //判断车辆信息是否存在,按序号查找车辆
        else if(order==3)
            FindBusStart();                 //判断车辆信息是否存在,按始发站查找车辆
        else if(order==4)
            FindBusterminal();              //判断车辆信息是否存在,按终点站查找车辆
        else
            cout<<"输入错误!退出程序..."<<endl;
        exit(1);
        break;
    case 5:
        Check_station();                    //查看所有车站
        break;
    case 6:
        Save_file();                        //存储到文件
        break;
    case 7:
        cout<<"您已退出程序!"<<endl;
        exit(1);
    default:
        cout<<"输入错误,请重新输入"<<endl;
        Keyboard_entry();
    }
}

void Company::File_input()
{
    // 需要运用读入文件知识实现,
    int i=0;
    Bus *BB;
    ifstream infile("GJ.txt",ios::in);
    //以输入方式打开磁盘文件
    if(!infile)
    {
        cerr<<"open error!"<<endl;
        exit(1);
    }
    for(i=0; i<size; i++)
    {
        BB=bus[i];
        infile>>BB->number>>BB->name>>BB->start>>BB->terminal;
        cout<<"添加公交车"<<BB->name<<"成功"<<endl;
    }
    cout<<"读取到"<<i<<"组数据"<<endl;
    cout<<"请按任意键继续..."<<endl;
    fflush(stdin);
    getchar();
    Keyboard_entry(); //读入文件后返回键盘录入
}

bool Company::AddBus1(int number,char *name,char *type,char *start,char *terminal)
{
    int i;
    Bus *bb;
    bb= new Bus(number,name,type,start,terminal);
    for(i=0; i<size; i++)
    {
        bus1=bus[i];
        if(strcmp(bus1->name,name)==0)
        {
            if(strcmp(bus1->type,type)==0)
            {
                if(strcmp(bus1->start,start)==0)
                {
                    if(strcmp(bus1->terminal,terminal)==0)
                    {
                        cout<<"此公交车信息已存在,录入失败!"<<endl;
                        return false;
                    }
                }
            }
        }
    }
    if(i==size)
    {
        bus[size]=bb;
        size++;
        cout<<"车辆信息录入成功!"<<endl;
        return true;
    }
    else
        return false;
}

void Company::AddBus()   //增加车辆
{
    /*
    Company类的函数,用于判断输入的车辆信息是否重复,并将没有重复的信息增加到信息总表中去
    */
    int number22;       //编号
    char name22[10];    //名称(即路线)
    char type22[10];    //车型
    char start22[10];   //起点站
    char terminal22[10];//终点站
    int type;
    char ty[10];
    cout<<"-->>添加车辆"<<endl;
    cout<<"您正在增加车辆"<<endl;
    cout<<"请输入车辆编号:"<<endl;
    cin>>number22;
    cout<<"请输入车辆名称:"<<endl;
    cin>>name22;
    cout<<"请输入车辆类型:"<<endl;
    cout<<"0.其他 1.普通车 2.空调车 3.双层车"<<endl;
    cin>>type;
    switch(type)
    {
    case 0:
        strcpy(ty,"其他类型");
        strcpy(type22,ty);
        break;
    case 1:
        strcpy(ty,"普通车");
        strcpy(type22,ty);
        break;
    case 2:
        strcpy(ty,"空调车");
        strcpy(type22,ty);
        break;
    case 3:
        strcpy(ty,"双层车");
        strcpy(type22,ty);
        break;
    default:
        cout<<"输入有误!"<<endl;
        AddBus();
    }
    cout<<"请输入车辆起点:"<<endl;
    cin>>start22;
    cout<<"请输入车辆终点:"<<endl;
    cin>>terminal22;
    AddBus1(number22,name22,type22,start22,terminal22);
    cout<<"请按任意键继续..."<<endl;
    fflush(stdin);
    getchar();
    Keyboard_entry();
}

bool Company::DeleteBus2(int  number)
{
    int i;
    for(i=0; i<size; i++)
    {
        bus1=bus[i];
        if(bus1->number==number)
        {
            for(int j=i; j<size; j++)
            {
                bus1=bus[j];
                (bus1->number)--;
                bus[j]=bus[j+1];
                if(j==size-1)
                    number=bus1->number ;
            }
            cout<<"该车信息已删除!"<<endl;
            size--;
            return true;
        }
    }
    if(i==size)
    {
        cout<<"未找到该车信息,无法删除!"<<endl;
        return false;
    }
    return false;
}

void Company::DeleteBus()     //删除车辆
{
    /*
    Company类的函数,根据用户输入的车辆名称判断车辆信息是否存在,
    若存在,查找并显示所有此名称的车辆,再提示用户根据显示出的车辆信息选择要删车的车辆
    */
    int num;
    cout<<"-->>删除车辆"<<endl;
    show();
    cout<<"请选择要删除的车辆的编号:"<<endl;
    cin>>num;
    DeleteBus2(num);
    cout<<"请按任意键继续..."<<endl;
    fflush(stdin);
    getchar();
    Keyboard_entry();
}

bool Company::FindBusNum1(int number)
{
    int i;
    for(i=0; i<size; i++)
    {
        bus1=bus[i];
        if(bus1->number==number)
        {
            cout<<bus1->number<<"号公交车的信息为:"<<endl;
            cout<<setiosflags(ios::left)<<"          *         "<<setw(8)<<"编号"<<setw(8)<<"名称"<<setw(8)<<"类型"<<setw(8)<<"起点站"<<setw(8)<<"终点站"<<"*"<<endl;
            cout<<setiosflags(ios::left)<<"          *         "<<setw(8)<<bus1->number<<setw(8)<<bus1->name<<setw(8)<<bus1->type<<setw(8)<<bus1->start<<setw(8)<<bus1->terminal<<setw(8)<<"*"<<endl;
            return true;
        }
    }
    if(i==size)
    {
        cout<<"无该车任何信息!"<<endl;
        return false;
    }
    return false;
}

void Company::FindBusNum()      //判断车辆信息是否存在,查找车辆
{
    int account;
    cout<<"请输入要查找的车辆编号:";
    cin>>account;
    FindBusNum1(account);
    cout<<"请按任意键继续..."<<endl;
    fflush(stdin);
    getchar();
    Keyboard_entry();
}

bool Company::FindBusNam1(char *name1)
{
    for(int i=0; i<size; i++)
    {
        bus1=bus[i];
        if(strcmp(bus1->name,name1)==0)
        {
            cout<<"路线名称为"<<bus1->name<<"的公交车的信息为:"<<endl;
            cout<<setiosflags(ios::left)<<"          *         "<<setw(8)<<"编号"<<setw(8)<<"名称"<<setw(8)<<"类型"<<setw(8)<<"起点站"<<setw(8)<<"终点站"<<"*"<<endl;
            cout<<setiosflags(ios::left)<<"          *         "<<setw(8)<<bus1->number<<setw(8)<<bus1->name<<setw(8)<<bus1->type<<setw(8)<<bus1->start<<setw(8)<<bus1->terminal<<setw(8)<<"*"<<endl;
            return true;
        }
        if(i==size)
        {
            cout<<"无该车任何信息!"<<endl;
            return false;
        }
        return false;
    }
}

void Company::FindBusNam()      //判断车辆信息是否存在,查找车辆
{
    char name11[10];
    cout<<"请输入要查找车辆的名称:"<<endl;
    cin>>name11;
    FindBusNam1(name11);
    cout<<"请按任意键继续..."<<endl;
    fflush(stdin);
    getchar();
    Keyboard_entry();
}

bool Company::FindBusStart1(char *start1)
{
    for(int i=0; i<size; i++)
    {
        bus1=bus[i];
        if(strcmp(bus1->start,start1)==0)
        {
            cout<<"始发站为"<<bus1->start<<"的公交车的信息为:"<<endl;
            cout<<setiosflags(ios::left)<<"                *"<<setw(8)<<"编号"<<setw(8)<<"名称"<<setw(8)<<"类型"<<setw(8)<<"起点站"<<setw(8)<<"终点站"<<"*"<<endl;
            cout<<setiosflags(ios::left)<<"                *"<<setw(8)<<bus1->number<<setw(8)<<bus1->name<<setw(8)<<bus1->type<<setw(8)<<bus1->start<<setw(8)<<bus1->terminal<<setw(8)<<"*"<<endl;
            return true;
        }
        if(i==size)
        {
            cout<<"无该车任何信息!"<<endl;
            return false;
        }
        return false;
    }
}

void Company::FindBusStart()      //判断车辆信息是否存在,查找车辆
{
    char start11[10];
    cout<<"请输入要查找车辆的始发站:"<<endl;
    cin>>start11;
    FindBusStart1(start11);
    cout<<"请按任意键继续..."<<endl;
    fflush(stdin);
    getchar();
    Keyboard_entry();
}

bool Company::FindBusterminal1(char *terminal1)
{
    for(int i=0; i<size; i++)
    {
        bus1=bus[i];
        if(strcmp(bus1->terminal,terminal1)==0)
        {
            cout<<"终点站为"<<bus1->terminal<<"的公交车的信息为:"<<endl;
            cout<<setiosflags(ios::left)<<"                *"<<setw(8)<<"编号"<<setw(8)<<"名称"<<setw(8)<<"类型"<<setw(8)<<"起点站"<<setw(8)<<"终点站"<<"*"<<endl;
            cout<<setiosflags(ios::left)<<"                *"<<setw(8)<<bus1->number<<setw(8)<<bus1->name<<setw(8)<<bus1->type<<setw(8)<<bus1->start<<setw(8)<<bus1->terminal<<setw(8)<<"*"<<endl;
            return true;
        }
        if(i==size)
        {
            cout<<"无该车任何信息!"<<endl;
            return false;
        }
        return false;
    }
}

void Company::FindBusterminal()      //判断车辆信息是否存在,按终点站查找车辆
{
    char terminal11[10];
    cout<<"请输入要查找车辆的终点站:"<<endl;
    cin>>terminal11;
    FindBusterminal1(terminal11);
    cout<<"请按任意键继续..."<<endl;
    fflush(stdin);
    getchar();
    Keyboard_entry();
}

void Company::DispAll()              //显示全部车辆
{
    cout<<setiosflags(ios::left)<<"           *       "<<setw(8)<<"编号"<<setw(8)<<"名称"<<setw(8)<<"类型"<<setw(8)<<"起点站"<<setw(8)<<"终点站"<<"*"<<endl;
    for(int i=0; i<size; i++)
    {
        bus1=bus[i];
        cout<<setiosflags(ios::left)<<"           *       "<<setw(8)<<bus1->number<<setw(8)<<bus1->name<<setw(8)<<bus1->type<<setw(8)<<bus1->start<<setw(8)<<bus1->terminal<<setw(8)<<"*"<<endl;

    }
    cout<<endl;
    cout<<"请按任意键继续..."<<endl;
    fflush(stdin);
    getchar();
    Keyboard_entry();
    /*
    Company类的函数,输出所有车辆信息
    */
}

void Company::show()                //显示车辆信息,用于删除车辆
{
    cout<<setiosflags(ios::left)<<"           *       "<<setw(8)<<"编号"<<setw(8)<<"名称"<<setw(8)<<"类型"<<setw(8)<<"起点站"<<setw(8)<<"终点站"<<"*"<<endl;
    for(int i=0; i<size; i++)
    {
        bus1=bus[i];
        cout<<setiosflags(ios::left)<<"           *       "<<setw(8)<<bus1->number<<setw(8)<<bus1->name<<setw(8)<<bus1->type<<setw(8)<<bus1->start<<setw(8)<<bus1->terminal<<setw(8)<<"*"<<endl;

    }
    cout<<endl;
}

void Company::Check_station()         //查看所有车站
{
    cout<<"所有公交车站有:"<<endl;
    for(int i=0;i<size;i++)
    {
        bus1=bus[i];
        cout<<bus1->start<<", "<<bus1->terminal<<"  ";
    }
    cout<<endl<<endl;
    cout<<"请按任意键继续..."<<endl;
    fflush(stdin);
    getchar();
    Keyboard_entry();
}

void Company::Save_file()            //存储到文件
{
    ofstream outfile("GJ.txt",ios::out);
    if(!outfile)
    {
        cerr<<"open error!"<<endl;
        exit(1);
    }
    for(int i=0; i<size; i++)
    {
        outfile<<bus[i]<<endl;
    }
    outfile.close();
    cout<<"读入文件成功"<<endl<<endl;
    cout<<"请按任意键继续..."<<endl;
    fflush(stdin);
    getchar();
    Keyboard_entry(); //读入文件后返回键盘录入
}

int main()
{
    Company bus;
    bus.welcome();
}


©️2020 CSDN 皮肤主题: 成长之路 设计师:Amelia_0503 返回首页