1. 程式人生 > >用C語言寫的一個最短作業優先排程演算法

用C語言寫的一個最短作業優先排程演算法

#include <stdio.h>
//定義一個結構體
struct sjf{
char name[10]; //程序名
float arrivetime; //到達時間
float servicetime;//服務時間
float starttime; //開始時間
float finishtime;//完成時間
float zztime;//週轉時間
float dqzztime;//帶權週轉
};

//定義一個結構體陣列
sjf a[100];

//定義一個輸入函式
void input(sjf *p,int N)
{ 
	int i;
    printf("intput the process's name & arrivetime & servicetime:\nfor exmple: a 0 100\n");
    for(i=0;i<=N-1;i++)
	{
		printf("input the %dth process's information:\n",i+1);
        scanf("%s%f%f",&p[i].
                            name,&p[i].arrivetime,&p[i].servicetime);
	}

}
//定義一個輸出函式
void Print(sjf *p,float arrivetime,float servicetime,float starttime,float finishtime,float zztime,float dqzztime,int N)
{
	int k;

    printf("run order:");//執行順序
    printf("%s",p[0].name);
    for(k=1;k<N;k++)
	{
		printf("-->%s",p[k].name);
	} 
    printf("\nthe process's information:\n");
    printf("\nname\tarrive\tservice\tstart\tfinish\tzz\tdqzz\n");
    for(k=0;k<=N-1;k++)
	{ 
		printf("%s\t%-.2f\t%-.2f\t%-.2f\t%-.2f\t%-.2f\t%-.2f\t\n",p[k].name,p[k].arrivetime,p[k].servicetime,p[k].starttime,p[k].finishtime,p[k].zztime,p[k].dqzztime);
	}
   
}
//按到達時間排序
void sort(sjf *p,int N)
{
	for(int i=0;i<=N-1;i++)
    for(int j=0;j<=i;j++)
    if(p[i].arrivetime<p[j].arrivetime)
	{
		sjf temp;
        temp=p[i];
        p[i]=p[j];
        p[j]=temp;
    }
}

//執行階段
void deal(sjf *p, float arrivetime,float servicetime,float starttime,float finishtime,float &zztime,float &dqzztime,int N)
{ 
	int k;
    for(k=0;k<=N-1;k++)
	{
         if(k==0)
         { 
             p[k].starttime=p[k].arrivetime;//第一個程序的開始時間=到達時間
             p[k].finishtime=p[k].arrivetime+p[k].servicetime;}//完成時間=到達時間+服務時間
         else 
		 {
			 if(p[k-1].finishtime>=p[k].arrivetime)
			 {
				 p[k].starttime=p[k-1].finishtime;}
			 else
			 {
			 p[k].starttime =p[k].arrivetime;}
			 p[k].finishtime=p[k].starttime+p[k].servicetime;
		 }
	}

     for(k=0;k<=N-1;k++)
     {
     p[k].zztime=p[k].finishtime-p[k].arrivetime;//週轉時間=完成時間-到達時間
     p[k].dqzztime=p[k].zztime/p[k].servicetime;//帶權週轉時間=週轉時間/服務時間
     
     }
}

//短作業優先排程演算法

void sjff(sjf *p,int N)
{
	float arrivetime=0,servicetime=0,starttime=0,finishtime=0,zztime=0,dqzztime=0;


	sort(p,N);//呼叫sort函式

		
    for(int m=0;m<N-1;m++)
	{
		if(m==0)
        p[m].finishtime=p[m].arrivetime+p[m].servicetime;
        else 
		{
			if(p[m-1].finishtime >=p[m].arrivetime )
			{
				p[m].starttime=p[m-1].finishtime;}
			else
			{
				p[m].starttime =p[m].arrivetime;}
			  	p[m].finishtime=p[m].starttime+p[m].servicetime;
		}
		int i=0;
        for(int n=m+1;n<=N-1;n++)
		{
			if(p[n].arrivetime<=p[m].finishtime)
            i++;
		}
		 //按服務時間排序
        float min=p[m+1].servicetime;
        int next=m+1;//m+1=n
        for(int k=m+1;k<m+i;k++)
		{
          if(p[k+1].servicetime<min)
          {
			  min=p[k+1].servicetime;
              next=k+1;
		  }
            
		}
            sjf temp;
            temp=p[m+1];
            p[m+1]=p[next];
            p[next]=temp;
	}
        
   deal(p,arrivetime,servicetime,starttime,finishtime,zztime,dqzztime,N);
   
   Print(p,arrivetime,servicetime,starttime,finishtime,zztime,dqzztime,N);
}
void main()
{ int N;
   printf("------短作業優先排程演算法------\n");
   printf("input the process's number:\n");
   scanf("%d",&N);
   input(a,N);
   sjf *b=a;
   sjff(b,N);//呼叫sjff函式
}