C语言编写 银行取票排队系统Word下载.docx
《C语言编写 银行取票排队系统Word下载.docx》由会员分享,可在线阅读,更多相关《C语言编写 银行取票排队系统Word下载.docx(23页珍藏版)》请在冰豆网上搜索。
//无密码登陆客服系统
voidcall();
//客服呼叫客户客服要输入值班窗口号
voidcallfree(intmywin);
//窗口为空闲时呼叫客户客服不用再输入值班窗口号
elementtypedequeue(queueq);
intnum=0;
//客户编号变量全局变量
queuevip,nor;
//定义2个队列一个存普通客户,一个存vip客户
intwin[allwin+1]={0};
//用数组下标表示窗口号,元素值表示窗口状态,值为0表示空闲,值1表示忙碌。
【+1考虑到\0】
idtypecardid[50];
//存储帐户卡号的一个数组全局变量不能定义得太小因为如果输入的字符超过数组长度,程序会出错退出!
idtypecardid2[50];
//临时保存cardid的数据
intlist[2*n]={0};
//按“vip优先vip客户间先来后到普通客户间先来后到”的规则排列好的服务顺序数组元素数量为2个队列的长度
time_ttget[t],tin[t],tout[t];
//取票时间进入窗口时间离开窗口时间;
指定time_t变量的大小t在上面有宏定义
/*****************************************/
voidyourid()//客户插入、确认银行卡
{
//inti;
printf("
\t【请插入您的银行卡】:
\t"
);
scanf("
%s"
cardid);
//这种赋值方法有漏洞如果输入的字符超过数组长度,程序会出错退出!
if(strcmp(cardid2,cardid)!
=0)
{
if(strlen(cardid)<
=19)//strlen()检测数组的长度,即卡号的位数。
卡号位数不能大于19为了演示方便,小于19的也算合法
{
printf("
\t【您的银行卡号码】:
\t%s\n"
strcpy(cardid2,cardid);
//cardid复制到cardid2中
}
else
\t【抱歉!
您的银行卡可能已失效,更换新银行卡请选择1、客户取票】:
\n"
//银行卡号位数超过19可能已失效
hugemenu();
//回到最大菜单函数相当于首页
}
}
else
printf("
您刚才已经取过票!
】\n"
hugemenu();
}
intnumber()//客户编号加1函数
num++;
//num为全局变量
return(num);
charisvip()//是否为vip
chari;
\t"
&
i);
//i=y或Y标记为VIP发现%s比%c可靠
return(i);
/**********************************************/
structqueuerecord
{
intcapacity;
//容量
intfront;
//队头
intrear;
//队尾
intsize;
//队列中的元素个数
//time_t*t1,*t2;
elementtype*array;
//相当于intarray[];
};
intisempty(queueq)//检测队列是否为空
returnq->
size==0;
intisfull(queueq)//检测队列是否已满
return(q->
size==q->
capacity);
//q的size(队列里的元素个数)等于capacity(容量)时意味着队列已满
/***********************************************/
queuecreatequeue(intmaxelements)//建立队列,maxelements定义队列容量
queueq;
if(maxelements<
minqueuesize)
printf("
\t【队列容量太小!
允许最小值为】:
%d\n"
minqueuesize);
q=(queue)malloc(sizeof(structqueuerecord));
//强制转换格式
if(q==NULL)
Outofspace!
!
"
);
q->
array=(elementtype*)malloc(sizeof(elementtype)*maxelements);
//强制转换格式
if(q->
array==NULL)
capacity=maxelements;
makeempty(q);
returnq;
voidmakeempty(queueq)
size=0;
front=1;
//不是零
rear=0;
/********************************************/
staticintsucc(intvalue,queueq)//此函数让rear回到队列最开始的位置
if(++value==q->
capacity)
value=0;
returnvalue;
voidenqueue(elementtypex,queueq)//入队函数
if(isfull(q))
fullqueue!
q->
size++;
//队列增加一个队员所以size要+1
rear=succ(q->
rear,q);
//如果rear+1后等于容量(capacity),则rear变为0,否则rear+1
array[q->
rear]=x;
elementtypedequeue(queueq)
elementtypex=0;
if(isempty(q))
printf("
\t【队列为空!
size--;
x=q->
array[q->
front];
front=succ(q->
front,q);
returnx;
/******************************************/
voidshowfreewin()//显示空闲窗口
inti;
for(i=0;
i<
=allwin-1;
i++)//-1因为窗口号比数组下标大1
if(win[i]==0)
\t%d"
i+1);
/**************************************************/
intcheckfreewin()//检测有没有空闲窗口没有的话返回值比窗口总数大1
inti,j=0;
i<
=allwin-1;
i++)
j++;
//break;
//return(i+1);
//+1因为数组下标与窗口号是不对应的要用到返回值6(窗口数+1)
return(j);
//返回空闲的窗口总数
voidentrywin()//进入空闲窗口
i<
i++)
win[i]=1;
break;
}//将该窗口的值赋值为1,表示窗口忙碌
voidleavewin(intwinx)//客户离开窗口,传入离开哪个窗口客户离开后窗口空闲用0表示winx是存储窗口号的局部变量
win[winx-1]=0;
//窗口号与数组下标是不对应的
/*******************************************/
voidopenwin(intwinx)//打开某个窗口,即令win[winx]的值为0
//必须减1因为窗口号与数组号不对应
/**************************************/
voidclosewin(intwinx)//关闭某个窗口,即令win[winx]的值为1
win[winx-1]=1;
voidgetvip()//vip客户取票
yourid();
//下一步按N返回按B
//charnext;
//确认帐号是否正确的变量
intwinback=checkfreewin();
//检测有无空闲窗口
charcheckvip;
intyournum;
//存储客户的编号
\n\t【系统检测是否为VIP客户,如果是返回值为Y。
此处暂时由人工代替系统输入】\n"
checkvip=isvip();
if(checkvip=='
y'
||checkvip=='
Y'
)//vip客户代码isvip()函数里有scanf()函数
{
num=number();
//number()函数每调用一次,返回值增加1num是全局变量
enqueue(num,vip);
//队列中的数组用来存客户编号
yournum=num;
time(&
tget[yournum]);
if(winback>
(vip->
size-1))//空闲窗口数比队列里除本客户外的人多
\t【尊敬的VIP客户:
%s,您的编号为:
%d,客服马上呼叫您,请留意!
cardid,num);
\t【%d号客户取票时间】:
%s\n"
yournum,ctime(&
tget[yournum]));
}
{
\n\t【尊敬的VIP客户:
%d服务窗口全忙!
】\n\t【您的前面有%d位客户正在等待,请稍等!
cardid,num),(vip->
size-1);
//vip队列里的人数减去客户本人
您当前不是vip客户!
请选择“1、客户取票”服务】\n"
cardid2[0]='
\0'
;
//没有取票成功所以cardid2[]不能和cardid[]相等。
把字符串结束符存到字符串第一个位置
/*************************************************************/
voidgetnor()//普通客户取票
num=number();
enqueue(num,nor);
yournum=num;
time(&
//记录客户开始等待的时间不需要强制转换变量类型数组也需要&
?
resettx()函数返回一个合适的值
//检测窗口数
if(winback>
size+nor->
size-1))//空闲窗口数比排在前面的人数多
\t【尊敬的客户,您的编号为:
%d客服马上呼叫您,请留意!
num);
}
num,(vip->
size-1));
}
/************************************************************/
voidmanagewin()//管理窗口的开与关
charx;
//开启窗口关闭窗口返回客服系统
intwinx;
//要开启或关闭的窗口号
while
(1)//选择1或2之后才能跳出此循环
{printf("
\t【当前空闲窗口】:
showfreewin();
\t【请选择】:
\t\t\t1.开启窗口\t2.关闭窗口\n\t\t\t3.返回\n"
\t【您的选择】:
scanf("
x);
//%s比%c可靠
if(x=='
1'
)//x为字符类型
\t【请输入要开启的窗口】:
scanf("
%d"
winx);
if(winx<
=allwin)
{
if(win[winx-1]==0)
{
printf("
\t【第%d号窗口当前为开启状态,无需再开启!
winx);
}
else
openwin(winx);
\t【第%d号窗口已成功打开!
}
else
printf("
\t【没有这个窗口!
if(x=='
2'
)
\t【请输入要关闭的窗口】:
scanf("
if(winx<
if(win[winx-1]==1)
{
printf("
\t【第%d号窗口当前为关闭状态,无需再关闭!
}
else
closewin(winx);
\t【第%d号窗口已成功关闭】\n"
{
if(x=='
3'
service();
\t【没有这个选项!
请重新选择!
//如果没有选择1、2或者3则反复提示用户做正确选择
voidshowqueue()//显示客户编号的服务顺序
inti,j;
vip->
size;
i++)
%d"
(vip->
array[(vip->
front)+i]));
//显示vip
list[i]=(vip->
front)+i]);
//把客户编号按vip队列的顺序存到list[]数组中
for(j=0;
j<
nor->
j++)//显示普通客户编号的服务顺序
(nor->
array[(nor->
front)+j]));
list[i+j]=(nor->
front)+j]);
//把客户编号按nor队列的顺序存到list[]数组中并且从list[i]开始
voidcallfree(intmywin)//值班窗口为空闲状态时呼叫客户
{
charnext1;
//标记客户是否已成功办理业务
charnext2;
//标记是否关闭本窗口
charreach;
//客户是否按时到达窗口
FILE*fp;
//一定要大写的
\t【请%d号客户到第%d号窗口!
list[0],mywin);
//此前必须执行一次showqueue()list[0]会改变
\t【%d号客户是否已到达窗口?
list[0]);
\t\t\t1.客户已到达\t2.客户已离开\n"
reach);
if(reach=='
tin[list[0]]);
//客户进入窗口的时间不需要强制转换变量类型数组也需要&
resettx()函数返回一个合适的值
win[mywin-1]=1;
//把刚才呼叫用户的窗口置为忙碌记住-1
if(list[0]==vip->
array[vip->
front])//判断list数组的第一个元素是属于vip还是nor队列
dequeue(vip);
dequeue(nor);
\t【客户已成功办理业务请按Y】:
while
(1)//直到按Y后才跳出循环
next1);
if(next1=='
||next1=='
time(&
tout[list[0]]);
//服务结束的时间客户离开窗口不需要强制转换变量类型数组也需要&
\n\t\t\t0.设置第%d号窗口为空闲\n\t\t\t1.设置第%d号窗口为忙碌\n\t【您的选择】:
mywin,mywin);
while
(1)//如果不是按1或0就重复执行下面的语句直到按了1或0才跳出循环
scanf("
next2);
if(next2=='
win[mywin-1]=1;
\n\t【第%