c语言程序设计— 模拟实现银行的排队叫号系统

南京航空航天大学 自动化学院
[基本要求]
(1) 假定银行上午9点开门,下午5点关门,期间每个小时的客流量不超过35人;
(2) 每个客户的基本信息包括:到达银行时间、业务需要办理的时长。这两项数据均由系统随机生成,其中业务办理所需时长定义不超过 30 分钟。若随机生成的时长等于 0,即说明该客户未办理业务,提前离开;根据客户达到银行的时间,为客户发放号码牌(提前离开的客户,由于也已经到达银行,因此也会被发放号码牌);
(3) 程序运行时,由键盘输入银行的窗口数量,然后输出:第几号客户几点到达,在等待了多少分钟后,在几号窗口办理业务,持续多少分钟;若客户是提前离开的,那对应的输出就是:第几号客户几点到达,提前离开。将 8 小时内,所有被服务的客户按照上述要求输出基本信息。最后,统计一下,每个窗口分别服务了多少客户,今天一共服务了多少客户;客户最长的等待时间以及客户的平均等待时间;
(4) 提示用户可以继续输入窗口数量,若输入 0,程序结束;否则按照上述要求给出相应的输出;
(5) 观察银行的窗口数量与接待客户总量与客户等待时间之间的关系;
(6) 算法提示:用结构体数组表示客户(每个数组元素包括客户到达时间、业务办理时间等成员),客户的数据利用随机数自动生成,按照他们的到达时间排序;银行的窗口也用数组表示,要记录的是每个窗口当前已经累积的工作时间长,哪个当前的累计时长最短,就把当前排在最前的顾客分配给哪个窗口;如果当前有两个或者两个以上的窗口累计时长一样,都是最短,那么可以随机分配。

期末小作业?二十块别想了

我的资源里有一个非常类似的,你可以借鉴一下

使用C++实现银行排队叫号系统
https://blog.51cto.com/u_15080022/3787487

我可以帮你写呀


void call() //客服呼叫客户

{

int mywin;//客服所在窗口号 自动分配窗口改为手工分配

char mywinchar;//字符型的窗口号 0的ascii码为48

char setfree;

printf("\t【当前空闲窗口】:");

showfreewin();

printf("\t【当前客户队列情况】:");

showqueue();

printf("\n");

if(vip->size == 0 && nor->size == 0)

{

printf("\t【暂时没有客户等待服务!】\n");

service();

}

else

{printf("\t【请输入您值班的窗口号】:");

scanf("%s",&mywinchar);

mywin = mywinchar -48;//这样做可以避免输入非数字引起程序错误 但是窗口总数不能大于9!!0的ascii码为48

if(mywin >= 1 && mywin <= allwin)

{

if(win[mywin - 1] ==0) //值班的窗口为空闲状态

{

callfree(mywin);//将值班的窗口号 mywin传递给callfree函数

}

else

{

printf("\t【第%d号窗口当前为忙碌状态!】\n",mywin);

printf("\t【是否设置第%d号窗口为空闲,并继续呼叫客户?】\n",mywin);

printf("\t【请选择】:\n");

printf("\t\t\tY.是\tN.否\n");

printf("\t【您的选择】:");

scanf("%s",&setfree);

if(setfree ==*Y* ||setfree ==*y*)

{

win[mywin - 1] = 0;

callfree(mywin);//不用再次输入窗口号 将当前窗口号传递到callfree()函数 按原来的窗口号呼叫客户

}

else

{

if(setfree == *N* || setfree == *n*)

{

call();//选择其他窗口号来呼叫客户

}

else

{

printf("\t【没有这个选项!】\n");

}

}

}

}

else

{

if(mywin >= 1 && mywin <= 9)

{

printf("\t【第%d号窗口暂未开设,请确认您所在值班的窗口号!】\n",mywin);

call();

}

else

{

printf("\t【请正确输入您值班的窗口号!】\n");

call();

}

}

}

}

/*************************************************************/

void servicelogin() //登陆客服系统

{

char password[] = "1";

char pass[20]; //记录输入的密码

printf("\t【请输入登陆密码】:\t");

scanf("%s",pass);//pass是数组 不需要&

while(strcmp(pass,password) == 0) //strcmp为字符串比较函数,返回值为0表示两字符串相同

{

service();//service()函数里有跳出循环的语句 所以这里不是死循环

}

printf("\t【登陆密码错误!】\n");

hugemenu();

}

/*************************************************************/

void service()

{char menu; //客服系统里的菜单变量 若此处设置为整型 万一输入的不是数字会造成死循环 所以设置为字符型

printf("\n\t【请选择】:\n");

printf("\t\t\t1.呼叫客户\t2.队列情况\n\t\t\t3.管理窗口\t4.返回\n");

while(1)

{printf("\t【您的选择】:");

scanf("%s",&menu); // %s 比%c可靠

switch(menu)

{

case *1*:call();service();break;//文单引号表示是字符型

case *2*:printf("\t【当前队列情况】:");showqueue();service();break;

case *3*:managewin();break;

case *4*:hugemenu();break;

default:

{

printf("\t【请正确选择您的服务项目!】\n");

printf("\t\t\t1.呼叫客户\t2.队列情况\n\t\t\t3.管理窗口\t4.返回\n");

}

}

}

}

/*************************************************************/

void turnoff()

{

char password[] ="1";

char pass[30];//定义大一点 因为如果输入的字符超过数组长度,程序会出错 退出!

char sure;//确定不确定关闭

printf("\t【请输入登陆密码】: ");

scanf("%s",pass);//输入密码时 如果输入的字符超过数组长度,程序会出错 退出!属于漏洞!

if(strcmp(pass,password) == 0)//对比字符串 返回值等于意味着密码正确

{

printf("\t【关闭系统后,客户将不能排队取票!】\n\t【您确定要关闭吗?】\n\n");

printf("\t\t\tY.关闭\t\tN.保持\n");

while(1)

{printf("\t【您的选择】:");

scanf("%s",&sure); //不应该用%c 因为用%c的话 回车时会影响

if(sure == *y* || sure == *Y* ) //注意不是sure == *y* || *Y* !!!

{

printf("\t【系统关闭中...】\n");

Beep(800,300); Beep(800,300); Beep(800,800); //声音 beep(调子,时间)

exit(0);//关闭系统

}

else

{if(sure == *n* || sure == *N*)

{

printf("\t【系统未关闭 依然正常运行!】\n");

break;

}

else

{

printf("\t【关闭请按 Y 保持请按 N】\n");

}

}

}

}

else

{

printf("\t【密码错误!请重新输入!】\n");

}

}

/************************************************************/

void hugemenu()//最大的菜单

{

char menu; //服务项目菜单 采用字符型比较可靠!因为如果定义成整型,万一输入了字符,可能会造成死循环错误

while(1) //系统将一直运行 直到运行 turnoff()函数

{

printf("\n\t********************欢迎您使用本系统********************\n\n");

printf("\t【请选择服务项目】:\n");

printf("\t\t\t1.客户取票\t2.VIP服务\n\t\t\t3.客服系统\t4.关闭系统\n");

printf("\t【您的选择】:");

scanf("%s",&menu); //用%s 比%c好 %c会记录字符 而且比如输入111 就会执行getnor() 3次!如果用%s。也输入111,不同的是只执行一遍getnor 后面两个1与回车都不起作用。

switch(menu)

{

case *1*:getnor(); printf("\n\t^^^^^^^^^^^^^^^^^^^^感谢您使用本系统^^^^^^^^^^^^^^^^^^^^\n\n");break;

case *2*:getvip(); printf("\n\t^^^^^^^^^^^^^^^^^^^^感谢您使用本系统^^^^^^^^^^^^^^^^^^^^\n\n");break;

case *3*:servicelogin();break;

case *4*:turnoff();break;

default:printf("\t【暂时没有这个选项!】\n");

}

}

}

/***********************************************************/

int main()

{

vip = createqueue(n);//创建vip客户队列

nor = createqueue(n);//创建普通股客户队列

hugemenu();//调用主界面 //hugemenu()函数是无限循环函数,内部有跳出循环的语句

return 0;

}