你的位置:首页 > ASP.net教程

[ASP.net教程]实验二 作业调度

#include<stdio.h>#include<stdlib.h>#include<malloc.h>#define M 24struct JCB{  char name[M];//作业名  int rt;//到达时间  float r;//响应比  int ct;//需要CPU(运行)时间  int ft;//完成时的时间  int wt;//周转时间  float awt;//加权周转时间}p[M];//输出函数void Output(int a){  int i;  printf("\n作业名 到达系统时间 所需CPU时间  完成时间 周转时间 加权周转时间\n");  for(i=0;i<a;i++)  {    printf("%s\t  ",p[i].name);    printf(" %d\t\t",p[i].rt);    printf(" %d\t\t",p[i].ct);    printf("%d\t",p[i].ft);    printf("%d\t",p[i].wt);    printf("%f\n",p[i].awt);  }}//输入函数int Input(){  int i,a,b=0;  int init,k;  int j=1;  JCB f;  do{    printf("请输入作业个数(2-24):");    scanf("%d",&a);    if(a<2||a>24)      j=0;    else break;  }while(j=1);  for(i=0;i<a;i++)  {    printf("Please enter name:");    scanf("%s",p[i].name);    printf("Please enter rt:");    scanf("%d",&p[i].rt);    printf("Please enter ct:");    scanf("%d",&p[i].ct);    p[i].ft=0;    p[i].wt=0;    p[i].awt=0;    p[i].r=0;  }  for(i=0;i<a;i++)//按到达系统时间先后排序  {    init=p[b].rt;    f=p[b];    for(k=b;k<a;k++)    {      if(p[k].rt<init)      {        f=p[k];        p[k]=p[b];        p[b]=f;          init=p[b].rt;      }    }    b++;  }  Output(a);//按到达系统时间先后排序输出  return a;}//SJF算法选择短作业int Selectwork(int t,int n){  int i,l=0;  int temp,m,k=0;  JCB a[M];  JCB b;  //寻找当前时间t到达系统还未完成的作业,用数组a[M]存储  for(i=1;i<n;i++)  {    if(p[i].rt<=t&&p[i].ft==0)    {      a[l]=p[i];      l++;      k=l;    }  }  //寻找未完成作业中最短的作业  temp=a[0].ct;  b=a[0];  for(m=0;m<k;m++)  {    if(a[m].ct<temp)    {      b=a[m];      a[m]=a[0];      a[0]=b;      temp=a[0].ct;    }  }  return a[0].ct;//返回最短作业的所需CPU时间}//HRRE算法选择响应比高的作业int Choose(int t,int n){  int i,k,l=0;  int m=0;  float r,temp;  JCB a[M];  JCB b;  //寻找当前时间t到达系统还未完成的作业,用数组a[M]存储  for(i=1;i<n;i++)  {    if(p[i].rt<=t&&p[i].ft==0)    {      a[l]=p[i];      l++;      k=l;    }  }  //计算每个未完成作业的响应比  for(i=0;i<k;i++)  {    a[i].r=1+(float)(t-a[i].rt)/(float)a[i].ct;  }  //寻找未完成作业中响应比最高的作业  temp=a[0].r;  b=a[0];  for(m=0;m<k;m++)  {    if(a[m].r>temp)    {      b=a[m];      a[m]=a[0];      a[0]=b;      temp=a[0].r;    }  }  return a[0].ct;//返回最高响应比的作业的所需CPU时间}void FCFS(){  int i,j;  int now=0;//当前时间  j=Input();  int sumwt=0;//周转时间总和  float sumawt=0;//带权周转时间总和  float avwt,avgwt;//avwt是平均周转时间,avgwt是平均带权周转时间  for(i=0;i<j;i++)  {    if(i==0)    {      now=p[i].rt;      p[i].ft=now+p[i].ct;      p[i].wt=p[i].ft-p[i].rt;      p[i].awt=p[i].wt/p[i].ct;    }    else    {      if(p[i-1].ft>p[i].rt)      {        now=p[i-1].ft;        p[i].ft=now+p[i].ct;      }      else      {        now=p[i].rt;        p[i].ft=now+p[i].ct;      }      p[i].wt=p[i].ft-p[i].rt;      p[i].awt=(float)p[i].wt/(float)p[i].ct;    }    sumwt+=p[i].wt;    sumawt+=p[i].awt;  }  avgwt=(float)sumwt/j;  avwt=sumawt/j;  Output(j);  printf("平均周转时间为:%f\n",avgwt);  printf("平均带权周转时间为:%f\n",avwt);}void SJF(){    int i=0,j=0,k=0;  j=Input();  int l,m,now;//当前时间  int a=0;  int sumwt=0;//周转时间总和  float sumawt=0;//带权周转时间总和  double avwt,avgwt;//avwt是平均周转时间,avgwt是平均带权周转时间  l=0;  int n=0;  for(i=0;i<j;i++)  {    if(i==0)    {      now=p[i].rt;      p[i].ft=p[i].rt+p[i].ct;      now=p[i].ft;    }    else    {      a=Selectwork(now,j);      //寻找最短作业的位置      for(m=0;m<j;m++)        if(p[m].ct==a&&p[m].ft==0)        {          k=m;          break;        }      p[k].ft=now+p[k].ct;//计算最短作业的完成时间      now=p[k].ft;    }  }  for(i=0;i<j;i++)  {    p[i].wt=p[i].ft-p[i].rt;    p[i].awt=(float)p[i].wt/(float)p[i].ct;    sumwt+=p[i].wt;    sumawt+=p[i].awt;  }  avgwt=(float)sumwt/j;  avwt=sumawt/j;  Output(j);  printf("平均周转时间为:%f\n",avgwt);  printf("平均带权周转时间为:%f\n",avwt);  }void HRRN(){  int i=0,j=0,k=0;  int b=0,now=0,m;  float sumwt=0;//周转时间总和  float sumawt=0;//带权周转时间总和  double avwt,avgwt;//avwt是平均周转时间,avgwt是平均带权周转时间  j=Input();  for(i=0;i<j;i++)  {    if(i==0)    {      p[i].ft=p[i].rt+p[i].ct;      now=p[i].ft;    }    else    {      b=Choose(now,j);      //寻找最高响应比的作业的位置      for(m=0;m<j;m++)        if(p[m].ct==b&&p[m].ft==0)        {          k=m;          break;        }      p[k].ft=now+p[k].ct;//计算最高响应比的作业的完成时间      now=p[k].ft;    }  }  for(i=0;i<j;i++)  {    p[i].wt=p[i].ft-p[i].rt;    p[i].awt=(float)p[i].wt/(float)p[i].ct;    sumwt+=p[i].wt;    sumawt+=p[i].awt;  }  avgwt=(float)sumwt/j;  avwt=sumawt/j;  Output(j);  printf("平均周转时间为:%f\n",avgwt);  printf("平均带权周转时间为:%f\n",avwt);}void Start(){  int d;  int j=1;  do{    printf("1.FCFS 2.SJF 3.HRRN \n请输入你需要的调度算法的序号: ");    scanf("%d",&d);    if(d<1||d>3)      j=0;    else break;  }while(j=1);  switch(d)  {  case 1:    FCFS();    break;  case 2:    SJF();    break;  case 3:    HRRN();    break;  }}int main(){  int i=1;  char a;  do{    Start();    printf("Do you want to continue?(y or n):");    scanf(" %c",&a);    if(a=='n')      break;  }while(i=1);  printf("The end!\n");  return 0;}