#include<stdio.h> |
#include<iostream.h> |
#include<iomanip.h> |
#include<string.h> |
//本程序包括:FIFO,运算时间短的作业优先,优先数调度算法,响应比最高者优先调度算法 |
const int MAXJOB = 50; //定义最大作业 |
//定义数据结构体 |
typedef struct node { |
int number; |
int reach_time; |
int reach_hour; |
int reach_minite; |
int need_time; |
int privilege; |
float excellent; |
int start_time; |
int wait_time; |
int visited; |
} job; |
job jobs[MAXJOB]; |
int quantity; |
//初始化函数 |
void initial() { |
int i; |
for (i = 0; i < MAXJOB; i++) { |
jobs[i].number = 0; |
jobs[i].reach_time = 0; |
jobs[i].reach_hour = 0; |
jobs[i].reach_minite = 0; |
jobs[i].privilege = 0; |
jobs[i].excellent = 0; |
jobs[i].start_time = 0; |
jobs[i].wait_time = 0; |
jobs[i].visited = 0; |
} |
quantity = 0; |
} |
//重置作业数据函数 |
void reset() { |
int i; |
for (i = 0; i < MAXJOB; i++) { |
jobs[i].start_time = 0; |
jobs[i].wait_time = 0; |
jobs[i].visited = 0; |
} |
} |
//读入作业数据函数 |
void readData() { |
FILE *fp; |
char fname[20]; |
int i; |
cout << "请输入作业数据文件名:" ; |
strcpy (fname, "8job.txt" ); |
cin >> fname; |
if ((fp = fopen (fname, "r" )) == NULL) { |
cout << "错误,文件打不开,请检查文件名:)" << endl; |
} else { |
while (! feof (fp)) { |
fscanf (fp, "%d %d %d %d" , &jobs[quantity].number, &jobs[quantity].reach_time, &jobs[quantity].need_time, &jo |
bs[quantity].privilege); |
jobs[quantity].reach_hour = jobs[quantity].reach_time / 100; |
jobs[quantity].reach_minite = jobs[quantity].reach_time % 100; |
quantity++; |
} |
//输出初始作业数据 |
cout << "输出初始作业数据" << endl; |
cout << "---------------------------------------------------------------" << endl; |
cout.setf(2); |
cout << setw(10) << "作业号" << setw(12) << "到达时间" << setw(14) << "所需时间(分)" << setw(14) << "优先级(0>1)" << endl; |
for (i = 0; i < quantity; i++) { |
cout << setw(10) << jobs[i].number << setw(12) << jobs[i].reach_time << setw(14) << jobs[i].need_time << setw(14) << jobs[i].privil |
ege << endl; |
} |
} |
} |
//FIFO算法 |
void FIFO() { |
int i; |
int current_hour; |
int current_minute; |
int total_time = 0; |
//输出作业流 |
cout << endl; |
cout << endl << "FIFO算法作业流" << endl; |
cout << "---------------------------------------------------------------" << endl; |
cout.setf(2); |
cout << setw(10) << "作业号" << setw(12) << "到达时间" << setw(12) << "开始时间" << setw(14) << "周转时间(分)" << endl; |
current_hour = jobs[0].reach_hour; |
current_minute = jobs[0].reach_minite; |
for (i = 0; i < quantity; i++) { |
jobs[i].start_time = current_hour * 100 + current_minute; |
jobs[i].wait_time = (current_hour - jobs[i].reach_hour) * 60 + (current_minute - jobs[i].reach_minite) + jobs[i |
].need_time; |
cout << setw(10) << jobs[i].number << setw(12) << jobs[i].reach_time << setw(12) << jobs[i].start_time << setw(14) << jobs[i].wait_ |
time << endl; |
current_hour = current_hour + (jobs[i].need_time + current_minute) / 60; |
current_minute = (jobs[i].need_time + current_minute) % 60; |
total_time += jobs[i].wait_time; |
} |
cout << endl << "总周转时间:" << total_time << " 平均周转时间:" << total_time / quantity << endl; |
} |
//运算时间短的作业优先算法 |
void shorter() { |
int i, j, p; |
int current_hour; |
int current_minute; |
int current_need_time; |
int total_time = 0; |
//输出作业流 |
cout << endl; |
cout << endl << "时间短作业优先算法作业流(开始调度时刻为最后一个作业到达系统的时间)" << endl; |
cout << "------------------------------------------------------------------------" << endl; |
cout.setf(2); |
cout << setw(10) << "作业号" << setw(12) << "到达时间" << setw(14) << "所需时间(分)" << setw(12) << "开始时间" << setw(14) << "周转时间(分)" << endl; |
current_hour = jobs[quantity - 1].reach_hour; |
current_minute = jobs[quantity - 1].reach_minite; |
for (i = 0; i < quantity; i++) { |
current_need_time = 30000; |
for (j = 0; j < quantity; j++) { |
if ((jobs[j].visited == 0) && (jobs[j].need_time < current_need_time)) { |
p = j; |
current_need_time = jobs[j].need_time; |
} |
} |
jobs[p].start_time = current_hour * 100 + current_minute; |
jobs[p].wait_time = (current_hour - jobs[p].reach_hour) * 60 + (current_minute - jobs[p].reach_minite) + jobs[p |
].need_time; |
cout << setw(10) << jobs[p].number << setw(12) << jobs[p].reach_time << setw(14) << jobs[p].need_time << setw(12) << jobs[p].start_ |
time << setw(14) << jobs[p].wait_time << endl; |
current_hour = current_hour + (jobs[p].need_time + current_minute) / 60; |
current_minute = (jobs[p].need_time + current_minute) % 60; |
jobs[p].visited = 1; |
total_time += jobs[p].wait_time; |
} |
cout << endl << "总周转时间:" << total_time << " 平均周转时间:" << total_time / quantity << endl; |
} |
//优先数调度算法 |
void privilege() { |
int i, j, p; |
int current_hour; |
int current_minute; |
int current_privilege; |
int total_time = 0; |
//输出作业流 |
cout << endl; |
cout << endl << "优先数调度算法作业流(开始调度时刻为最后一个作业到达系统的时间)" << endl; |
cout << "------------------------------------------------------------------------" << endl; |
cout.setf(2); |
cout << setw(10) << "作业号" << setw(12) << "到达时间" << setw(14) << "优先级(0>1)" << setw(12) << "开始时间" << setw(14) << "周转时间(分)" << endl; |
current_hour = jobs[quantity - 1].reach_hour; |
current_minute = jobs[quantity - 1].reach_minite; |
for (i = 0; i < quantity; i++) { |
current_privilege = 30000; |
for (j = 0; j < quantity; j++) { |
if ((jobs[j].visited == 0) && (jobs[j].privilege < current_privilege)) { |
p = j; |
current_privilege = jobs[j].privilege; |
} |
} |
jobs[p].start_time = current_hour * 100 + current_minute; |
jobs[p].wait_time = (current_hour - jobs[p].reach_hour) * 60 + (current_minute - jobs[p].reach_minite) + jobs[p |
].need_time; |
cout << setw(10) << jobs[p].number << setw(12) << jobs[p].reach_time << setw(14) << jobs[p].privilege << setw(12) << jobs[p].start_ |
time << setw(14) << jobs[p].wait_time << endl; |
current_hour = current_hour + (jobs[p].need_time + current_minute) / 60; |
current_minute = (jobs[p].need_time + current_minute) % 60; |
jobs[p].visited = 1; |
total_time += jobs[p].wait_time; |
} |
cout << endl << "总周转时间:" << total_time << " 平均周转时间:" << total_time / quantity << endl; |
} |
//响应比最高者优先调度算法 |
void excellent() { |
int i, j, p; |
int current_hour; |
int current_minute; |
float current_excellent; |
int total_time = 0; |
//输出作业流 |
cout << endl; |
cout << endl << "响应比高者优先调度算法作业流(开始调度时刻为最后一个作业到达系统的时间)" << endl; |
cout << "------------------------------------------------------------------------" << endl; |
cout.setf(2); |
cout << setw(10) << "作业号" << setw(12) << "到达时间" << setw(12) << "开始时间" << setw(14) << "周转时间(分)" << endl; |
current_hour = jobs[quantity - 1].reach_hour; |
current_minute = jobs[quantity - 1].reach_minite; |
for (i = 0; i < quantity; i++) { |
current_excellent = -1; |
for (j = 0; j < quantity; j++) { |
if (jobs[j].visited == 0) { |
jobs[j].wait_time = (current_hour - jobs[j].reach_hour) * 60 + (current_minute - jobs[j].reach_minite); |
jobs[j].excellent = ( float )(jobs[j].wait_time / jobs[j].need_time); |
} |
} |
for (j = 0; j < quantity; j++) { |
if ((jobs[j].visited == 0) && (jobs[j].excellent > current_excellent)) { |
p = j; |
current_excellent = jobs[j].excellent; |
} |
} |
jobs[p].start_time = current_hour * 100 + current_minute; |
jobs[p].wait_time = (current_hour - jobs[p].reach_hour) * 60 + (current_minute - jobs[p].reach_minite) + jobs[p |
].need_time; |
cout << setw(10) << jobs[p].number << setw(12) << jobs[p].reach_time << setw(12) << jobs[p].start_time << setw(14) << jobs[p].wait_ |
time << endl; |
current_hour = current_hour + (jobs[p].need_time + current_minute) / 60; |
current_minute = (jobs[p].need_time + current_minute) % 60; |
jobs[p].visited = 1; |
total_time += jobs[p].wait_time; |
} |
cout << endl << "总周转时间:" << total_time << " 平均周转时间:" << total_time / quantity << endl; |
} |
//显示版权信息函数 |
void version() { |
cout << endl << endl; |
cout << " ┏━━━━━━━━━━━━━━━━━━━━━━━┓" << endl; |
cout << " ┃ 作业调度模拟系统 ┃" << endl; |
cout << " ┠───────────────────────┨" << endl; |
cout << " ┃ (c)All Right Reserved Neo ┃" << endl; |
cout << " ┃ sony006@163.com ┃" << endl; |
cout << " ┃ version 2004 build 1122 ┃" << endl; |
cout << " ┗━━━━━━━━━━━━━━━━━━━━━━━┛" << endl; |
cout << endl << endl; |
} |
void main() { |
version(); |
initial(); |
readData(); |
FIFO(); |
shorter(); |
reset(); |
privilege(); |
reset(); |
excellent(); |
} |