算法流程

实现代码

#include<stdlib.h>
#include<stdio.h>
struct PCB
{
        int pid;//进程标识符
        float arrive_time;//进入时间
        float request_time;//服务时间
        float start_time;//开始时间
        float end_time;//结束时间
        float turnaround_time;//周转时间
        float dqturnaround_time;//带权周转时间
        int status;
}proc[4];
void printresult(int i);
void init()
{
    int i;
    float x;
    for(i=0;i<4;i++)
    {
            proc[i].pid=i+1;
            printf("请输入进程%d的进入时间:",proc[i].pid);
            scanf("%f",&x);
            while(x<=0)
            {
                    printf("请输入大于0的数:");
                    scanf("%f",&x);
            }
            proc[i].arrive_time=x;
            printf("请输入进程%d的服务时间:",proc[i].pid);
            scanf("%f",&x);
            while(x<=0)
            {
                    printf("请输入大于0的数:");
                    scanf("%f",&x);
            }
            proc[i].request_time=x;
            proc[i].start_time=0;
            proc[i].end_time=0;
            proc[i].turnaround_time=0;
            proc[i].dqturnaround_time=0;
            proc[i].status=0;
    }
}
int fcfs()//寻找未执行的进程中进入时间最短的进程
{
        int i,t,w=0;
        for(i=0;i<4;i++)
        {
                if(proc[i].status==0)
                {
                        t=proc[i].arrive_time;
                        w=1;
                }
                if(w==1)
                {
                        break;
                }
        }
        for(i=0;i<4;i++)
        {
                if(proc[i].arrive_time<t && proc[i].status==0)
                        t=proc[i].arrive_time;
        }
        for(i=0;i<4;i++)
                if(proc[i].arrive_time==t)
                        return i;
}
void update(int s)
{
        int i,g=0,d;
        for(i=0;i<4;i++)
        {
                if(proc[i].status==0)
                        continue;
                else
                {
                    g=1;
                    break;
                }
        }
        if(g==0)//第一个执行的进程
        {
                proc[s].start_time=proc[s].arrive_time;
                proc[s].end_time=proc[s].arrive_time+proc[s].request_time;
                proc[s].turnaround_time=proc[s].request_time;
                proc[s].status=1;
                g=2;
        }
        if(g==1)//不是第一个执行的进程
        {
                proc[s].status=1;
                for(i=0;i<4;i++)
                {
                        if(proc[i].status==1)
                                d=proc[i].end_time;
                }
                for(i=0;i<4;i++)
                {
                        if(proc[i].end_time>d && proc[i].status==1)//找出所有进程的最晚结束时间
                                d=proc[i].end_time;
                }
                if(proc[s].arrive_time<d)
                        proc[s].start_time=d;
                else
                        proc[s].start_time=proc[s].arrive_time;
                proc[s].end_time=proc[s].start_time+proc[s].request_time;
                proc[s].turnaround_time=proc[s].end_time-proc[s].arrive_time;//周转时间等于结束时间减去进入时间
        }
                proc[s].dqturnaround_time=proc[s].turnaround_time/proc[s].request_time;//带权周转时间等于周转时间除以服务时间
}

void printresult(int i)
{
        printf("%d\t",proc[i].pid);
        printf("%f\t",proc[i].arrive_time);
        printf("%f\t",proc[i].request_time);
        printf("%f\t",proc[i].start_time);
        printf("%f\t",proc[i].end_time);
        printf("%f\t",proc[i].turnaround_time);
        printf("%f\n",proc[i].dqturnaround_time);
}
int main()
{
        int i,k;
        int d[4];
        system("clear");
        init();
        printf("进程标识符 进入时间     服务时间       开始时间       结束时间       周转时间       带权周转时间\n");

        for(i=0;i<4;i++)
        {
                k=fcfs();
                update(k);
                d[i]=k;
        }
        for(i=0;i<4;i++)
        {
                printresult(d[i]);
        }
        return 0;
}

效果

 

版权声明:本文为qrxqrx原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/qrxqrx/articles/7852804.html