数据结构课程设计: 20、中工校园百事通系统(****)

版权声明:转载请留言 https://blog.csdn.net/qq_40744093 https://blog.csdn.net/qq_40744093/article/details/86246022

                                                   中工校园百事通系统(****)

要用到文件操作,使用CodeBlocks,建议放到同一目录下

[问题描述]

中工校园百事通平台汇聚的是与校园有关的各类公共信息查询服务,包括与学生相关的衣食住行,学习、娱乐等分类,为学生校园生活提供各类查询服务,主要包括如下模块的增删改查等功能:

  1. 学校部门,包括院系位置及办公电话(存储:链表←→文件)
  2. 校园餐饮:名称、位置、电话及特色(存储:顺序表←→文件)
  3. 校园景点导游咨询:为来访的客人提供各种景点信息查询服务(景点间行程的最短路径、时间或最少经费等需求)
  4. 校园停车场管理系统(停车场:栈结构;便道:实现临时存车,先来先存)
  5. 二手市场:供求信息查询或发布,查询时按销量或价格排序(存储:顺序表←→文件)
  6. 文本聊天系统:聊天双方能安全、快捷传输聊天内容

[设计要求]

  1. 要有选择操作界面,实现形式不限,各个处理对象的组成结构根据需求自行合理定义
  2. 要用数据结构中所学知识点
  3. 大量的数据保存建议使用文件保存

 

[设计思路]

  1. 链表
  2. 顺序表
  3. 最短路
  4. 栈和队列
  5. 排序
  6. 聊天互动

[文件内容]

[代码及注释]

#include<iostream>
#include<fstream>
#include<string>
#include<cstring>
#include<vector>
using namespace std;
int flag=0;                                         /*判断程序是否结束*/
//学校部门
typedef struct LNode{
    string id;                                      /*部门编号*/
    string name;                                    /*部门名称*/
    string place;                                   /*部门位置*/
    string phone;                                   /*部门电话*/
    LNode *next;                                    /*指针域*/
}LNode,*LinkList;                                   /*结点类型,结点指针类型*/
typedef struct{
    LinkList L;                                     /*单链表*/
    int length;                                     /*部门数量*/
}Department;                                        /*部门类型*/
bool ReadDepartment(Department &D);                 /*读取部门文件*/
void QueryDepartment(Department &D);                /*查询部门信息*/
bool JudgeDepartment(Department &D,string ID);      /*判断部门信息是否合法*/
void ReviseDepartment(Department &D);               /*修改部门*/
void AddDepartment(Department &D);                  /*增加部门*/
void DeleteDepartment(Department &D);               /*删除部门*/
int SchoolDepartment(Department &D);                /*学校部门操作菜单*/

//校园餐饮
#define MAXFOOD 11111                               /*最大商家数*/
typedef struct{
    string id;                                      /*商家编号*/
    string name;                                    /*商家名称*/
    string place;                                   /*商家位置*/
    string phone;                                   /*商家电话*/
    string style;                                   /*商家食物特色*/
}Eat;                                               /*商家结点类型*/
typedef struct{
    Eat eat[MAXFOOD+1];                             /*MAXFOOD种商家*/
    int length;                                     /*商家种数*/
}Food;                                              /*餐饮结点类型*/
bool ReadFood(Food &F);                             /*读取餐饮文件*/
void QueryFood(Food &F);                            /*查询商家信息*/
bool JudgeFood(Food &F,string ID);                  /*判断商家信息是否合法*/
void ReviseFood(Food &F);                           /*修改商家*/
void AddFood(Food &F);                              /*增加商家*/
void DeleteFood(Food &F);                           /*删除商家*/
void Catering(Food &F);                             /*校园餐饮操作菜单*/

//校园景点导游
#define inf 0x3f3f3f3f                              /*无穷大*/
#define MAXV 1111                                   /*最大景点数*/
int pre[MAXV+1],dis[MAXV+1],mint[MAXV+1],vis[MAXV+1];
typedef struct VNode{
    int id;                                         /*景点编号*/
    string name;                                    /*景点名字*/
    string info;                                    /*景点信息*/
    VNode *next;                                    /*指针域*/
}VNode,*Vertex;                                     /*景点结点类型,景点指针结点类型*/
typedef struct{
    int to;                                         /*终点*/
    int distance;                                   /*距离*/
    int time;                                       /*花费时间*/
}Edge;                                              /*边类型*/
typedef struct{
    Vertex V;                                       /*单链表头结点*/
    vector<Edge> r[MAXV+1];                         /*MAXV个景点*/
    int Vnum;                                       /*景点个数*/
    int Enum;                                       /*双向边条数*/
}Graph;                                             /*邻接表图类型*/
bool ReadVNode(Graph &G);                           /*从文件中读取景点信息*/
bool JudgeVNode(Graph &G,int ID);                   /*判断景点信息是否合法*/
void SingleQueryVNode(Graph &G);                    /*查询单一景点*/
void QueryVNode(Graph &G);                          /*查询所有景点*/
void AddVNode(Graph &G);                            /*增加景点*/
void DeleteVNode(Graph &G);                         /*删除景点*/
void CreatGraph(Graph &G);                          /*构图*/
Vertex FindVNode(Graph &G,int ID);                  /*找出景点*/
void MinRoad(Graph &G);                             /*两点之间最短路径(迪杰斯特拉)*/
void MinTime(Graph &G);                             /*两点之间最少时间(迪杰斯特拉)*/
void SchoolSpot(Graph &G);                          /*校园景点操作菜单*/

//停车场管理系统
#define MAXCAR 3                                    /*停车场最大停车数*/
#define Price 0.02                                  /*停车场每分钟收费价格*/
typedef struct{
    string id;                                      /*车牌号*/
    int stime;                                      /*到达时间*/
}Car;                                               /*车辆类型*/
typedef struct{
    Car c[MAXCAR+1];                                /*MAXSIZE辆车,0号不用*/
    int top;                                        /*下标代替指针*/
}SqStack;                                           /*顺序栈,表示停车场*/
typedef struct QNode{
    Car c;                                          /*一辆车*/
    QNode *next;                                    /*指针域*/
}QNode,*QueuePtr;                                   /*结点类型,结点指针类型*/
typedef struct{
    QueuePtr Front;                                 /*头指针*/
    QueuePtr Real;                                  /*尾指针*/
    int length;                                     /*链队长度*/
}LinkQueue;                                         /*链队,表示便道*/
void InitSqStack(SqStack &S);                       /*初始化顺序栈*/
void InitLinkQueue(LinkQueue &Q);                   /*初始化链队*/
bool ArriveJudge(SqStack &S,LinkQueue &Q,Car car);  /*判断到达车辆是否合法*/
bool Full(SqStack &S);                              /*判断栈是否满*/
void Push(SqStack &S,Car car);                      /*入栈*/
void EnQueue(LinkQueue &Q,Car car);                 /*入队*/
void Arrive(SqStack &S,LinkQueue &Q);               /*车辆到达*/
void Pop(SqStack &S);                               /*出栈*/
void DeQueue(LinkQueue &Q,Car &car);                /*出队*/
void Leave(SqStack &S,SqStack &TempS,LinkQueue &Q); /*车辆离开*/
void QueryPark(SqStack &S);                         /*查询停车场*/
void QueryRoad(LinkQueue &Q);                       /*查询便道*/
void Menu(SqStack &S,SqStack &TempS,LinkQueue &Q);  /*操作汇总*/

//二手市场
#define MAXGoods 11111                              /*最大商品数量*/
typedef struct{
    string id;                                      /*商品编号*/
    string name;                                    /*商品名称*/
    int price;                                      /*商品价格*/
    int sale;                                       /*商品销售量*/
}Goods;                                             /*商品类型*/
typedef struct{
    Goods g[MAXGoods+1];                            /*MAXGoods个商品*/
    int length;                                     /*商品数量*/
}Market;                                            /*二手市场类型*/
bool ReadMarket(Market &M);                         /*读取二手市场文件*/
void BubbleSort(Market &M);                         /*冒泡排序*/
void QueryMarket(Market &M);                        /*查询商品信息*/
bool JudgeMarket(Market &M,string ID);              /*判断商品是否合法*/
void ReviseMarket(Market &M);                       /*修改商品信息*/
void AddMarket(Market &M);                          /*增加商品*/
void DeleteMarket(Market &M);                       /*删除商品*/
void FleaMarket(Market &M);                         /*二手市场操作菜单*/

//聊天
#define MAXACCOUNT  11                              /*最大聊天账户*/
typedef struct{
    string id;                                      /*账号*/
    string name;                                    /*账户名*/
    string password;                                /*密码*/
}Account;                                           /*账户类型*/
typedef struct{
    Account account[MAXACCOUNT+1];                  /*MAXACCOUNT个账户*/
    bool vis[MAXACCOUNT];                           /*判断是否在线*/
    int length;                                     /*账户数量*/
}Chat;                                              /*聊天类型*/
void InitChat(Chat &C);                             /*初始化*/
void BeginChat(Chat &C,Account A);                  /*开始聊天*/
void Register(Chat &C);                             /*注册*/
void Login(Chat &C);                                /*登陆*/
void WeChat(Chat &C);                               /*聊天操作菜单*/

//学校部门
bool ReadDepartment(Department &D)
{
    ifstream in("学校部门.txt");
    int k=0;
    D.L=new LNode;
    D.L->next=NULL;
    while(1)
    {
        LinkList s=new LNode;
        s->next=NULL;
        in>>s->id>>s->name>>s->place>>s->phone;
        if(s->id=="")break;
        ++k;
        s->next=D.L->next;
        D.L->next=s;
    }
    if(k==0)
    {
        cout<<"<<<<校园餐饮文件读取失败"<<endl;
        cout<<"-------------------------------------"<<endl;
        return false;
    }
    D.length=k;
    cout<<"<<<<校园餐饮文件读取成功"<<endl;
    return true;
}
void QueryDepartment(Department &D)
{
    cout<<endl<<"<<<<总部门数:"<<D.length<<endl;
    LinkList p=D.L->next;
    while(p)
    {
        cout<<endl;
        cout<<"|部门编号:"<<p->id<<endl;
        cout<<"|部门名称:"<<p->name<<endl;
        cout<<"|部门位置:"<<p->place<<endl;
        cout<<"|办公电话:"<<p->phone<<endl;
        cout<<"--------------------"<<endl;
        p=p->next;
    }
}
bool JudgeDepartment(Department &D,string ID)
{
    LinkList p=D.L->next;
    while(p)
    {
        if(p->id==ID)return false;
        p=p->next;
    }
    return true;
}
void ReviseDepartment(Department &D)
{
    cout<<"输入要修改的编号:";
    string ID;
    cin>>ID;
    LinkList p=D.L->next;
    while(p)
    {
        if(ID==p->id)
        {
            cout<<"--------------------"<<endl;
            cout<<"1--部门编号:"<<p->id<<endl;
            cout<<"2--部门名称:"<<p->name<<endl;
            cout<<"3--部门位置:"<<p->place<<endl;
            cout<<"4--办公电话:"<<p->phone<<endl;
            cout<<"其他:无任何改动"<<endl;
            cout<<"--------------------"<<endl;
            int op;
            cout<<"输入你的选择:";
            cin>>op;
            string str;
            if(op>=1&&op<=4){cout<<"输入修改内容:";cin>>str;}
            switch(op)
            {
                case 1:if(JudgeDepartment(D,str)){p->id=str;cout<<"<<<<修改成功"<<endl;}
                       else cout<<"<<<<编号已经存在,修改失败"<<endl;break;
                case 2:p->name =str;cout<<"<<<<修改成功"<<endl;break;
                case 3:p->place=str;cout<<"<<<<修改成功"<<endl;break;
                case 4:p->phone=str;cout<<"<<<<修改成功"<<endl;break;
                default :cout<<"<<<<没有任何修改!"<<endl;
            }
            return;
        }
        p=p->next;
    }
    cout<<"<<<<编号输入错误"<<endl;
}
void AddDepartment(Department &D)
{
    LinkList d=new LNode;
    d->next=NULL;
    cout<<"|部门编号:";
    cin>>d->id;
    cout<<"|部门名称:";
    cin>>d->name;
    cout<<"|部门位置:";
    cin>>d->place;
    cout<<"|办公电话:";
    cin>>d->phone;
    if(JudgeDepartment(D,d->id))
    {
        D.length++;
        d->next=D.L->next;
        D.L->next=d;
        cout<<"<<<<增加成功"<<endl;
    }
    else cout<<"<<<<编号已经存在,增加失败"<<endl;
}
void DeleteDepartment(Department &D)
{
    cout<<"输入要删除的编号:";
    string ID;
    cin>>ID;
    LinkList p=D.L;
    while(p->next)
    {
        if(p->next->id==ID)
        {
            LinkList s=p->next;
            p->next=s->next;
            delete s;
            D.length--;
            cout<<"<<<<部门删除成功"<<endl;
            return;
        }
        p=p->next;
    }
    cout<<"<<<<编号输入错误"<<endl;
}
int SchoolDepartment(Department &D)
{
    int mark=0;
    while(1)
    {
        cout<<"                       -----------------------------------"<<endl;
        cout<<"                      |          欢迎来到学校部门         |"<<endl;
        cout<<"                      |-----------------------------------|"<<endl;
        cout<<"                      |          1--查看                  |"<<endl;
        cout<<"                      |          2--修改                  |"<<endl;
        cout<<"                      |          3--增加                  |"<<endl;
        cout<<"                      |          4--删除                  |"<<endl;
        cout<<"                      |          其他--退出               |"<<endl;
        cout<<"                       -----------------------------------"<<endl;
        int op;
        cout<<"输入你的选择:";
        cin>>op;
        switch(op)
        {
            case 1:QueryDepartment(D);break;
            case 2:ReviseDepartment(D);break;
            case 3:AddDepartment(D);break;
            case 4:DeleteDepartment(D);break;
            default :mark=1;cout<<"欢迎下次再来!"<<endl;
        }
        if(mark)break;
    }
}
//校园餐饮
bool ReadFood(Food &F)
{
    ifstream in("校园餐饮.txt");
    int k=1;
    while(1)
    {
        in>>F.eat[k].id>>F.eat[k].name>>F.eat[k].place>>F.eat[k].phone>>F.eat[k].style;
        if(F.eat[1].id=="")
        {
            cout<<"<<<<校园餐饮文件读取失败"<<endl;
            cout<<"-------------------------------------"<<endl;
            return false;
        }
        if(F.eat[k].id=="")break;
        ++k;
    }
    F.length=k-1;                                 //航班数量
    cout<<"<<<<校园餐饮文件读取成功"<<endl;
    return true;
}
void QueryFood(Food &F)
{
    cout<<"<<<<餐饮店总数:"<<F.length<<endl;
    for(int k=1;k<=F.length;++k)
    {
        cout<<endl;
        cout<<"|编号:"<<F.eat[k].id<<endl;
        cout<<"|名称:"<<F.eat[k].name<<endl;
        cout<<"|位置:"<<F.eat[k].place<<endl;
        cout<<"|电话:"<<F.eat[k].phone<<endl;
        cout<<"|特色:"<<F.eat[k].style<<endl;
        cout<<"--------------------"<<endl;
    }
}
bool JudgeFood(Food &F,string ID)
{
    for(int i=1;i<=F.length;++i)
        if(F.eat[i].id==ID)return false;
    return true;
}
void ReviseFood(Food &F)
{
    QueryFood(F);
    cout<<"输入要修改的编号:";
    string ID;
    cin>>ID;
    for(int k=1;k<=F.length;++k)
        if(ID==F.eat[k].id)
        {
            cout<<"--------------------"<<endl;
            cout<<"1--编号:"<<F.eat[k].id<<endl;
            cout<<"2--名称:"<<F.eat[k].name<<endl;
            cout<<"3--位置:"<<F.eat[k].place<<endl;
            cout<<"4--电话:"<<F.eat[k].phone<<endl;
            cout<<"5--特色:"<<F.eat[k].style<<endl;
            cout<<"其他:无任何改动"<<endl;
            cout<<"--------------------"<<endl;
            int op;
            cout<<"输入你的选择:";
            cin>>op;
            string str;
            if(op>=1&&op<=5)
            {
                cout<<"输入修改内容:";
                cin>>str;
            }
            switch(op)
            {
                case 1:if(JudgeFood(F,str)){F.eat[k].id=str;cout<<"<<<<修改成功"<<endl;}
                       else cout<<"<<<<编号已经存在,修改失败"<<endl;break;
                case 2:F.eat[k].name =str;cout<<"<<<<修改成功"<<endl;break;
                case 3:F.eat[k].place=str;cout<<"<<<<修改成功"<<endl;break;
                case 4:F.eat[k].phone=str;cout<<"<<<<修改成功"<<endl;break;
                case 5:F.eat[k].style=str;cout<<"<<<<修改成功"<<endl;break;
                default :cout<<"<<<<没有任何修改!"<<endl;
            }
            return;
        }
    cout<<"<<<<编号输入错误"<<endl;
}
void AddFood(Food &F)
{
    Eat f;
    cout<<"|编号:";
    cin>>f.id;
    cout<<"|名称:";
    cin>>f.name;
    cout<<"|位置:";
    cin>>f.place;
    cout<<"|电话:";
    cin>>f.phone;
    cout<<"|特色:";
    cin>>f.style;
    if(JudgeFood(F,f.id))
    {
        F.length++;
        F.eat[F.length]=f;
        cout<<"<<<<增加成功"<<endl;
    }
    else cout<<"<<<<编号已经存在,增加失败"<<endl;
}
void DeleteFood(Food &F)
{
    QueryFood(F);
    cout<<"输入要删除的编号:";
    string ID;
    cin>>ID;
    int k;
    for(k=1;k<=F.length;++k)
        if(ID==F.eat[k].id)break;
    if(k==F.length+1){cout<<"<<<<编号输入错误"<<endl;return;}
    else
    {
        for(int i=k;i<=F.length-1;++i)
            F.eat[i]=F.eat[i+1];
        F.length--;
        cout<<"<<<<删除成功"<<endl;
    }
}
void Catering(Food &F)
{
    int mark=0;
    while(1)
    {
        cout<<"                       -----------------------------------"<<endl;
        cout<<"                      |     欢迎来到校园餐饮系统          |"<<endl;
        cout<<"                      |-----------------------------------|"<<endl;
        cout<<"                      |         1--查看                   |"<<endl;
        cout<<"                      |         2--修改                   |"<<endl;
        cout<<"                      |         3--增加                   |"<<endl;
        cout<<"                      |         4--删除                   |"<<endl;
        cout<<"                      |         其他--退出                |"<<endl;
        cout<<"                       -----------------------------------"<<endl;
        int op;
        cout<<"输入你的选择:";
        cin>>op;
        switch(op)
        {
            case 1:QueryFood(F);break;
            case 2:ReviseFood(F);break;
            case 3:AddFood(F);break;
            case 4:DeleteFood(F);break;
            default:mark=1;cout<<"欢迎下次再来!"<<endl;
        }
        if(mark)break;
    }
}

//校园景点导游咨询


bool ReadVNode(Graph &G)
{
    ifstream in("校园景点导游.txt");
    int k=0;
    G.V=new VNode;
    G.V->next=NULL;
    while(1)
    {
        Vertex s=new VNode;
        s->next=NULL;
        in>>s->id>>s->name>>s->info;
        if(s->name=="")break;
        ++k;
        s->next=G.V->next;
        G.V->next=s;
    }
    if(k==0)
    {
        cout<<"<<<<校园景点导游文件读取失败"<<endl;
        cout<<"-------------------------------------"<<endl;
        return false;
    }
    G.Vnum=k;
    cout<<"<<<<校园景点导游文件读取成功"<<endl;
    return true;
}
bool JudgeVNode(Graph &G,int ID)
{
    Vertex p=G.V->next;
    while(p)
    {
        if(p->id==ID)return false;
        p=p->next;
    }
    return true;
}
void SingleQueryVNode(Graph &G)
{
    int ID;
    cout<<"输入要查询的景点编号:";
    cin>>ID;
    Vertex p=G.V->next;
    while(p)
    {
        if(p->id==ID)
        {
            cout<<endl;
            cout<<"|景点编号:"<<p->id<<endl;
            cout<<"|景点名称:"<<p->name<<endl;
            cout<<"|景点信息:"<<p->info<<endl;
            cout<<"--------------------"<<endl;
            return;
        }
        p=p->next;
    }
    cout<<"<<<<查询失败,没有该景点"<<endl;
}
void QueryVNode(Graph &G)
{
    cout<<"<<<<总景点数:"<<G.Vnum<<endl;
    Vertex p=G.V->next;
    while(p)
    {
        cout<<endl;
        cout<<"|景点编号:"<<p->id<<endl;
        cout<<"|景点名称:"<<p->name<<endl;
        cout<<"|景点信息:"<<p->info<<endl;
        cout<<"--------------------"<<endl;
        p=p->next;
    }
}
void AddVNode(Graph &G)
{
    Vertex v=new VNode;
    v->next=NULL;
    cout<<"|景点编号:";
    cin>>v->id;
    cout<<"|景点名称:";
    cin>>v->name;
    cout<<"|景点信息:";
    cin>>v->info;
    if(JudgeVNode(G,v->id))
    {
        G.Vnum++;
        v->next=G.V->next;
        G.V->next=v;
        cout<<"<<<<增加成功"<<endl;
    }
    else cout<<"<<<<编号已经存在,增加失败"<<endl;
}
void DeleteVNode(Graph &G)
{
    int ID;
    cout<<"输入要查询的景点编号:";
    cin>>ID;
    Vertex p=G.V;
    while(p->next)
    {
        if(p->next->id==ID)
        {
            Vertex s=p->next;
            p->next=s->next;
            delete s;
            G.Vnum--;
            cout<<"<<<<删除景点成功"<<endl;
            return;
        }
        p=p->next;
    }
    cout<<"<<<<编号输入错误"<<endl;
}
void CreatGraph(Graph &G)
{
    for(int i=0;i<=MAXV;++i)
        G.r[i].clear();
    int num;
    cout<<"<<<<输入要创建图的总边数:";
    cin>>num;
    while(num--)
    {
        int From,To,Distance,Time;
        cout<<"输入起点,终点,距离,花费时间(空格隔开):";
        cin>>From>>To>>Distance>>Time;
        if(!JudgeVNode(G,From)&&!JudgeVNode(G,To))
        {
            G.r[From].push_back(Edge{To,Distance,Time});
            G.r[To].push_back(Edge{From,Distance,Time});
            G.Enum++;
            cout<<"<<<<一条双向边添加成功"<<endl;
        }
        else cout<<"<<<<顶点不存在,添加失败"<<endl;
    }
}
Vertex FindVNode(Graph &G,int ID)
{
    Vertex p=G.V->next;
    while(p)
    {
        if(p->id==ID)return p;
        p=p->next;
    }
}
void MinRoad(Graph &G)
{
    memset(dis,inf,sizeof(dis));
    memset(vis,0,sizeof(vis));
    memset(pre,0,sizeof(pre));
    int From,To;
    cout<<"起始点:";
    cin>>From;
    cout<<"终点:";
    cin>>To;
    if(!JudgeVNode(G,From)&&!JudgeVNode(G,To))
    {
        dis[From]=0;
        int k=G.Vnum-1;
        while(k--)
        {
            int MIN=inf,L;
            Vertex p=G.V->next;
            while(p)
            {
                if(!vis[p->id]&&dis[p->id]<MIN)
                {
                    MIN=dis[p->id];
                    L=p->id;
                }
                p=p->next;
            }
            if(vis[L])continue;
            vis[L]=1;
            for(int i=0;i<G.r[L].size();++i)
            {
                int R=G.r[L][i].to;
                int W=G.r[L][i].distance;
                if(!vis[R]&&dis[R]>dis[L]+W)
                {
                    dis[R]=dis[L]+W;
                    pre[R]=L;               //记录前驱
                }
            }
        }
        if(dis[To]==inf){cout<<"<<<<两点之间不可达"<<endl;return;}
        cout<<FindVNode(G,From)->name<<"到"<<FindVNode(G,To)->name<<"的最短距离为"<<dis[To]<<"米"<<endl;
        cout<<"<<<<具体路径为:"<<endl;
        int temp[MAXV+1];
        k=1;
        temp[1]=To;
        while(pre[To])
        {
            temp[++k]=pre[To];
            To=pre[To];
        }
        cout<<FindVNode(G,temp[k])->name;
        for(int i=k-1;i>=1;--i)
            cout<<"->"<<FindVNode(G,temp[i])->name;
        cout<<endl;
        cout<<"-----------------------------------"<<endl;
    }
    else cout<<"<<<<输入的起点或终点不存在"<<endl;
}
void MinTime(Graph &G)
{
    memset(mint,inf,sizeof(mint));
    memset(vis,0,sizeof(vis));
    memset(pre,0,sizeof(pre));
    int From,To;
    cout<<"起始点:";
    cin>>From;
    cout<<"终点:";
    cin>>To;
    if(!JudgeVNode(G,From)&&!JudgeVNode(G,To))
    {
        mint[From]=0;
        int k=G.Vnum-1;
        while(k--)
        {
            int MIN=inf,L;
            Vertex p=G.V->next;
            while(p)
            {
                if(!vis[p->id]&&mint[p->id]<MIN)
                {
                    MIN=mint[p->id];
                    L=p->id;
                }
                p=p->next;
            }
            if(vis[L])continue;
            vis[L]=1;
            for(int i=0;i<G.r[L].size();++i)
            {
                int R=G.r[L][i].to;
                int W=G.r[L][i].time;
                if(!vis[R]&&mint[R]>mint[L]+W)
                {
                    mint[R]=mint[L]+W;
                    pre[R]=L;               //记录前驱
                }
            }
        }
        if(mint[To]==inf){cout<<"<<<<两点之间不可达"<<endl;return;}
        cout<<FindVNode(G,From)->name<<"到"<<FindVNode(G,To)->name<<"的最少时间为"<<mint[To]<<"分"<<endl;
        cout<<"<<<<具体路径为:"<<endl;
        int temp[MAXV+1];
        k=1;
        temp[1]=To;
        while(pre[To])
        {
            temp[++k]=pre[To];
            To=pre[To];
        }
        cout<<FindVNode(G,temp[k])->name;
        for(int i=k-1;i>=1;--i)
            cout<<"->"<<FindVNode(G,temp[i])->name;
        cout<<endl;
        cout<<"-----------------------------------"<<endl;
    }
    else cout<<"<<<<输入的起点或终点不存在"<<endl;
}
void SchoolSpot(Graph &G)
{
    int mark=0;
    while(1)
    {
        cout<<"                           ------------------------"<<endl;
        cout<<"                          |  欢迎来到校园景点系统  |"<<endl;
        cout<<"                          |------------------------|"<<endl;
        cout<<"                          |     1--查看单一景点    |"<<endl;
        cout<<"                          |     2--增加景点        |"<<endl;
        cout<<"                          |     3--删除景点        |"<<endl;
        cout<<"                          |     4--查看全部景点    |"<<endl;
        cout<<"                          |     5--构图            |"<<endl;
        cout<<"                          |     6--两点最短路径    |"<<endl;
        cout<<"                          |     7--两点最少时间    |"<<endl;
        cout<<"                          |     其他--退出         |"<<endl;
        cout<<"                           ------------------------"<<endl;
        int op;
        cout<<"输入你的选择:";
        cin>>op;
        switch(op)
        {
            case 1:SingleQueryVNode(G);break;
            case 2:AddVNode(G);break;
            case 3:DeleteVNode(G);break;
            case 4:QueryVNode(G);break;
            case 5:CreatGraph(G);break;
            case 6:MinRoad(G);break;
            case 7:MinTime(G);break;
            default :mark=1;cout<<"欢迎下次再来!"<<endl;
        }
        if(mark)break;
    }
}



//停车场管理系统

void InitSqStack(SqStack &S){S.top=0;}
void InitLinkQueue(LinkQueue &Q)
{
    Q.Front=Q.Real=new QNode;
    Q.Front->next=NULL;
    Q.Front->c.stime=0;
    Q.length=0;
}
bool ArriveJudge(SqStack &S,LinkQueue &Q,Car car)
{
    if(car.stime<=0){cout<<"<<<<到达时间不合法!"<<endl;return false;}
    for(int i=1;i<=S.top;++i)
    {
        if(S.c[i].id==car.id){cout<<"<<<<该车已在停产场内!"<<endl;return false;}
        if(S.c[i].stime>car.stime){cout<<"<<<<到达时间不合法!"<<endl;return false;}
    }
    QueuePtr p=Q.Front->next;
    while(p)
    {
        if(p->c.id==car.id){cout<<"<<<<该车已在便道内!"<<endl;return false;}
        p=p->next;
    }
    if(Q.Real->c.stime>car.stime){cout<<"<<<<到达时间不合法!"<<endl;return false;}
    return true;
}
bool Full(SqStack &S)
{
    if(S.top==MAXCAR)return true;
    return false;
}
void Push(SqStack &S,Car car)
{
    S.top++;
    S.c[S.top]=car;
}
void EnQueue(LinkQueue &Q,Car car)
{
    QueuePtr s=new QNode;
    s->c=car;
    s->next=NULL;
    Q.Real->next=s;
    Q.Real=s;
    Q.length++;
}
void Arrive(SqStack &S,LinkQueue &Q)
{
    int hour,fen;
    Car car;
    cout<<"车牌号:";
    cin>>car.id;
    cout<<"到达时间(输入小时与分钟,空格隔开):";
    cin>>hour>>fen;
    if(hour<0||hour>23||fen<0||fen>59){cout<<"<<<<输入时间不合法"<<endl;return;}
    car.stime=hour*60+fen;
    if(!ArriveJudge(S,Q,car))return;
    if(!Full(S)){Push(S,car);cout<<"<<<<停车位置:"<<S.top<<endl;}
    else{EnQueue(Q,car);cout<<"<<<<停车场,已进便道候车"<<endl;}
}
void Pop(SqStack &S)
{
    S.top--;
}
void DeQueue(LinkQueue &Q,Car &car)
{
    QueuePtr p=Q.Front->next;
    car=p->c;
    Q.Front->next=p->next;
    if(p==Q.Real)Q.Real=Q.Front;
    delete p;
    Q.length--;
}
void Leave(SqStack &S,SqStack &TempS,LinkQueue &Q)
{
    if(S.top==0){cout<<"<<<<停车场空空如也!"<<endl;return;}
    string ID;
    int ETIME,hour,fen;
    cout<<"车牌号:";
    cin>>ID;
    cout<<"离开时间(输入小时与分钟,空格隔开):";
    cin>>hour>>fen;
    if(hour<0||hour>23||fen<0||fen>59){cout<<"<<<<输入时间不合法"<<endl;return;}
    ETIME=hour*60+fen;
    int k=-1;
    for(int i=1;i<=S.top;++i)
        if(S.c[i].id==ID){k=i;break;}
    if(k==-1)
    {
        QueuePtr p=Q.Front;
        while(p->next)
        {
            if(p->next->c.id==ID)
            {
                QueuePtr s=p->next;
                if(s->c.stime>ETIME){cout<<"<<<<离开时间不合法"<<endl;return;}
                p->next=s->next;
                if(s==Q.Real)Q.Real=p;
                delete s;
                cout<<"<<<<已从便道离开"<<endl;
                return;
            }
            p=p->next;
        }
        cout<<"<<<<没有此车"<<endl;return;
    }
    else
    {
        if(S.c[k].stime>ETIME){cout<<"<<<<离开时间不合法"<<endl;return;}
        cout<<"-----------"<<endl;
        cout<<"|车牌号:"<<ID<<endl;
        cout<<"|应收费:"<<Price*(ETIME-S.c[k].stime)<<endl;
        cout<<"-----------"<<endl;
        for(int i=S.top;i>k;--i)
        {
            Push(TempS,S.c[i]);
            Pop(S);
        }
        Pop(S);
        for(int i=TempS.top;i>=1;--i)
        {
            Push(S,TempS.c[i]);
            Pop(TempS);
        }
        cout<<"<<<<已从停车场离开"<<endl;
        if(Q.Front!=Q.Real)
        {
            Car car;
            DeQueue(Q,car);
            car.stime=ETIME;
            Push(S,car);
        }
    }
}
void QueryPark(SqStack &S)
{
    if(S.top==0){cout<<"<<<<停车场空空如也"<<endl;return;}
    cout<<"停车场总车辆:"<<S.top<<endl<<endl;
    for(int k=S.top;k>=1;--k)
    {
        cout<<"|车牌号:"<<S.c[k].id<<endl;
        cout<<"|位置:"<<k<<endl;
        cout<<"-----------"<<endl;
    }
}
void QueryRoad(LinkQueue &Q)
{
    if(Q.Front==Q.Real){cout<<"<<<<便道空空如也"<<endl;return;}
    QueuePtr p=Q.Front->next;
    cout<<"便道总车辆:"<<Q.length<<endl;
    cout<<"按照顺序如下:"<<endl;
    while(p){cout<<"|车牌号:"<<p->c.id<<endl;p=p->next;}
}
void Park(SqStack &S,SqStack &TempS,LinkQueue &Q)
{
    int mark=0;
    while(1)
    {
        cout<<"                       -----------------------------------"<<endl;
        cout<<"                      |       欢迎来到停车场管理系统      |"<<endl;
        cout<<"                      |-----------------------------------|"<<endl;
        cout<<"                      |         1--车辆到达               |"<<endl;
        cout<<"                      |         2--车辆离去               |"<<endl;
        cout<<"                      |         3--查看停车场             |"<<endl;
        cout<<"                      |         4--查看便道               |"<<endl;
        cout<<"                      |         其他--退出                |"<<endl;
        cout<<"                       -----------------------------------"<<endl;
        int op;
        cout<<"输入你的选择:";
        cin>>op;
        switch(op)
        {
            case 1:Arrive(S,Q);break;
            case 2:Leave(S,TempS,Q);break;
            case 3:QueryPark(S);break;
            case 4:QueryRoad(Q);break;
            default:mark=1;cout<<"<<<<欢迎下次再来,再见!"<<endl;
        }
        if(mark)break;
    }
}


//二手市场

bool ReadMarket(Market &M)
{
    ifstream in("二手市场.txt");
    int k=1;
    while(1)
    {
        in>>M.g[k].id>>M.g[k].name>>M.g[k].price>>M.g[k].sale;
        if(M.g[1].id=="")
        {
            cout<<"<<<<二手市场文件读取失败"<<endl;
            cout<<"-------------------------------------"<<endl;
            return false;
        }
        if(M.g[k].id=="")break;
        ++k;
    }
    M.length=k-1;
    cout<<"<<<<二手市场文件读取成功"<<endl;
    return true;
}
void BubbleSort(Market &M)
{
    cout<<" -----------------"<<endl;
    cout<<"|1--按销量查看商品|"<<endl;
    cout<<"|2--按价格查看商品|"<<endl;
    cout<<" -----------------"<<endl;
    int op;
    cin>>op;
    if(op==1)
    {
        for(int i=1;i<M.length;++i)
            for(int j=i+1;j<=M.length;++j)
                if(M.g[i].sale>M.g[j].sale)
                {
                    M.g[0]=M.g[i];
                    M.g[i]=M.g[j];
                    M.g[j]=M.g[0];
                }
    }
    else if(op==2)
    {
        for(int i=1;i<M.length;++i)
            for(int j=i+1;j<=M.length;++j)
                if(M.g[i].price>M.g[j].price)
                {
                    M.g[0]=M.g[i];
                    M.g[i]=M.g[j];
                    M.g[j]=M.g[0];
                }
    }
}
void QueryMarket(Market &M)
{
    BubbleSort(M);
    cout<<"<<<<二手商品总数:"<<M.length<<endl;
    for(int k=1;k<=M.length;++k)
    {
        cout<<endl;
        cout<<"|编号:"<<M.g[k].id<<endl;
        cout<<"|商品:"<<M.g[k].name<<endl;
        cout<<"|价格:"<<M.g[k].price<<endl;
        cout<<"|销量:"<<M.g[k].sale<<endl;
        cout<<"--------------------"<<endl;
    }
}
bool JudgeMarket(Market &M,string ID)
{
    for(int i=1;i<=M.length;++i)
        if(M.g[i].id==ID)return false;
    return true;
}
void ReviseMarket(Market &M)
{
    cout<<"输入要修改的编号:";
    string ID;
    cin>>ID;
    for(int k=1;k<=M.length;++k)
        if(ID==M.g[k].id)
        {
            cout<<"--------------------"<<endl;
            cout<<"1--编号:"<<M.g[k].id<<endl;
            cout<<"2--商品:"<<M.g[k].name<<endl;
            cout<<"3--价格:"<<M.g[k].price<<endl;
            cout<<"4--销量:"<<M.g[k].sale<<endl;
            cout<<"其他:无任何改动"<<endl;
            cout<<"--------------------"<<endl;
            int op;
            cout<<"输入你的选择:";
            cin>>op;
            string str;
            int key;
            if(op>=1&&op<=4)cout<<"输入修改内容:";
            switch(op)
            {
                case 1:cin>>str;if(JudgeMarket(M,str)){M.g[k].id=str;cout<<"<<<<修改成功"<<endl;}
                       else cout<<"<<<<编号已经存在,修改失败"<<endl;break;
                case 2:cin>>str;M.g[k].name =str;cout<<"<<<<修改成功"<<endl;break;
                case 3:cin>>key;M.g[k].price=key;cout<<"<<<<修改成功"<<endl;break;
                case 4:cin>>key;M.g[k].sale=key;cout<<"<<<<修改成功"<<endl;break;
                default :cout<<"<<<<没有任何修改!"<<endl;
            }
            return;
        }
    cout<<"<<<<编号输入错误"<<endl;
}
void AddMarket(Market &M)
{
    Goods m;
    cout<<"|编号:";
    cin>>m.id;
    cout<<"|商品:";
    cin>>m.name;
    cout<<"|价格:";
    cin>>m.price;
    cout<<"|销量:";
    cin>>m.sale;
    if(JudgeMarket(M,m.id))
    {
        M.length++;
        M.g[M.length]=m;
        cout<<"<<<<发布成功"<<endl;
    }
    else cout<<"<<<<编号已经存在,发布失败"<<endl;
}
void DeleteMarket(Market &M)
{
    cout<<"输入要下架的编号:";
    string ID;
    cin>>ID;
    int k;
    for(k=1;k<=M.length;++k)
        if(ID==M.g[k].id)break;
    if(k==M.length+1){cout<<"<<<<编号输入错误"<<endl;return;}
    else
    {
        for(int i=k;i<=M.length-1;++i)
            M.g[i]=M.g[i+1];
        M.length--;
        cout<<"<<<<下架成功"<<endl;
    }
}

void FleaMarket(Market &M)
{
    int mark=0;
    while(1)
    {
        cout<<"                       -----------------------------------"<<endl;
        cout<<"                      |          欢迎来到二手市场         |"<<endl;
        cout<<"                      |-----------------------------------|"<<endl;
        cout<<"                      |          1--查看                  |"<<endl;
        cout<<"                      |          2--修改                  |"<<endl;
        cout<<"                      |          3--发布                  |"<<endl;
        cout<<"                      |          4--下架                  |"<<endl;
        cout<<"                      |          其他--退出               |"<<endl;
        cout<<"                       -----------------------------------"<<endl;
        int op;
        cout<<"输入你的选择:";
        cin>>op;
        switch(op)
        {
            case 1:QueryMarket(M);break;
            case 2:ReviseMarket(M);break;
            case 3:AddMarket(M);break;
            case 4:DeleteMarket(M);break;
            default :mark=1;cout<<"欢迎下次再来!"<<endl;
        }
        if(mark)break;
    }
}


//聊天

void InitChat(Chat &C)
{
    memset(C.vis,false,sizeof(C.vis));
    C.length=0;
}
void BeginChat(Chat &C,Account A)
{
    string ID;
    cout<<"输入您聊天对象的账户号码:";
    cin>>ID;
    int mark=-1;
    for(int i=0;i<C.length;++i)
        if(C.account[i].id==ID)
        {
            mark=i;
            break;
        }
    if(mark==-1)cout<<"<<<<没有此账户"<<endl;
    else
    {
        if(!C.vis[mark])cout<<"<<<<对方不在线呢"<<endl;
        else
        {
            cout<<"对方在线,开始聊天吧!"<<endl;
            while(1)
            {
                int p=0,q=0;
                    cout<<A.name<<"继续发送消息?(y/n)";
                    char ch;
                    cin>>ch;
                    if(ch!='y')
                    {
                        cout<<"<<<<输入结束"<<endl;
                        p=1;
                    }
                    else
                    {
                        cout<<"请输入:";
                        string message;
                        cin>>message;
                        cout<<A.name<<"说:"<<endl;
                        cout<<"<<<<"<<message<<endl;
                    }
                    cout<<C.account[mark].name<<"继续发送消息?(y/n)";
                    cin>>ch;
                    if(ch!='y')
                    {
                        cout<<"<<<<输入结束"<<endl;
                        q=1;
                    }
                    else
                    {
                        cout<<"请输入:";
                        string message;
                        cin>>message;
                        cout<<C.account[mark].name<<"说:"<<endl;
                        cout<<"<<<<"<<message<<endl;
                    }
                if(p&&q)
                {
                    cout<<"<<<<聊天结束"<<endl;
                    return;
                }
            }
        }
    }
}
void Register(Chat &C)
{
    cout<<"                <注册系统>"<<endl;
    cout<<"账  号:";
    cin>>C.account[C.length].id;
    cout<<"用户名:";
    cin>>C.account[C.length].name;
    cout<<"密  码:";
    cin>>C.account[C.length].password;
    for(int i=0;i<C.length;++i)
        if(C.account[i].id==C.account[C.length].id)
        {
            cout<<"<<<<账号已存在,注册失败!"<<endl;
            return;
        }
    C.length++;
    cout<<"<<<<恭喜你,注册成功,立即登陆吧"<<endl;
}
void Login(Chat &C)
{
    Account A;
    cout<<"                <登陆系统>"<<endl;
    cout<<"账  号:";
    cin>>A.id;
    cout<<"密  码:";
    cin>>A.password;
    int mark=-1;
    for(int i=0;i<C.length;++i)
        if(C.account[i].id==A.id&&C.account[i].password==A.password)
        {
            C.vis[i]=true;
            cout<<"<<<<登陆成功"<<endl;
            mark=i;
            break;;
        }
    if(mark==-1)
    {
        cout<<"<<<<登陆失败,请认真核对账号密码是否输入正确!"<<endl;
        return;
    }
    cout<<"是否开始聊天?(y/n)";
    char ch;
    cin>>ch;
    if(ch=='y')BeginChat(C,C.account[mark]);
}
void WeChat(Chat &C)
{
    while(1)
    {
        int mark=0;
        cout<<"                       -----------------------------------"<<endl;
        cout<<"                      |     欢迎来到双人在线聊天系统      |"<<endl;
        cout<<"                      |-----------------------------------|"<<endl;
        cout<<"                      |         1--注册                   |"<<endl;
        cout<<"                      |         2--登陆                   |"<<endl;
        cout<<"                      |         其他--退出                |"<<endl;
        cout<<"                       -----------------------------------"<<endl;
        int op;
        cout<<"输入你的选择:";
        cin>>op;
        switch(op)
        {
            case 1:Register(C);break;
            case 2:Login(C);break;
            default :mark=1;cout<<"欢迎下次再来!"<<endl;
        }
        if(mark)break;
    }
}
void Menu(Department &D,Food &F,Graph &G,SqStack &S,SqStack &TempS,LinkQueue &Q,Market &M,Chat &C)
{
    cout<<"                       -----------------------------------"<<endl;
    cout<<"                      |     欢迎来到中工校园百事通系统    |"<<endl;
    cout<<"                      |-----------------------------------|"<<endl;
    cout<<"                      |         1--学校部门               |"<<endl;
    cout<<"                      |         2--校园餐饮               |"<<endl;
    cout<<"                      |         3--校园景点导游咨询       |"<<endl;
    cout<<"                      |         4--校园停车场管理系统     |"<<endl;
    cout<<"                      |         5--二手市场               |"<<endl;
    cout<<"                      |         6--双人在线文本聊天       |"<<endl;
    cout<<"                      |         其他--退出                |"<<endl;
    cout<<"                       -----------------------------------"<<endl;
    int op;
    cout<<"输入你的选择:";
    cin>>op;
    switch(op)
    {
        case 1:SchoolDepartment(D);break;
        case 2:Catering(F);break;
        case 3:SchoolSpot(G);break;
        case 4:Park(S,TempS,Q);break;
        case 5:FleaMarket(M);break;
        case 6:WeChat(C);break;
        default :flag=1;cout<<"欢迎下次再来!"<<endl;
    }
}
int main()
{

    //学校部门
    Department D;
    ReadDepartment(D);
    //校园餐饮
    Food F;
    ReadFood(F);
    //校园景点导游
    Graph G;
    ReadVNode(G);
    //停车场
    SqStack S,TempS;
    LinkQueue Q;
    InitSqStack(S);
    InitSqStack(TempS);
    InitLinkQueue(Q);

    //二手市场
    Market M;
    ReadMarket(M);
    //聊天
    Chat C;
    InitChat(C);

    while(1)
    {
        Menu(D,F,G,S,TempS,Q,M,C);
        if(flag)break;
        system("pause");
        system("cls");
    }
    return 0;
}

[简单展示]

猜你喜欢

转载自blog.csdn.net/qq_40744093/article/details/86246022
今日推荐