先来先服务,短作业优先,最高响应比三种算法下求平均周转和带权周转时间的实现

来源:互联网 发布:淘宝上有两家大拿韩代 编辑:程序博客网 时间:2024/04/28 12:41




codear发表于2006年04月11日 21:20:00(http://blog.csdn.net/coDear)
#include<iostream.h>
#define N 6
struct time{
    float arriveTime;
    float runTime;
    float finishTime;
    float totalTime;
    float weightTotalTime;
    char name;
};

 void InputTime(time *p)
 {
     int i;//counter
     cout<<"input name & arrive time & run time:"<<endl;
     for(i=0;i<=N-1;i++){
         float temp1,temp2;
         char name;
         cout<<"作业名:"<<endl;
         cin>>name;
         p[i].name=name;
         cout<<"到达时:"<<endl;
         cin>>temp1;
         p[i].arriveTime=temp1;
         cout<<"运行时间:"<<endl;
         cin>>temp2;
         p[i].runTime=temp2;
        
     }
         
 }
 void Print(time *p,float totalTimeSum,float weightTotalTimeSum){

     cout<<"运行次序:"<<endl;
     for(int k=0;k<=N-1;k++)
     {
         cout<<p[k].name<<" ";
        
     }
     cout<<endl;
     cout<<"平均周转时间:"<<totalTimeSum/N<<endl;
     cout<<"平均带权周转时间:"<<weightTotalTimeSum/N<<endl;
}
 void sort(time *p)
 {
     for(int i=0;i<=N-1;i++)
         for(int j=0;j<=i;j++)
             if(p[i].arriveTime<p[j].arriveTime)
             {
                 time temp;
                 temp=p[i];
                 p[i]=p[j];
                 p[j]=temp;
             }
 }

 void deal(time *p,float &totalTimeSum,float &weightTotalTimeSum)
 {
    
              int k;//counter
     for(k=0;k<=N-1;k++)
     {
         if(k==0)
             p[k].finishTime=p[k].arriveTime+p[k].runTime;
         else
             p[k].finishTime=p[k-1].finishTime+p[k].runTime;
     }

     for(k=0;k<=N-1;k++)
     {
     p[k].totalTime=p[k].finishTime-p[k].arriveTime;
     p[k].weightTotalTime=p[k].totalTime/p[k].runTime;
    
        
         totalTimeSum+=p[k].totalTime;
         weightTotalTimeSum+=p[k].weightTotalTime;
     }
 }



 void FCFS(time *p)
 {
     float totalTimeSum=0,weightTotalTimeSum=0;

     sort(p);

     deal(p,totalTimeSum,weightTotalTimeSum);

     cout<<"先来先服务:"<<endl;

Print(p,totalTimeSum,weightTotalTimeSum);

    
 }


void SWF(time *p)
 {
    
     float totalTimeSum=0,weightTotalTimeSum=0;

     sort(p);

        for(int m=0;m<N-1;m++)
        {
        
            if(m==0)
            p[m].finishTime=p[m].arriveTime+p[m].runTime;
            else
                p[m].finishTime=p[m-1].finishTime+p[m].runTime;

            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].runTime;
            int follow=m+1;
            for(int k=m+1;k<m+i;k++)
            {
                
            if(p[k+1].runTime<min)
            {min=p[k+1].runTime;
            follow=k+1;}
            
            }
            time temp;
            temp=p[m+1];
            p[m+1]=p[follow];
            p[follow]=temp;
        }
        
    

     deal(p,totalTimeSum,weightTotalTimeSum);

     cout<<"短作业优先:"<<endl;


    Print(p,totalTimeSum,weightTotalTimeSum);
}

void TRRF(time *p){
    float totalTimeSum=0,weightTotalTimeSum=0;

     sort(p);

        for(int m=0;m<N-1;m++)
        {
            
            if(m==0)
            p[m].finishTime=p[m].arriveTime+p[m].runTime;
            else
                p[m].finishTime=p[m-1].finishTime+p[m].runTime;

            int i=0;
            for(int n=m+1;n<=N-1;n++)
            {
                
                if(p[n].arriveTime<=p[m].finishTime)
                    i++;
            }
            float max=(p[m].finishTime-p[m+1].arriveTime)/p[m+1].runTime;
            int follow=m+1;
            for(int k=m+1;k<m+i;k++)
            {
                
                if(max<=(p[m].finishTime-p[k+1].arriveTime)/p[k+1].runTime){
            max=(p[m].finishTime-p[k+1].arriveTime)/p[k+1].runTime;
            follow=k+1;
                }
            
            }
            time temp;
            temp=p[m+1];
            p[m+1]=p[follow];
            p[follow]=temp;
        }
        
    

     deal(p,totalTimeSum,weightTotalTimeSum);

     cout<<"最高响应比优先:"<<endl;


    Print(p,totalTimeSum,weightTotalTimeSum);
}
        

void main(){
    
    time a[N];
    InputTime(a);
    time *b=a;time *c=a;
    FCFS(a);
    SWF(b);
    TRRF(c);

}
    
/*
input name & arrive time & run time:
作业名:
a
到达时:
0
运行时间:
6
作业名:
b
到达时:
2
运行时间:
50
作业名:
c
到达时:
5
运行时间:
20
作业名:
d
到达时:
5
运行时间:
10
作业名:
e
到达时:
12
运行时间:
40
作业名:
f
到达时:
15
运行时间:
8
先来先服务:
运行次序:
a b c d e f
平均周转时间:74.1667
平均带权周转时间:5.2425
短作业优先:
运行次序:
a d f c e b
平均周转时间:44.8333
平均带权周转时间:1.6025
最高响应比优先:
运行次序:
a d c f b e
平均周转时间:48.5
平均带权周转时间:2.0275
Press any key to continue
*/ 
原创粉丝点击