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