實現步驟:
1.將進程按到達時間排序;
進程開始運行:
(1)在進程運行結束前到達的進程:
比較運行時間—短的先運行
(2)在進程運行結束前到達的進程:
先到達的運行。
上源碼:`
#include <iostream>
#include<string>
using namespace std;
class SJF {
public:
string name;//程序名
int a_time;//到達時間
int r_time;//運行時間
int s_time;//開始時間
int f_time;//結束時間
int round_time;//z週轉時間
double wr_time;//帶權週轉時間
double ar_time;//平均週轉時間
double awr_time;//平均帶權週轉時間
}; SJF a[1000];
void sjf() {
int num, i, j, temp;
string t;
cout << "請輸入進程個數 :";
cin >> num;
cout << "請輸入" << num << "個進程名字" << endl;
for (i = 0; i < num; i++) {
cin >> a[i].name;
a[i].a_time = (int)rand() % 10 + 1;
a[i].r_time = (int)rand() % 10 + 1;
}//隨機生成到達時間和運行時間
cout << "打印數據.................." << endl;
cout << "進程名" << " " << "到達時間" << " " << "運行時間" << " " << "開始時間" << " " << "結束時間" << " " << "週轉時間" << " " << "帶權週轉時間" << " " << "平均週轉時間" << " " << "平均帶權週轉時間" << endl;
for (i = 0; i < num; i++) {
cout << a[i].name << "\t" << a[i].a_time << "\t" << a[i].r_time << "\t\t" << 0 << "\t" << 0 << "\t" << 0 << "\t" << 0 << "\t" << 0 << "\t" << 0 << endl;
}
for (i = 1; i < num; i++) {
for (j = 0; j < num - i; j++) {
if (a[j].a_time > a[j + 1].a_time) {
t = a[j].name;
a[j].name = a[j + 1].name;
a[j + 1].name = t;
temp = a[j].a_time;
a[j].a_time = a[j + 1].a_time;
a[j + 1].a_time = temp;
temp = a[j].r_time;
a[j].r_time = a[j + 1].r_time;
a[j + 1].r_time = temp;
}
}
}//按到達時間排序 升序
for (int k = 0; k < num - 1; k++) {
if (a[k].a_time == a[k + 1].a_time&&a[k].r_time > a[k + 1].r_time) {
t = a[j].name;
a[j].name = a[j + 1].name;
a[j + 1].name = t;
temp = a[j].a_time;
a[j].a_time = a[j + 1].a_time;
a[j + 1].a_time = temp;
temp = a[j].r_time;
a[j].r_time = a[j + 1].r_time;
a[j + 1].r_time = temp;
}
}
cout << endl;
cout << "SJF算法。。。。。。。。。" << endl;
cout << "進程名" << " " << "到達時間" << " " << "運行時間" << " " << "開始時間" << " " << "結束時間" << " " << "週轉時間" << " " << "帶權週轉時間" << " " << "平均週轉時間" << " " << "平均帶權週轉時間" << endl;
a[0].s_time = a[0].a_time + a[0].r_time;
a[0].f_time = a[0].a_time + a[0].r_time;
a[0].round_time = a[0].f_time - a[0].a_time;
a[0].wr_time = a[0].round_time / a[0].r_time;
a[0].ar_time = a[0].round_time;
a[0].awr_time = a[0].wr_time;
for (i = 1; i < num; i++) {
for (j = i; j < num - 1; j++) {
for (int d = i + 1; d < num; d++) {
if ((a[i - 1].f_time >= a[j].a_time) && (a[i - 1].f_time >= a[d].a_time) && (a[j].r_time > a[d].r_time)) {
t = a[j].name;
a[j].name = a[j + 1].name;
a[j + 1].name = t;
temp = a[j].a_time;
a[j].a_time = a[j + 1].a_time;
a[j + 1].a_time = temp;
temp = a[j].r_time;
a[j].r_time = a[j + 1].r_time;
a[j + 1].r_time = temp;
}
}
}
if (a[i].a_time < a[i - 1].f_time) {//當前到達時間在上一個作業結束時間之前
a[i].f_time = a[i - 1].f_time + a[i].r_time;
a[i].s_time = a[i - 1].f_time + a[i].r_time;
a[i].round_time = a[i].f_time - a[i].a_time;
a[i].wr_time = a[i].round_time / a[i].r_time;
a[i].ar_time = a[i].round_time / (i + 1);
a[i].awr_time = a[i].wr_time / (i + 1);
}
else {//之後
a[i].f_time = a[i].a_time + a[i].r_time;
a[i].s_time = a[i ].a_time + a[i].r_time;
a[i].round_time = a[i].f_time - a[i].a_time;
a[i].wr_time = a[i].round_time / a[i].r_time;
a[i].ar_time = a[i].round_time / (i + 1);
a[i].awr_time = a[i].wr_time /(i + 1);
}
}
for (i = 0; i < num; i++) {
cout << a[i].name << "\t" << a[i].a_time << "\t" << a[i].r_time << "\t\t" << a[i].s_time <<"\t"<<a[i].f_time<< "\t" << a[i].round_time << "\t" << a[i].wr_time<< "\t\t" << a[i].ar_time << "\t\t" << a[i].awr_time << endl;
}
}//如果到達時間相同就運行時間短的放前邊
int main()
{
sjf();
}