# include <iostream.h>
# include <iomanip.h>
struct process //定义进程结构体
{
char Name[20]; //程序名
int reach_time; //进程到达时间
int run_time; //进程服务时间
int begin_time; //进程开始时间
int end_time; //进程完成时间
int turn_time; //进程周转时间
float p_turn_time; //进程带权周转时间
};
int N;//进程的个数;
float aveturn_timeF,avep_turn_timeF,aveturn_timeS,avep_turn_timeS;//两个算法的平均周转时间和平均带权周转时间
void GetInProcess(process *pp)//对进程数组进行初始化
{
cout<<" 进程名(字母) 进程到达时间 进程服务时间 "<<endl;
cout<<endl;
for(int i=0;i<=N-1;i++)
{
cout<<"进程名"<<i+1<<":";
cin>>pp[i].Name;
cin>>pp[i].reach_time;
cin>>pp[i].run_time;
}
cout<<endl;
cout<<" 输入完毕 输入内容为: "<<endl;
cout<<endl;
cout<<"进程名(字母) 该进程到达时间 该进程服务时间 "<<endl;
for(int j=0;j<=N-1;j++)
{
cout<<setw(10)<<pp[j].Name;
cout<<setiosflags(ios::internal);
cout<<setw(10)<<pp[j].reach_time
<<setw(18)<<pp[j].run_time<<endl;
}
}
void ProcessSort(process *pp)//对此进程数组按到达时间从小到大排序 排序方法为选择法
{
for(int i=0;i<N-1;i++)
{
int k=i;
for(int j=i+1;j<=N-1;j++)
if(pp[k].reach_time>pp[j].reach_time)
k=j;
//在此已得到最小数的下标
process t;
t=pp[k];
pp[k]=pp[i];
pp[i]=t;
}//完成排序
}
void PrintProcess(process *pp)//输出诸进程
{
cout<<" 进程名 到达时间 服务时间 开始执行时间 完成时间 周转时间 带权周转时间 "<<endl;
for(int i=0;i<=N-1;i++)
cout<<setw(8)<<pp[i].Name
<<setw(10)<<pp[i].reach_time
<<setw(10)<<pp[i].run_time
<<setw(10)<<pp[i].begin_time
<<setw(10)<<pp[i].end_time
<<setw(10)<<pp[i].turn_time
<<setw(12)<<pp[i].p_turn_time
<<endl;
}
void FCFS(process *pp)//对各数据项进行赋值 FCFS算法
{
pp[0].begin_time=pp[0].reach_time;
pp[0].end_time=pp[0].run_time+pp[0].begin_time;
pp[0].turn_time=pp[0].end_time-pp[0].reach_time;
pp[0].p_turn_time=(float)pp[0].turn_time/pp[0].run_time;
for(int i=1;i<=N-1;i++)
{
pp[i].begin_time=pp[i-1].end_time;
pp[i].end_time=pp[i].run_time+pp[i].begin_time;
pp[i].turn_time=pp[i].end_time-pp[i].reach_time;
pp[i].p_turn_time=(float)pp[i].turn_time/pp[i].run_time;
}
//以下为计算平均周转时间和平均带权周转时间
int sum1=0;
for(int j=0;j<=N-1;j++)
sum1=sum1+pp[j].turn_time;
aveturn_timeF=(float)sum1/N;
float sum2=0;
for(int k=0;k<=N-1;k++)
sum2=sum2+pp[k].p_turn_time;
avep_turn_timeF=sum2/N;
}
void SJF(process *pp)//SJF算法
{
int kk=0;//记录性变量 看已有多少个进程已计算了
int *ccharg=new int[N];//记录性数组 看有哪些进程已计算了 0为否1为是
for(int l=0;l<=N-1;l++)
ccharg[l]=0;
process *p1=new process[N];//另外开辟一个存放进程的数组
//计算第一个先到的进程各个量
pp[0].begin_time=pp[0].reach_time;
pp[0].end_time=pp[0].run_time+pp[0].begin_time;
pp[0].turn_time=pp[0].end_time-pp[0].reach_time;
pp[0].p_turn_time=(float)pp[0].turn_time/pp[0].run_time;
p1[0]=pp[0];//赋值到新开辟的数组中
ccharg[0]=1;//表pp数组中下标为0的量已计算
while(kk<N-1)
{
//根据d1[kk].end_time找到前K(下标)进程已到达
int k=-1;
for(int i=1;i<=N-1;i++)//前提为pp数组已经过按到达时间从小到大排序
if(p1[kk].end_time<pp[i].reach_time)
{
k=i-1;
break;
}
if(k==-1)//说明所有的进程都已到达
k=N-1;
//在1到K个进程找到服务时间最短的进程下标min**注意这儿有缺点当有服务时间一样的时间则按下的算法
//为先到的那个进程先运行
int min=0,m=-1;
for(int j=1;j<=k;j++)
{
if(ccharg[j]==1)//说明此下标的进程已计算完毕
{
}
else
{
if(m==-1)//说明是第一次进入else
{
min=j;
m=0;
}
else
{
if(pp[min].run_time>pp[j].run_time)
min=j;
}
}
}
//下面为算出min的各数据项
pp[min].begin_time=p1[kk].end_time;
pp[min].end_time=pp[min].run_time+pp[min].begin_time;
pp[min].turn_time=pp[min].end_time-pp[min].reach_time;
pp[min].p_turn_time=(float)pp[min].turn_time/pp[min].run_time;
kk++;
p1[kk]=pp[min];
ccharg[min]=1;//说明min已算
}//while结束
cout<<endl;
PrintProcess(p1);
cout<<"--------------------------------------------------------------------------------"<<endl;
int sum1=0;
for(int x=0;x<=N-1;x++)
sum1=sum1+pp[x].turn_time;
aveturn_timeS=(float)sum1/N;
float sum2=0;
for(int y=0;y<=N-1;y++)
sum2=sum2+pp[y].p_turn_time;
avep_turn_timeS=sum2/N;
}
//主函数开始
void main()
{
process *pro=NULL;
cout<<" ★★★★★★★★★★★★处理机调度实验★★★★★★★★★★★★ "<<endl;
cout<<endl;
cout<<"请输入进程的个数(有几个进程): ";
cin>>N;
pro=new process[N];
cout<<endl;
cout<<"根据提示分别输入整型的数据,对进程初始化:"<<endl;
cout<<endl;
cout<<"例如:a 2 3"<<endl;
cout<<endl;
GetInProcess(pro);
ProcessSort(pro);
cout<<endl;
cout<<" 经过计算,结果如下:"<<endl;
cout<<endl;
//SJK算法
cout<<" ★★★★SJF算法如下★★★★ "<<endl;
SJF(pro);
PrintProcess(pro);
cout<<endl;
cout<<"平均周转时间: "<<aveturn_timeS<<endl;
cout<<"平均带权周转时间: "<<avep_turn_timeS<<endl;
cout<<endl;
//FCFS算法
cout<<" ★★★★FCFS算法如下★★★★ "<<endl;
cout<<endl;
FCFS(pro);
PrintProcess(pro);
cout<<endl;
cout<<"平均周转时间: "<<aveturn_timeF<<endl;
cout<<"平均带权周转时间: "<<avep_turn_timeF<<endl;
cout<<endl;
}