2 rrrrr12 rrrrr12 于 2014.05.21 20:18 提问

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

#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 和到达时间一致

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!