直接做的话,假设为p1,p2,p3,p4,p5
调度顺序肯定是p1,p2,p3,p4,p5
平均周转时间
p1:3-0=3
p2:9-2=7
p3:13-4=9
p4:18-6=12
p5:20-8=12
平均:(3+7+9+12+12)/5=8.6
这样写应该可以:#include<iostream.h>
#include<stdio.h>
struct pcb{
char pno
int come_time //到达时间
int run_time //服务时间
}
float fcfs(pcb pro[],int n)
{
struct pcb temp
int i,j,k //time为当前时间
float weight_time=0,time=0 //记录周转时间的和
//temp=(pcb)malloc(sizeof(pcb))
cout<<"进程调度情况如下:"<<endl
cout<<"进程号 到达时间服务时间周转时间:"<<endl
//选择排序过程,按到达时间升序排列
for(i=0i<n-1i++)
{
k=i
for(j=i+1j<nj++)
if(pro[k].come_time>pro[j].come_time)
k=j
if(k!=i)
{
temp=pro[i]
pro[i]=pro[k]
pro[k]=temp
}
}
for(i=0i<ni++)
{ time+=pro[i].run_time
weight_time+=(time-pro[i].come_time)/pro[i].run_time //(time-pro[i].come_time)/pro[i].run_time为排序后第i个进程的周转时间
cout<<pro[i].pno<<" "<<pro[i].come_time<<" "<<pro[i].run_time<<" "<<(time-pro[i].come_time)/pro[i].run_time<<endl
}
return weight_time/=n //返回平均带权周转时间
}
void insert(pcb pro[],pcb pro1,int start,int end)//将一pcb类型的元素插入到有序数组中,最后还保持有序
{
int i=end
while((i--)>start)
if(pro[i].run_time>pro1.run_time)pro[i+1]=pro[i]
pro[i]=pro1
}
float sjp(pcb pro[],int n)
{
int i,first=0,count,flag[20],k,min
float time=0,weight_time=0
//调度第一个到达内存的进程
for(i=1i<ni++)
{
if(pro[first].come_time>pro[i].come_time) first=i
flag[i]=0
}
flag[first]=1
time=(float)pro[first].run_time
weight_time=1
cout<<pro[first].pno<<" "<<pro[first].come_time<<""<<pro[first].run_time<<" "<<weight_time<<endl
//pro_temp[0]=pro[first]
count=n-1
while(count)
{
k=0
min=32767 //设置一个较大的阈值,
for(i=0i<ni++) //找到一个未被访问的,作业较短的且已经到达内存的作业调度
if((i!=first)&&(flag[i]==0)&&(time>=pro[i].come_time)&&(min>pro[i].run_time))
{
k=i
min=pro[i].run_time
}
flag[k]=1 //访问后置标记为访问
time+=pro[k].run_time
weight_time+=(time-pro[k].come_time)/pro[k].run_time
cout<<pro[k].pno<<" "<<pro[k].come_time<<""<<pro[k].run_time<<""<<(time-pro[k].come_time)/pro[k].run_time<<endl
count-- //每调度一个作业,count减1
}
return weight_time/=n
}
void main()
{
pcb pro[5]={{'C',2,5},{'A',0,4},{'B',1,3},{'D',3,2},{'E',4,4}}
cout<<fcfs(pro,5)<<endl
cout<<sjp(pro,5)<<endl
}