| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1584 人关注过本帖
标题:急!!需求高手指点一下,万分感谢!!(60分)
只看楼主 加入收藏
PP_make
Rank: 2
等 级:论坛游民
帖 子:21
专家分:62
注 册:2010-4-25
收藏
 问题点数:0 回复次数:0 
急!!需求高手指点一下,万分感谢!!(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 编辑 ]
搜索更多相关主题的帖子: 需求 感谢 
2010-07-13 19:11
快速回复:急!!需求高手指点一下,万分感谢!!(60分)
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017472 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved