进程问题(FCFS先来先服务C++实现)

说明

其实就是简单的对于到来的时间进行排序,因为是非抢占式 所以一个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;
}

猜你喜欢

转载自blog.csdn.net/qq_43477024/article/details/109676787