短进程优先算法

#include "stdio.h"

struct sjf{
	char name[10];
	float arrivetime;  //到达时间
	float servicetime;  //运行时间
	float starttime;    //开始时间
	float finishtime;   //完成时间

};
sjf a[100];

//进程信息输入
void input(sjf *p,int N)
{ 
	int i;
    printf("输入进程的名字、到达时间、服务时间:(例如: a 0 100)\n");
    for(i=0;i<=N-1;i++)
	{
       printf("输入进程%d的信息:\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,int N)
{
	  int k;
     printf("\n\n进程调度顺序:");
     printf("%s",p[0].name);
     for(k=1;k<N;k++)
	 {printf("-->%s",p[k].name);} 
     printf("\n进程具体调度信息:");
     printf("\n进程名\t到达时间\t运行时间\t开始时间\t完成时间\n");
     for(k=0;k<=N-1;k++)
         printf(" %s\t  %-.2f\t\t  %-.2f\t\t  %-.2f\t\t  %-.2f\t\n",p[k].name,p[k].arrivetime,
		 p[k].servicetime,p[k].starttime,p[k].finishtime);
   
}

//排序
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,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+float(p[k].servicetime)/60;}
         else
           {
    p[k].starttime=p[k-1].finishtime;
             p[k].finishtime=p[k-1].finishtime+float(p[k].servicetime)/60;}
     }
   
}
 
void sjff(sjf *p,int N)
{
	    float arrivetime=0,servicetime=0,starttime=0,finishtime=0;
        sort(p,N);
        for(int m=0;m<N-1;m++)
        {if(m==0)
            p[m].finishtime=p[m].arrivetime+float(p[m].servicetime)/60;
         else
            p[m].finishtime=p[m-1].finishtime+float(p[m].servicetime)/60;
  
         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;
         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,N);
   
        Print(p,arrivetime,servicetime,starttime,finishtime,N);
}

void main()
{ int N;
   printf("\t------短作业优先调度算法------\n");
   printf("输入进程数目: ");
   scanf("%d",&N);
   input(a,N);
   sjf *b=a;
   sjf *c=a;
   sjff(b,N);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值