0422作业调度

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
struct jcb{
    char name[10];
    char status;
    int arrtime;//到达时间
    int id;
    int reqtime;//作业运行所需时间
    int startime;//开始时间
    int finitime;//完成时间
    int  ti;//周转时间
    float TAtime,TAWtime;//等待时间,带权周转时间
    float prio;
}job[24],jcb[24],jobarr[24];
int systime=0;
int m=0;
int intarr,intfin,intjob;//到达的作业个数,完成作业个数、未到达作业个数
int ReadFile()
{
    
    int i=0;
    FILE *fp;     //定义文件指针
    fp=fopen("F:/3.txt","r");  //打开文件
    if(fp==NULL)
    {
        printf("File open error !
");
        exit(0);
    }
    printf("
 id    作业到达时间     作业运行所需要时间
");
    while(!feof(fp))
    {
        fscanf(fp,"%d%d%d",&jcb[i].id,&jcb[i].arrtime,&jcb[i].reqtime);  //fscanf()函数将数据读入
        printf("
%3d%12d%15d
",jcb[i].id,jcb[i].arrtime,jcb[i].reqtime);  //输出到屏幕
        i++;
    }

    if(fclose(fp))     //关闭文件
    {
        printf("Can not close the file !
");
        exit(0);
    }
    m=i;
    return m;

}

//调用伪随机数的产生数据
int Pseudo_random_number()
{
    int i;
    srand((unsigned)time(0));  //参数seed是rand()的种子,用来初始化rand()的起始值。
    //输入作业数
    m=rand()%23+5;
    for(i=1; i<=m; i++)
    {
        jcb[i].id=i;
        //作业到达时间
        jcb[i].arrtime=rand()%29+1;
        //作业运行时间
        jcb[i].reqtime=rand()%7+1;
    }
    printf("
 id    作业到达时间     作业运行所需要时间
");
    for(i=1; i<=m; i++)
    {
        printf("
%3d%12d%15d
",jcb[i].id,jcb[i].arrtime,jcb[i].reqtime);
    }
    return m;

}
//先到先服务
void TheFCFS()
{
    int i,j;

    float sum=0.0,acount=0.0;
    struct jcb temp;

    
    printf("**********先来先服务算法FCFS*************
");
    //ReadFile();
    for(i=0;i<m;i++)
    {
        for(j=i+1;j<m;j++)
        {
            if(jcb[i].arrtime>jcb[j].arrtime)
            {
                temp=jcb[i];
                jcb[i]=jcb[j];
                jcb[j]=temp;
            }
        }
    }
    printf("
 id    作业到达时间     作业运行所需要时间
");
    for(i=0;i<m;i++)
    {
        printf("
%3d%12d%15d
",jcb[i].id,jcb[i].arrtime,jcb[i].reqtime);
    }
    for(i=0;i<m;i++){
        jcb[i].finitime=systime+jcb[i].reqtime;
        jcb[i].ti=jcb[i].finitime-jcb[i].arrtime;
        jcb[i].TAWtime=(float)jcb[i].ti/jcb[i].reqtime;
        systime=jcb[i].finitime;
    }
    for(i=0;i<m;i++)
    {
        sum=sum+jcb[i].ti;
        acount=acount+jcb[i].TAWtime;
    }
        
        //jcb[0].ti=jcb[0].finitime-systime;
       printf("
id  到达时间  运行时间  完成时间  周转时间  带权周转时间
");
    for(i=0;i<m;i++)
        printf("%d     %d		%d	     %d	     %d	      %.2f
",jcb[i].id,jcb[i].arrtime,jcb[i].reqtime,jcb[i].finitime,jcb[i].ti,jcb[i].TAWtime);

  
    printf("平均作业周转时间=%.2f
",sum/m);
    printf("平均作业周转时间=%.2f
",acount/m);
    printf("
");
    printf("
");

}
//计算周转时间,带权周转时间,平均周转时间
void jisuan(int i,int j){
        
    float sum=0.0,acount=0.0;
    
        for(i=0;i<m;i++){
        jcb[i].finitime=systime+jcb[i].reqtime;
        jcb[i].ti=jcb[i].finitime-jcb[i].arrtime;
        jcb[i].TAWtime=(float)jcb[i].ti/jcb[i].reqtime;
        systime=jcb[i].finitime;
    }
    for(i=0;i<m;i++)
    {
        sum=sum+jcb[i].ti;
        acount=acount+jcb[i].TAWtime;
    }
        
        //jcb[0].ti=jcb[0].finitime-systime;
       printf("
id  到达时间  运行时间  完成时间  周转时间  带权周转时间
");
for(i=0;i<m;i++)
        printf("%d     %d		%d	     %d	     %d	      %.2f
",jcb[i].id,jcb[i].arrtime,jcb[i].reqtime,jcb[i].finitime,jcb[i].ti,jcb[i].TAWtime);

  
    printf("平均作业周转时间=%.2f
",sum/m);
    printf("平均作业周转时间=%.2f
",acount/m);
    printf("
");
    printf("
");
}
//短作业优先
void TheSJF()
{
        int i,j;

    float sum=0.0,acount=0.0;
    struct jcb temp;
    printf("**********先来先服务算法SJF*************
");
    //ReadFile();
    for(i=0;i<m;i++)
    {
        for(j=i+1;j<m;j++)
        {
            if(jcb[i].arrtime>jcb[j].arrtime)
            {
                temp=jcb[i];
                jcb[i]=jcb[j];
                jcb[j]=temp;
            }
        }
    }

    printf("
 id    作业到达时间     作业运行所需要时间
");
    for(i=0;i<m;i++)
    {
        printf("
%3d%12d%15d
",jcb[i].id,jcb[i].arrtime,jcb[i].reqtime);
    }

    for(i=1;i<m;i++){
        for(j=i+1;j<m;j++){
            if(jcb[i].reqtime>jcb[j].reqtime){
                temp=jcb[i];
                jcb[i]=jcb[j];
                jcb[j]=temp;
            }
        }
    }
    jisuan(i,j);

}
//HRRF(最高响应比)算法调度 
void TheHRRF(){
        int i,j;
float sum=0.0,acount=0.0;

    struct jcb temp;
    printf("**********最高响应比算法HRRF*************
");
    //ReadFile();
    for(i=0;i<m;i++)
    {
        for(j=i+1;j<m;j++)
        {
            if(jcb[i].arrtime>jcb[j].arrtime)
            {
                temp=jcb[i];
                jcb[i]=jcb[j];
                jcb[j]=temp;
            }
        }
    }
    for(i=1;i<m;i++){
        for(j=i+1;j<m;j++){
            if(jcb[i].reqtime>jcb[j].reqtime){
                temp=jcb[i];
                jcb[i]=jcb[j];
                jcb[j]=temp;
            }
        }
    }
    printf("
 id    作业到达时间     作业运行所需要时间
");
    for(i=0;i<m;i++)
    {
        printf("
%3d%12d%15d
",jcb[i].id,jcb[i].arrtime,jcb[i].reqtime);
    }


     printf("
id    最高响应比
");
     for(j=1;j<m;j++)
    {
        jcb[j].TAtime=(float)(jcb[0].reqtime-jcb[j].arrtime);
        jcb[j].prio=1+jcb[j].TAtime/jcb[j].reqtime;
         printf("%d       %.2f
",jcb[j].id,jcb[j].prio);
    }
     for(i=1;i<m-1;i++){
          printf("
id    最高响应比
");
         for(j=i+1;j<m;j++){
             jcb[j].TAtime=jcb[j].TAtime+jcb[i].reqtime;
             jcb[j].prio=1+jcb[j].TAtime/jcb[j].reqtime;
             printf("%d       %.2f
",jcb[j].id,jcb[j].prio);
     }}
     jisuan(i,j);

}



void menu2()
{
    printf("	****************************************
");
    printf("	         1、调用键盘输入数据            
");
    printf("	         2、调用文本写入数据            
");
    printf("	         3、调用伪随机数的产生数据      
");
    printf("	         0、退出系统                    
");
    printf("	****************************************
");
    printf("	请选择菜单项:");
}

void menu(){
    printf("	*****************************************************
");
    printf("	*                       welcome                     *
");
    printf("	*****************************************************
");
    printf("	*               1、FCFS(先到先服务)算法调度       *
");
    printf("	*               2、SJF(短作业优先)算法调度        *
");
    printf("	*               3、HRRF(最高响应比)算法调度       *
");
    printf("	*               0、后退到上一级菜单                 *
");
    printf("	*****************************************************
");
    printf("请选择功能<0~5>:");
}

void insert(int n)
{
    int i,j;
    char name[10];
    int arrtime1;
    int reqtime1;
    printf("what?
");
        printf("输入作业名:");
        scanf("%s",name);
        printf("到达时间:");
        scanf("%d",&arrtime1);
        printf("要求服务时间:");
        scanf("%d",&reqtime1);
        printf("
");
    for(i=0;i<=n;i++)
    {
        if(arrtime1<job[i].arrtime)
        {
            for(j=n-1;j>=i;j--)
            {
             job[j+1].arrtime=job[j].arrtime;
             strcpy(job[j+1].name,job[j].name);
             job[j+1].reqtime=job[j].reqtime;

            }
            job[i].arrtime=arrtime1;
            strcpy(job[i].name,name);
            job[i].reqtime=reqtime1;
            //n=n+1;
            break;
        }
        if((i=n)&&(arrtime1>=job[i].arrtime))
        {
            job[i].arrtime=arrtime1;
            job[i].reqtime=reqtime1;
            strcpy(job[i].name,name);
        }
    }
    for(i=0;i<=n;i++)
    {
        printf("N %d	%s	%d	%d
",i+1,job[i].name,job[i].arrtime,job[i].reqtime);
    }
}

void Delete(int n)
{

    int i,j;
    int arrtime1;
        printf("what?
");
        printf("input the data to delete:");
        scanf("%d",&arrtime1);
    for(i=0;i<n;i++)
        {
            if(arrtime1==job[i].arrtime)
            {
            for(j=i+1;j<n;j++)
            {
                job[j-1].arrtime=job[j].arrtime;
                job[j-1].reqtime=job[j].reqtime;
                strcpy(job[j-1].name,job[j].name);
            }
        }
    }
    printf("	name	arrtime	reqtime
");
    for(i=0;i<n-1;i++)
    {
        printf("N %d	%s	%d	%d
",i+1,job[i].name,job[i].arrtime,job[i].reqtime);
    }
}
void all(int n)
{
    //int i,j;
    char ch;
    //int arrtime1;
    //int reqtime1;
    printf("Insert   or  Delete  or  Exit?");
    scanf("%s",&ch);
    if(ch=='I' || ch=='i')
    {
        insert(n);
    }
    else if(ch=='D' || ch=='d')
    {
    
        Delete(n);
        
    }
    else if(ch=='E' || ch=='e')
    {
        exit(0);

    }
}

 //调用键盘输入数据 
void input()
{
    int i,j,n;
    //char ch[10];
    struct jcb temp;
    printf("	作业个数:");
    scanf("%d",&n);
    printf("
");
    for(i=0;i<n;i++){
        printf("第%d个作业:
",i+1);
        printf("输入作业名:");
        scanf("%s",job[i].name);
        printf("到达时间:");
        scanf("%d",&job[i].arrtime);
        printf("要求服务时间:");
        scanf("%d",&job[i].reqtime);
        printf("
");
    }
    
    for(i=0;i<n;i++){
        for(j=i+1;j<n;j++){
            if(job[i].arrtime>job[j].arrtime){
                temp=job[i];
                job[i]=job[j];
                job[j]=temp;
            }
        }
    }
    printf("经按到达时间排序后,未达到队列是
");
    printf("	name	artime	rqtime
");
    for(i=0;i<n;i++){
        printf("N %d	%s	%d	%d
",i+1,job[i].name,job[i].arrtime,job[i].reqtime);
    }
    all(n);
    printf("
	现在系统时间 0:
");
}
main(){
    int n,p;
    while(1){
    menu2();
    scanf("%d",&n);
    if(n==0) break;
    switch(n){
    case 1:input();
      while(1){
        menu();
        scanf("%d",&p);
        if(p==0) break;
        switch(p){
            case 1:TheFCFS();break;
            case 2:TheSJF();break;
            case 3:TheHRRF();break;
            case 0:p=0;break;}}
        break;
        case 2:ReadFile();
              while(1){
                  menu();
                  scanf("%d",&p);
                  if(p==0) break;
                  switch(p){
                  case 1:TheFCFS();break;
                  case 2:TheSJF();break;
                  case 3:TheHRRF();break;
                case 0:p=0;break;}}
              break;
          case 3:Pseudo_random_number();
              while(1){
                     menu();
              scanf("%d",&p);
              if(p==0) break;
              switch(p){
              case 1:TheFCFS();break;
              case 2:TheSJF();break;
              case 3:TheHRRF();break;
            case 0:p=0;break;}}
              break; 
          case 0:n=0;break;
    }
    
    }
    printf("please any key to continue......");
        getch();
}

 

原文地址:https://www.cnblogs.com/4249ken/p/5419861.html