急!!需求高手指点一下,万分感谢!!(60分)
鄙人最近在做一个操作系统的课设,课设的题目是:模拟超市排队调度系统 大致的要求是这样的,模拟超市排队结账调度程序。首先考虑已经排在队伍前面欲结账人的购物多少,其次考虑哪个队伍的人最少,通过程序调度刚来到的人排到哪个等待时间最少的队伍上, 要求: 1.假设有100个顾客,结算一个物品需要1秒钟 ;2.能给出动态的调度演示过程;3.每个顾客的购物数随机生成;4.顾客到达的顺序也是随机的;5.初始化时设定帐口数目和初始排队情况;(语言不限)
写完之后发现还有些问题,主要出现的问题是 顾客号9 出现了两次调度,在最后调度7号的时候,本该进入队列2 中的,结果却意外的出现在队列0中,我想主要的问题出现在函数 void settle_accounts()中,大家都知道,一旦出现了逻辑错误的时候,当事人就很难发现问题的所在,再加上鄙人的水平很是一般!!希望各位大侠帮帮忙,给出点修改建议,呵呵,万分感谢了!!
以下是我写的代码:
#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
//以下定义的数组都是从1开始的
struct Guke{
int number;
int wupinshu; //顾客购买物品数
int arr_time; //顾客到达时间
};
struct Duilie{
struct Guke guke;
struct Duilie *next;
};
void init_Guke();
void init_Duilie();
void arr_time(struct Guke *p1);
void queue_in(struct Guke q2);
void settle_accounts();
void init_Du(int number,struct Guke pl);
struct Guke Gu[10];
struct Duilie Du[3];
void init_Guke() //对顾客手中物品初始化
{ int i;
for(i=0;i<10;i++)
{
Gu[i].number=i;
Gu[i].wupinshu=rand()%21; //假设顾客买的物品数不超过100个
Gu[i].arr_time=rand()%12; //假设顾客到达的时间不超过300秒
}
}
void init_Duilie() //假设超市才开门,初始化为0
{
int i;
for(i=0;i<3;i++)
{
Du[i].guke.number=0;
Du[i].guke.arr_time=0;
Du[i].guke.wupinshu=0;
Du[i].next=NULL;
}
}
void settle_accounts() //柜台结账 每一秒结算一个物品
{
struct Duilie *p1;
printf("\n");
int i;
for(i=0;i<3;i++)
{
if(Du[i].guke.wupinshu>0)
{
Du[i].guke.wupinshu--;
printf("%5d",Du[i].guke.wupinshu);
}
if((Du[i].guke.wupinshu==0)&&(Du[i].next!=NULL))
{
p1=Du[i].next;
printf("顾客号->%d进入队列号->%d\n",p1->guke.number,i);
printf("%3d,%10d,%12d\n",p1->guke.number,p1->guke.arr_time,p1->guke.wupinshu); //??!
Du[i].guke.arr_time=p1->guke.arr_time;
Du[i].guke.number=p1->guke.arr_time;
Du[i].guke.wupinshu=p1->guke.wupinshu;
Du[i].next=p1->next;
free(p1);
p1=NULL;
}
if((Du[i].guke.wupinshu==0)&&(Du[i].next==NULL))
{
Du[i].guke.arr_time=0;
Du[i].guke.number=0;
Du[i].guke.wupinshu=0;
}
}
if((Du[1].guke.wupinshu==0)&&(Du[2].guke.wupinshu==0)&&(Du[3].guke.wupinshu==0)&&(Du[1].next==NULL)&&(Du[2].next==NULL)&&(Du[3].next==NULL))
printf("超市排队已经完成,队列为空!!\n");
}
//顾客到达时间排队
void arr_time(struct Guke *p1)
{
int time,i;
int time1=0;
//struct Guke *pr;
for(time=0;time<=12;time++)
for(i=0;i<10;i++)
if(p1[i].arr_time==time)
{
for(int j=1;j<=time;j++)
{
Sleep(1000); //顾客按其设定的时间进行排队,和柜台结账时并发进行的
settle_accounts(); // ??!
time1++;
}
// pr=&(p1[i]);
queue_in(p1[i]);
//则为第i个顾客进去排队队列
}
if(time1>12) //说明最后的顾客也在排队了
{
while((Du[1].next!=NULL)||(Du[2].next!=NULL)||(Du[3].next!=NULL))
{
for(i=0;i<3;i++)
{
Sleep(1000);
settle_accounts();
}
}
}
}
//顾客排队调度算法
void queue_in(struct Guke q2)
{
int count_goods[3]={0};
int count_people[3]={0};
int min_goods,min_number,min_people;
struct Duilie *p;
int i;
for(i=0;i<3;i++)
{
for(p=&Du[i];p!=NULL;p=p->next)
{
count_goods[i]+=p->guke.wupinshu;
if(p->guke.number>0)
count_people[i]++;
}
}
min_goods=count_goods[0];
min_people=count_people[0];
min_number=0;
for(i=0;i<3;i++)
{
if(min_goods>count_goods[i])
{
min_goods=count_goods[i];
min_number=i;
}
}
switch(min_number)
{
case 0: init_Du(0, q2);
break;
case 1: init_Du(1, q2);
break;
case 2: init_Du(2, q2);
break;
}
if((count_goods[0]==count_goods[1])&&(count_goods[0]==count_goods[2])&&(count_goods[1]==count_goods[2]))
{
for(i=0;i<3;i++)
{
if(min_people>count_people[i])
{
min_people=count_people[i];
min_number=i;
}
}
switch(min_number)
{
case 0: init_Du(0, q2);
break;
case 1: init_Du(1, q2);
break;
case 2: init_Du(2, q2);
break;
}
}
}
void init_Du(int number,struct Guke pl)
{
struct Duilie *p1,*p2;
for(p1=&Du[number];p1->next!=NULL;p1=p1->next)
;
p2=(struct Duilie *)malloc(sizeof(struct Duilie));
p2->guke.arr_time=pl.arr_time;
p2->guke.number=pl.number;
p2->guke.wupinshu=pl.wupinshu;
p1->next=p2;
p2->next=NULL;
}
int main(void)
{
struct Guke *pl;
pl=&Gu[0];
init_Guke();
init_Duilie();
printf("顾客号: 顾客到达时间: 顾客物品数:\n");
for(int i=0;i<10;i++)
printf("%3d,%10d,%12d\n",Gu[i].number,Gu[i].arr_time,Gu[i].wupinshu);
arr_time(pl);
return 0;
}
[ 本帖最后由 PP_make 于 2010-7-14 17:48 编辑 ]