一、 需求分析
说明程序设计的任务和目的,明确规定下述内容:
用代码模拟进程状态的转变、进程调度的策略
(1) 输入的形式和输入值的范围;
已在程序中预置好进程数据,只需输入数字1/2选择算法
(2) 输出的形式;
根据时刻输出每个时刻的调度过程
(3) 程序所能达到的功能;
模拟SJF,FCFS调度
(4) 测试数据,包括正确的输入及其输出结果和含有错误的输入及其输出结果。
正确输入:1 或者 2
错误输入:不等于1 、2的字符
二、 概要设计
说明本程序中用到的所有抽象数据类型的定义、主程序的流程以及各程序模块之间的层次(调用)关系。
Process类
ArrivalTime
ServiceTime
FinishTime
WholeTime
WeightWholeTime
三、 详细设计
实现程序模块的具体算法。
void FCFS(process(&processList)[MAXNUM])
void SJF(process(&processList)[MAXNUM])
四、 调试分析
(1) 调试过程中遇到的问题以及解决方法,设计与实现的回顾讨论和分析;
数组越界。
解决办法:定义全局常变量MAXNUM
五、 用户使用说明
程序的使用说明,列出每一步的操作步骤。
运行程序--选择算法--查看结果
六、 测试结果
列出测试结果,包括输入和输出。
附录
带注释的源程序,注释应清楚具体;
<pre name="code" class="cpp">#include "stdafx.h"
#include<iostream>
#include<string>
using namespace std;
//进程等待了
//进程执行了
// 空闲了
static const int MAXNUM = 5;
class process
{
public:
string ID;
double ArrivalTime, ServiceTime, FinishTime, WholeTime, WeightWholeTime;
process(double arrivalTime, double serviceTime, string id);
~process();
//static double Get_AverageWT_FCFS(process(&processList)[MAXNUM]);
private:
};
process::process(double arrivalTime, double serviceTime, string id)
{
ID = id;
ArrivalTime = arrivalTime;
ServiceTime = serviceTime;
}
process::~process()
{
}
double Get_AverageWT(process(&processList)[MAXNUM])
{
double sum = 0;
for (int i = 0; i < MAXNUM; i++)
{
sum += processList[i].WholeTime;
}
return sum / MAXNUM;
}
double Get_AverageWWT(process(&processList)[MAXNUM])
{
double sum = 0;
for (int i = 0; i < MAXNUM; i++)
{
sum += processList[i].WeightWholeTime;
}
return sum / MAXNUM;
}
void FCFS(process(&processList)[MAXNUM])//先来后到
{
for (int i = 0; i<MAXNUM; i++)
{
for (int j = i; j<MAXNUM; j++)
{
if (processList[i].ArrivalTime>processList[j].ArrivalTime)
{
process temp = processList[i];
processList[i] = processList[j];
processList[j] = temp;
}
}
}
}
void SJF(process(&processList)[MAXNUM])//小的优先
{
for (int k = 1; k<MAXNUM; k++)//把最先到达的提前
{
if (processList[0].ArrivalTime>processList[k].ArrivalTime)
{
process temp = processList[0];
processList[0] = processList[k];
processList[k] = temp;
}
}
for (int i = 1; i<MAXNUM; i++)//余下的 短时间优先
{
for (int j = i; j<MAXNUM; j++)
{
if (processList[i].ServiceTime>processList[j].ServiceTime)
{
process temp = processList[i];
processList[i] = processList[j];
processList[j] = temp;
}
}
}
}
int _tmain(double argc, _TCHAR* argv[])
{
cout << "-------------------------------进程调度算法:" << endl;
int time = 0;//计时器
double q = 1;//时间片
process processList[MAXNUM] = { process(0, 1, "A"), process(1, 3, "B"), process(2, 4, "C"), process(3, 2, "D"), process(4, 4, "E") };
cout << "--------进程列表如下:" << endl;
for (int i = 0; i < MAXNUM; i++)
{
cout << "进程ID:" << processList[i].ID << " 到达时间:" << processList[i].ArrivalTime << " 服务时间:" << processList[i].ServiceTime << endl;
}
int flag = 1;// 1 SJF 2FCFS
cout << "请选择进程处理方式: 1-SJF 2-FCFS" << endl;
cin >> flag;
while (!(flag == 1 || flag == 2))
{
cout << "输入错误,请重新输入!" << endl;
cin >> flag;
}
if (flag == 1)
{
SJF(processList);
}
else
{
FCFS(processList);
}
int i = 0;//进程索引
while (i<MAXNUM)
{
if (processList[i].ArrivalTime == time)//无等待 处理进程
{
cout << "当前时刻:" << time << " [开始]进程" << processList[i].ID << endl;
processList[i].FinishTime = time + processList[i].ServiceTime;
time = processList[i].FinishTime;
processList[i].WholeTime = processList[i].FinishTime - processList[i].ArrivalTime;
processList[i].WeightWholeTime = processList[i].WholeTime / processList[i].ServiceTime;
cout << " " << " [结束]进程" << processList[i].ID << " 耗时" << processList[i].ServiceTime << "秒" << " 周转时间:" << processList[i].WholeTime << " 带权周转时间:" << processList[i].WeightWholeTime << endl;
i++;//处理完后移到下一个任务
}
else if (time>processList[i].ArrivalTime)//执行等待的进程
{
cout << "当前时刻:" << time << " [开始]进程" << processList[i].ID << " 排队等待" << time - processList[i].ArrivalTime << "秒" << endl;
processList[i].FinishTime = time + processList[i].ServiceTime;
time = processList[i].FinishTime;
processList[i].WholeTime = processList[i].FinishTime - processList[i].ArrivalTime;
processList[i].WeightWholeTime = processList[i].WholeTime / processList[i].ServiceTime;
cout << " " << " [结束]进程" << processList[i].ID << " 耗时" << processList[i].ServiceTime << "秒" << " 周转时间:" << processList[i].WholeTime << " 带权周转时间:" << processList[i].WeightWholeTime << endl;
i++;//处理完后移到下一个任务
}
else
{
cout << "当前时刻:" << time << " [空闲]" << endl;
time += q;;
}
}
if (flag == 1)
{
cout << "当前时刻:" << time << " 【SJF】 已处理所有进程!" << " 平均周转时间:" << Get_AverageWT(processList) << " 带权平均周转时间:" << Get_AverageWWT(processList) << endl;
}
else
{
cout << "当前时刻:" << time << " 【FCFS】 已处理所有进程!" << " 平均周转时间:" << Get_AverageWT(processList) << " 带权平均周转时间:" << Get_AverageWWT(processList) << endl;
}
return 0;
}