版权声明:转载请留言 https://blog.csdn.net/qq_40744093 https://blog.csdn.net/qq_40744093/article/details/86246022
中工校园百事通系统(****)
要用到文件操作,使用CodeBlocks,建议放到同一目录下
[问题描述]
中工校园百事通平台汇聚的是与校园有关的各类公共信息查询服务,包括与学生相关的衣食住行,学习、娱乐等分类,为学生校园生活提供各类查询服务,主要包括如下模块的增删改查等功能:
- 学校部门,包括院系位置及办公电话(存储:链表←→文件)
- 校园餐饮:名称、位置、电话及特色(存储:顺序表←→文件)
- 校园景点导游咨询:为来访的客人提供各种景点信息查询服务(景点间行程的最短路径、时间或最少经费等需求)
- 校园停车场管理系统(停车场:栈结构;便道:实现临时存车,先来先存)
- 二手市场:供求信息查询或发布,查询时按销量或价格排序(存储:顺序表←→文件)
- 文本聊天系统:聊天双方能安全、快捷传输聊天内容
[设计要求]
- 要有选择操作界面,实现形式不限,各个处理对象的组成结构根据需求自行合理定义
- 要用数据结构中所学知识点
- 大量的数据保存建议使用文件保存
[设计思路]
- 链表
- 顺序表
- 最短路
- 栈和队列
- 排序
- 聊天互动
[文件内容]
[代码及注释]
#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;
}
[简单展示]