使得该规划全文 2014-05-21 12:18 采纳率: 0%
浏览 1160

进程调度 计算平均周转时间 第一次提问真的是不知道哪儿错了 感觉逻辑正确啊

#include "stdio.h"
typedef struct p
{
int id;
char name;
int atime;//到达时间
int stime;//服务时间
int rstime;//已经服务时间
int pri;//优先级
int t;//周转时间
float ts;
int flag;
}pcb;
main()
{
void fcfs(pcb p[5]);
void sjf(pcb p[5]);
void pri(pcb p[5]);
void scan(pcb *t);
void fuzhi(pcb &a,pcb &b);
int i;
pcb b[5],p1[5];
for(i=0;i<5;i++)
{
scan(&b[i]);
}
for(i=0;i<5;i++)
{
fuzhi(p1[i],b[i]);
}

fcfs(p1);
for(i=0;i<5;i++)
{
fuzhi(p1[i],b[i]);
}
sjf(p1);

pri(b);

}
void scan(pcb *t)
{
printf("input process id,name,atime,stime,pri:\n");
scanf("%d %c%d%d%d",&(t->id),&(t->name),&(t->atime),&(t->stime),&(t->pri));
t->t=0;
t->ts=0;
t->rstime=0;
}
void fcfs(pcb p[5])
{
int i,s=0;
float sc=0,ss=0;
for(i=0;i<5;i++)
{

   s=s+p[i].stime;
   p[i].t=s-p[i].atime;
   sc+=p[i].t;
   p[i].ts=(int)(s/p[i].stime);
   ss=ss+p[i].ts;

}
printf("%.3f,%.3f\n",sc/5.0,ss/5.0);
}

void sjf(pcb p[5])
{ void chuan(pcb &a,pcb &b);
void fuzhi(pcb &a,pcb &b);
pcb pt[5];
int i,j,count,t[5],min;
float sc=0,ss=0,s=0;
count=0;
for(i=0;i<5;i++)
{
fuzhi(pt[i],p[i]);
}

for(i=0;i<4;i++)
{   min=i;
    for(j=i+1;j<5;j++)
    {
        if(pt[i].stime>pt[j].stime)
        {   
            chuan(pt[i],pt[j]);

        }   
    }
  t[i]=pt[i].id;
  p[i].flag=1;
}
t[i]=pt[i].id;
i=0;
p[4].flag=1;
while(p[0].flag||p[1].flag||p[2].flag||p[3].flag||p[4].flag)
{   
    j=t[i];
    i=(i+1)%5;
    if(p[j].atime<=count&&p[j].flag)
    {
        s=s+p[j].stime;
        p[j].t=(int)(s-p[j].atime);
        sc+=p[j].t;
        p[j].ts=s/p[j].stime;
        ss=ss+p[j].ts;
        p[j].flag=0;
        i=0;
        count=count+p[j].stime;
    }

}
 printf("%.3f,%.3f\n",sc/5.0,ss/5.0);

}
void pri(pcb p[5]) //这个函数中出现的问题
{ void prin(pcb p[5]);
void chuan(pcb &a,pcb &b);
void fuzhi(pcb &a,pcb &b);
pcb pt[5];
int i,j,count,t[5],min,f;
float sc=0,ss=0,s=0;
count=0;
for(i=0;i<5;i++)
{

fuzhi(pt[i],p[i]);
}

for(i=0;i<4;i++)
{   min=i;
    for(j=i+1;j<5;j++)
    {
        if(pt[i].pri>pt[j].pri)
        {   
            chuan(pt[i],pt[j]);

        }

    }
  t[i]=pt[i].id;
  p[i].flag=1;

}
t[i]=pt[i].id;//这个t[] 是存放按优先权排的顺序
p[4].flag=1;
while(p[0].flag||p[1].flag||p[2].flag||p[3].flag||p[4].flag)
{   


    for(i=0;i<5;i++)
    {   j=t[i];

        if(p[j].atime<count&&p[j].flag)

        {
            p[j].rstime++;
            if(p[j].rstime==p[j].stime)
            {
                p[j].flag=0;
                p[j].t=p[j].t-p[j].atime;
                p[j].ts=p[j].t/p[j].stime;


            }


          break;
        }

    }
        for(f=0;f<5;f++)
    {
        if(p[f].atime<count&&p[f].flag)
        {
            p[f].t++;

        }
    }


    count++;

}
for(i=0;i<5;i++)
{
    sc+=p[i].t;//这个p[].t中数据不对 就这个出的错应该
    ss+=p[i].ts;
}

 printf("%.3f,%.3f\n",sc/5.0,ss/5.0);
 prin(p);

}

void chuan(pcb &a,pcb &b)
{ pcb t;
t.id=a.id;
t.name=a.name;
t.atime=a.atime;
t.stime=a.stime;
t.rstime=a.rstime;
t.pri=a.pri;
t.t=a.t;
t.ts=a.ts;
t.flag=a.flag;
a.id=b.id;
a.name=b.name;
a.atime=b.atime;
a.stime=b.stime;
a.rstime=b.rstime;
a.pri=b.pri;
a.t=b.t;
a.ts=b.ts;
a.flag=b.flag;
b.id=t.id;
b.name=t.name;
b.atime=t.atime;
b.stime=t.stime;
b.rstime=t.rstime;
b.pri=t.pri;
b.t=t.t;
b.ts=t.ts;
b.flag=t.flag;

}
void fuzhi(pcb &a,pcb &b)
{
a.id=b.id;
a.name=b.name;
a.atime=b.atime;
a.stime=b.stime;
a.rstime=b.rstime;
a.pri=b.pri;
a.t=b.t;
a.ts=b.ts;
a.flag=b.flag;
}
void prin(pcb p[5])
{
int i;
for(i=0;i<5;i++)
{
printf("%d,%c,%d,%d,%d,%d,%d,%f,%d\n",p[i].id,p[i].name,p[i].atime,p[i].stime,p[i].pri,p[i].rstime,p[i].t,p[i].ts,p[i].flag);
}
}
进程名 A B C D E
到达时间 0 1 2 3 4
服务时间 4 3 5 2 4
优先级 2 3 1 4 0
id 和到达时间一致

  • 写回答

1条回答

  • ChatGPTᴼᴾᴱᴺᴬᴵ 2023-03-16 13:23
    关注

    该回答引用ChatGPT

    你好!你在计算平均周转时间的代码中有一个小错误,可能是导致程序结果不正确的原因。


    在您的pri函数中,您计算了每个进程的剩余时间,如果剩余时间等于服务时间,则将该进程标记为已完成,并计算其周转时间。但是,在计算剩余时间时,您使用了已经服务时间(rstime),而应该使用已经用去的时间(count - atime)。因此,在计算剩余时间时,将以下代码:

    if (p[j].atime < count && p[j].flag) {
      p[j].rstime++;
      if (p[j].rstime == p[j].stime) {
        p[j].flag = 0;
        p[j].t = p[j].t - p[j].atime;
        p[j].ts = p[j].t / p[j].stime;
      }
      break;
    }
    

    改为以下代码即可:

    if (p[j].atime < count && p[j].flag) {
      p[j].rstime = count - p[j].atime;
      if (p[j].rstime == p[j].stime) {
        p[j].flag = 0;
        p[j].t = count - p[j].atime;
        p[j].ts = p[j].t / p[j].stime;
      }
      break;
    }
    

    这样可以使您的代码正确计算每个进程的平均周转时间。

    评论

报告相同问题?

悬赏问题

  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?
  • ¥15 求daily translation(DT)偏差订正方法的代码
  • ¥15 js调用html页面需要隐藏某个按钮