數據結構課程設計 物流管理系統

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();//排隊下單系統	 
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章