這是一個簡單的模擬銀行叫號系統,用c語言實現的。個人專業只學過C,翻閱學習了些數據機構的知識,而後開始編寫的。一個初學程序的新手。往多多指點! 實現的功能:根據先來先服務的原則,模擬實現一個銀行業務服務叫號系統(系統需求:客戶到達銀行首先取號,而後根據先來先服務的原則等待空閒業務服務窗口叫號,最後業務處理完離開) 系統主要分爲3個功能模塊,分別是:客戶取號(客戶建立)、叫號系統(業務服務安排)、退出。 客戶取號界面:當客戶到達時,在主菜單輸入「1」,進入「客戶到達界面」。此時界面會顯示:客戶的排隊序號、到達時間。 叫號系統界面:在主菜單輸入「2」,進入「叫號系統界面」。此時界面會顯示「請耐心等待」,等待櫃檯客戶業務處理的結束,直到櫃檯客戶業務處理結束時,叫號系統界面會顯示結束服務客戶的客戶信息(包括:序號、到達時間、等待時間、服務時間),若還有等待的客戶就顯示下一位服務客戶的序號、服務的櫃檯號及客戶等待的時間;若沒有等待的客戶就顯示「已無等待客戶」。 退出界面:在主菜單輸入「0」,進入退出界面,顯示「謝謝您的使用」後退出銀行叫號模擬系統。node
<!-- lang: cpp -->
#include <stdio.h>windows
#include <malloc.h>函數
#include <windows.h>學習
#include <stdlib.h>測試
#include <string.h>指針
#include <time.h>code
#include <windows.h>索引
int first = 1;//用於生成隨機到達時間模塊,判斷是否第一次生成隨機到達時間;隊列
int hour;//用於生成隨機到達時間,記入到達的小時;圖片
int minute;//用於生成隨機到達時間,記入到達的分鐘;
int oldminute[10];//用於計算客戶的等待時間的計數量,記入上一個客戶到達時間的分鐘;
int n = 1;//標誌oldminute[]的索引位置;
int oldsever[10];//用於計算客戶的等待時間的計數量,記入上一個客戶的服務時間;
int tice = 1;//標記計算等待時間是索引位置;
int num = 1;//客戶序號累加計數
typedef struct qnode
{
int custmerNumber;//客戶序號;
char arriveTime[10];//客戶到達時間;
char waitTime[10];//客戶等待時間;
char serveTime[10];//客戶服務時間;
struct qnode *next;
}CustmerQNode;
typedef struct
{
CustmerQNode *front;//隊列頭指針,指向隊頭元素;
CustmerQNode *rear;//隊列胃指針,指向隊尾元素;
}LiQueue;
/初始化隊列,不帶頭結點的隊列鏈表;/
void InitQueue(LiQueue *&q)
{
q=(LiQueue*)malloc(sizeof(LiQueue));
q->front=q->rear=NULL;
}
/實現隊列的入隊;/
void enQueue(LiQueue *q)
{
//封裝結點;
CustmerQNode *s;
s=(CustmerQNode*)malloc(sizeof(CustmerQNode));
s->custmerNumber = num++;
/生成隨機到達時間/
char time2[10];
char time3[10];
int ad;
if(first == 1)
{
for(int k = 0 ; k<5; k++)
{
hour = ((int)(4*(rand()/(RAND_MAX+1.0)))+8);
}
first = 0;
}
itoa(hour,time3,10);//itoa:把整數轉換爲字符串;
strcat(time3,"點");
for(int m = 0; m<5; m++)
{
ad = ((int)(4*rand()/(RAND_MAX+1.0)));
}
minute += ad;
minute += 2;
oldminute[n++] = minute;
itoa(minute,time2,10);//itoa:把整數轉換爲字符串;
strcat(time3,time2);
strcat(time3,"分");
strcpy(s->arriveTime,time3);
s->next=NULL;
if(q->rear==NULL)
{
q->front =s;
q->rear =s;
}
else
{
q->rear->next =s;
q->rear =s;
}
}
/修改客戶信息:完成客戶等待時間和服務時間的修改;/
int revamp(LiQueue *q)
{
if(q->rear == NULL)
return 0;
else
{
//隨機生成服務時間
int sertime = 0;
int temp;
int wait;
for(int i = 0; i<5; i++)
{
temp = ((int)(4*rand()/(RAND_MAX+1.0))+5);
}
sertime += temp;
oldsever[tice] = sertime;
itoa(sertime,q->front->serveTime,10);
if(tice == 1)
{
wait = 0;
itoa(wait,q->front->waitTime,10);
strcat(q->front->waitTime,"分鐘");
}
else
{
wait = oldsever[tice-1]-(oldminute[tice] - oldminute[tice - 1]);
if(wait < 0)
{
itoa(0,q->front->waitTime,10);
strcat(q->front->waitTime,"分鐘");
}
else
{
itoa(wait,q->front->waitTime,10);
strcat(q->front->waitTime,"分鐘");
}
}
tice++;
return 1;
}
}
/出隊函數:刪除客戶信息,並返回刪除的客戶的基本信息/
int deQueue(LiQueue *q,int &DecCustmerNumber, char *DecArriveTime, char *DecServeTime,char *DecWaitTime)
{
CustmerQNode *t;
if(q->rear ==NULL)
return 0;
if(q->front == q->rear )//只有一個結點
{
t=q->front ;
q->front =NULL;
q->rear =NULL;
}
else
{
t=q->front;
q->front=q->front->next;
}
DecCustmerNumber = t->custmerNumber;
strcpy(DecArriveTime,t->arriveTime);
strcpy(DecServeTime,t->serveTime);
strcpy(DecWaitTime,t->waitTime);
free(t);
return 1;
}
void main()
{
LiQueue *q;
int id;//deQueue函數返回的客戶序號;
char decarrive[10];//deQueue函數返回的客戶到達時間;
char decserve[10];//deQueue函數返回的客戶服務時間;
char decwait[10];//deQueue函數返回的客戶等待時間;
char choose;//服務選項;
int bar = 1;//櫃檯號;
int second;//延時程序的循環計數;
InitQueue(q);
srand(time(0));
printf("銀行叫號模擬系統\n");//建立3個業務服務窗口,經過7個客戶來測試模擬系統;
printf("\n");
printf("=====================================\n");
printf("1. 客戶取號(客戶建立)\n");
printf("2. 叫號模擬(業務服務安排)\n");
printf("0. 退出\n");
printf("(按數字一、二、0,選擇操做)\n");
printf("=====================================\n");
printf("\n");
while(1)
{
printf("請您輸入服務選項:");
scanf("%c",&choose);
getchar();
switch (choose)
{
case '1'://1. 客戶取號(客戶建立)
enQueue(q);//客戶加入隊列;
printf("客戶號%d\t到達時間:%s\n",q->rear->custmerNumber,q->rear->arriveTime);
printf("\n");
break;
case '2'://2. 叫號模擬(業務服務安排)
printf("請耐心等待...\n");
for(second = 0 ; second<5 ; second++)
{
Sleep(1000);//延時1秒
}
revamp(q);//修改客戶的服務時間和等待時間;
deQueue(q,id,decarrive,decserve,decwait);//將完成服務的客戶移出隊列;
//客戶業務處理完後,輸出客戶的狀態信息(序號、到達時間、等待時間、服務時間)
printf("第%d位客戶, 到達時間爲:%s, 服務時間爲:%s, 等待時間爲:%s\n",id,decarrive,decserve,decwait);
if(q->front != NULL)//判斷隊列中是否還有等待的客戶;
{
printf("請%d客戶到第%d櫃檯\n",q->front->custmerNumber,bar++);
}
else
{
printf("已無等待客戶\n");
}
printf("\n");
if(bar == 4)
{
bar = 1;
}
break;
case '0'://0. 退出
printf("謝謝您的使用!\n");
exit(1);
default :
printf("您輸入的選擇有誤,請從新輸入。\n");
break;
}
}
}
效果圖截圖: