说明
其实就是简单的对于到来的时间进行排序,因为是非抢占式 所以一个sort就好了
.hfile
#ifndef FCFS_H
#define FCFS_H
#include<iostream>
#include<iomanip>
#include<vector>
#include<queue>
typedef struct PCB{
int ID; //标识符
int ComeTime; //到达时间
int ServerTime; //服务时间
int FinishTime; //完成时间
int TurnoverTime; //周转时间
double WeightedTurnoverTime; //带权周转时间
}PCB;
void InputPCB(std::vector<PCB> &PCBList);
void FCFS(std::vector<PCB> &PCBList);
void show(std::vector<PCB> &PCBList);
bool cmp(const PCB &p1,const PCB &p2);
#endif
.cpp
#include<bits/stdc++.h>
#include"FCFS.h"
using namespace std;
void InputPCB(std::vector<PCB> &PCBList){
while (true){
PCB temp;
std::cout<<"输入标识符:";
cin>>temp.ID;
cout<<"输入到达时间:";
cin>>temp.ComeTime;
cout<<"输入服务时间:";
cin>>temp.ServerTime;
PCBList.push_back(temp);
cout<<"继续输入?(q to quit)";
char ch;
cin>>ch;
if(ch=='q'||ch=='Q')
break;
else
continue;
}
}
bool cmp(const PCB &p1, const PCB &p2)
{
return p1.ComeTime < p2.ComeTime;
}
void FCFS(std::vector<PCB> &PCBList){
sort(PCBList.begin(),PCBList.end(),cmp); //按升序排列ComeTime
int FinishTime=-1; //上一个作业的完成时间
for(vector<PCB>::iterator it=PCBList.begin();it!=PCBList.end();++it){
if((*it).ComeTime<FinishTime) //作业到达时,上一个作业还没有结束
(*it).FinishTime=(*(it-1)).FinishTime+(*it).ServerTime;
else{
(*it).FinishTime=(*it).ComeTime+(*it).ServerTime;
(*it).TurnoverTime=(*it).FinishTime-(*it).ComeTime;
(*it).WeightedTurnoverTime=(double)(*it).TurnoverTime/(*it).ServerTime;
FinishTime=(*it).FinishTime;
}
}
}
void show(std::vector<PCB> &PCBList)
{
int SumTurnoverTime = 0;
double SumWeightedTurnoverTime = 0;
std::cout.setf(std::ios::left);
std::cout << std::setw(20) << "标识符";
for (std::vector<PCB>::iterator it = PCBList.begin(); it < PCBList.end(); ++it)
std::cout << std::setw(5) << (*it).ID;
std::cout << std::endl;
std::cout << std::setw(20) << "到达时间";
for (std::vector<PCB>::iterator it = PCBList.begin(); it < PCBList.end(); ++it)
std::cout << std::setw(5) << (*it).ComeTime;
std::cout << std::endl;
std::cout << std::setw(20) << "服务时间";
for (std::vector<PCB>::iterator it = PCBList.begin(); it < PCBList.end(); ++it)
std::cout << std::setw(5) << (*it).ServerTime;
std::cout << std::endl;
std::cout << std::setw(20) << "完成时间";
for (std::vector<PCB>::iterator it = PCBList.begin(); it < PCBList.end(); ++it)
std::cout << std::setw(5) << (*it).FinishTime;
std::cout << std::endl;
std::cout << std::setw(20) << "周转时间";
for (std::vector<PCB>::iterator it = PCBList.begin(); it < PCBList.end(); ++it)
{
std::cout << std::setw(5) << (*it).TurnoverTime;
SumTurnoverTime += (*it).TurnoverTime;;
}
std::cout << std::endl;
std::cout << std::setw(20) << "带权周转时间";
for (std::vector<PCB>::iterator it = PCBList.begin(); it < PCBList.end(); ++it)
{
std::cout << std::setw(5) << (*it).WeightedTurnoverTime;
SumWeightedTurnoverTime += (*it).WeightedTurnoverTime;;
}
std::cout << std::endl;
std::cout << "平均周转时间: " << (double)SumTurnoverTime / PCBList.size() << std::endl;
std::cout << "平均带权周转时间: " << SumWeightedTurnoverTime / PCBList.size() << std::endl;
}
int main(){
vector<PCB> PCBList;
InputPCB(PCBList);
FCFS(PCBList);
show(PCBList);
return 0;
}