C++實現FCFS,SJF,Round_Robin

測試用input.txt 四個數字依次爲進程編號 進程到達時間 進程需要時間 進程優先級

1  0   79  1

2  184 49  0
3  135 52  2
4  128 65  1
5  197 98  0
6  112 10  2
7  298 6   1
8  112 72  0
9  38  47  2
10 236 100 1

代碼部分

#include <iostream>

#include <fstream>
#include <string>
using namespace std;
struct Process {
    int num;
    int ReadyTime;
    int time;
    int Priority;
};
void PaiXuReadyTime(Process *a,int n)
{
    int i = 0, j = 0, k = 0;
    for (i = 0; i < n - 1; i++)
    {
        k = i;

        for (j = i + 1; j < n; j++)
        {
            if (a[k].ReadyTime > a[j].ReadyTime)
            {
                k = j;
            }
        }
        if (k != i)
        {
            Process tmp = a[k];
            a[k] = a[i];
            a[i] = tmp;
        }
    }
}
void PaiXuTime(Process *a, int n)
{
    int i = 0, j = 0, k = 0;
    for (i = 0; i < n - 1; i++)
    {
        k = i;

        for (j = i + 1; j < n; j++)
        {
            if (a[k].time > a[j].time)
            {
                k = j;
            }
        }
        if (k != i)
        {
            Process tmp = a[k];
            a[k] = a[i];
            a[i] = tmp;
        }
    }
}
void ShortestJobFirst(Process * p,int n)
{
    Process *a = new Process[n];
    for (int q = 0; q < n; q++)
    {
        a[q] = p[q];
    }
    PaiXuReadyTime(a, n);
    int *TimeSequence = new int[n + 1];
    TimeSequence[0] = a[0].ReadyTime;
    for(int m = 0; m < n; m++)
    {
        TimeSequence[m + 1] = TimeSequence[m] + a[m].time;
        Process *TempSequence = new Process[n];
        int nfTS = 0;
        for (int f = m + 1; f < n; f++)
        {
            if (/*(a[f].ReadyTime >= TimeSequence[m]) && */(a[f].ReadyTime <= TimeSequence[m + 1]))
            {
                TempSequence[nfTS] = a[f];
                nfTS++;
            }
        }
        PaiXuTime(TempSequence, nfTS);
        if (nfTS > 0)
        {
            Process lalala = a[m + 1];
            a[m + 1] = TempSequence[0];
            for (int i = m+2; i < n; i++)
            {
                if (TempSequence[0].num == a[i].num)
                    a[i] = lalala;
            }
        }
    }
    cout << "SJF" << endl;
    for (int i = 0; i < n; i++)
    {
        cout << a[i].num << " " << a[i].ReadyTime << " " << a[i].time << " " << a[i].Priority << " " << TimeSequence[i + 1] << " " << endl;
    }

    //計算平均週轉時間
    float sum = 0;
    for (int i = 0; i < n; i++)
    {
        //cout << TimeSequence[i] << " - " << a[i].ReadyTime << endl;
        sum = sum + TimeSequence[i] - a[i].ReadyTime + a[i].time;
    }
    sum = sum / n;
    cout << "Average turn around time is " << sum << endl;
    cout << endl;
}
void FCFS(Process * p,int n)
{
    int i = 0, j = 0, k = 0;
    Process *a = new Process[n];
    for (int q = 0; q < n; q++)
    {
        a[q] = p[q];
    }
    for (i = 0; i < n - 1; i++)
    {
        k = i;

        for (j = i + 1; j < n; j++)
        {
            if (a[k].ReadyTime > a[j].ReadyTime)
            {
                k = j;
            }
        }
        if (k != i)
        {
            Process tmp = a[k];
            a[k] = a[i];
            a[i] = tmp;
        }
    }
    /*for (int i = 0; i < n; i++)
        cout << "time " << a[i].time << " ";*/
    cout << "FCFS" << endl;
    int *TimeSequence=new int[n + 1];
    TimeSequence[0]= a[0].ReadyTime;
    for (int i = 0; i < n+1; i++)
    {
        TimeSequence[i + 1] = TimeSequence[i] + a[i].time;
    }
    for (int i = 0; i < n; i++)
    {
        cout << a[i].num << " " << a[i].ReadyTime << " " << a[i].time << " " << a[i].Priority << " " << TimeSequence[i+1] << " " << endl;
    }

    //計算平均週轉時間
    float sum = 0;
    for (int i =0; i < n ; i++)
    {
        //cout << TimeSequence[i] << " - " << a[i].ReadyTime<<" + "<<a[i].time << endl;
        sum = sum + TimeSequence[i]-a[i].ReadyTime+a[i].time;
    }
    sum = sum /n ;
    cout << "Average turn around time is " << sum << endl;
    cout << endl;
}
void DeleteProcess(Process* p, int i,int&n)//刪除p中下標爲i的進程 剩餘進程向前補缺 n爲p當前長度
{
    for (int j = i; j < n; j++)
        p[j] = p[j + 1];
    n--;
}
void Round_Robin(Process * p, int n,int TimeSlice)
{
    Process *ProcessQueue = new Process[200];  //用來儲存執行順序
    Process *a = new Process[n];
    for (int q = 0; q < n; q++)
    {
        a[q] = p[q];
    }
    
    int test[200];
    int testNum = 0;
    
    int TimeSequence[200] = { 0 };
    int TimeSequenceNum = 0;
    PaiXuReadyTime(a, n);
    int ProcessQueueNum = 0;              //ProcessQueue中process個數
    ProcessQueue[ProcessQueueNum] = a[0];
    ProcessQueueNum++;
    int CurrentProcess = 0;               //記錄ProcessQueue執行到哪一個進程了
    int i = 0;                             //計數還不在ProcessQueue的最小下標
    if (a[0].time < TimeSlice)             //小於0情況還需考慮直到找到合適的a[i]或者執行完所有的進程
    {
        TimeSequence[TimeSequenceNum + 1] = TimeSequence[TimeSequenceNum] + a[0].time;
        TimeSequenceNum++;

    }
    else
    {
        TimeSequence[TimeSequenceNum + 1] = TimeSequence[TimeSequenceNum] + TimeSlice;
        TimeSequenceNum++;

        test[testNum] = ProcessQueue[CurrentProcess].num;
        testNum++;
        
        ProcessQueue[0].time = ProcessQueue[0].time - TimeSlice;
    }
    i++;
    while (ProcessQueueNum !=0)
    {
        for (;CurrentProcess < ProcessQueueNum; CurrentProcess=(CurrentProcess+1)%ProcessQueueNum)
        {
            if (ProcessQueue[CurrentProcess].time < TimeSlice)            
            {
                TimeSequence[TimeSequenceNum + 1] = TimeSequence[TimeSequenceNum] + ProcessQueue[CurrentProcess].time;
                TimeSequenceNum++;
                
                ProcessQueue[CurrentProcess].time = 0;
                test[testNum] = ProcessQueue[CurrentProcess].num;
                testNum++;

                DeleteProcess(ProcessQueue, CurrentProcess, ProcessQueueNum);
                if (ProcessQueueNum == 0)
                    break;
            }
            else
            {
                TimeSequence[TimeSequenceNum + 1] = TimeSequence[TimeSequenceNum] + TimeSlice;
                TimeSequenceNum++;

                ProcessQueue[CurrentProcess].time = ProcessQueue[CurrentProcess].time - TimeSlice;
                
                test[testNum] = ProcessQueue[CurrentProcess].num;
                testNum++;
                
            }

            for (int j = i; j < n; j++)
            {

                if (a[j].ReadyTime < TimeSequence[TimeSequenceNum])
                {
                    ProcessQueue[ProcessQueueNum] = a[j];
                    ProcessQueueNum++;
                    i++;
                }
            }

        }
    }
    cout << "Round_Robin" << endl;
    cout << "依次執行的進程的進程號" << endl;
    for (int i = 0; i < testNum; i++)
        cout << test[i] << "  ";
    /*cout << "整個過程的時間" << endl;
    for (int i = 0; i < TimeSequenceNum; i++)
        cout << TimeSequence[i] << " ";*/
    cout << endl;
    //cout << TimeSequenceNum << testNum ;

    //計算週轉時間
    float sum = 0;
    for (int i = 0; i < testNum-1; i++)
    {
        sum = TimeSequence[i + 1] - TimeSequence[i] + sum;
            for (int j = i - 1; j >= 0; j--)
            {
                if (test[i] == test[j])
                {
                    sum = sum + (i - j - 1)*TimeSlice;
                    break;
                }
            }
    }
    sum = sum / n;
    cout << "Average turn around time is " << sum << endl;
}
int main()
{
    Process p[10];
    ifstream infile;
    infile.open("input.txt");
    if (!infile) cout << "error" << endl;
    string str;
    string part;
    int i=0;
    while (getline(infile, str))   //按行讀取,遇到換行符結束
    {
        part=str.substr(0,2);
        p[i].num = stoi(part);
        part = str.substr(3,3);
        p[i].ReadyTime = stoi(part);
        part = str.substr(7,3);
        p[i].time= stoi(part);
        part = str.substr(11,1);
        p[i].Priority = stoi(part);
        i++;
    }
    ShortestJobFirst(p, 10);
    FCFS(p, 10);
    Round_Robin(p, 10, 10);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章