模拟银行排队取号系统 - 命令行版 - 代码

更新时间:2023-09-17 07:27:01 阅读量: 幼儿教育 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

1 1 北邮模拟银行系统_命令行版_源代码(C语言版 C-Free)

以此怀念 我幼稚的不冷静 大一下 干了一些事 至少努力过 努力不错过 这段有点冲动的时期 毕竟青春 再见 宏福 再见 大一

By 北邮14级13班 颜力琦

constant.h

#define Wait 0//等待服务状态

#define DistributeForOrdinary 1//分配普通客户状态 #define WaitForVIPNum 2//等待VIP身份号状态 #define CheckVIP 3//核对VIP身份号状态 #define DistributeForVIP 4//分配VIP客户状态 #define Quit 5//下班指令发出,锁定取号机状态

#define Unopen 10//窗口关闭状态 #define WaitWin 11//窗口等待状态 #define Serve 12//窗口服务状态 #define Call 13//窗口叫号状态 #define Rest 14//窗口休息状态 #define Closed 15//窗口下班状态

variable.h

FILE *fptr1;//读取信息的文件 FILE *fptr2;//输出文件

FILE *fptr3;//输出统计数据文件 FILE *fVIP;//VIP文件打开指针

int state = 0;//取号机状态值

int closeOrder = 0;//下班指令是否发出 int WinCount, VIPWinCount;//营业窗口数 int change = 0;//是否有事件发生

2 1

struct VIPInformation VIPInfo; //VIP客户资料 struct WINDOWS Win[8]; //8个窗口编号0-7

int MaxSeqLen;//单队列最大允许等待长度 int MinSec;//单业务办理最短时长 int MaxSec;//单业务办理最长时长 int MinRestSec;//窗口休息最短时长 int MaxRestSec;//窗口休息最长时长 int VIPSERVLen;//VIP窗口设置时长

int maxNUM=0;//最大普通服务号码 int minNUM=0;//最小普通服务号码

int VIPmaxNUM=0;//最大VIP服务号码 int VIPminNUM=0;//最小VIP服务号码

char SERVE[3] = {0};//最大客户服务号码

HANDLE hScreenMutex;//保存互斥对象的句柄

Main.c

#include #include #include #include #include #include #include \#include \

#define DEBUG

void initialize(void);//初始化函数

3 1 void get_input(void); //输入函数 void control(void);//系统控制函数 void print_message(void);//输出函数

void print_file(void);//输出到运行情况的记录(结果)文件

void print_statisticsFile(void);//输出到运行情况的记录(结果)文件 void bankError(void);//特殊情况

void rest(int n); //处理窗口休息请求

void InputVIPInformation(void);//VIP客户资料维护 void queue(void);//为普通客户排队 void queueVIP(void);//为VIP排队 void windowWork(void);//各窗口控制 void windowControl(void);//增减窗口控制

//VIP客户资料维护部分 void correct(void); void Delete(void); void add(void); void menu(void);

int VIPInformationupdate(void);

struct VIPInformation { char name[10]; int num; int account; };

struct WINDOWS //存储窗口信息 { int IsVIP; int WindowState; int serveNum; int start;//记录事件发生时间 int timeInterval;//时间间隔 int closeLater;//服务完毕后是否关闭 int appraise;//客户满意度评价 int sum;//总共受理客户数 clock_t timeSum;//总业务办理时长 int restLater;//服务完毕后是否休息 };

main() { clock_t start, finish; //初始化 initialize();

//创建线程 DWORD ThreatID = 1; hScreenMutex = CreateMutex(NULL, FALSE, \创建互斥对象 HANDLE hRead1

CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)get_input,NULL,0,&ThreatID); CloseHandle(hRead1); printf(\Welcome to 模拟银行营业******************************\\n\ //运行 while((VIPWinCount!=0||WinCount!=0)||state!=Quit) { WaitForSingleObject(hScreenMutex, INFINITE);//申请互斥对象所有权 control(); //模拟系统运行函数

print_message(); //信息输出函数 print_file();

ReleaseMutex(hScreenMutex);//释放互斥对象所有权 } fclose(fptr2); print_statisticsFile();//输出统计结果文件 printf(\服务结束,是否退出程序\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\a\ system(\ return 0; }

4 1 =

5 1

void initialize(void) { FILE *file; int i; //打开文件 fptr2=fopen(\ file=fopen(\ if(fptr2==NULL||file==NULL){ printf(\ exit(0); } //8个窗口状态初始化 Win[0].IsVIP = 1; Win[0].WindowState = WaitWin; Win[1].IsVIP = 1; Win[1].WindowState = Unopen; Win[2].IsVIP = 0; Win[2].WindowState = WaitWin; Win[3].IsVIP = 0; Win[3].WindowState = WaitWin; Win[4].IsVIP = 0; Win[4].WindowState = WaitWin; Win[5].IsVIP = 0; Win[5].WindowState = Unopen; Win[6].IsVIP = 0;

11 1 if(VIPmaxNUM>VIPminNUM) { for(i=0; i<2; i=i+1) { if(Win[i].WindowState==WaitWin) { Win[i].WindowState=Call; VIPminNUM=VIPminNUM+1; Win[i].serveNum=VIPminNUM; Win[i].start = clock(); Win[i].timeInterval=rand()P00+5000;//叫号时间为5~10秒随机数 Win[i].timeSum = Win[i].timeSum + Win[i].timeInterval;//服务时间增加 Win[i].sum = Win[i].sum +1; change = 1; break; } } } }

void windowControl(void)//增减窗口控制 { int i; int maxVIPCount = 0; static clock_t present = 0, previous = 0; present = clock(); //普通窗口的增加 if((maxNUM-minNUM)>=(3*WinCount)) { for(i=2;i<8&&Win[i].WindowState!=Unopen;i=i+1) { }

12 1 if(i<8) { Win[i].WindowState = WaitWin; WinCount = WinCount + 1; change = 1; } }

//普通窗口的减少

if(((maxNUM-minNUM)<(2*WinCount))&&(WinCount>3)) { for(i=7;i>=2&&Win[i].WindowState==Unopen;i=i-1) { } if(i>=2) { switch(Win[i].WindowState) { case WaitWin: Win[i].WindowState = Unopen; WinCount = WinCount - 1; change = 1; break; case Rest: Win[i].WindowState = Unopen; WinCount = WinCount - 1; change = 1; break; case Call: Win[i].closeLater = 1; WinCount=WinCount-1; case Serve: Win[i].closeLater = 1; WinCount=WinCount-1; break; } } }

13 1

//VIP窗口的增加

if(VIPmaxNUM-VIPminNUM>3&&Win[1].WindowState==Unopen) { Win[1].WindowState = WaitWin; VIPWinCount = VIPWinCount + 1; change = 1; }

//VIP窗口的减少

if(present-previousmaxVIPCount) { maxVIPCount = VIPmaxNUM-VIPminNUM; } else previous = present; }

if(present-previous>=VIPSERVLen) { if(maxVIPCount<3) { switch(Win[1].WindowState) { case WaitWin: Win[1].WindowState = Unopen; VIPWinCount = VIPWinCount - 1; change = 1; break; case Rest: Win[1].WindowState = Unopen; VIPWinCount = VIPWinCount - 1; change = 1; break; case Call: Win[1].closeLater = 1; VIPWinCount=VIPWinCount-1; break; case Serve: Win[1].closeLater = 1; VIPWinCount=VIPWinCount-1; break; }

14 1 previous = present; } } }

void windowWork(void) { int i;

clock_t present; present = clock(); srand(time(NULL)); //随机种子 for(i=0; i<8; i=i+1) { switch(Win[i].WindowState) { case Serve: if(present>=Win[i].start+Win[i].timeInterval) { Win[i].appraise = rand()%3 + 1;//客户满意度由随机数产生 if(Win[i].closeLater==0) { Win[i].WindowState = WaitWin;//窗口服务结束 change = 1; } if(Win[i].closeLater==1) { Win[i].WindowState = Unopen;//窗口关闭 Win[i].closeLater=0;

15 1 change = 1; } if(Win[i].restLater==1) { Win[i].WindowState = Rest;//窗口休息 Win[i].start = present; Win[i].timeInterval = rand()%((MaxRestSec-MinRestSec)*1000)+MinRestSec*1000; Win[i].restLater=0; change = 1; } } break; case Call:

if(present>=Win[i].start+Win[i].timeInterval) { Win[i].WindowState = Serve; Win[i].start = present; Win[i].timeInterval = rand()%((MaxSec-MinSec)*1000)+MinSec*1000;//客户办理业务的时间长短由随机数产生,范围在MinSec到MaxSec之间 Win[i].timeSum = Win[i].timeSum + Win[i].timeInterval;//服务时间增加 change = 1; } break; case Rest: if(present>=Win[i].start+Win[i].timeInterval) { Win[i].WindowState = WaitWin;//窗口休息结束 if(i<2) { VIPWinCount = VIPWinCount+1; } else WinCount = WinCount+1; change = 1; } break;

本文来源:https://www.bwwdw.com/article/zgoh.html

Top