1 问题描述
在当今的电子商务时代,全球物流产业有了新的发展趋势。现代物流服务的核心目标是在物流全过程中以最小的综合成本来满足顾客的需求。
在这个“互联网+”的时代,众多的学者研究员,针对物流选址,物流调度,不断提出新的思考与研究成果,从改进花朵授粉算法,萤火虫算法,混合蝙蝠算法,到遗传算法,再到蚂蚁算法。人们对物流越来越重视。物流已经成为现代人生产生活离不开的重要组成部分。
着眼未来,从2013年的汉诺威工业博览会上德国提出工业4.0,以期望利用信息化技术促进产业变革,到2015年5月中华人民共和国国务院正式印发《中国制造2025》,部署全面推进实施制造强国战略。中德双方签署的《中德合作行动纲要》中,有关工业4.0合作的内容共有4条,第一条就明确提出工业生产的数字化就是“工业4.0”对于未来中德经济发展具有重大意义。双方认为,两国政府应为企业参与该进程提供政策支持。
工业4.0项目主要分为三个主题“智能工厂”,“智能生产”,“智能物流”,所以说物流无论是在现在还是未来,都有着广阔的发展前景。因此一个能在智能化时代发挥作用的物流的管理系统将在未来发挥无可估量的作用。
本次课程设计将会对物流管理系统进行简单的实现,从顾客的下单,到配送将有一个较为完整的实现,当然这只是一次对于整个物流的简单模拟。
本系统是为了在物流中以最小的综合成本来满足顾客的需求而进行开发的,将会在顾客下单,物流配送,两个大的方面,针对用户的实际需求,提出解决方案。
第一部分顾客下单,这个功能的设计主要是利用队列先进先出的独特结构,给予用户较为公平的用户体验,在工作窗口不能满足现有工作量的时候,系统将会对后来的用户进行入队操作;在工作完成后,顾客离开,将会有评分功能,以期望的到用户反馈,提高公司的服务质量;另提供查询排队人数,业务办理等基础功能。
第二部分是物流的配送,这个功能的设计是用数组表示法创建一个无向图,针对用户的实际需求,将校园内标志地点的编号、名称、简介等信息放入到图的顶点当中,将各地点间的距离信息存放在弧当中。利用弗洛伊德算法求出两个地点之间的最短路径以及预计用时;用相应的函数来查找景点,并显示出它的编号,信息,简介。可以根据快递员的需求添加或删除节点地点,但不能对用户输入的信息进行存储。当用户操作完毕需要退出时,需提供退出选项,便于用户退出系统。在界面显示适量的提示信息,保证用户能够较为容易的上手该系统。
2 数据结构描述
2.1 数据结构和存储结构
1. 队列
队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列在很多实际问题中有很重要的应用,操作系统,客服系统,都是应用了一种数据结构来实现先进先出的典范,这也是在本系统中应用队列的主要原因。
typedef struct CheckInfo
{
int guke; //顾客编号
char name[32]; //收件人
char phone[32]; //手机号
char introduction[256]; //物品描述
int position; //目的地编号
}checkinfo,Arr[ci];
typedef struct List
{
CheckInfo A[n+1]; //顾客用来办理业务的N个窗口
int len; //表示数组中的元素个数
}List;
typedef struct Lnode
{//链表结点类型
int guke; //顾客编号
char name[32]; //收件人
char phone[32]; //手机号
char introduction[256]; //物品描述
int position; //目的地编号
struct Lnode *next;
}Lnode;
typedef struct Linkqueue
{ //链式存储的等候队列的类型定义
Lnode *front;
Lnode *rear;
}Linkqueue;
2. 图
图是比树更一般,更复杂的非线性数据结构。图结构中结点之间的关系是任意的,每个元素都可以和其他任何元素相关,即元素之间是多对多的关系。在计算机科学中,图是最灵活的数据结构之一,很多问题都可以使用图模型进行建模求解,例如系统工程、化学分析、统计力学、遗传学、人工智能等领域。本系统中,为了描述各个地点以及其之间的路径关系,采用图的数据结构,结点代表地点,结点间的边代表地点之间的路径,边的权值代表路径的长度以及所花费的费用。
typedef struct mgraph
{ //图的结构信息
vexsinfo vexs[MaxVertexNum]; //顶点向量(数组)
adjmatrix arcs; //邻接矩阵
int vexnum,arcnum; //顶点,边数
}mgraph;
3. 邻接矩阵存储
本系统采用图的邻接矩阵存储结构。图的邻接矩阵表示法也成为数组表示法。它采用两个数组来表示图:一个是用于存储定点信息的一维数组,另一个是用于存储图中顶点之间关联关系的二维数组,这个关联关系数组被称为邻接矩阵。采用邻接矩阵存储法表示图,很便于实现图的一些基本操作,比如查询,判断,插入,删除等操作。本系统会经常进行这些操作,所以本系统采用图的邻接矩阵存储结构。
typedef struct arcell
{ //边的权值信息
int adj; //权值
} arcell,adjmatrix[MaxVertexNum][MaxVertexNum]; //图的邻接矩阵类型
typedef struct vexsinfo
{//顶点信息
int position; //编号
char name[32]; //名称
char introduction[256]; //简介
} vexsinfo;
typedef struct mgraph
{//图的结构信息
vexsinfo vexs[MaxVertexNum]; //顶点向量(数组)
adjmatrix arcs; //邻接矩阵
int vexnum,arcnum; //顶点,边数
}mgraph;
2.2 主要算法
1. 弗洛伊德算法
弗洛伊德算法是通过一个图的权值矩阵求出它的每两点间的最短路径矩阵。从图的带权邻接矩阵A=[a(i,j)] n×n开始,递归地进行n次更新,即由矩阵D(0)=A,按一个公式,构造出矩阵D(1);又用由D(1)构造出D(2);……;最后构造出矩阵D(n)。矩阵D(n)的i行j列元素便是i号顶点到j号顶点的最短路径长度,称D(n)为图的距离矩阵,同时还可引入一个后继节点矩阵path来记录两点间的最短路径。
2.3 ADT
ADT,即抽象数据类型,是一个实现包括储存数据元素的存储结构以及实现基本操作的算法。在这个数据抽象的思想中,数据类型的定义和它的实现是分开的。以下为本系统的ADT。
ADT system{
数据对象{ vexnum,arcnum,vexs[NO],arc[NO][NO]}
基本操作{
void Initshuzu():初始化数组
void Initqueue(Linkqueue *qu):初始化队列
mgraph initgraph():初始化图
void mytime()
void Enqueue(Linkqueue *Q,CheckInfo elem):进队操作
CheckInfo Dlqueue(Linkqueue *Q):出队操作
void daoda(int x):顾客到达
void likai(int x):顾客离开
int guitai( ):判断柜台号是否正确
int pingfeng( ):判断输入分数是否正确
void mygrade():评分主函数
void printl():业务查询
void print2():排队查询
void browsecompus(mgraph c):显示所有景点信息
void shortestpath_floyd(mgraph c):查询两景点间的最短路径
int locatevex(mgraph c,int v):查找景点在图中的序号
void path(mgraph c, int m,int u,int k):打印序号m,n之间的路径
int allpath(mgraph c):打印两个景点中长度不超过8的路径
int creatgragh(mgraph *c):构造图的邻接矩阵
int newgraph(mgraph *c):更新图的部分信息
int enarc(mgraph *c):增加一条边
int envex(mgraph *c):增加一个顶点
int delvex(mgraph *c):删除一个顶点
int delarc(mgraph *c):删除图的一条边
void printmatrix(mgraph c):输出图的邻接矩阵
int changegraph(mgraph *c):图操作主函数
void mainwork(mgraph campus):快递员所用函数
void workmain():顾客
} ADT system
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#include <iostream>
#include <conio.h>
#define Infinity 1000
#define MaxVertexNum 35
#define MAX 40
#define ci 100 //等待中的人
#define n 3 //柜台个数
using namespace std;
int y,z; //y评分 z柜台数
float sum1=0,sum2=0,sum3=0,sum4=0,sum5=0; //每个柜台的评分总数
float i1=0,i2=0,i3=0,i4=0,i5=0;
float ave1=0,ave2=0,ave3=0,ave4=0,ave5=0;
//数据结构队列的定义
typedef struct CheckInfo
{
int guke; //顾客编号
char name[32]; //收件人
char phone[32]; //手机号
char introduction[256]; //物品描述
int position; //目的地编号
}checkinfo,Arr[ci];
typedef struct List
{
CheckInfo A[n+1]; //顾客用来办理业务的N个窗口
int len; //表示数组中的元素个数
}List;
typedef struct Lnode
{//链表结点类型
int guke; //顾客编号
char name[32]; //收件人
char phone[32]; //手机号
char introduction[256]; //物品描述
int position; //目的地编号
struct Lnode *next;
}Lnode;
typedef struct Linkqueue
{ //链式存储的等候队列的类型定义
Lnode *front;
Lnode *rear;
}Linkqueue;
//数据结构中图的定义
typedef struct arcell
{ //边的权值信息
int adj; //权值
} arcell,adjmatrix[MaxVertexNum][MaxVertexNum]; //图的邻接矩阵类型
typedef struct vexsinfo
{//顶点信息
int position; //编号
char name[32]; //名称
char introduction[256]; //简介
} vexsinfo;
typedef struct mgraph
{//图的结构信息
vexsinfo vexs[MaxVertexNum]; //顶点向量(数组)
adjmatrix arcs; //邻接矩阵
int vexnum,arcnum; //顶点,边数
}mgraph;
//全局变量
int visited[35]; //标志是否访问
int d[35]; //存储路径顶点编号
mgraph campus; //图变量
List L,L1; //列表
Linkqueue Q,Q1; //链式对列
CheckInfo C; //快递单信息
int countt = 0; //快递单总数
//(1)-(3)初始化
//(1)初始化数组
void Initshuzu()
{
int i;
for(i=1;i<=n;i++){
L.A[i].guke=0;
strcpy(L.A[i].name,"0");
strcpy(L.A[i].phone,"0");
strcpy(L.A[i].introduction,"0");
L.A[i].position=0;
}
//元素值为0,表示编号为I的窗口当前状态为空
L.len=0;
}
//(2)初始化队列
void Initqueue(Linkqueue *qu)
{
qu->front=qu->rear=(Lnode *)malloc(sizeof(Lnode));
qu->front->next=NULL;
}
// (3) 初始化图
mgraph initgraph()
{
int i=0,j=0;
mgraph c;
c.vexnum =28; //顶点个数
c.arcnum =39; //边的个数
for(i=0;i<c.vexnum ;i++) //依次设置顶点编号
c.vexs[i].position =i;
//依次输入顶点信息
strcpy(c.vexs[0].name ,"天天快乐");
strcpy(c.vexs[0].introduction ,"该区域最大的快递公司");
strcpy(c.vexs[1].name ,"材料科学与工程学院");
strcpy(c.vexs[1].introduction ,"齐齐哈尔大学材料科学与工程学院成立于2010年3月");
strcpy(c.vexs[2].name ,"国际教育学院");
strcpy(c.vexs[2].introduction ,"齐齐哈尔大学国际教育学院,承担外国留学生汉语言专业、汉语国际教育专业的教学及日常管理工作");
strcpy(c.vexs[3].name ,"化学与化学工程学院");
strcpy(c.vexs[3].introduction ,"化学与化学工程学院是由齐齐哈尔轻工学院的化工系与齐齐哈尔师范学院的化学系于1998年组建而成");
strcpy(c.vexs[4].name ,"机电工程学院");
strcpy(c.vexs[4].introduction ,"齐齐哈尔大学机电工程学院始建于1958年获批的化工机械与设备本科专业");
strcpy(c.vexs[5].name,"计算机与控制工程学院");
strcpy(c.vexs[5].introduction ,"计算机与控制工程学院办学历史悠久,整体实力雄厚,拥有国家级大学生校外实践教育基地");
strcpy(c.vexs[6].name ,"建筑与土木工程学院");
strcpy(c.vexs[6].introduction ,"建筑与土木工程学院现开设城乡规划(五年制)、土木工程和人文地理与城乡规划三个全日制本科专业");
strcpy(c.vexs[7].name,"继续教育学院");
strcpy(c.vexs[7].introduction ,"齐齐哈尔大学继续教育学院前身为1983年齐齐哈尔师范学院设置的成人教育处");
strcpy(c.vexs[8].name ,"教育与传媒学院");
strcpy(c.vexs[8].introduction ,"教育学专业为省重点建设专业,教育管理、学前教育、现代教育技术、心理健康教育四个领域教育硕士专业学位授予权。");
strcpy(c.vexs[9].name, "经济与管理学院");
strcpy(c.vexs[9].introduction , "经济与管理学院前身是1983年9月建立的齐齐哈尔轻工学院管理系。");
strcpy(c.vexs[10].name ,"理学院");
strcpy(c.vexs[10].introduction ,"理学院下设数学与应用数学系、信息与计算科学系、物理系、地理系、高等数学教研部和大学物理教学与实验中心6个系级教学部门。");
strcpy(c.vexs[11].name ,"马克思主义学院");
strcpy(c.vexs[11].introduction ,"承担着全校本科生与研究生的思想政治理论课教学任务。历经多年发展,学院凝心聚力,教师踏实敬业。");
strcpy(c.vexs[12].name ,"美术与艺术设计学院");
strcpy(c.vexs[12].introduction ,"学院已有三十年的办学历史,是黑龙江省高校最早开办艺术专业之一,现已成为黑龙江省美术与艺术设计人才培养的重要基地");
strcpy(c.vexs[13].name ,"轻工与纺织学院");
strcpy(c.vexs[13].introduction ,"轻工与纺织学院是学校具有传统优势特色的工科学院");
strcpy(c.vexs[14].name ,"生命科学与农林学院");
strcpy(c.vexs[14].introduction ,"生命科学与农林学院具有48年的办学历史");
strcpy(c.vexs[15].name ,"食品与生物工程学院");
strcpy(c.vexs[15].introduction ,"食品与生物工程学院的前身是齐齐哈尔轻工学院时期的食品工程系。");
strcpy(c.vexs[16].name ,"体育学院");
strcpy(c.vexs[16].introduction ,"体育学院始建于1972年,学院具有光荣的办学历史、深厚的文化底蕴和扎实的办学基础,良好的办学条件在省内外享有盛誉。");
strcpy(c.vexs[17].name ,"通信与电子工程学院");
strcpy(c.vexs[17].introduction ,"通信与电子工程学院设有电子信息工程、通信工程、物联网工程和电子信息科学与技术4个本科专业及专业实验中心和电工电子教学与实验中心等教学科研部门");
strcpy(c.vexs[18].name ,"外国语学院");
strcpy(c.vexs[18].introduction ,"外国语学院前身为齐齐哈尔师范学院外语系,始建于1962年,是黑龙江省重要的外语类人才培养基地。");
strcpy(c.vexs[19].name ,"文学与历史文化学院");
strcpy(c.vexs[19].introduction ,"学院经过几代教育工作者的艰苦努力,形成了鲜明的办学风格与育人理念,拥有良好的社会声誉和较大的社会影响力。");
strcpy(c.vexs[20].name ,"研究生部");
strcpy(c.vexs[20].introduction ,"齐齐哈尔大学研究生教育始于1986年与大连理工大学联合招收硕士研究生,");
strcpy(c.vexs[21].name ,"音乐与舞蹈学院");
strcpy(c.vexs[21].introduction ,"音乐与舞蹈学院是黑龙江省音乐与舞蹈学艺术人才的重要培养基地,创建于1975年。");
strcpy(c.vexs[22].name ,"哲学与法学学院");
strcpy(c.vexs[22].introduction ,"哲学与法学学院涵盖了哲学、法学两大学科门类,思想政治教育(师范类)、法学、社会工作、哲学、政治学与行政学等五个本科专业");
strcpy(c.vexs[23].name ,"公共外语教研部");
strcpy(c.vexs[23].introduction ,"公共外语教研部是承担全校非英语专业大学本科生和研究生公共英语教学工作的教学单位,肩负着以培养大学生英语应用能力为重点的教学任务。");
strcpy(c.vexs[24].name ,"学生公寓1号楼");
strcpy(c.vexs[24].introduction ,"男寝");
strcpy(c.vexs[25].name ,"学生公寓2号楼");
strcpy(c.vexs[25].introduction ,"男寝");
strcpy(c.vexs[26].name ,"学生公寓3号楼");
strcpy(c.vexs[26].introduction ,"女寝");
strcpy(c.vexs[27].name ,"学生公寓4号楼");
strcpy(c.vexs[27].introduction ,"女寝");
//依次输入边上的权值信息
for(i=0;i<c.vexnum ;i++)
for(j=0;j<c.vexnum ;j++)
c.arcs [i][j].adj =Infinity; //先初始化图的邻接矩阵
//部分弧长
c.arcs[0][2].adj=50; c.arcs[0][3].adj=60;
c.arcs[1][4].adj=90;
c.arcs[2][3].adj=60; c.arcs[2][8].adj=40;
c.arcs[3][4].adj=60; c.arcs[3][6].adj=40;
c.arcs[4][5].adj=70; c.arcs[4][9].adj=70; c.arcs[4][10].adj=80; c.arcs[4][17].adj=200;
c.arcs[5][7].adj=70;
c.arcs[6][9].adj=40;
c.arcs[7][18].adj=190;
c.arcs[8][11].adj=50;
c.arcs[9][12].adj=40;
c.arcs[10][18].adj=70;
c.arcs[11][12].adj=60; c.arcs[11][14].adj=50; c.arcs[11][15].adj=50;
c.arcs[12][16].adj=50;
c.arcs[13][14].adj=40; c.arcs[13][22].adj=60;
c.arcs[14][15].adj=50; c.arcs[14][20].adj=90;
c.arcs[15][16].adj=60; c.arcs[15][21].adj=40;
c.arcs[16][17].adj=60;
c.arcs[17][18].adj=80;
c.arcs[18][19].adj=60;
c.arcs[20][21].adj=60; c.arcs[20][24].adj=80;
c.arcs[22][23].adj=60; c.arcs[22][25].adj=80;
c.arcs[23][24].adj=60;
c.arcs[24][26].adj=100; c.arcs[24][27].adj=100;
c.arcs[25][26].adj=90;
c.arcs[26][27].adj=90;
for(i=0;i<c.vexnum ;i++) //邻接矩阵是对称矩阵,对称赋值
for(j=0;j<c.vexnum ;j++)
c.arcs[j][i].adj =c.arcs[i][j].adj ;
return c;
}//initgraph
//(4)进队操作
void Enqueue(Linkqueue *Q,CheckInfo elem)
{
Lnode *s;
s=(Lnode *)malloc(sizeof(Lnode));
s->guke=elem.guke; //更新
strcpy(s->name,elem.name);
strcpy(s->phone,elem.phone);
strcpy(s->introduction,elem.introduction);
s->position=elem.position;
s->next=NULL;
Q->rear->next=s;
Q->rear=s;
}
//(5)出队操作
CheckInfo Dlqueue(Linkqueue *Q)
{
CheckInfo x;
Lnode *t;
if(Q->front==Q->rear)
{
printf("队列为空!\n");
exit(1);
}
else
{
t=Q->front->next;
Q->front->next=t->next;
x.guke=t->guke; //更新
strcpy(x.name,t->name);
strcpy(x.phone,t->phone);
strcpy(x.introduction,t->introduction);
x.position=t->position;
free(t);
return x;
}
}
//(6)顾客到达事件
void daoda(int x)
{
int guke; //顾客编号
char name[32];//收件人
char phone[32];//手机号
char introduction[256];//物品描述
int position;//目的地编号
int i=L.len+1;
cout<<"请输入\n收件人:";
cin>>name;
cout<<"\n手机号:";
cin>>phone;
cout<<"\n物品描述:";
cin>>introduction;
cout<<"\n目的地编号:";
cin>>position;
C.guke=x;
strcpy(C.name,name);
strcpy(C.phone,phone);
strcpy(C.introduction,introduction);
C.position=position;
if (L.len<n)
{ L.A[i]=C;
i++;
L.len++;
}
else
Enqueue(&Q,C);
}
//(7)顾客离开
void likai(int x)
{
int i=0,j=1,y;
do
{
if(x>L.len||x==0)
{
printf(" 输入有误!请重新输入:");
scanf("%d",&x);
j++;
}
else
for(i=1; i<=L.len; i++)
{
if(i==x)
{
printf(" 尊敬的 %d 号顾客您好!\n",x);
/*L1.A[countt].guke=L.A[i].guke;
strcpy(L1.A[countt].name,L.A[i].name);
strcpy(L1.A[countt].phone,L.A[i].phone);
strcpy(L1.A[countt].introduction,L.A[i].introduction);
L1.A[countt].position=L.A[i].position;*/
C.guke=L.A[i].guke;
strcpy(C.name,L.A[i].name);
strcpy(C.phone,L.A[i].phone);
strcpy(C.introduction,L.A[i].introduction);
C.position=L.A[i].position;
Enqueue(&Q1,C);
L.A[i].guke=0;
L.len--;
if(Q.front!=Q.rear)
{
y=Dlqueue(&Q).guke;
L.A[i].guke=y;
L.len++;
}
countt++;
}
}
}while(i==0 && j<3);
if(j==3)
{
printf(" 再见!欢迎下次光临!"); //输入错误>=3时,退出系统
exit(0);
}
}
// (8)判断输入的柜台号是否正确
int guitai( )
{
int y=0;
printf(" 请输入您所办理业务的服务人员编号(1-3):");
scanf("%d",&y);
if(y<1||y>5)
{
printf(" 您输入的柜台号有误,请重新输入!\n");
printf(" 请输入您所办理业务的柜服务人员号(1-3):");
scanf("%d",&y);
}
else
printf(" 你所办理业务的服务人员为 %d.\n",y);
return y;
}
//(9)判断输入的分数是否正确
int pingfeng( )
{
int y=0;
printf(" 请输入您的评分(1-5):\n 1分………非常不满意; 2分………不满意; 3分………一般满意;\n 4分………比较满意; 5分………非常满意。\n");
printf(" 请输入:");
scanf("%d",&y);
if(y<1||y>5)
{
printf(" 你输入评分有误,请重新输入!\n");
printf(" 请输入你的评分(1-5):\n");
scanf("%d",&y);
}
else
printf(" 你的评分为%d.\n",y);
return y;
}
//(10)主评分函数
void mygrade()
{
printf(" 为了改善服务质量,请你对我们的服务进行评价。谢谢!\n");
z=guitai( );
y=pingfeng( );
switch (z) //柜台评分处理
{
case 1: //1号柜台评分处理
{
sum1+=y;
i1++;
ave1=sum1/i1;
printf(" %d号服务人员的平均满意度为%0.2f。感谢你的评分,谢谢!\n",z,ave1);
break;
}
case 2: //2号柜台评分处理
{
sum2+=y;
i2++;
ave2=sum2/i2;
printf(" %d号服务人员的平均满意度为%0.2f。感谢你的评分,谢谢!\n",z,ave2);
break;
}
case 3: //3号柜台评分处理
{
sum3+=y;
i3++;
ave3=sum3/i3;
printf(" %d号服务人员的平均满意度为%0.2f。感谢你的评分,谢谢!\n",z,ave3);
break;
}
default : printf(" 你的输入有误,请重新输入!\n");
}
getch();
}
//(11)业务查询
void printl()
{
int i;
printf("工作人员业务办理情况: 一号工作人员 二号工作人员 三号工作人员\n");
printf(" ");
for( i=1;i<=L.len;i++)
{
printf("%d 号客户 ",L.A[i].guke);
}
printf("\n");
}
//(12)排队查询
void print2()
{
Lnode *s;
int i=0;
printf(" 正在等候办理业务的顾客编号为:");
s=Q.front->next;
while(s!=NULL)
{
printf("%d ",s->guke);
s=s->next;
i++;
}
printf("\n 您的前面一共有 %d 人在排队,请您稍候!",i);
printf("\n");
}
// (13) 查找地点在图中的序号
int locatevex(mgraph c,int v)
{
int i;
for(i=0;i<c.vexnum ;i++)
if(v==c.vexs[i].position)
return i; //找到,返回顶点序号i
return -1; //否则,返回-1
}
//(14) 、(15) 求两地点间的所有路径
// (14) 打印序号为m,n地点间的长度不超过8个地点的路径
void path(mgraph c, int m,int u,int k)
{
int s,x=0;
int t=k+1; //t 记载路径上下一个中间顶点在d[]数组中的下标
if(d[k]==n && k<8) //d[k]存储路径顶点。若d[k]是终点n且地点个数<=8,则输出该路径
{ //递归出口,找到一条路径
for(s=0;s<k;s++)
printf("%s--->",c.vexs[d[s]].name); //输出该路径。s=0 时为起点m
printf("%s",c.vexs[d[s]].name); //输出最后一个地点名(即顶点n的名字,此时s==k)
printf("\n\n");
}
else
{
s=0;
while(s<c.vexnum) //从第m个顶点,试探至所有顶点是否有路径
{
if((c.arcs[d[k]][s].adj<Infinity) && (visited[s]==0)) //初态:顶点m到顶点s有边,且未被访问
{
visited[s]=1;
d[k+1]=s; //存储顶点编号s 至d[k+1]中
path(c,m,n,t); //求从下标为t=k+1的第d[t]个顶点开始的路径(递归调用),同时打印出一条m至n的路径
visited[s]=0; //将找到的路径上顶点的访问标志重新设置为0,以用于试探新的路径
}
s++; //试探从下一个顶点 s 开始是否有到终点的路径
}//endwhile
}//endelse
}//endpath
//(15) 打印两地点间的地点个数不超过8的所有路径。调用(14)
int allpath(mgraph c)
{
int k,i,j,m,nn;
printf("\n\n请输入你要查询的两个地点编号:\n\n");
scanf("%d%d",&i,&j);
printf("\n\n");
m=locatevex(c,i); //调用(2),确定该顶点是否存在。若存在,返回该顶点编号
nn=locatevex(c,j);
d[0]=m; //存储路径起点m (int d[]数组是全局变量)
for(k=0;k<c.vexnum;k++) //全部顶点访问标志初值设为0
visited[k]=0;
visited[m]=1; //第m个顶点访问标志设置为1
path(c,m,nn,0); //调用(3)。k=0,对应起点d[0]==m。k为d[]数组下标
return 1;
}
// (16) 用迪杰斯特拉算法,求出一个地点到其他地点间的最短路径,并打印
void shortestpath_dij(mgraph c)
{
//迪杰斯特拉算法,求从顶点v0到其余顶点的最短路经及其带权长度d[v]
//若p[v][w]为1,则w是从v0到v的最短路经上的顶点
//final[v]类型用于设置访问标志
int v,w,i,min,t=0,x,flag=1,v0; //vo为起始地点的编号
int final[35],d[35],p[35][35];
printf("\n请输入一个起始地点的编号:");
scanf("%d",&v0);
printf("\n\n");
while(v0<0||v0>c.vexnum)
{
printf("\n你所输入的地点编号不存在\n");
printf("请重新输入:");
scanf("%d",&v0);
}//while
for(v=0;v<c.vexnum ;v++)
{
final[v]=0; //初始化各顶点访问标志
d[v]=c.arcs[v0][v].adj; //v0 到各顶点 v 的权值赋值给d[v]
for(w=0;w<c.vexnum ;w++) //初始化p[][]数组,各顶点间的路径全部设置为空路径0
p[v][w]=0;
if(d[v]<Infinity) //v0 到v 有边相连,修改p[v][v0]的值为1
{
p[v][v0]=1;
p[v][v]=1; //各顶点自己到自己要连通
}
}//for
d[v0]=0; //自己到自己的权值设为0
final[v0]=1; //v0的访问标志设为1,v 属于 s 集
for(i=1;i<c.vexnum ;i++) //对其余c.vexnum-1个顶点w,依次求 v 到 w 的最短路径
{
min=Infinity;
for(w=0;w<c.vexnum ;w++) //在未被访问的顶点中,查找与 v0 最近的顶点v
if(!final[w])
if(d[w]<min) //v0 到 w (有边)的权值<min
{
v=w;
min=d[w];
}//if
final[v]=1; //v 的访问标志设置为1,v 属于s集
for(w=0;w<c.vexnum ;w++) //修改v0 到其余各顶点w 的最短路径权值d[w]
if(!final[w]&&(min+c.arcs[v][w].adj <d[w])) //若w 不属于s,且v 到w 有边相连
{
d[w]=min+c.arcs[v][w].adj; //修改v0 到w 的权值d[w]
for(x=0;x<c.vexnum ;x++) //所有v0 到v 的最短路径上的顶点x,都是v0 到w 的最短路径上的顶点
p[w][x]=p[v][x];
p[w][w]=1;
}//if
}//for
for(v=0;v<c.vexnum ;v++) //输出v0 到其它顶点v 的最短路径
{
if(v!=v0)
printf("%s",c.vexs[v0].name); //输出地点v0 的地点名
for(w=0;w<c.vexnum ;w++) //对图中每个顶点w,试探w 是否是v0 到v 的最短路径上的顶点
{
if(p[v][w] && w!=v0 && w!=v) //若w 是且w 不等于v0,则输出该地点
printf("--->%s",c.vexs[w].name);
}
printf("---->%s",c.vexs[v].name);
printf("\n总路线长为%d米\n\n",d[v]);
}//for
}//shortestpath
//(17)-(23)修改图的信息。包括建图、更新信息、删除、增加结点和边
//(17) 构造图的邻接矩阵
int creatgragh(mgraph *c) //建图。以图的邻接矩阵存储图
{
int i,j,m,nn;
int v0,v1;
int distance;
printf("请输入图的顶点数和边数: \n");
scanf("%d %d",&c->vexnum ,&c->arcnum );
printf("下面请输入地点的信息:\n");
for(i=0;i<c->vexnum ;i++) //构造顶点向量(数组)
{
printf("请输入地点的编号:");
scanf("%d",c->vexs[i].position );
printf("\n请输入地点的名称:");
scanf("%s",c->vexs[i].name );
printf("\n请输入地点的简介:");
scanf("%s",c->vexs[i].introduction );
}
for(i=0;i<c->arcnum ;i++) //初始化邻接矩阵
for(j=0;j<c->arcnum ;j++)
c->arcs[i][j].adj =Infinity;
printf("下面请输入图的边的信息:\n");
for(i=1;i<=c->arcnum ;i++) //构造邻接矩阵
{
printf("\n第%d条边的起点 终点 长度为:",i);//输入一条边的起点、终点及权值
scanf("%d %d %d",&v0,&v1,&distance);
m=locatevex(campus,v0);
nn=locatevex(campus,v1);
if(m>=0 && nn>=0)
{
c->arcs[m][nn].adj =distance;
c->arcs[nn][m].adj =c->arcs[m][nn].adj ;
}
}
return 1;
}//creatgragh
// (18) 更新图的部分信息。返回值: 1
int newgraph(mgraph *c)
{
int changenum; //计数。用于记录要修改的对象的个数
int i,mm,nn,t,distance,v0,v1;
printf("\n下面请输入你要修改的地点的个数:\n");
scanf("%d",&changenum);
while(changenum<0||changenum>c->vexnum )
{
printf("\n输入错误!请重新输入");
scanf("%d",&changenum);
}
for(i=0;i<changenum;i++)
{
printf("\n请输入地点的编号:");
scanf("%d",&mm);
t=locatevex(campus,mm);
printf("\n请输入地点的名称:");
scanf("%s",c->vexs[t].name );
printf("\n请输入地点的简介:");
scanf("%s",c->vexs[t].introduction );
}
printf("\n下面请输入你要更新的边数");
scanf("%d",&changenum);
while(changenum<0||changenum>c->arcnum )
{
printf("\n输入错误!请重新输入");
scanf("%d",&changenum);
}
printf("\n下面请输入更新边的信息:\n");
for(i=1;i<=changenum ;i++)
{
printf("\n修改的第%d条边的起点 终点 长度为:",i);
scanf("%d %d %d",&v0,&v1,&distance);
mm=locatevex(campus,v0);
nn=locatevex(campus,v1);
if(mm>=0 && nn>=0)
{
c->arcs[mm][nn].adj =distance;
c->arcs[nn][mm].adj =c->arcs[mm][nn].adj ;
}
}
return 1;
}//newgraph
// (19) 增加一条边。返回值:1
int enarc(mgraph *c)
{
int mm,nn,distance;
printf("\n请输入边的起点和终点编号,权值:");
scanf("%d %d %d",&mm,&nn,&distance);
while(mm<0||mm>c->vexnum ||nn<0||nn>c->vexnum )
{
printf("输入错误,请重新输入:");
scanf("%d %d",&mm,&nn);
}
if(locatevex(campus,mm)<0)
{
printf("此结点%d已删除",mm);
return 1;
}
if(locatevex(campus,n)<0)
{
printf("此结点%d已被删除:",nn);
return 1;
}
c->arcs[mm][nn].adj =distance;
c->arcs[nn][mm].adj =c->arcs[mm][nn].adj; //对称赋值
return 1;
}//enarc
//(20)增加一个结点。返回值:1
int envex(mgraph *c)
{
int i;
printf("请输入你要增加结点的信息:");
printf("\n编号:");
scanf("%d",&c->vexs[c->vexnum ].position );
printf("名称:");
scanf("%s",c->vexs[c->vexnum ].name );
printf("简介:");
scanf("%s",c->vexs[c->vexnum ].introduction) ;
c->vexnum ++;
for(i=0;i<c->vexnum;i++) //对原邻接矩阵新增加的一行及一列进行初始化
{
c->arcs [c->vexnum -1][i].adj=Infinity; //最后一行(新增的一行)
c->arcs [i][c->vexnum -1].adj=Infinity; //最后一列(新增的一列)
}
return 1;
}//envex
//(21)删除图的一个顶点。返回值:1
int delvex(mgraph *c)
{
int i=0,j;
int m;
int v;
if(c->vexnum <=0)
{
printf("图中已无顶点");
return 1;
}
printf("\n下面请输入你要删除的地点编号:");
scanf("%d",&v);
while(v<0||v>c->vexnum )
{
printf("\n输入错误!请重新输入");
scanf("%d",&v);
}
m=locatevex(campus,v);
if(m<0)
{
printf("此顶点 %d 已删除",v);
return 1;
}
for(i=m;i<c->vexnum-1 ;i++)//对顶点信息所在顺序表进行删除m 点的操作
{
strcpy(c->vexs[i].name ,c->vexs [i+1].name );
strcpy(c->vexs[i].introduction ,c->vexs [i+1].introduction );
}
//对原邻接矩阵,删除该顶点到其余顶点的邻接关系。分别删除相应的行和列
for(i=m;i<c->vexnum-1 ;i++) //行
for(j=0;j<c->vexnum ;j++) //列
c->arcs [i][j]=c->arcs [i+1][j]; //二维数组,从第m+1行开始依次往前移一行。即删除第m 行
for(i=m;i<c->vexnum-1 ;i++)
for(j=0;j<c->vexnum ;j++)
c->arcs [j][i]=c->arcs [j][i+1]; //二维数组,从第m+1列开始依次往前移一列。即删除第m 列
c->vexnum --;
return 1;
}//delvex
//(22)删除图的一条边。返回值:1
int delarc(mgraph *c)
{
int mm,nn;
int v0,v1;
if(c->arcnum <=0)
{
printf("图中已无边,无法删除。");
return 1;
}
printf("\n下面请输入你要删除的边的起点和终点编号:");
scanf("%d %d",&v0,&v1);
mm=locatevex(campus,v0);
if(mm<0)
{
printf("此 %d 顶点已删除",v0);
return 1;
}
nn=locatevex(campus,v1);
if(n<0)
{
printf("此 %d 顶点已删除",v1);
return 1;
}
c->arcs [mm][nn].adj =Infinity; //修改邻接矩阵对应的权值
c->arcs [nn][mm].adj =Infinity;
c->arcnum --;
return 1;
}//delarc
//(23) 输出图的邻接矩阵的值
void printmatrix(mgraph c)
{
int i,j,k=0; //k 用于计数,控制换行
for(i=0;i<c.vexnum ;i++)
for(j=0;j<c.vexnum ;j++)
{
if(c.arcs[i][j].adj ==Infinity)
printf("----");
else
printf("%4d",c.arcs[i][j].adj);
k++;
if(k%c.vexnum ==0)
printf("\n");
}
}//printpath
//(24)图操作的主调函数。返回值:1
int changegraph(mgraph *c)
{
int yourchoice;
printf("\n请问是要\n\n(1)再次建图 (2)删除结点 (3)删除边\n");
printf("\n(4)增加结点 (5)增加边 (6)更新信息\n\n(7)打印邻接矩阵 (8)返回?\n\n");
scanf("%d",&yourchoice);
printf("\n\n");
while(!(yourchoice==1||yourchoice==2||yourchoice==3||yourchoice==4||yourchoice==5||yourchoice==6
||yourchoice==7||yourchoice==8))
{
printf("输入选择不明确,请重输\n");
scanf("%d",&yourchoice);
}
while(1)
{
switch(yourchoice)
{
case 1: creatgragh(c); break;
case 2: delvex(c); break;
case 3: delarc(c); break;
case 4: envex(c); break;
case 5: enarc(c); break;
case 6: newgraph(c); break;
case 7: printmatrix(campus); break;
case 8: return 1;
}
printf("\n请问是要\n\n(1)再次建图 (2)删除结点 (3)删除边\n");
printf("\n(4)增加结点 (5)增加边 (6)更新信息\n\n(7)打印邻接矩阵 (8)返回?\n\n");
scanf("%d",&yourchoice);
printf("\n\n");
while(!(yourchoice==1||yourchoice==2||yourchoice==3||yourchoice==4||yourchoice==5||yourchoice==6
||yourchoice==7||yourchoice==8))
{
printf("输入选择不明确,请重输\n");
scanf("%d",&yourchoice);
}
}//endwhile(1)
return 1;
}//changegraph
//(25)查询两地点间的最短路径
void shortestpath_floyd(mgraph c)
{
//用floyd算法求各对顶点v和w间的最短路经及其带权长度的d[v][w]。
//若p[v][w][u]==1;则u是v到w的当前求得的最短路经上的顶点
int i,j,k,d[35][35],p[35][35][35];
int v,u,w;
for(v=0;v<c.vexnum ;v++) //初始化各对顶点 v,w 之间的起始距离 d[v][w] 及 路径 p[v][w][] 数组
{
for(w=0;w<c.vexnum ;w++)
{
d[v][w]=c.arcs[v][w].adj; //d[v][w] 中存放 v 至 w 间初始权值
for(u=0;u<c.vexnum ;u++) //初始化最短路径 p[v][w][] 数组,第 3 个分量全部清0
p[v][w][u]=0;
if(d[v][w]<Infinity) //如果 v 至 w 间有边相连
{
p[v][w][v]=1; // v 是 v 至 w 最短路径上的顶点
p[v][w][w]=1; // w 是 v 至 w 最短路径上的顶点
}//if
}//for
}//endfor
for(u=0;u<c.vexnum ;u++) // 求v至w的最短路径及距离。对任意顶点u,试探其是否为v至w最短路径上的顶点
{
for(v=0;v<c.vexnum ;v++)
for(w=0;w<c.vexnum ;w++)
if(d[v][u]+d[u][w]<d[v][w]) //从 v 经 u 到 w 的一条路径更短
{
d[v][w]=d[v][u]+d[u][w]; //修改 v 至 w 的最短路径长度
for(i=0;i<c.vexnum ;i++) //修改 v 至 w 的最短路径数组。 若i是v至u的最短路径上的顶点,
p[v][w][i]=p[v][u][i]||p[u][w][i]; //或i是u至w的最短路径上的顶点, 则i是v至w的最短路径上的顶点
}
}//endfor
printf("\n请输入出发点和目的地编号:");
scanf("%d%d",&k,&j);
printf("\n\n");
while(k<0||k>c.vexnum||j<0||j>c.vexnum)
{
printf("\n你所输入的地点编号不存在!");
printf("\n请重新输入出发点和目的地编号:\n\n");
scanf("%d%d",&k,&j);
printf("\n\n");
}
printf("%s",c.vexs[k].name ); //输出出发地点名称
for(u=0;u<c.vexnum ;u++)
if(p[k][j][u] && k!=u && j!=u) //输出最短路径上中间地点名称
printf("--->%s",c.vexs[u].name );
printf("--->%s",c.vexs[j].name ); //输出目的地地点名称
printf("\n\n\n总长为%d米\n\n\n",d[k][j]);
}//shortestpath_floyd
// (26) 查询地点的信息
void seeabout(mgraph c)
{
int k;
printf("\n请输入要查询的地点编号:");
scanf("%d",&k);
while(k<0||k>c.vexnum)
{
printf("\n你所输入的地点编号不存在!");
printf("\n请重新输入:");
scanf("%d",&k);
}
printf("\n\n编号:%-4d\n",c.vexs[k].position );
printf("\n\n地点名称:%-10s\n",c.vexs[k].name );
printf("\n\n介绍:%-80s\n\n",c.vexs[k].introduction );
}//seeabout
// (27) 显示所有地点信息
void browsecompus(mgraph c)
{
int i;
printf(" \n\n编号 地点名称 简介\n");
printf("___________________________________________________________________________________________________________\n");
for(i=0;i<c.vexnum ;i++)
printf("%-10d%-25s%-80s\n",c.vexs[i].position,c.vexs[i].name,c.vexs[i].introduction);
printf("___________________________________________________________________________________________________________\n\n");
}//browsecompus
//(28)时间函数
void mytime()
{
time_t timep;
time (&timep);
printf(" 现在时刻:%s",ctime(&timep));
}
void QueueTraverse(Linkqueue *Q)
{
Lnode *p;
p=Q->front->next;
cout<<" \n顾客编号 收件人 手机号 物品描述 目的地编号"<<endl;
printf("________________________________________________________________________\n");
while(p&&p->guke!=0)
{
printf("%-15d%-15s%-15s%-18s%-25d\n",p->guke,p->name,p->phone,p->introduction,p->position);
p=p->next;
}
printf("________________________________________________________________________\n");
}
void songchu(Linkqueue *Q1)
{
cout<<"快递是否送出"<<endl;
int yyyy;
cin>>yyyy;
if(yyyy==1)
{
Dlqueue(Q1);
cout<<"快递已经送出"<<endl;
QueueTraverse(Q1);
}
}
// (17) 服务人员主要操作面板
void mainwork(mgraph campus)
{
int yourchoice;
printf("\n**************************欢迎天天开心快递公司**************************\n");
printf("* *\n");
printf("* 快递派送 *\n");
printf("* 菜 单 选 择 *\n");
printf("* 1.学校地点编号简介查询 2. 查询两点之间的最短路径 *\n");
printf("* 3.更改地点信息 4. 查询可行路径 *\n");
printf("* 5.投递成功 6. 退出 *\n");
printf("************************************************************************\n");
mytime();
printf("请输入你的选择:");
scanf("%d",&yourchoice);
while(!(yourchoice==1||yourchoice==2||yourchoice==3||yourchoice==4||yourchoice==5||yourchoice==6
||yourchoice==7||yourchoice==8))
{
printf("输入选择不明确,请重输\n");
scanf("%d",&yourchoice);
}
while(1)
{
switch(yourchoice)
{
case 1: system("cls"); browsecompus(campus); break;
//case 2: system("cls"); shortestpath_dij(campus); break;
case 2: system("cls"); shortestpath_floyd(campus); break;
//case 4: system("cls"); seeabout(campus); break;
case 3: system("cls"); changegraph(&campus); break;
case 4: system("cls"); allpath(campus); break;
//case 7: system("cls"); printmatrix(campus); break;
case 5: system("cls"); songchu(&Q1); break;
case 6: system("cls"); exit(0); break;
default: break;
}
printf("\n**************************欢迎天天开心快递公司**************************\n");
printf("* *\n");
printf("* 快递派送 *\n");
printf("* 菜 单 选 择 *\n");
printf("* 1.学校地点编号简介查询 2. 查询两点之间的最短路径 *\n");
printf("* 3.更改地点信息 4. 查询可行路径 *\n");
printf("* 5.投递成功 6. 退出 *\n");
printf("************************************************************************\n");
mytime();
printf("\n请输入您的选择:");
scanf("%d",&yourchoice);
}//endwhile(1)
}//mainwork2
// (17) 下单主要工作面板
void workmain()
{
time_t a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,end;
double b1=0,b2=0,b3=0,b4=0,b5=0,b6=0,b7=0,b8=0,b9=0,b10=0,allsum=0,average=0,xi=0;
double A[10]={0,0,0,0,0,0,0,0,0,0};
int c,x,v=0,w=0;
double sum=0;
Initshuzu();
Initqueue(&Q);
Initqueue(&Q1);
campus=initgraph();
while(1)
{
printf("\n**************************欢迎天天开心快递公司**************************\n");
printf("* *\n");
printf("* 1.顾客下单 2.顾客离开 *\n");
printf("* 3.查看业务办理 4.查看排队情况 *\n");
printf("* 5.系统查询 6.服务人员界面 *\n");
printf("* 7.退出 *\n");
printf("* 提示:请按回车键进行下一步操作 *\n");
printf("* *\n");
printf("************************************************************************\n");
mytime();
printf("请输入您的选择:");
scanf("%d",&c);
switch(c)
{
case 1:
{
int k=0;
int a;
system("cls");
printf("\n*************************顾客下单界面*******************************\n\n");
browsecompus(campus);
++v; //普通卡顾客计数
printf(" 尊敬的普通用户,您的业务号为 %d.\n",v);
daoda(v);
if(v==1)
{
a1=time(NULL); //取v=1的客户到达时间
mytime(); //显示v=1的客户到达时间
system("pause");
}
else if(v==2)
{
a2=time(NULL);
mytime();
system("pause");
}
else if(v==3)
{
a3=time(NULL);
mytime();
system("pause");
}
else if(v==4)
{
a4=time(NULL);
mytime();
system("pause");
}
else if(v==5)
{
a5=time(NULL);
mytime();
system("pause");
}
else if(v==6)
{
a6=time(NULL);
mytime();
system("pause");
}
else if(v==7)
{
a7=time(NULL);
mytime();
system("pause");
}
else if(v==8)
{
a8=time(NULL);
mytime();
system("pause");
}
else if(v==9)
{
a9=time(NULL);
mytime();
system("pause");
}
else if(v==10)
{
a10=time(NULL);
mytime();
system("pause");
}
else
{
printf(" 请稍候拿号,谢谢!");
system("pause");
}
system("cls");
break;
}
case 2:
{
system("cls");
printf("\n*****************************顾客离开界面***************************\n\n");
printf(" 请输入离开顾客得编号:");
scanf("%d",&x);
likai(x);
mygrade();
w++;
if(x=1)
{
end=time(NULL);
A[0]=difftime(end,a1);
printf(" 您办理业务所用时间为 %0.2f 秒.\n",A[0]);
}
else if(x=2)
{
end=time(NULL);
A[1]=difftime(end,a2);
printf(" 您办理业务所用时间为 %0.2f 秒.\n",A[1]);
}
else if(x=3)
{
end=time(NULL);
A[2]=difftime(end,a3);
printf(" 您办理业务所用时间为 %0.2f 秒.\n",A[2]);
}
else if(x=4)
{
end=time(NULL);
A[3]=difftime(end,a4);
printf(" 您办理业务所用时间为 %0.2f 秒.\n",A[3]);
}
else if(x=5)
{
end=time(NULL);
A[4]=difftime(end,a5);
printf(" 您办理业务所用时间为 %0.2f 秒.\n",A[4]);
}
else if(x=6)
{
end=time(NULL);
A[5]=difftime(end,a6);
printf(" 您办理业务所用时间为 %0.2f 秒.\n",A[5]);
}
else if(x=7&&difftime(end,a7)== 10.0)
{
end=time(NULL);
A[6]=difftime(end,a7);
printf(" 您办理业务所用时间为 %0.2f 秒.\n",A[6]);
}
else if(x=8&&difftime(end,a8)== 10.0)
{
end=time(NULL);
A[7]=difftime(end,a8);
printf(" 您办理业务所用时间为 %0.2f 秒.\n",A[7]);
}
else if(x=9&&difftime(end,a9)== 10.0)
{
end=time(NULL);
A[8]=difftime(end,a9);
printf(" 您办理业务所用时间为 %0.2f 秒.\n",A[8]);
}
else if(x=10&&difftime(end,a10)== 10.0)
{
end=time(NULL);
A[9]=difftime(end,a10);
printf(" 您办理业务所用时间为 %0.2f 秒.\n",A[9]);
}
else
{
printf(" 您没有快递包裹....");
}
allsum+=A[0];
getch();
system("cls");
break;
}
case 3:
{
system("cls");
printf("\n****************************业务查询界面*****************************\n\n");
printl();
getch();
system("cls");
break;
}
case 4:
{
system("cls");
printf("\n****************************排队查询界面*****************************\n\n");
print2();
getch();
system("cls");
break;
}
case 5:
{
char cool[3];
int i,k=0;
system("cls");
printf("\n************************* 系统查询界面*****************************\n\n");
printf(" 请输入你的管理员账号 :");
scanf("%d",&i);
printf(" 请您输入四位密码:");
scanf("%s",&cool);
if(i==000 && cool[0]=='1' && cool[1]=='1' && cool[2]=='1' && cool[3]=='1')
{
average=allsum/w;
printf("\n 至今已有 %d 位用户成功办理业务!",w);
printf("\n 普通用户业务办理总共用时 %0.2f秒,平均用时 %0.2f秒\n",allsum,average);
}
workmain();
getch();
system("cls");
break;
}
case 6:
{
char cool[3];
int i;
system("cls");
printf(" 请输入你的快递员账号 :");
scanf("%d",&i);
printf(" 请您输入四位密码:");
scanf("%s",&cool);
if(i==000 && cool[0]=='1' && cool[1]=='1' && cool[2]=='1' && cool[3]=='1')
{
if(countt==0)
{
cout<<"无任何客户下单"<<endl;
break;
}
else
{
/*while(countt>=0)
{
//printf("%-10d%-25s%-80s\n",c.vexs[i].position,c.vexs[i].name,c.vexs[i].introduction);
printf("%-15d%-20s%-15s%-24s%-25d\n",L1.A[countt].guke,L1.A[countt].name,L1.A[countt].phone,L1.A[countt].introduction,L1.A[countt].position);
countt--;
}*/
QueueTraverse(&Q1);
}
mainwork(campus);
}
getch();
system("cls");
break;
}
case 7:
cout<<"感谢您使用本系统,谢谢!"<<endl;
return;
getch();
system("cls");
default: printf(" 输入有误!请重新输入:\n");
getch();
system("cls");
}
}
}
int main()
{
workmain();//排队下单系统
}