短作業優先演算法c++版
#include "stdafx.h"
#include "iostream"
#include "string"
using namespace std;
struct JOB//作業結構體
{
string name; //程序名
float arrivetime;//到達時間
float servicestime;//服務時間
float starttime; //開始時間
float finishtime;//完成時間
float zztime; //週轉時間
float dqzztime; //帶權週轉時間
int sfzx;//是否執行標誌位 1已執行 0未執行
};
//獲取下一個要執行的工作的服務時間
string search_min(JOB job[],int nowtime)
{
//記錄符合條件的作業的服務時間
JOB job_servicetime[6];
//給服務時間陣列賦值
for(int n=0;n<6;n++)
{
//符合條件的話賦值
if(job[n].arrivetime<=nowtime && job[n].sfzx==0)
{
job_servicetime[n].servicestime=job[n].servicestime;
job_servicetime[n].name=job[n].name;
}
//不符合條件賦-1
else
{
job_servicetime[n].servicestime=-1;
job_servicetime[n].name=" ";
}
}
//宣告第三個變數,獲取最小服務時間用
int temp_time;
string temp_name;
//符合條件的作業的服務時間從小到大排序
for(int i=0;i<6;i++)
{
for(int j=i+1;j<6;j++)
{
//去掉不符合條件的作業
if(job_servicetime[i].servicestime!=-1)
{
if(job_servicetime[i].servicestime>job_servicetime[j].servicestime)
{
temp_time=job_servicetime[i].servicestime;
temp_name=job_servicetime[i].name;
job_servicetime[i].servicestime=job_servicetime[j].servicestime;
job_servicetime[i].name=job_servicetime[j].name;
job_servicetime[j].servicestime=temp_time;
job_servicetime[j].name=temp_name;
}
}
}
}
string name;
//最小服務時間賦給num變數
for(int k=0;k<6;k++)
{
//去掉不符合條件的作業
if(job_servicetime[k].servicestime!=-1)
{
//num=job_servicetime[k].servicestime;
name=job_servicetime[k].name;
break;
}
}
//返回num
return name;
}
int input()//輸入作業資訊函式
{
//輸入操作
//只記錄三個欄位的結構體
JOB job_th[6];
//迴圈輸入操作
for(int q=0;q<6;q++)
{
cout<<"\n請輸入作業名,到達時間,執行時間:";
cin>>job_th[q].name>>job_th[q].arrivetime>>job_th[q].servicestime;
//標誌是否已經執行
job_th[q].sfzx=0;
}
JOB job_si[6];//記錄七個欄位的結構體
//sfzx欄位初值為0(表示未執行)
for(int s=0;s<6;s++)
{
job_si[s].sfzx=0;
}
//給第一個作業賦值
job_si[0].name=job_th[0].name;
job_si[0].arrivetime=job_th[0].arrivetime;
job_si[0].servicestime=job_th[0].servicestime;
job_si[0].starttime=job_si[0].arrivetime;
job_si[0].finishtime=job_si[0].arrivetime+job_si[0].servicestime;
job_si[0].zztime=job_si[0].finishtime-job_si[0].arrivetime;
job_si[0].dqzztime=job_si[0].zztime/job_si[0].servicestime;
job_si[0].sfzx=1;//更新執行狀態
job_th[0].sfzx=1;//更新執行狀態
//記錄job_si結構體的成員數量
int index=0;
//演算法核心部分
for(int g=1;g<6;g++)
{
//獲取下一個工作名稱
string name=search_min(job_th,job_si[index].finishtime);
//按工作名稱計算相關值
for(int f=1;f<6;f++)
{
if(job_th[f].name==name)
{
index=index+1;
job_si[index].name=job_th[f].name;
job_si[index].arrivetime=job_th[f].arrivetime;
job_si[index].servicestime=job_th[f].servicestime;
job_si[index].starttime=job_si[index-1].finishtime;
job_si[index].finishtime=job_si[index].starttime+job_si[index].servicestime;
job_si[index].zztime=job_si[index].finishtime-job_si[index].arrivetime;
job_si[index].dqzztime=job_si[index].zztime/job_si[index].servicestime;
job_si[index].sfzx=1;
job_th[f].sfzx=1;
break;
}
}
}
//按執行順序輸出工作
cout.width(9);
cout<<"作業名";
cout.width(9);
cout<<"到達時間";
cout.width(11);
cout<<"服務時間";
cout.width(13);
cout<<"開始時間";
cout.width(10);
cout<<"結束時間";
cout.width(10);
cout<<"週轉時間";
cout.width(9);
cout<<"帶權週轉時間"<<endl;
for(int i=0;i<6;i++)
{
cout.width(9);
cout<<job_si[i].name;
cout.width(9);
cout<<job_si[i].arrivetime;
cout.width(11);
cout<<job_si[i].servicestime;
cout.width(13);
cout<<job_si[i].starttime;
cout.width(10);
cout<<job_si[i].finishtime;
cout.width(10);
cout<<job_si[i].zztime;
cout.width(9);
cout<<job_si[i].dqzztime<<endl;
}
//獲取週轉時間和平均週轉時間
double sum_zz=0;
double sum_dqzz=0;
for(int p=0;p<6;p++)
{
sum_zz=sum_zz+job_si[p].zztime;
sum_dqzz=sum_dqzz+job_si[p].dqzztime;
}
cout<<"平均週轉時間:"<<sum_zz/6<<endl;
cout<<"平均帶權週轉時間:"<<sum_dqzz/6<<endl;
return 0;
};
int main(int argc, char* argv[])
{
input();
return 0;
}
執行結果: