1、/无密码登陆客服系统void call();/客服呼叫客户 客服要输入值班窗口号void callfree(int mywin);/窗口为空闲时呼叫客户 客服不用再输入值班窗口号elementtype dequeue(queue q);int num = 0; /客户编号变量 全局变量queue vip,nor; /定义2个队列 一个存普通客户,一个存vip客户int winallwin+1 = 0; /用数组下标表示窗口号,元素值表示窗口状态,值为0表示空闲,值1表示忙碌。【+1考虑到 0】idtype cardid50;/存储帐户卡号的一个数组 全局变量 不能定义得太小 因为如果输入的字符
2、超过数组长度,程序会出错 退出! idtype cardid250;/临时保存cardid的数据int list2*n = 0; / 按 “vip优先 vip客户间先来后到 普通客户间先来后到” 的规则排列好的服务顺序 数组元素数量为2个队列的长度time_t tgett,tint,toutt; /取票时间 进入窗口时间 离开窗口时间;指定time_t变量的大小 t在上面有宏定义/*/void yourid() /客户插入、确认银行卡 /int i; printf(t【请插入您的银行卡】: t); scanf(%s,cardid); / 这种赋值方法有漏洞 如果输入的字符超过数组长度,程序会出
3、错 退出! if(strcmp(cardid2,cardid) != 0) if(strlen(cardid) size = 0;int isfull(queue q)/检测队列是否已满 return(q-size = q-capacity ); /q的size(队列里的元素个数) 等于capacity(容量) 时意味着队列已满/*/queue createqueue( int maxelements ) /建立队列,maxelements 定义队列容量 queue q; if( maxelements array = (elementtype*)malloc( sizeof( element
4、type ) * maxelements );/强制转换格式 if( q-array = NULL )capacity = maxelements; makeempty(q); return q;void makeempty(queue q)size = 0;front = 1;/不是零rear = 0;/*/static int succ(int value,queue q) /此函数让rear回到队列最开始的位置 if(+value = q-capacity ) value = 0; return value;void enqueue(elementtype x,queue q) /入队函
5、数 if(isfull(q)full queue! q-size+; /队列增加一个队员 所以size要+1rear = succ(q-rear,q); /如果rear+1后 等于 容量(capacity),则rear变为0,否则rear+1arrayq-rear = x;elementtype dequeue( queue q ) elementtype x = 0; if( isempty( q ) ) printf( t【队列为空!size-; x = q-array q-front ;front = succ( q-front, q); return x;/*/void showfre
6、ewin() /显示空闲窗口 int i; for(i = 0;i=allwin-1;i+) / -1 因为窗口号比数组下标大1 if(wini = 0)t%d,i+1);/*/int checkfreewin() /检测有没有空闲窗口 没有的话返回值比窗口总数大1 int i,j = 0; i = allwin-1;i+) j+; /break; /return (i+1); /+1 因为数组下标与窗口号是不对应的 要用到返回值6(窗口数 + 1) return (j);/返回空闲的窗口总数void entrywin() /进入空闲窗口i (vip-size - 1)/空闲窗口数比队列里除本
7、客户外的人 多t【尊敬的VIP客户:%s,您的编号为:%d,客服马上呼叫您,请留意!,cardid,num);t【%d号客户取票时间】:%sn,yournum,ctime(&tgetyournum); nt【尊敬的VIP客户:%d 服务窗口全忙!】nt【您的前面有%d位客户正在等待,请稍等! ,cardid,num),(vip-size - 1);/vip队列里的人数减去客户本人 您当前不是vip客户!请选择“1、客户取票”服务】n cardid20 = 0;/没有取票成功 所以cardid2 不能和cardid 相等。把字符串结束符存到字符串第一个位置/*/void getnor() /普通
8、客户取票 num = number(); enqueue(num,nor); yournum = num; time(&/记录客户开始等待的时间 不需要强制转换变量类型 数组也需要&? resettx()函数返回一个合适的值/检测窗口数 if(winback size + nor-size - 1)/空闲窗口数 比排在前面的人数多t【尊敬的客户,您的编号为:%d 客服马上呼叫您,请留意!,num); ,num,(vip-size - 1) ); /*/void managewin() /管理窗口的开与关 char x; /开启窗口 关闭窗口 返回客服系统 int winx;/要开启或关闭的窗口
9、号 while(1) /选择1 或 2 之后才能跳出此循环 printf(t【当前空闲窗口】: showfreewin();t【请选择】:ttt1.开启窗口t2.关闭窗口nttt3.返回nt【您的选择】: scanf(x); / %s 比%c可靠 if(x = 1) /x为字符类型t【请输入要开启的窗口】: scanf(%dwinx); if(winx = allwin) if(winwinx - 1 = 0) printf(t【第%d号窗口当前为开启状态,无需再开启!,winx); else openwin(winx);t【第%d号窗口已成功打开! else printf(t【没有这个窗口!
10、 if(x = 2)t【请输入要关闭的窗口】: scanf( if(winx size; i+) %d ,(vip-array(vip-front) + i) );/显示vip listi = (vip-front) + i);/把客户编号按vip队列的顺序存到list数组中 for(j = 0; j j+) /显示普通客户编号的服务顺序,(nor-array(nor-front) + j) ); listi+j = (nor-front) + j);/把客户编号按nor队列的顺序存到list数组中 并且从listi开始 void callfree(int mywin)/值班窗口为空闲状态时呼
11、叫客户 char next1;/标记客户是否已成功办理业务 char next2;/标记是否关闭本窗口 char reach;/客户是否按时到达窗口 FILE *fp;/ 一定要大写的t【请%d号客户到第%d号窗口!,list0,mywin);/此前必须执行一次showqueue() list0会改变t【%d号客户是否已到达窗口?,list0);ttt1.客户已到达t2.客户已离开nreach); if(reach = tinlist0); /客户进入窗口的时间 不需要强制转换变量类型 数组也需要& resettx()函数 返回一个合适的值 winmywin- 1 = 1;/把刚才呼叫用户的窗
12、口置为忙碌 记住 -1 if(list0 = vip-arrayvip-front) /判断list数组的第一个元素 是属于vip 还是nor队列 dequeue(vip); dequeue(nor);t【客户已成功办理业务请按 Y 】: while(1) /直到按 Y后 才跳出循环next1); if(next1 = | next1 = time(&toutlist0);/服务结束的时间 客户离开窗口 不需要强制转换变量类型 数组也需要&nttt0.设置第%d号窗口为空闲nttt1.设置第%d号窗口为忙碌nt【您的选择】:,mywin,mywin); while(1) /如果不是按 1或 0 就重复执行下面的语句 直到按了1 或0才跳出循环 scanf(next2); if(next2 = winmywin - 1 = 1;nt【第%
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1