/**短进程优先算法**/
#include <cstdlib>
#include <iostream>
#include <iomanip>
using namespace std;
//定义结构体
struct spf{
char name[10];
float arrivetime;
float servicetime;
float starttime;
float finishtime;
float zztime;
float dqzztime;
};
spf a[100];
//输入
void input(spf *p,int N)
{
int i;
cout<<endl;
cout<<"请输入进程的 名字 到达时间 服务时间: (例如: a 0 100)"<<endl;
for(i=0;i<=N-1;i++)
{
cout<<"请输入进程"<<i+1<<"的信息";
cin>>p[i].name;
cin>>p[i].arrivetime;
cin>>p[i].servicetime;
}
}
//排序
void sort(spf *p,int N)
{
/****按照到达时间排序****/
for(int i=0;i<N-1;i++)
for(int j=i+1;j<=N-1;j++)
if(p[i].arrivetime>p[j].arrivetime)
{
spf temp;
temp=p[i];
p[i]=p[j];
p[j]=temp;
}
for(int m=0;m<N-1;m++)
{
if(m==0)
p[m].finishtime=p[m].arrivetime+p[m].servicetime;
else
p[m].finishtime=p[m-1].finishtime+p[m].servicetime;
/****查找当前进程执行过程中进入系统的进程****/
int i=0;
for(int n=m+1;n<=N-1;n++)
{
if(p[n].arrivetime<=p[m].finishtime)
i++;
}
/****选择最短的为接下来执行的****/
float min=p[m+1].servicetime;
int next=m+1;//m+1=n
for(int k=m+2;k<=m+i;k++)
{
if(p[k].servicetime<min)
{
min=p[k].servicetime;
next=k;}
}
spf temp;
temp=p[m+1];
p[m+1]=p[next];
p[next]=temp;
}
}
//运行,计算周转时间和带权周转时间
void run(spf *p,int N)
{ int k;
for(k=0;k<=N-1;k++)
{
if(k==0)
{
p[k].starttime=p[k].arrivetime;
p[k].finishtime=p[k].arrivetime+p[k].servicetime;}
else
{
p[k].starttime=p[k-1].finishtime;
p[k].finishtime=p[k-1].finishtime+p[k].servicetime;}
}
for(k=0;k<=N-1;k++)
{
p[k].zztime=p[k].finishtime-p[k].arrivetime;
p[k].dqzztime=p[k].zztime/p[k].servicetime;
}
}
//显示
void Print(spf *p,int N)
{
int k;
cout<<"调用最短进程优先算法以后进程运行的顺序是: ";
cout<<p[0].name;
for(k=1;k<N;k++)
{
cout<<"-->";
cout<<p[k].name;
}
cout<<endl;
cout<<"具体进程调度信息:"<<endl;
cout<<"进程名 到达时间 服务时间 开始时间 结束时间 周转时间 带权周转时间"<<endl;
for(k=0;k<=N-1;k++)
{
cout<<setw(4)<< p[k].name
<<setw(8)<< p[k].arrivetime
<<setw(10)<< p[k].servicetime
<<setw(10)<< p[k].starttime
<<setw(10)<< p[k].finishtime
<<setw(10)<< p[k].zztime
<<setw(10)<< p[k].dqzztime<<endl;
}
}
//最短进程优先 计算平均周转时间和平均带权周转时间
void SPF(spf *p,int N)
{
sort(p,N);
run(p,N);
Print(p,N);
int k;
float Attime=0;
float AQttime=0;
for(k=0;k<=N-1;k++)
{
Attime+=p[k].zztime;
AQttime+=p[k].dqzztime;
}
Attime=Attime/N;
AQttime=AQttime/N;
cout<<"调用最短进程算法的平均周转时间为: ";
cout<<Attime<<endl;
cout<<"调用最短进程算法的平均带权周转时间为: ";
cout<<AQttime<<endl;
}
int main(void)
{
int N;
cout<<endl;
cout<<endl;
cout<<"<<----------!!!@@@最短进程优先调度算法@@@!!!---------->>"<<endl;
cout<<endl;
cout<<"输入进程数目:"<<endl;
cin>>N;
input(a,N);
SPF(a,N);
}