短作業優先演算法c++實現
定義
對預計執行時間短的作業(程序)優先分派處理機.通常後來的短作業不搶先正在執行的作業.
程式碼為:
#include<stdio.h>
#include <iostream>
#include<iomanip>
using namespace std;
struct PCB
{
char name[10];//程序名
float arrivetime;//標誌程序到達時間
float needtime;//程序所需的時間
float starttime;//開始時間
floatfinishtime;//完成時間
float alltime;//總共所用的時間,即週轉時間
floatdqalltime;//帶權週轉時間
};
PCB a[200];
void Pinput(PCB *p,int N)
{
cout<<"*-----------------------輸入部分------------------------*"<<endl;
cout<<"程序名稱"<<"\t"<<"到達時間"<<"\t"<<"所需時間"<<endl;
for(int i=0;i<N;i++)
{
cout<<"輸入第"<<i<<"個程序的資訊"<<endl;
cin>>p[i].name;
cin>>p[i].arrivetime;
cin>>p[i].needtime;
}
}
void Poutput(PCB *p,int N)
{
float arrivetime;
float needtime;
float starttime;
float finishtime;
float alltime;
float dqalltime;
intj;
cout<<"*------------------輸出部分-------------------*"<<endl;
cout<<"具體程序排程資訊:"<<endl;
cout<<"程序名 到達時間 所需時間 開始時間 結束時間 週轉時間 帶權週轉時間"<<endl;
for(j=0;j<N;j++)
{
cout<<setw(4)<<p[j].name<<setw(8)<<p[j].arrivetime<<setw(10)<<p[j].needtime<<setw(10)
<<p[j].starttime<<setw(10)<<p[j].finishtime<<setw(10)<<p[j].alltime<<setw(10)
<<p[j].dqalltime<<endl;
}
}
//排序
void Psort(PCB *p,int N)
{
for(inti=0;i<N;i++)
for(int j=0;j<i;j++)
if(p[i].arrivetime<p[j].arrivetime)
{
PCBtemp;
temp=p[i];
p[i]=p[j];
p[j]=temp;
}
intk;
for(k=0;k<N-1;k++)
{
if(k==0)
{
p[k].starttime=p[k].arrivetime;
p[k].finishtime=p[k].arrivetime+p[k].needtime;
}
else
{
p[k].starttime=p[k-1].finishtime;
p[k].finishtime=p[k].starttime+p[k].needtime;
}
//選擇最短作業執行
intm=0;
for(intt=k+1;t<=N-1;t++)
{
if(p[t].arrivetime<=p[k].finishtime)
m++;
}
floatmin=p[k+1].needtime;
intnext=k+1;
for(int q=k+1;q<k+m;q++)
{
if(p[q+1].needtime<min)
{
min=p[q+1].needtime;
next=q+1;
}
PCBtemp;
temp=p[k+1];
p[k+1]=p[next];
p[next]=temp;
}
}
}
//執行,計算週轉時間和帶權週轉時間
void Pdeal(PCB *p,float arrivetime,floatneedtime,float starttime,float finishtime,float &alltime,float&dqalltime,int N)
{
intk;
for(k=0;k<N;k++)
{
if(k==0)
{
p[k].starttime=p[k].arrivetime;
p[k].finishtime=p[k].arrivetime+p[k].needtime;
}
else
{
p[k].starttime=p[k-1].finishtime;
p[k].finishtime=p[k].starttime+p[k].needtime;
}
}
for(k=0;k<N;k++)
{
p[k].alltime=p[k].finishtime-p[k].arrivetime;
p[k].dqalltime=p[k].alltime/p[k].needtime;
}
}
voidPCB(PCB *p,int N)
{
float arrivetime=0;
float needtime=0;
float starttime=0;
float finishtime=0;
float alltime=0;
float dqalltime=0;
Psort(p,N);
Pdeal(p,arrivetime,needtime,starttime,finishtime,alltime,dqalltime,N);
Poutput(p,N);
}
int main()
{
intm;
cout<<"*------------------短作業優先-------------------*"<<endl;
cout<<"輸入程序數:"<<endl;
cin>>m;
Pinput(a,m);
PCB(a,m);
}