• (哈) 四种算法 MVP!!!


    代码《look》

    //本算法包含四种调度:先到先服务,短作业优先,时间片轮转,优先级调度

    #include<stdio.h>
    #define N 50
    int main()
    {
    void fcfs(); //先来先服务
    void sjf(); //短作业优先
    void rr(); //时间片轮转
    void yxj(); //优先级调度
    int a;
    while(true)
    {
    printf(" ");
    printf(" /*************************/");
    printf(" /* 1、先到先服务 调 度 */");
    printf(" /* 2、短作业优先 调 度 */");
    printf(" /* 3、时间片轮转 调 度 */");
    printf(" /* 4、优先级优先 调 度 */");
    printf(" /* 0、 退 出 */ ");
    printf(" /*************************/");
    printf(" 请选择菜单项: ");
    scanf("%d",&a);
    printf(" ");
    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(" 请输入有n个进程(0<n<=50):");
    scanf("%d",&n);
    while(n>50||n<=0)
    {
    printf("n 请重新输入:");
    scanf("%d",&n);
    }
    printf(" ");
    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(" 进程%d 到达时间:",a[i].id);
    scanf("%d",&a[i].dt);
    printf(" 进程%d 服务时间:",a[i].id);
    scanf("%d",&a[i].st);
    printf(" ");
    }

    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(" 1、按id号依次输出 ");
    printf(" 2、按完成顺序依次输出 ");
    printf(" 请选择输出顺序: ");
    scanf("%d",&px);
    printf(" id:到达时间 服务时间 完成时间 周转时间 带权周转时间 ");
    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 %d %d %.0f %.2f ",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(" 平均周转时间:%.2f ",sum1/n);
    printf(" 平均带权周转时间:%.2f ",sum2/n);
    break;
    }
    case 2: //2.按完成顺序依次输出
    {
    for(i=0;i<n;i++)
    {
    printf("%d: %d %d %d %.0f %.2f ",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(" 平均周转时间:%.2f ",sum1/n);
    printf(" 平均带权周转时间:%.2f ",sum2/n);
    break;
    }
    default: break;
    }
    }

    /**********************************短作业优先*******************************/
    /***************************************************************************/
    void sjf()
    {
    int i,j,n,min,px; //n:进程个数 px:输出方式选择
    int b=0,z;
    float sum1,sum2;
    printf(" 请输入有n个进程(0<n<=50): ");
    scanf("%d/n",&n);
    while(n>50||n<=0)
    {
    printf("n 请重新输入:");
    scanf("%d",&n);
    }
    printf(" ");
    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(" 进程%d 到达时间:",a[i].id);
    scanf("%d",&a[i].dt);
    printf(" 进程%d 服务时间:",a[i].id);
    scanf("%d",&a[i].st);
    printf(" ");
    }

    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(" 请选择输出顺序 ");
    printf(" 1、按id号依次输出 ");
    printf(" 2、按完成顺序依次输出 ");
    scanf("%d",&px);
    printf(" id:到达时间 服务时间 完成时间 周转时间 带权周转时间 ");
    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 %d %d %.0f %.2f ",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(" 平均周转时间:%.2f ",sum1/n);
    printf(" 平均带权周转时间:%.2f ",sum2/n);
    break;
    }
    case 2: //2、按完成顺序依次输出
    {
    for(i=0;i<n;i++)
    {
    printf("%d: %d %d %d %.0f %.2f ",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(" 平均周转时间:%.2f ",sum1/n);
    printf(" 平均带权周转时间:%.2f ",sum2/n);
    break;
    }
    default: break;
    }
    }

    /***************************时间片轮转调度******************************/
    /***********************************************************************/
    void rr()
    {
    int i,j,n,min,px,rr,time;
    float sum1,sum2;
    bool flag=true;
    printf(" 请输入有n个进程(0<n<=50): ");
    scanf("%d",&n);
    while(n>50||n<=0)
    {
    printf("n 请重新输入: ");
    scanf("%d",&n);
    }
    printf(" ");
    printf(" 请输入时间片大小(0<rr): ");
    scanf("%d",&rr);
    while(rr<=0)
    {
    printf("n 请重新输入: ");
    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(" 进程%d 到达时间:",a[i].id);
    scanf("%d",&a[i].dt);
    printf(" 进程%d 服务时间:",a[i].id);
    scanf("%d",&a[i].st);
    a[i].st2 = a[i].st;
    printf(" ");
    }

    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 ",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 ",i,a[i].st2);
    a[i].st2 = a[i].st2 - rr;
    //printf("运算后当前a[%d].st2值为:%d ",i,a[i].st2);
    //printf("当前TIME值为:%d ",time);
    time = time + rr;
    //printf("增加之后TIME值为:%d ",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(" 1、按id号依次输出 ");
    printf(" 2、按完成顺序依次输出 ");
    printf(" 请选择输出顺序: ");
    scanf("%d",&px);
    printf(" id:到达时间 服务时间 完成时间 周转时间 带权周转时间 ");
    sum1=0;
    sum2=0;
    switch(px)
    {
    case 2:
    {
    for(i=0;i<n;i++)
    {
    printf("%d: %d %d %d %.0f %.2f ",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(" 平均周转时间:%.2f ",sum1/n);
    printf(" 平均带权周转时间:%.2f ",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 %d %d %.0f %.2f ",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(" 平均周转时间:%.2f ",sum1/n);
    printf(" 平均带权周转时间:%.2f ",sum2/n);
    break;
    }
    default: break;
    }
    }





    /***************************优先级调度****************************/
    /*****************************************************************/
    void yxj()
    {
    int i,j,n,min,px;
    int b=0,z;
    float sum1,sum2;
    printf(" 请输入有n个进程(0<n<=50): ");
    scanf("%d/n",&n);
    while(n>50||n<=0)
    {
    printf("n 请重新输入: ");
    scanf("%d",&n);
    }
    printf(" ");
    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(" 到达时间: ");
    scanf("%d",&a[i].dt);
    printf(" 服务时间: ");
    scanf("%d",&a[i].st);
    printf(" 优先级: ");
    scanf("%d",&a[i].yxj);
    printf(" ");
    }

    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(" 请选择输出顺序 ");
    printf(" 1、按id号依次输出 ");
    printf(" 2、按完成顺序依次输出 ");
    scanf("%d",&px);
    printf(" id:到达时间 服务时间 优先级 完成时间 周转时间 带权周转时间 ");
    sum1=0;
    sum2=0;

    switch(px)
    {
    case 2:
    {
    for(i=0;i<n;i++)
    {
    printf("%d: %d %d %d %d %.0f %.2f ",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(" 平均周转时间:%.2f ",sum1/n);
    printf(" 平均带权周转时间:%.2f ",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 %d %d %d %.0f %.2f ",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(" 平均周转时间:%.2f ",sum1/n);
    printf(" 平均带权周转时间:%.2f ",sum2/n);
    break;
    }
    default: break;
    }

    }

     

     

     

  • 相关阅读:
    ARM装配说明MCR/MRC学习
    smark和openfire即时通信代码
    Bulk Insert具体订单
    Redis测井系统
    几种任务调度的 Java 实现方法与比较
    Android中Style和Theme的使用
    高仿优酷Android客户端图片左右滑动(自动切换)
    Android GridView 一行显示数据(包括图片和文本),解决的办法是计算数据占该行的宽度是多少
    为Android GridView 设置行背景
    Android利用Filter过滤数据
  • 原文地址:https://www.cnblogs.com/1314-520/p/12710271.html
Copyright © 2020-2023  润新知