1. 程式人生 > >程序排程問題之FCFS,SJF,HRRN

程序排程問題之FCFS,SJF,HRRN



#include<stdio.h>
#define N 5
typedef struct Process
{
 char name;
 int arrivetime;
 int servetime;
 int finishtime;
 int cyclingtime;
 double wcyclingtime;
 int beginning;
};
struct Process pro[N]={//FCFS
 {'A',0,3,0,0,0},
 {'B',2,6,0,0,0},
 {'C',4,4,0,0,0},
 {'D',6,5,0,0,0},
 {'E',8,2,0,0,0}
};
struct Process pro1[N]={//SJF
 {'A',0,3,0,0,0},
 {'B',2,6,0,0,0},
 {'C',4,4,0,0,0},
 {'D',6,5,0,0,0},
 {'E',8,2,0,0,0}
};
struct Process pro2[N]={//HRRN
 {'A',0,3,0,0,0},
 {'B',2,6,0,0,0},
 {'C',4,4,0,0,0},
 {'D',6,5,0,0,0},
 {'E',8,2,0,0,0}
};

void Input()
{
 int m;
 for(m=0;m<=4;m++)
 {
  printf("程序%d:\n",m);
  printf("程序名:");
  scanf("%s",&pro[m].name);
  printf("到達時間:");
  scanf("%d",&pro[m].arrivetime);
  printf("服務時間:");
  scanf("%d",&pro[m].servetime);
  printf("\n");
 }
}
void Display()
{
 int a,b,c;
 printf("程序名:\t\t");
 for(a=0;a<N;a++)
  printf("%c\t",pro[a].name);
 printf("\n");

 printf("到達時間:\t");
 for(b=0;b<N;b++)
  printf("%d\t",pro[b].arrivetime);
 printf("\n");

 printf("服務時間:\t");
 for(c=0;c<N;c++)
  printf("%d\t",pro[c].servetime);
 printf("\n");

void sort()//按到達時間排序
{
 int i,j,t,x;
 char y;
 for(j=0;j<N-1;j++)
 {
  for(i=0;i<N-1-j;i++)
  {
   if(pro[i].arrivetime>pro[i+1].arrivetime)
   {
    t=pro[i+1].arrivetime;
    pro[i+1].arrivetime=pro[i].arrivetime;
    pro[i].arrivetime=t;

    x=pro[i+1].servetime;
    pro[i+1].servetime=pro[i].servetime;
    pro[i].servetime=x;

    y=pro[i+1].name;
    pro[i+1].name=pro[i].name;
    pro[i].name=y;
   }
  }
 }
}
void FCFS()
{
 int k,d,j;
 int current=0;
 int n=0;
 int iflag=0;
 int flag[N]={0};
 double sum1=0,sum2=0;
 printf("先來先服務演算法:\n\n");
 while(n<5)
 {
  for(d=0;d<N;d++)
  {
   if(current==pro[d].arrivetime&&flag[d]==0)
    printf("%d\t程序%c到達記憶體\n\n",current,pro[d].name); 
 
   if(current>=pro[d].arrivetime&&iflag==0&&flag[d]==0)
   {
    iflag=1;
    flag[d]=1;
    pro[d].beginning=current;
    printf("%d\t程序%c開始執行\n\n",pro[d].beginning,pro[d].name);
   }
 
   if((current==(pro[d].beginning+pro[d].servetime))&&iflag==1&&flag[d]==1)
   {
    iflag=0;
    pro[d].finishtime=current;
    printf("%d\t程序%c結束!\n\n",current,pro[d].name);
    n++;
    
   }
  }
  current++;
 }

 for(j=0;j<N;j++)
 {
  pro[j].cyclingtime=pro[j].finishtime-pro[j].arrivetime;
  pro[j].wcyclingtime=pro[j].cyclingtime*1.00/pro[j].servetime;
 }
 
 printf("程序名\t到達時間 服務時間 完成時間 週轉時間 帶權週轉\n");
 for(k=0;k<N;k++)
 {
  printf("%3c\t %3d\t  %3d\t   %3d\t    %3d\t     %.2f\n",pro[k].name,pro[k].arrivetime,pro[k].servetime,pro[k].finishtime,pro[k].cyclingtime,pro[k].wcyclingtime);
 
 }

 for(j=0;j<N;j++)
 {
  sum1+=pro[j].cyclingtime;
  sum2+=pro[j].wcyclingtime;
 }
 printf("平均週轉時間:%.2f\t\t平均帶權週轉時間:%.2f\n",sum1/N,sum2/N);
}


void sort1()//按服務時間排序
{
 int i,j,t,x;
 char y;
 for(j=0;j<N-1;j++)
 {
  for(i=0;i<N-1-j;i++)
  {
   if(pro1[i].servetime>pro1[i+1].servetime)
   {
    t=pro1[i+1].arrivetime;
    pro1[i+1].arrivetime=pro1[i].arrivetime;
    pro1[i].arrivetime=t;

    x=pro1[i+1].servetime;
    pro1[i+1].servetime=pro1[i].servetime;
    pro1[i].servetime=x;

    y=pro1[i+1].name;
    pro1[i+1].name=pro1[i].name;
    pro1[i].name=y;
   }
  }
 }

}
void SJF()
{
 int d,k,j;
 int flag1[N]={0};
 int iflag=0;
 int n=0;
 int current=0;
 double sum1=0,sum2=0;
 printf("短作業優先演算法:\n\n");
 while(n<5)
 {
  for(d=0;d<N;d++)
  {
   if(current==pro1[d].arrivetime&&flag1[d]==0)
    printf("%d\t程序%c到達記憶體\n\n",current,pro1[d].name); 
 
   if(current>=pro1[d].arrivetime&&iflag==0&&flag1[d]==0)
   {
    iflag=1;
    flag1[d]=1;
    pro1[d].beginning=current;
    printf("%d\t程序%c開始執行\n\n",current,pro1[d].name);
   }
 
   if((current==(pro1[d].beginning+pro1[d].servetime))&&iflag==1&&flag1[d]==1)
   {
    iflag=0;
    pro1[d].finishtime=current;
    printf("%d\t程序%c結束!\n\n",current,pro1[d].name);
    n++;
    if(d<4)
    {
     if(current>=pro1[d+1].arrivetime&&flag1[d+1]==0)
     {
      iflag=1;
      flag1[d+1]=1;
      pro1[d+1].beginning=current;
      printf("%d\t程序%c開始執行\n\n",current,pro1[d+1].name);
     }
    }
    else if(d==4)
    {
     iflag=1;
     flag1[0]=1;
     pro1[0].beginning=current;
     printf("%d\t程序%c開始執行\n\n",current,pro1[0].name);
    }
   }
   
  }
  current++;
 }
 for(j=0;j<N;j++)
 {
  pro1[j].cyclingtime=pro1[j].finishtime-pro1[j].arrivetime;
  pro1[j].wcyclingtime=pro1[j].cyclingtime*1.00/pro1[j].servetime;
 }

 printf("程序名\t到達時間 服務時間 完成時間 週轉時間 帶權週轉\n");
 for(k=0;k<N;k++)
 {
  printf("%3c\t %3d\t  %3d\t   %3d\t    %3d\t     %.2f\n",pro1[k].name,pro1[k].arrivetime,pro1[k].servetime,pro1[k].finishtime,pro1[k].cyclingtime,pro1[k].wcyclingtime);
 
 }

 for(j=0;j<N;j++)
 {
  sum1+=pro1[j].cyclingtime;
  sum2+=pro1[j].wcyclingtime;
 }
 printf("平均週轉時間:%.2f\t\t平均帶權週轉時間:%.2f\n",sum1/N,sum2/N);
}
int priority(int flag2[N],int finishtime,int reach[N])
{
 int d,ID;
 double max;
 double first[N]={0};
 for(d=1;d<N;d++)
 {
  if(flag2[d]==0&&reach[d]==1)
   first[d]=(finishtime-pro2[d].arrivetime+pro2[d].servetime)*1.00/pro2[d].servetime;//計算優先順序
 }
 max=0;
 for(d=1;d<N;d++)
 { 
  if(flag2[d]==0&&reach[d]==1)
  {
   if(max<first[d])
   {
    max=first[d];
    ID=d;
   }
  }
 }
 return ID;
}
void HRRN()
{
 int d,k,j;
 int n=0;
 int iflag=0,flag2[N]={0},reach[N]={0};
 int current=0,finishtime=0;
 double sum1=0,sum2=0;
 printf("高響應比排程演算法:\n\n");

 printf("%d\t程序%c到達記憶體\n\n",current,pro2[0].name);
 reach[0]=1;
 pro2[0].beginning=0;
 printf("%d\t程序%c開始執行\n\n",current,pro2[0].name);
 pro2[0].finishtime=pro2[0].servetime;
 iflag=1;
 flag2[0]=1;

 while(n<5)
 {
  for(d=0;d<N;d++)
  {
   if(current==pro2[d].arrivetime&&flag2[d]==0)
   {
    reach[d]=1;
    printf("%d\t程序%c到達記憶體\n\n",current,pro2[d].name);
   }
   
   
   if((current==(pro2[d].beginning+pro2[d].servetime))&&iflag==1&&flag2[d]==1)
   {
    iflag=0;
    pro2[d].finishtime=current;
    finishtime=current;
    printf("%d\t程序%c結束!\n\n",current,pro2[d].name);
    n++;
    
    if(n<=4)
    {
     k=priority(flag2,finishtime,reach);
     if(reach[k]==1)
     {
      iflag=1;
      flag2[k]=1;
      pro2[k].beginning=current;
      printf("%d\t程序%c開始執行\n\n",current,pro2[k].name);
     }
    }
    
   }
  }
  current++;
 }
 //輸出
 for(j=0;j<N;j++)
 {
  pro2[j].cyclingtime=pro2[j].finishtime-pro2[j].arrivetime;
  pro2[j].wcyclingtime=pro2[j].cyclingtime*1.00/pro2[j].servetime;
 }
 
 printf("程序名\t到達時間 服務時間 完成時間 週轉時間 帶權週轉\n");
 for(k=0;k<N;k++)
 {
  printf("%3c\t %3d\t  %3d\t   %3d\t    %3d\t     %.2f\n",pro2[k].name,pro2[k].arrivetime,pro2[k].servetime,pro2[k].finishtime,pro2[k].cyclingtime,pro2[k].wcyclingtime);
 
 }

 for(j=0;j<N;j++)
 {
  sum1+=pro2[j].cyclingtime;
  sum2+=pro2[j].wcyclingtime;
 }
 printf("平均週轉時間:%.2f\t\t平均帶權週轉時間:%.2f\n",sum1/N,sum2/N);

}

void Compare()
{
 int k,j;
 double sum1=0,sum2=0,sum3=0,sum4=0,sum5=0,sum6=0;

 printf("先來先服務演算法:\n");
 printf("程序名\t到達時間 服務時間 完成時間 週轉時間 帶權週轉\n");
 for(k=0;k<N;k++)
 {
  printf("%3c\t %3d\t  %3d\t   %3d\t    %3d\t     %.2f\n",pro[k].name,pro[k].arrivetime,pro[k].servetime,pro[k].finishtime,pro[k].cyclingtime,pro[k].wcyclingtime);
 
 }

 for(j=0;j<N;j++)
 {
  sum1+=pro[j].cyclingtime;
  sum2+=pro[j].wcyclingtime;
 }
 printf("平均週轉時間:%.2f\t\t平均帶權週轉時間:%.2f\n",sum1/N,sum2/N);


 printf("短作業優先演算法:\n");
 printf("程序名\t到達時間 服務時間 完成時間 週轉時間 帶權週轉\n");
 for(k=0;k<N;k++)
 {
  printf("%3c\t %3d\t  %3d\t   %3d\t    %3d\t     %.2f\n",pro1[k].name,pro1[k].arrivetime,pro1[k].servetime,pro1[k].finishtime,pro1[k].cyclingtime,pro1[k].wcyclingtime);
 
 }

 for(j=0;j<N;j++)
 {
  sum3+=pro1[j].cyclingtime;
  sum4+=pro1[j].wcyclingtime;
 }
 printf("平均週轉時間:%.2f\t\t平均帶權週轉時間:%.2f\n",sum3/N,sum4/N);


 printf("高響應比排程演算法:\n");
 printf("程序名\t到達時間 服務時間 完成時間 週轉時間 帶權週轉\n");
 for(k=0;k<N;k++)
 {
  printf("%3c\t %3d\t  %3d\t   %3d\t    %3d\t     %.2f\n",pro2[k].name,pro2[k].arrivetime,pro2[k].servetime,pro2[k].finishtime,pro2[k].cyclingtime,pro2[k].wcyclingtime);
 
 }

 for(j=0;j<N;j++)
 {
  sum5+=pro2[j].cyclingtime;
  sum6+=pro2[j].wcyclingtime;
 }
 printf("平均週轉時間:%.2f\t\t平均帶權週轉時間:%.2f\n",sum5/N,sum6/N);

}
void Time()
{
}
void show()
{
 printf("程序排程模擬程式\n");
 printf("1、輸入作業情況\n");
 printf("2、顯示作業情況\n");
 printf("3、先來先服務演算法\n");
 printf("4、短作業優先演算法\n");
 printf("5、高響應比優先演算法\n");
 printf("6、時間片輪轉排程演算法\n");
 printf("7、演算法結果比對\n");
 printf("0、退出\n");
}

void main()
{
 int n;
 show();
 printf("請輸入選擇:");
 scanf("%d",&n);
 while(n<=6)
 {
  switch(n)
  {
   case 0:
    break;
   case 1:
    Input();
    break;
   case 2:
    Display();
    break;
   case 3:
    Display();
    FCFS();//先來先服務演算法
    break;
   case 4:
    Display();
    sort1();
    SJF();//短作業優先演算法
    break;
   case 5:
    Display();
    HRRN();//高響應比優先演算法
    break;
   case 6:
    Compare();
    break;
  }
  if(n==0)
   break;
  printf("請輸入選擇:");
  scanf("%d",&n);
 }
}

運用結構體陣列寫的,可能不是最簡單的,但是全部正確。