<pre class="brush:cpp;gutter:true;">// sun.cpp : 定义控制台应用程序的入口点。
//本算法包含四种调度:先到先服务,短作业优先,时间片轮转,优先级调度

#include<stdio.h>
#define N 50
void main()
{      
    void fcfs();    //先来先服务
    void sjf();        //短作业优先
    void rr();        //时间片轮转
    void yxj();        //优先级调度
    int a;
    while(true)
    {
        printf("\n\n");
        printf("\t/*************************/");
        printf("\n\t/*    1、先到先服务 调 度     */");
        printf("\n\t/*    2、短作业优先 调 度     */");
        printf("\n\t/*    3、时间片轮转 调 度     */");
        printf("\n\t/*    4、优先级优先 调 度     */");
        printf("\n\t/*    0、 退   出      */\n");
        printf("\t/*************************/");
        printf("\n\n\t请选择菜单项:\t");
        scanf("%d",&a);
        printf("\n");
        switch(a){
            case 1: fcfs();break;
            case 2: sjf();break;
            case 3: rr();break;
            case 4: yxj();break;
            default: break;
        }
        if(a<0&&a>4) break;
    }
}

/***********************先来先服务**************************/
/***********************************************************/
void fcfs()
{
    int i,j,n,min,px;   //n:进程个数  px:输出方式选择
    float sum1,sum2;
    printf("\t请输入有n个进程(0<n<=50):");
    scanf("%d",&n);
    while(n>50||n<=0)
    {
        printf("n\t请重新输入:");
        scanf("%d",&n);
    }
    printf("\n\n");
    struct Gzuo{
        int id;        //进程名字
        int dt;        //到达时刻
        int st;        //服务时间
        int wct;    //完成时刻
        float zt;    //周转时间
        float dczt;    //带权周转时间
    };
    Gzuo a[N];
    for(i=0;i<n;i++)
    {
        a[i].id=i+1;
        printf("\t进程%d 到达时间:",a[i].id);
        scanf("%d",&a[i].dt);
        printf("\t进程%d 服务时间:",a[i].id);
        scanf("%d",&a[i].st);
        printf("\n");
    }
    
    for(j=n-1;j>=0;j--)
    {  
        for(i=0;i<j;i++)
        {
            if(a[i].dt>a[i+1].dt) 
            {                
                min=a[i].id;
                a[i].id=a[i+1].id;
                a[i+1].id=min;

                min=a[i].dt;
                a[i].dt=a[i+1].dt;
                a[i+1].dt=min;
                
                min=a[i].st;
                a[i].st=a[i+1].st;
                a[i+1].st=min;  
            }
        } 
    }
    a[0].wct=a[0].dt+a[0].st;        //完成时刻=到达时刻+服务时间
    a[0].zt=(float)a[0].st;            //第一个 周转时间=服务时间
    a[0].dczt=a[0].zt/a[0].st;        //带权周转时间=周转时间/服务时间

    for(i=1;i<n;i++)
    {
        if(a[i].dt>a[i-1].wct)            //当 a[i]到达时刻>a[i-1]完成时刻
        {
            a[i].wct=a[i].dt+a[i].st;    //a[i]完成时刻=到达时刻+服务时间
            a[i].zt=(float)a[i].st;        //此时,周转时间=服务时间
            a[i].dczt=a[i].zt/a[i].st;    //带权周转时间=周转时间/服务时间
        }
        else
        {
            a[i].wct=a[i-1].wct+a[i].st;        //a[i]完成时刻=a[i-1]完成时刻+a[i]服务时间
            a[i].zt=(float)(a[i].wct-a[i].dt);    //周转时间=完成时刻-到达时刻
            a[i].dczt=a[i].zt/a[i].st;            //带权周转时间=周转时间/服务时间
        }
    }                                                                      
    
    printf("\t1、按id号依次输出\n");
    printf("\t2、按完成顺序依次输出\n");
    printf("\n\t请选择输出顺序:\t");
    scanf("%d",&px);
    printf("\nid:到达时间\t服务时间\t完成时间\t周转时间\t带权周转时间\n");
    sum1=0;
    sum2=0;
    switch(px)
    {
        case 1:   //1.按id号依次输出
        {
            for(j=0;j<n;j++)
            {    
                for(i=0;i<n;i++)
                    if(a[i].id==j+1)
                    {
                        printf("%d: %d\t\t%d\t\t%d\t\t%.0f\t\t%.2f\n",a[i].id,a[i].dt,a[i].st,a[i].wct,a[i].zt,a[i].dczt);
                        sum1+=a[i].zt;
                        sum2+=a[i].dczt;
                    }
                    
            }
            printf("\n平均周转时间:%.2f\n",sum1/n);
            printf("\n平均带权周转时间:%.2f\n\n",sum2/n);
            break;
        }  
        case 2:        //2.按完成顺序依次输出
        {      
            for(i=0;i<n;i++)
            {    
                printf("%d: %d\t\t%d\t\t%d\t\t%.0f\t\t%.2f\n",a[i].id,a[i].dt,a[i].st,a[i].wct,a[i].zt,a[i].dczt);
                sum1+=a[i].zt;
                sum2+=a[i].dczt;
            }
            printf("\n平均周转时间:%.2f\n",sum1/n);
            printf("\n平均带权周转时间:%.2f\n\n",sum2/n);
            break;
        }
        default: break;
    }
}

/**********************************短作业优先*******************************/
/***************************************************************************/
void sjf()
{
    int i,j,n,min,px;   //n:进程个数  px:输出方式选择
    int b=0,z;
    float sum1,sum2;
    printf("\n\t请输入有n个进程(0<n<=50): ");
    scanf("%d/n",&n);
    while(n>50||n<=0)
    {
        printf("n\t请重新输入:");
        scanf("%d",&n);
    }
    printf("\n");
    struct Gzuo{
        int id;            //进程名字
        int dt;            //到达时刻
        int st;            //服务时间
        int wct;        //完成时刻
        float zt;        //周转时间
        float dczt;        //带权周转时间
    };
    Gzuo a[N];
    for(i=0;i<n;i++)
    {
        a[i].id=i+1;
        printf("\t进程%d 到达时间:",a[i].id);
        scanf("%d",&a[i].dt);
        printf("\t进程%d 服务时间:",a[i].id);
        scanf("%d",&a[i].st);
        printf("\n");
    }
    
    min=a[0].dt;       
    for(j=n-1;j>=0;j--)
    {  
        for(i=0;i<j;i++)
        {
            if(a[i].dt>a[i+1].dt)   //如果a[i]的到达时刻>a[i+1]的到达时刻
            {
                min=a[i].id;
                a[i].id=a[i+1].id;
                a[i+1].id=min;

                min=a[i].dt;
                a[i].dt=a[i+1].dt;
                a[i+1].dt=min;
                
                min=a[i].st;
                a[i].st=a[i+1].st;
                a[i+1].st=min;            
            }
            if(a[i].dt==a[i+1].dt&&a[i].st>a[i+1].st)  //同时到达且a[i]更短
            {
                min=a[i].id;
                a[i].id=a[i+1].id;
                a[i+1].id=min;

                min=a[i].dt;
                a[i].dt=a[i+1].dt;
                a[i+1].dt=min;
                
                min=a[i].st;
                a[i].st=a[i+1].st;
                a[i+1].st=min;  
            }
        } 
    }
    a[0].wct=a[0].st+a[0].dt;
    a[0].zt=(float)a[0].st;
    a[0].dczt=a[0].zt/a[0].st;
    
    for(i=1;i<n;i++)
    {
        if(a[i].dt>a[0].wct) ;
        else b=b+1;
    }
    
    for(j=b-1;j>=1;j--)
    {  
        for(i=1;i<j;i++)
        {
            if(a[i].st>a[i+1].st) 
            {
                min=a[i].dt;
                a[i].dt=a[i+1].dt;
                a[i+1].dt=min;
                
                min=a[i].st;
                a[i].st=a[i+1].st;
                a[i+1].st=min;   
                
                min=a[i].id;
                a[i].id=a[i+1].id;
                a[i+1].id=min;
                
            }
        } 
    }
    
    for(i=1;i<n;i++)
    {
        if(a[i].dt>a[i-1].wct)
        {
            a[i].wct=a[i].dt+a[i].st;
            a[i].zt=(float)a[i].st;
            a[i].dczt=a[i].zt/a[i].st;
        }
        else
        {
            a[i].wct=a[i-1].wct+a[i].st;
            a[i].zt=(float)(a[i].wct-a[i].dt);
            a[i].dczt=a[i].zt/a[i].st;
        }          
        
        for(j=i+1,b=j;j<n;j++)
        {
            if(a[j].dt>a[i].wct) ;
            else b=b+1;
            
        }
        
        for(j=b-1;j>=i;j--)
        {  
            for(z=i;z<j;z++)
            {
                if(a[z].st>a[z+1].st) 
                {
                    min=a[z].dt;
                    a[z].dt=a[z+1].dt;
                    a[z+1].dt=min;
                    
                    min=a[z].st;
                    a[z].st=a[z+1].st;
                    a[z+1].st=min; 
                    
                    min=a[i].id;
                    a[i].id=a[i+1].id;
                    a[i+1].id=min;
                    
                }
            } 
        }
    }                                                                      
    printf("\n\t请选择输出顺序\n");
    printf("\t1、按id号依次输出\n");
    printf("\t2、按完成顺序依次输出\n");
    scanf("%d",&px);
    printf("\nid:到达时间\t服务时间\t完成时间\t周转时间\t带权周转时间\n");
    sum1=0;
    sum2=0;
    switch(px)
    {    
        case 1:    //1、按id号依次输出
        { 
            for(j=0;j<n;j++)
            {      
                for(i=0;i<n;i++)
                    if(a[i].id==j+1)
                    {
                        printf("%d: %d\t\t%d\t\t%d\t\t%.0f\t\t%.2f\n",a[i].id,a[i].dt,a[i].st,a[i].wct,a[i].zt,a[i].dczt);
                        sum1+=a[i].zt;
                        sum2+=a[i].dczt;
                    }
            }
            printf("\n平均周转时间:%.2f\n",sum1/n);
            printf("\n平均带权周转时间:%.2f\n\n",sum2/n);
            break;
        }  
        case 2:        //2、按完成顺序依次输出
        {      
            for(i=0;i<n;i++)
            {    
                printf("%d: %d\t\t%d\t\t%d\t\t%.0f\t\t%.2f\n",a[i].id,a[i].dt,a[i].st,a[i].wct,a[i].zt,a[i].dczt);
                sum1+=a[i].zt;
                sum2+=a[i].dczt;
            }
            printf("\n平均周转时间:%.2f\n",sum1/n);
            printf("\n平均带权周转时间:%.2f\n\n",sum2/n);
            break;
        }
        default: break;
    }
}

/***************************时间片轮转调度******************************/
/***********************************************************************/
void rr()
{
    int i,j,n,min,px,rr,time;
    float sum1,sum2;
    bool flag=true;
    printf("\n\t请输入有n个进程(0<n<=50): ");
    scanf("%d",&n);
    while(n>50||n<=0)
    {
        printf("n\t请重新输入: ");
        scanf("%d",&n);
    }
    printf("\n\n");
    printf("\t请输入时间片大小(0<rr):  ");
    scanf("%d",&rr);
    while(rr<=0)
    {
        printf("n\t请重新输入: ");
        scanf("%d",&rr);
    }
    struct Gzuo{
        int id;            //进程名字
        int dt;            //到达时刻
        int st;            //服务时间    
        int wct;        //完成时刻
        int st2;        //标志是否完成
        float zt;        //周转时间
        float dczt;        //带权周转时间
    };
    Gzuo a[N];

    for(i=0;i<n;i++)
    {
        a[i].id=i+1;
        printf("\t进程%d 到达时间:",a[i].id);
        scanf("%d",&a[i].dt);
        printf("\t进程%d 服务时间:",a[i].id);
        scanf("%d",&a[i].st);
        a[i].st2 = a[i].st;
        printf("\n");
    }
    
    for(j=n-1;j>=0;j--)
    {  
        for(i=0;i<j;i++)
        {
            if(a[i].dt>a[i+1].dt) 
            {        
                min=a[i].dt;
                a[i].dt=a[i+1].dt;
                a[i+1].dt=min;
                
                min=a[i].st;
                a[i].st=a[i+1].st;
                a[i+1].st=min; 
                
                min=a[i].st2;
                a[i].st2=a[i+1].st2;
                a[i+1].st2=min;
                
                min=a[i].id;
                a[i].id=a[i+1].id;
                a[i+1].id=min;
            }
        } 
    }
    time = a[0].dt;
    //printf("赋值后TIME值为:%d\n",time);
    min = 0;
    while(min<n)
    {
        flag = true;
        for(i = 0;i<n;i++)
            {
                if(a[i].st2>0&&a[i].dt<=time)
                flag = false;                            
            }
        for(i=0;i<n;i++)
        {
            if(a[i].st2 > 0 )
            {
                if(a[i].dt<=time)
                {
                    //printf("当前a[%d].st2值为:%d\n",i,a[i].st2);
                    a[i].st2 = a[i].st2 - rr;
                    //printf("运算后当前a[%d].st2值为:%d\n",i,a[i].st2);
                    //printf("当前TIME值为:%d\n",time);
                    time = time + rr;
                    //printf("增加之后TIME值为:%d\n",time);
                    if(a[i].st2<=0)
                    {    
                        a[i].wct = time + a[i].st2;
                        a[i].zt=(float)(a[i].wct-a[i].dt);
                        a[i].dczt=a[i].zt/a[i].st;                                            
                        min++;
                    }
                }else if(flag)
                {
                    for(i=0;i<n;i++)
                    {
                        if(a[i].st2>0&&a[i].dt>time)
                        {
                            time = a[i].dt;
                            break;
                        }    
                    }
                }        
            }
        }
    }
    printf("\t1、按id号依次输出\n");
    printf("\t2、按完成顺序依次输出\n");
    printf("\n\t请选择输出顺序:\t");
    scanf("%d",&px);
    printf("\nid:到达时间\t服务时间\t完成时间\t周转时间\t带权周转时间\n");
    sum1=0;
    sum2=0;
    switch(px)
    {
        case 2:
        {      
            for(i=0;i<n;i++)
            {    
                printf("%d: %d\t\t%d\t\t%d\t\t%.0f\t\t%.2f\n",a[i].id,a[i].dt,a[i].st,a[i].wct,a[i].zt,a[i].dczt);
                sum1+=a[i].zt;
                sum2+=a[i].dczt;
            }
            printf("\n平均周转时间:%.2f\n",sum1/n);
            printf("\n平均带权周转时间:%.2f\n\n",sum2/n);
            break;
        }
        case 1: 
        {
            for(j=0;j<n;j++)
            {    
                for(i=0;i<n;i++)
                    if(a[i].id==j+1)
                    {
                        printf("%d: %d\t\t%d\t\t%d\t\t%.0f\t\t%.2f\n",a[i].id,a[i].dt,a[i].st,a[i].wct,a[i].zt,a[i].dczt);
                        sum1+=a[i].zt;
                        sum2+=a[i].dczt;
                    }
                    
            }
            printf("\n平均周转时间:%.2f\n",sum1/n);
            printf("\n平均带权周转时间:%.2f\n\n",sum2/n);
            break;
        }  
        default: break;
    }
}





/***************************优先级调度****************************/
/*****************************************************************/
void yxj()
{
    int i,j,n,min,px;
    int b=0,z;
    float sum1,sum2;
    printf("\n\t\t请输入有n个进程(0<n<=50):\t");
    scanf("%d/n",&n);
    while(n>50||n<=0)
    {
        printf("n\t请重新输入:  ");
        scanf("%d",&n);
    }
    printf("\n");
    struct Gzuo{
        int id;            //进程名字
        int dt;            //到达时刻
        int st;            //服务时间
        int yxj;        //优先级
        int wct;        //完成时刻
        float zt;        //周转时间
        float dczt;        //带权周转时间
    };
    Gzuo a[N];
    for(i=0;i<n;i++)
    {
        a[i].id=i+1;
        printf("\t到达时间: ");
        scanf("%d",&a[i].dt);
        printf("\t服务时间: ");
        scanf("%d",&a[i].st);
        printf("\t优先级: ");
        scanf("%d",&a[i].yxj);
        printf("\n");
    }
    
    min=a[0].dt;       
    for(j=n-1;j>=0;j--)
    {  
        for(i=0;i<j;i++)
        {
            if(a[i].dt>a[i+1].dt) 
            {
                min=a[i].dt;
                a[i].dt=a[i+1].dt;
                a[i+1].dt=min;
                
                min=a[i].st;
                a[i].st=a[i+1].st;
                a[i+1].st=min;            
                
                min=a[i].id;
                a[i].id=a[i+1].id;
                a[i+1].id=min;
                
                min=a[i].yxj;
                a[i].yxj=a[i+1].yxj;
                a[i+1].yxj=min;
            }
            if(a[i].dt==a[i+1].dt&&a[i].yxj<a[i+1].yxj)
            {
                min=a[i].dt;
                a[i].dt=a[i+1].dt;
                a[i+1].dt=min;
                
                min=a[i].st;
                a[i].st=a[i+1].st;
                a[i+1].st=min;  
                
                min=a[i].id;
                a[i].id=a[i+1].id;
                a[i+1].id=min;
                
                min=a[i].yxj;
                a[i].yxj=a[i+1].yxj;
                a[i+1].yxj=min;
            }
        } 
    }
    a[0].wct=a[0].st+a[0].dt;
    a[0].zt=(float)a[0].st;
    a[0].dczt=a[0].zt/a[0].st;
    
    for(i=1;i<n;i++)
    {
        if(a[i].dt>a[0].wct) ;
        else b++;
        
    }
    
    for(j=b-1;j>=1;j--)
    {  
        for(i=1;i<j;i++)
        {
            if(a[i].yxj<a[i+1].yxj) 
            {
                min=a[i].dt;
                a[i].dt=a[i+1].dt;
                a[i+1].dt=min;
                
                min=a[i].st;
                a[i].st=a[i+1].st;
                a[i+1].st=min;   
                
                min=a[i].id;
                a[i].id=a[i+1].id;
                a[i+1].id=min;
                
                min=a[i].yxj;
                a[i].yxj=a[i+1].yxj;
                a[i+1].yxj=min;
                
            }
        } 
    }
    
    for(i=1;i<n;i++)
    {
        if(a[i].dt>a[i-1].wct)
        {
            a[i].wct=a[i].dt+a[i].st;
            a[i].zt=(float)a[i].st;
            a[i].dczt=a[i].zt/a[i].st;
        }
        else
        {
            a[i].wct=a[i-1].wct+a[i].st;
            a[i].zt=(float)(a[i].wct-a[i].dt);
            a[i].dczt=a[i].zt/a[i].st;
        }          
        
        for(j=i+1,b=j;j<n;j++)
        {
            if(a[j].dt>a[i].wct) ;
            else b=b+1;
            
        }
        
        for(j=b-1;j>=i;j--)
        {  
            for(z=i;z<j;z++)
            {
                if(a[z].yxj<a[z+1].yxj) 
                {
                    min=a[z].dt;
                    a[z].dt=a[z+1].dt;
                    a[z+1].dt=min;
                    
                    min=a[z].st;
                    a[z].st=a[z+1].st;
                    a[z+1].st=min; 
                    
                    min=a[i].id;
                    a[i].id=a[i+1].id;
                    a[i+1].id=min;
                    
                }
            } 
        }
    }                                                                      
    printf("\n\t请选择输出顺序\n");
    printf("\t1、按id号依次输出\n");
    printf("\t2、按完成顺序依次输出\n");
    scanf("%d",&px);
    printf("\nid:到达时间\t服务时间\t优先级\t完成时间\t周转时间\t带权周转时间\n");
    sum1=0;
    sum2=0;
    
    switch(px)
    {
        case 2:
        {      
            for(i=0;i<n;i++)
            {    
                printf("%d: %d\t\t%d\t\t%d\t\t%d\t\t%.0f\t\t%.2f\n",a[i].id,a[i].dt,a[i].yxj,a[i].st,a[i].wct,a[i].zt,a[i].dczt);
                sum1+=a[i].zt;
                sum2+=a[i].dczt;
            }
            printf("\n平均周转时间:%.2f\n",sum1/n);
            printf("\n平均带权周转时间:%.2f\n\n",sum2/n);
            break;
        }
        case 1:
        { 
            for(j=0;j<n;j++)
            {      
                for(i=0;i<n;i++)
                    if(a[i].id==j+1)
                    {
                        printf("%d: %d\t\t%d\t\t%d\t\t%d\t\t%.0f\t\t%.2f\n",a[i].id,a[i].dt,a[i].yxj,a[i].st,a[i].wct,a[i].zt,a[i].dczt);
                        sum1+=a[i].zt;
                        sum2+=a[i].dczt;
                    }
            }
            printf("\n平均周转时间:%.2f\n",sum1/n);
            printf("\n平均带权周转时间:%.2f\n\n",sum2/n);
            break;
        }  
        default: break;
    }
    
}

标签: none

相关文章推荐

添加新评论,含*的栏目为必填