1. 程式人生 > >基於鏈佇列的銀行叫號系統

基於鏈佇列的銀行叫號系統

程式所能達到的功能:

  1. 視覺化操作介面。
  2. 客戶和工作人員共用同一個虛擬佇列,客戶取編號後的資訊及時更新給工作人員。
  3. VIP客戶和普通客戶有設立不同視窗
  4. 派號功能:客戶可根據自己的情況進行操作領取編號,同時可知道當前有多少人正在排隊。
  5. 叫號功能:工作人員通過客戶的排隊情況進行叫號,在顯示器上顯示出來。
  6. 以及其他相關的人性化設計輔助功能
#define _CRT_SECURE_NO_WARNINGS
/* Bank System */

#include<ctime>
#include "queue.h"
#include<windows.h>
#define VIP 0
#define COMMON 1
#define WORKER 1
#define CLIENT 0
time_t now;/*系統時間*/
		   //#include "queue_queue.h"


		   //#define Line_Mode

LinkQueue *common, *vip;//物件

	/*	printf_func	*/
void printf_func(int flag)
{
	system("cls");
	if (flag) {

		printf("      *╭╮     ╭╮       ╭╮                                \n");
		printf("        ││     ││       │└ ╮                                    \n ");
		printf("    ╭  ┴┴  ─  ┴┴Ⅲ ╮ ~└─ ╯                                    \n");
		printf("     |   ﹋    ﹋   |         ------------------------------                               \n");
		printf("     |   ∩    ∩   |      ○ ☆ 請根據具體情況進行選擇哦!☆                              \n");
		printf("     |      ▽      |   O    -------------------------------                     \n");
		printf("     ╰  ─ m∞m─  ╯                                                     \n");


		printf("\n\n                -------------------------------------------------------\n      ");
		printf("          |  中文                     English                   |         \n");           
		printf("                |1.呼叫vip使用者的編號------One.Back call VIP number    |             \n");//呼叫的號碼
		printf("                |2.呼叫普通使用者的編號-----Two.Back call COMMON number |             \n");//呼叫的號碼
		printf("                |3.結束-------------------Three.Exit                  |          \n");//通道
		printf("                 ------------------------------------------------------                    \n");

		printf("\n                請選擇[1-3]--------------Please Select[one-three]:");//選擇1-3視窗
	}
	else {
		printf("      *╭╮     ╭╮       ╭╮                                \n");
		printf("        ││     ││       │└ ╮                                    \n ");
		printf("    ╭  ┴┴  ─  ┴┴Ⅲ ╮ ~└─ ╯                                    \n");
		printf("     |   ﹋    ﹋   |         ------------------------------                               \n");
		printf("     |   ∩    ∩   |      ○ ☆ 請根據你的情況進行選擇哦!☆                              \n");
		printf("     |      ▽      |   O    -------------------------------                     \n");
		printf("     ╰  ─ m∞m─  ╯                                                     \n");

		printf("\n\n                 --------------------------------------------------\n");
		printf("                 |     中文               English                 |\n");                    
		printf("                 | 1.vip使用者獲取號----One.vip user get number     |                      \n");
		printf("                 | 2.普通使用者獲取號---Two.common user get number  |                      \n");
		printf("                 | 3.結束------------Three.Exit                   |                      \n");//結束的通道
		printf("                 --------------------------------------------------                    \n");
		printf("\n                  請選擇[1-3]:--------Please Select[one-three]:");//選擇1-3視窗
	}
}

/*
select_num
*/
int select_num(int flag)
{
	int num = 0;

	while (num < 1 || num > 3)
	{
		printf_func(flag);
		scanf("%d", &num);
	}

	return num;
}

/*
* Bank System Init 初始化
*/
int Bank_Sys_Init(void)
{
	vip = new LinkQueue;
	common = new LinkQueue;

	InitQueue(*vip);
	InitQueue(*common);

	return 0;
}

/*
Bank System Quit退出程式
*/
int Bank_Sys_Term(void)
{
	DestoryQueue(*vip);
	DestoryQueue(*common);
	return 0;
}

/*
Bank Get One ID
*/
int Bank_Sys_Get_Id(int flag)
{
	static int vip_id = 0;
	static int common_id = 0;

	//Line Mode

	if (flag == 0)
	{
		if (0 == EnQueue(*vip, vip_id))
		{
			vip_id++;
			return vip_id;
		}
		else
			return -1;
	}
	else
	{
		if (0 == EnQueue(*common, common_id))
		{
			common_id++;
			return common_id;
		}
		else
			return -1;
	}


}

/***************************************************************
* Bank Call One ID
****************************************************************/
int Bank_Sys_Call_Id(int flag)
{
	int id, state;

	if (!flag) {
		state = DeQueue(*vip, id);
	}
	else {
		state = DeQueue(*common, id);
	}

	if (state == -1)return -1;
	return id;
}

/***************************************************************
* Bank Get All Users Number
****************************************************************/
unsigned int Bank_Get_User_Num(int flag)
{
	unsigned int num;

	if (flag == 0)
		num = getLeft(*vip);//獲得佇列的長度
	else
		num = getLeft(*common);

	return num;
}
//bank--logo
void User_dispaly()
{

	printf("\n\n");
	printf("                           謝謝您的使用,歡迎下次再來!\n");
	printf("-------------------------------< bank--logo >---------------------------------\n\n");
	printf("            ``╭╮              ╭╮   ╭╮\n");
	printf("            ``││              ││   │└ ╮ \n");
	printf("             ╭┴┴———————┴┴╮~└—╯\n");
	printf("             │                  │\n");
	printf("             │    ●       ●   │ \n");
	printf("             │ ○             ○│ \n");
	printf("             │       ╰—╯       │ \n");
	printf("             │                  │                                  \n");
	printf("             ╰—┬o— — —o┬—╯                                              \n");
	printf("                    ╭╮努力╭╮                                                              \n");
	printf("                  ╰┴————┴╯                                        \n");
	printf("             ══════════════════                            \n");
	printf("            ║    韶關學院銀行  ║                                        \n");
	printf("            ║    製作:陳玲瓏  ║                                                  \n");
}
void Worker_dispaly()
{
	printf("\n\n");
	printf("                           辛苦您啦,下次再見!\n");
	printf("-------------------------------< bank--logo >---------------------------------\n\n");
	printf("            ``╭╮              ╭╮   ╭╮\n");
	printf("            ``││              ││   │└ ╮ \n");
	printf("             ╭┴┴———————┴┴╮~└—╯\n");
	printf("             │                  │\n");
	printf("             │    ●       ●   │ \n");
	printf("             │ ○             ○│ \n");
	printf("             │       ╰—╯       │ \n");
	printf("             │                  │                                  \n");
	printf("             ╰—┬o— — —o┬—╯                                              \n");
	printf("                    ╭╮努力╭╮                                                              \n");
	printf("                  ╰┴————┴╯                                        \n");
	printf("             ══════════════════                            \n");
	printf("            ║    韶關學院銀行  ║                                        \n");
	printf("            ║    製作:陳玲瓏  ║                                                  \n");
}
void introduce() {
	printf("\n                             韶關學院銀行系統啟動中…… \n\n");
	Sleep(1000);
	system("cls");
	printf("            ``╭╮              ╭╮   ╭╮                                      \n");
	printf("            ``││              ││   │└ ╮            ∩------------------------------∩                   \n");
	printf("             ╭┴┴———————┴┴╮~└—╯            |  您好,請根據您的需求進行操作,|        \n");
	printf("             │                  │                  |   小白將會為您服務!           |             \n");
	printf("             │    ●       ●   │              ○  ∪------------------------------∪                   \n");
	printf("             │ ○             ○│          ○                                     \n");
	printf("             │       ╰—╯       │                                                   \n");
	printf("             │                  │ \n");
	printf("             ╰—┬o— — —o┬—╯\n");
	printf("                    ╭╮小白╭╮\n");
	printf("                 ╰┴————┴╯\n");
}

int login() {
	FILE *fp1, *fp2;
	int state;
	char str1[20], str2[20], str_z[20], str_m[20];
	//printf("       now time is %s\n", ctime(&now));
	//introduce();
	if ((fp1 = fopen("admin.txt", "rb")) == NULL)
	{
		introduce();
		printf("\n                              韶關學院銀行歡迎您的使用! \n\n");
		printf("     -------------------------建立管理員賬號----------------------\n");
		printf("     |                    本系統沒有您的工作後,請建立!               |\n");
		printf("     -------------------------------------------------------------\n");
		now = time(NULL);
		printf("      Now time is %s\n", ctime(&now));
		printf("     -------------------------------------------------------------\n");
		printf("     ☆              請輸入管理員賬號:");
		scanf("%s", str_z);
		printf("     ☆              請輸入密碼:      ");
		scanf("%s", str_m);
		printf("     -------------------------------------------------------------\n");
		fp2 = fopen("admin.txt", "wb");
		fprintf(fp2, "%s%c", str_z, '\n');
		fprintf(fp2, "%s%c", str_m, ' ');
		fclose(fp2);
	}
	fp1 = fopen("admin.txt", "rb");
	fscanf(fp1, "%s", str1);
	fscanf(fp1, "%s", str2);
	fclose(fp1);
	while (1)
	{
		system("cls");
		introduce();
		printf("\n                             韶關學院銀行歡迎您的使用! \n\n");
		printf("     ----------------------------使用方式-------------------------\n");
		printf("     |                                                           |\n");
		printf("     |              1.工作人員模式          0.使用者模式             |\n");
		printf("     |            One.Worker mode        zero.user mode            |\n");
		printf("     -------------------------------------------------------------\n");
		now = time(NULL);
		printf("             Now time is %s\n", ctime(&now));
		printf("     -------------------------------------------------------------\n");
		printf("     *              請你選擇(0-1):");
		scanf("%d", &state);
		printf("     -------------------------------------------------------------\n");
		if (state == 0)
			return 0;
		else if (state == 1)
		{
			system("cls");
			printf("      *╭╮     ╭╮       ╭╮                                \n");
			printf("        ││     ││       │└ ╮                                    \n ");
			printf("    ╭  ┴┴  ─  ┴┴Ⅲ ╮ ~└─ ╯                                    \n");
			printf("     |   ﹋    ﹋   |         -------------------------------------                               \n");
			printf("     |   ∩    ∩   |      ○ ☆用您的專屬工號進行登入才能工作哦!☆                              \n");
			printf("     |      ▽      |   O    -------------------------------------                     \n");
			printf("     ╰  ─ m∞m─  ╯                                                     \n");

			//////////////////////////////////////////////////////////////////////////////////////////
			printf("\n     ------------------------------------------------------------  \n");
			printf("     →              請輸入賬號:");
			scanf("%s", str_z);
			printf("     →              請輸入密碼:");
			scanf("%s", str_m);
			printf("     -------------------------------------------------------------\n");
			if (strcmp(str1, str_z) == 0 && strcmp(str2, str_m) == 0)
			{
				getchar();
				getchar();
				return 1;
			}
			else
			{
				printf("     -------------------------------------------------------------\n");
				printf("     |                     賬號或密碼錯誤!!!                     |\n");
				printf("     -------------------------------------------------------------\n");
				system("PAUSE");
				system("cls");
			}
		}
		else
		{
			printf("     -------------------------------------------------------------\n");
			printf("     |                        輸入不合法!!!                      |\a \n");
			printf("     -------------------------------------------------------------\n");
			system("PAUSE");
			system("cls");
		}
		/*
		printf("         ."".    ."".      您                             \n");
		printf("         |  |   /  /       已                             \n");
		printf("         |  |  /  /        成                             \n");
		printf("         |  | /  /         功                             \n");
		printf("         |  |/  ;-._       取                             \n");
		printf("         }  ` _/  / ;      編                             \n");
		printf("         |  /` ) /  /      號                             \n");
		printf("         | /  / _/\_/\      ,                            \n");
		printf("         | /  /     \      請                             \n");
		printf("         (  ' \ '-   |     耐                             \n");
		printf("         \   ` .   /       心                             \n");
		printf("          |       |        等                             \n");
		printf("          |       |        候                             \n");
		*/
	}
}
//選擇VIP視窗
int SelectVIPWindow() {
	printf("\n請輸入你所負責的視窗號:\n");
	printf("請選擇[1-2]:");//選擇1-2視窗
	int num;
	cin >> num;
	while (num < 1 || num>2) {
		printf("\n錯誤!!\n");
		printf("請再次輸入你所負責的視窗號:\n");
		printf("請選擇[1-2]:");//選擇1-2視窗
		cin >> num;
	}
	return num;
}

int SelectCommonWindow() {
	printf("\n請輸入你所負責的視窗號:\n");
	printf("請選擇[3-10]:");//選擇1-4視窗
	int num;
	cin >> num;
	while (num < 3 || num>10) {
		printf("\n錯誤!!\n");
		printf("請再次輸入你所負責的視窗號:\n");
		printf("請選擇 [3-10]:");//選擇1-4視窗
		cin >> num;
	}
	return num;
}

/***************************************************************
* main
****************************************************************/
int main(int argc, char**argv)
{
	int id, Vip;//id-使用者排隊號碼,vip-會員排隊號碼
	unsigned int num;//前面有num個人在排隊
	int role;

	role = login();
	system("cls");
	Bank_Sys_Init();
	//dispaly();
	if (role == WORKER) {//工作人員叫號
		while (1)
		{

			switch (select_num(WORKER))
			{
			case 1:
				int VIPWindowNumber;//VIP視窗號
				VIPWindowNumber = SelectVIPWindow();

				Bank_Sys_Init();
				load(*vip, VIP);
				num = Bank_Get_User_Num(VIP);
				id = Bank_Sys_Call_Id(VIP);
				write(*vip, VIP);
				Bank_Sys_Term();

				if (id == -1)
					printf("\n沒有人在排隊---there are no people in wait\n\n");
				else
				{
					printf("\n您應該叫VIP %d 來視窗號 %d ------you should call VIP %d,and go to window %d\n", id + 1, VIPWindowNumber, id + 1, VIPWindowNumber);
					printf("現在有 %d 個人在排隊 ------there are %d people are in wait\n\n", num,num);
					system("pause");
					system("cls");
					printf("\n\n\n-----------------------------------------------------------------------------------------------------------\n");
					printf("/n請編號為%d的VIP客戶到%d視窗辦理業務!-------Customers numbered %d should go to %d window for business\n", id + 1, VIPWindowNumber, id + 1, VIPWindowNumber);
					printf("---------------------------------------------------------------------------------------------------------------\n");
				}

				break;

			case 2:
				int CommonWindowNumber;
				CommonWindowNumber = SelectCommonWindow();

				Bank_Sys_Init();
				load(*common, COMMON);
				num = Bank_Get_User_Num(COMMON);
				id = Bank_Sys_Call_Id(COMMON);
				write(*common, COMMON);
				Bank_Sys_Term();

				if (id == -1)
					printf("\n沒有人在排隊-----there are no people in wait\n\n");
				else
				{
					printf("\n您應該叫普通使用者 %d 來視窗 %d ----you should call COMMON %d,and go to window %d\n", id + 1, CommonWindowNumber, id + 1, CommonWindowNumber);
					printf("現在有 %d 個人在排隊-------there are %d people are in wait\n\n", num,num);
					system("pause");
					//-------------------------------------------------------------------------------
					system("cls");
					printf("\n\n\n");
					printf("-----------------------------------------------------------------------------------------------------------\n");
					printf("/n請編號為%d的VIP客戶到%d視窗辦理業務!-------Customers numbered %d should go to %d window for business\n", id + 1, CommonWindowNumber, id + 1, CommonWindowNumber);
					printf("---------------------------------------------------------------------------------------------------------------\n");
				}

				break;

			case 3:
				system("cls");
				Worker_dispaly();
				system("pause");
				Bank_Sys_Term();
				remove("VIP.txt");
				remove("COMMON.txt");
				return 0;
			}

			system("pause");
		}
	}
	else {//使用者
		while (1)
		{

			switch (select_num(CLIENT))
			{
			case 1:
			{
				Bank_Sys_Init();
				load(*vip, VIP);
				id = Bank_Sys_Get_Id(VIP);
				num = Bank_Get_User_Num(VIP);
				write(*vip, VIP);
				Bank_Sys_Term();

				if (id == -1)
					printf("\n編號已經爆棚了,您需要等幾分鐘!-------the number is too large, you have to wait several minutes !\n");
				else
				{
					system("cls");
					printf("\n\n您的編號為.%d ----you get the vip %d\n", id, id);
					printf("現在有 %d 個人在您前面排隊--there are %d people in front of you\n\n", num - 1, num - 1);
					//------------------------------------------------------------------------------------------
					printf("         .''.    .''.      您                             \n");
					printf("         |  |   /  /       已                             \n");
					printf("         |  |  /  /        成                             \n");
					printf("         |  | /  /         功                             \n");
					printf("         |  |/  ;-._       取                             \n");
					printf("         }  ` _/  / ;      編                             \n");
					printf("         |  /` ) /  /      號                             \n");
					printf("         | /  /_/\\_/\\      ,                            \n");
					printf("         | /  /     \\      請                             \n");
					printf("         (  '\\ '-   |      耐                             \n");
					printf("          \\   ` .  /       心                             \n");
					printf("          |       |        等                             \n");
					printf("          |       |        候                             \n");
				}

				break;
			}
			case 2:
			{
				Bank_Sys_Init();
				load(*common, COMMON);
				id = Bank_Sys_Get_Id(COMMON);
				num = Bank_Get_User_Num(COMMON);
				write(*common, COMMON);
				Bank_Sys_Term();

				if (id == -1)
					printf("\n編號已經爆棚了,你需要等幾分鐘------the number is too large, you have to wait several minutes !\n\n");
				else
				{
					system("cls");

					printf("\n\n您的編號為%d -----you get the common %d\n", id, id);
					printf("現在有 %d 個人在您前面排隊\n\n", num - 1, num - 1);
					//--------------------------------------------------------------------
					printf("         .''.    .''.      您                             \n");
					printf("         |  |   /  /       已                             \n");
					printf("         |  |  /  /        成                             \n");
					printf("         |  | /  /         功                             \n");
					printf("         |  |/  ;-._       取                             \n");
					printf("         }  ` _/  / ;      編                             \n");
					printf("         |  /` ) /  /      號                             \n");
					printf("         | /  /_/\\_/\\      ,                            \n");
					printf("         | /  /     \\      請                             \n");
					printf("         (  '\\ '-   |      耐                             \n");
					printf("          \\   ` .  /       心                             \n");
					printf("          |       |        等                             \n");
					printf("          |       |        候                             \n");
				}

				break;
			}
			case 3:
			{
				system("cls");
				User_dispaly();
				system("pause");
				Bank_Sys_Term();
				remove("VIP.txt");
				remove("COMMON.txt");
				return 0;
			}
			}

			system("pause");
		}
	}
	return 0;

}

include"queue.h"是自己寫好的標頭檔案,c++的鏈佇列比較容易實現就不放出來了