• 实验二


    源程序名:作业调度.cpp

    1. 1.      原理分析及流程图

    存储结构:结构体数组。

    主要算法:排序算法跟最大值算法

    关键函数:循环嵌套

    1. 2.      主要程序段及其解释:

    看提交的代码

    复制代码
    复制代码
      1 #include<stdio.h>
      2 #include<stdlib.h>
      3 #include <conio.h>
      4 
      5 
      6 struct Job { 
      7     //定义作业控制块JCB  
      8     char name[10];        //作业名    
      9     float subtime;        //作业提交时间   
     10     float runtime;        //作业所需的运行时间
     11     
     12        float Tb;             //作业运行时刻     
     13        float Tc;             //作业完成时刻    
     14        float Ti;             //周转时间    
     15        float Wi;            //带权周转时间 
     16        
     17 }; 
     18 struct Job job[24]={0};
     19 
     20 int input(Job *j,int n);//输入作业内容
     21 void output(Job *j,int n);//输出作业内容
     22 void FCFS(Job *j,int n);
     23 float addallruntime(Job *j,int n);//得到总的时间
     24 void SJF(Job *j,int n,float allruntime);
     25 void HRRF(Job *j,int n,float allruntime);
     26 int main()
     27 {
     28     int n=0;
     29     int i;
     30     float a=0.0,b=0.0;//a存放作业平均周转时间,b存放平均带权周转时间
     31     float allruntime=0.0;
     32     printf("*********欢迎使用作业调度模拟系统***********
    ");
     33     n=input(job,n);
     34     allruntime=addallruntime(job,n);
     35           
     36           printf("
    1.FCFS  2.SJF   3.HRN");
     37           printf("
    请选择作业调度算法:");
     38           scanf("%d",&i);
     39           if(i==1)
     40           {
     41               FCFS(job,n);
     42           }
     43           else if(i==2)
     44           {
     45               SJF(job,n,allruntime);
     46           }else if(i==3)
     47           {
     48               HRRF(job,n,allruntime);
     49           }
     50           else
     51           {
     52               
     53           }
     54           
     55           printf("
    *******运行结果*********"); 
     56           
     57           output(job,n);
     58           for(i=0;i<n;i++)
     59           {
     60               a=a+job[i].Ti;
     61           }
     62           a=a/n;
     63           printf("
    此调度的平均周转时间:%f",a); 
     64           for(i=0;i<n;i++)
     65           {
     66               b=b+job[i].Wi;
     67           }
     68           b=b/n;
     69           printf("
    此调度的带权平均周转时间:%f
    ",b); 
     70           
     71           return 0;
     72 }
     73 int input(Job *j,int n)//输入作业
     74 {
     75     
     76     int i;
     77     printf("请输入作业数:");
     78     scanf("%d",&n);
     79     for(i=0;i<n;i++)
     80     {
     81         printf("
    作业号%d:",i);
     82         printf("
    请输入作业名");
     83         scanf("%s",job[i].name);
     84         
     85         
     86         printf("
    请输入作业提交时刻");
     87         scanf("%f",&job[i].subtime);
     88         
     89         printf("
    请输入作业运行时间");
     90         scanf("%f",&job[i].runtime);
     91         
     92         
     93     }
     94     
     95     return n;
     96     
     97 }
     98 void output(Job *j,int n)//打印输出作业信息
     99 
    100 {
    101     int i;
    102     printf("
    各个作业的情况");
    103     printf("
    作业名"); 
    104     
    105           printf("  作业运行时刻");
    106           printf("  作业完成时刻");
    107           printf("  周转时间");
    108           printf("  带权周转时间");
    109           
    110           
    111           
    112           for(i=0;i<n;i++)
    113           {
    114               
    115               printf("
    %s",j[i].name);
    116               
    117               printf("     %f",j[i].Tb);
    118               printf("     %f",j[i].Tc);
    119               printf("     %f",j[i].Ti);
    120               printf("     %f",j[i].Wi);
    121           }
    122           
    123 }
    124 
    125 float addallruntime(Job *j,int n)//得到所有作业运行时间
    126 {
    127     int i;
    128     float allruntime=0.0;
    129           for(i=0;i<n;i++)
    130           {
    131               
    132               
    133               allruntime=allruntime+job[i].runtime;
    134           }
    135           return allruntime;
    136 }
    137 
    138 void FCFS(Job *j,int n)
    139 {
    140     int i;
    141     j[0].Tb=j[0].subtime;
    142     j[0].Tc=j[0].Tb+j[0].runtime;
    143     j[0].Ti=j[0].Tc-j[0].subtime;
    144     j[0].Wi=j[0].Ti/j[0].runtime;
    145     for(i=1;i<n;i++)
    146     {
    147         
    148         j[i].Tb=j[i-1].Tc;
    149         j[i].Tc=j[i].Tb+j[i].runtime;
    150         j[i].Ti=j[i].Tc-j[i].subtime;
    151         j[i].Wi=j[i].Ti/j[i].runtime;
    152         
    153     }
    154 }
    155 void SJF(Job *j,int n,float allruntime)
    156 {
    157     float mintime=0;
    158     Job jtemp={0};
    159     
    160     int min=0;
    161     
    162     int startwork=0;
    163     float i;
    164     int k;
    165     for(i=0;i<allruntime;)
    166     {
    167         mintime=j[startwork].runtime;//假设一个剩余时间的最小值
    168         for(k=startwork;k<n;k++)
    169         {
    170             
    171             if(j[k].runtime<=mintime&&j[k].subtime<=i)//此作业的剩余时间更少则将其记为最少
    172             {
    173                 mintime=j[k].runtime;
    174                 min=k;
    175             }
    176             
    177         }
    178         j[min].Tb=i;
    179         
    180         j[min].Tc=j[min].Tb+j[min].runtime;
    181         j[min].Ti=j[min].Tc-j[min].subtime;
    182         j[min].Wi=j[min].Ti/j[min].runtime;
    183         
    184         jtemp=j[startwork];
    185         j[startwork]=j[min];
    186         j[min]=jtemp;
    187         
    188         startwork++;
    189         
    190         i=i+mintime;
    191     }
    192     
    193 }
    194 void HRRF(Job *j,int n,float allruntime)
    195 {
    196     
    197     float maxrb=0;
    198     Job jtemp={0};
    199     
    200     int z=0;
    201     float time=0;
    202     int startwork=0;
    203     float i;
    204     int k;
    205     for(i=0;i<allruntime;)
    206     {
    207         maxrb=(i-j[startwork].subtime)/j[startwork].runtime+1;//假设是最高响应比
    208         
    209         for(k=startwork;k<n;k++)
    210         {
    211             
    212             
    213             
    214             if(j[k].subtime<=i&&(i-j[k].subtime)/j[k].runtime+1>=maxrb)//此作业的最高响应比更高,则将其记为更高
    215             {
    216                 time=j[k].runtime;
    217                 
    218                 z=k;
    219             }
    220             
    221         }
    222         
    223         
    224         j[z].Tb=i;
    225         j[z].Tc=j[z].Tb+j[z].runtime;
    226         j[z].Ti=j[z].Tc-j[z].subtime;
    227         j[z].Wi=j[z].Ti/j[z].runtime;
    228         
    229         jtemp=j[startwork];
    230         j[startwork]=j[z];
    231         j[z]=jtemp;
    232         
    233         
    234         
    235         startwork++;
    236         i=i+time;
    237     }
    238 }
    
    
  • 相关阅读:
    JAVA课程设计+五子棋游戏
    201521123059 《Java程序设计》第十四周学习总结
    201521123059 《Java程序设计》第十三周学习总结
    软工个人总结
    alpha阶段个人总结
    centos 下构建lamp环境
    软工15作业3——案例分析
    结对编程
    201521123058 软工阅读第二次作业
    软工阅读作业1(201521123058 李绍乐)
  • 原文地址:https://www.cnblogs.com/44ZBW/p/4535048.html
Copyright © 2020-2023  润新知