哪位朋友能帮我看看银行业务模拟系统的一段代码么,运行出问题了,感激不尽

问题描述:假设某银行有四个窗口对外接待客户,从早晨银行开门起不断有客户进入银行。由于每个窗口在某个时刻只能接待一个客户,因此在客户人数众多时需在每个窗口前顺次排队,对于刚进入银行的客户,如果某个窗口的业务员正空闲,则可上前办理业务,反之,若四个窗口均有客户所占,他便会排在人数最少的队伍后面。现在需要编制程序以模拟银行的这种业务活动并计算一天中客户在银行逗留的平均时间。
1.基本要求
(1)初始化(OpenForDay),模拟银行开门时各数据结构的状态。
(2)事件驱动(EventDrived), 对客户到达和离开事件做相应处理。
(3)下班处理(CloseForDay),模拟银行关门时的动作,统计客户平均逗留时间

#include
#include
#include
#define NUMBER 100
#define M 4

struct pepo
{
int pepoarr;
int pepolef;
}pepo[NUMBER];

typedef struct LinkQueue
{
int data;
struct LinkQueue *next;
}LQ;

LQ* init()// 初始化
{
LQ p;
p=(LQ
)malloc(sizeof(LQ));
p->next=NULL;
return p;
}

LQ inqueue(LQ *p,int e)// 尾插法进队
{
LQ *s;
s=(LQ
)malloc(sizeof(LQ));
s->data=e;
s->next=p->next;
p->next=s;
p=s;
return p;
}

int getqueue(LQ *p)// 取队首元素
{
int e;
e=p->next->data ;
return e;
}

LQ *outqueue(LQ *p)// 出队列
{
LQ *q;
q=p->next;
p->next=q->next;
free(q);
return p;
}

void memu();
void openforday();
void start();
void end();

LQ *p1,*p2,*p3,*p4;// 表示银行的窗口

void memu()
{
int n,w;
do
{
puts("\n\n◆◇◆◇◆中国银行欢迎您◆◇◆◇◆");
puts("★☆★菜单★☆★");
puts("1.银行初始化");
puts("2.办理业务");
puts("3.离开银行");
puts("4.退出");
puts("请选择您所需要的服务(1-4): ");
scanf("%d",&n);
if(n4)
{
w=1;
getchar();
}
else w=0;
}while(w==1);
switch(n)
{
case 1:
openforday();
break;
case 2:
start();
break;
case 3:
end();
break;
case 4:
puts("◆◇◆◇◆欢迎您下次光临◆◇◆◇◆");
break;
}
}

void openforday()// 初始化
{
p1=init();
p2=init();
p3=init();
p4=init();
puts("▲银行此时四个窗口皆为空");
memu();
}

void start()
{
int k;
int flag[5]={0};
LQ *q1,*q2,*q3,*q4;

q1=p1->next;
q2=p2->next;
q3=p3->next;
q4=p4->next;

printf("此人是进入银行的第__个人:");
scanf("%d",&k);

if(p1->next = NULL)// 只要是有窗口为空,那么直接进入该窗口
{
    p1=inqueue(p1,k);
    printf("%d",p2->next->data);}// 调试代码,本身不用
else if(p2->next = NULL)
    p2=inqueue(p2,k);
else if(p3->next = NULL)
    p3=inqueue(p3,k);
else if(p4->next = NULL)
    p4=inqueue(p4,k);
else;

while(q1 != NULL)// 用flag统计每一个窗口的人数。
{
    flag[1]=flag[1]+1;
    q1=q1->next;}
while(q2 != NULL)
{
    flag[2]=flag[2]+1;
    q2=q2->next;}
while(q3 != NULL)
{
    flag[3]=flag[3]+1;
    q3=q3->next;}
while(q4 != NULL)
{
    flag[4]=flag[4]+1;
    q4=q4->next;}

if(flag[1]<=flag[2] && flag[1]<=flag[3] && flag[1]<=flag[4])// 在每一个窗口都不是空的时候,来的顾客进入人数较少的窗口
    p1=inqueue(p1,k);
if(flag[2]<flag[1] && flag[2]<=flag[3] && flag[2]<=flag[4])// 此段代码是判断哪个窗口的人数最少
    p2=inqueue(p2,k);
if(flag[3]<flag[1] && flag[3]<flag[2] && flag[3]<=flag[4])
    p3=inqueue(p1,k);
if(flag[4]<flag[1] && flag[4]<flag[2] && flag[4]<flag[3])
    p4=inqueue(p1,k);

printf("请输入此人到达银行的时间:");
scanf("%d",&pepo[k].pepoarr);
memu();

}

void end()
{
int m,k,t;
int time;
printf("位于__窗口的顾客将离开银行:");
scanf("%d",&m);
t=m;
switch(t)
{
case 1:
k=getqueue(p1);
printf("该顾客的序号为:%d",k);
printf("请输入该顾客离开的时间:");
scanf("%d",&pepo[k].pepolef);
time=pepo[k].pepolef-pepo[k].pepoarr;
printf("此人在银行办理业务总共花费 %d 的时间。",time);
memu();
break;
case 2:
printf("%d",p2->next->data);// 调试代码,本身不用
k=getqueue(p2);
printf("该顾客的序号为:%d",k);
printf("请输入该顾客离开的时间:");
scanf("%d",&pepo[k].pepolef);
time=pepo[k].pepolef-pepo[k].pepoarr;
printf("此人在银行办理业务总共花费 %d 的时间。",time);
memu();
break;
case 3:
k=getqueue(p3);
printf("该顾客的序号为:%d",k);
printf("请输入该顾客离开的时间:");
scanf("%d",&pepo[k].pepolef);
time=pepo[k].pepolef-pepo[k].pepoarr;
printf("此人在银行办理业务总共花费 %d 的时间。",time);
memu();
break;
case 4:
k=getqueue(p4);
printf("该顾客的序号为:%d",k);
printf("请输入该顾客离开的时间:");
scanf("%d",&pepo[k].pepolef);
time=pepo[k].pepolef-pepo[k].pepoarr;
printf("此人在银行办理业务总共花费 %d 的时间。",time);
memu();
break;
}
}

int main()
{
memu();
return 0;
}

1个回答

上面的代码是我写的,然而有点问题图片说明图片说明图片说明图片说明

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐