SJF HRRN FCFS 算法

SJF短作业优先 HRRN高响应比优先 FCFS先来先服务

 

源代码

#include
#include
#define LEN sizeof(struct process)
#define MAX 99
struct process{//结构体进程
    int no;
    float pri;
    float arrtime;
    float sertime;
    float strtime;
    float fintime;//=arr+ser
    float roundtime;//=fin-arr
    float aroundtime;//roun/ser
    process *next;
};
void LISTtime(struct process a[],int count){
float l,h,n;
for(int i=0;i     {                               //如果两个进程同时到达,按在屏幕先输入的先运行
        for(int j=i+1;j         { 
            if(a[j].arrtime < a[i].arrtime||a[j].arrtime==0)
            {
                l  =a[j].arrtime;            
                h  =a[j].sertime;
        n  =a[j].no;

                a[j].arrtime=a[i].arrtime;        
                a[j].sertime=a[i].sertime;
        a[j].no=a[i].no;

        a[i].no=n;
                a[i].arrtime=l;
                a[i].sertime=h;
            }
        }
    }
}
process *creat(){ //进程构造函数
    process *head;
    head=(process*)malloc(LEN);//head为头指针
    process *p1,*p2;//p1为新建指针,p2对尾指针
    head->next=NULL;
    p2=head;
    p1=(process*)malloc(LEN);
    printf("请输入进程号:\n");
    scanf("%d",&p1->no);
    printf("请输入进程到达时间:\n");
    scanf("%f",&p1->arrtime);
    printf("请输入进程需要时间:\n");
    scanf("%f",&p1->sertime);
    p1->fintime=0;
    p1->pri=0;
    while(p1->sertime!=0){
        p1->next=p2->next;
        p2->next=p1;
        p2=p1;
        p1=(process*)malloc(LEN);
        printf("请输入进程号:\n");
        scanf("%d",&p1->no);
        printf("请输入进程到达时间:\n");
        scanf("%f",&p1->arrtime);
        printf("请输入进程需要时间:\n");
        scanf("%f",&p1->sertime);
        p1->fintime=0;
        p1->pri=0;
    }
    free(p1);
    return head;
}

void PrintFS(struct process a[],int count){//FCFS和SJF输出
    int i;
        printf("      |到达时间  |服务时间  |开始时间  |完成时间  |周转时间  |带权周转时间\n");
    for(i=0;i         printf("进程%d |%f  |%f  |%f  |%f  |%f  |%f  \n",a[i].no,a[i].arrtime,a[i].sertime,a[i].strtime,a[i].fintime,a[i].roundtime,a[i].aroundtime);
    }
}
void printPf(process a[],int count){//HRRN输出
        printf("");
        printf("进程号|到达时间  |需要时间  |开始时间  |完成时间  |周转时间  |带权周转时间|进程优先级\n");
    for(int i=0;i         printf("     %d|%f  |%f  |%f  |%f  |%f  |%f  |%f\n",a[i].no,a[i].arrtime,a[i].sertime,a[i].strtime,a[i].fintime,a[i].roundtime,a

[i].aroundtime,a[i].pri);
    }
    printf("");
}
void copy(process a[],process b[],int count){//复制进程组

    for(int i=0;i                 b[i].no=a[i].no;
                b[i].arrtime=a[i].arrtime;
                b[i].sertime=a[i].sertime;
                b[i].fintime=a[i].fintime;
        }
}
void SJF(process a[],int count){//先来先服务
    int i,st=0,zero=0;
    float l,h,n;
    int time=0;
    for(i=0;i         if(a[i].arrtime==0)zero++;
        a[i].fintime=0;
        a[i].aroundtime=0;
        a[i].pri=0;
        a[i].roundtime=0;
    }
    for( i=0;i     {                          //如果两个进程同时到达,按在屏幕先输入的先运行
        for(int j=i+1;j         {    
            if(a[j].arrtime             {    
                l  =a[j].arrtime;            
                h  =a[j].sertime;
                n  =a[j].no;

                a[j].arrtime=a[i].arrtime;        
                a[j].sertime=a[i].sertime;
                a[j].no=a[i].no;

                a[i].no=n;
                a[i].arrtime=l;
                a[i].sertime=h;
            }
        }
    }
    time=a[0].arrtime;
    for( i=0;i     {                               //如果两个进程同时到达,按在屏幕先输入的先运行
        for(int j=i+1;j         { 
            if(a[j].sertime             {
                l  =a[j].arrtime;            
                h  =a[j].sertime;
                n  =a[j].no;

                a[j].arrtime=a[i].arrtime;        
                a[j].sertime=a[i].sertime;
                a[j].no=a[i].no;

                a[i].no=n;
                a[i].arrtime=l;
                a[i].sertime=h;
            }
        }
    }
    while(st         for(i=0;i             if(a[i].arrtime<=time&&a[i].fintime==0){
                a[i].fintime=time+a[i].sertime;
                a[i].strtime=time;
                a[i].roundtime=a[i].fintime-a[i].arrtime;
                a[i].aroundtime=a[i].roundtime/a[i].sertime;
                time=a[i].fintime;
                st++;
                for(int i=st-1;i                     {                               //如果两个进程同时到达,按在屏幕先输入的先运行
                        for(int j=i+1;j                         { 
                            if(a[j].sertime

[i].fintime==0)
                            {
                                l  =a[j].arrtime;            
                                h  =a[j].sertime;
                                n  =a[j].no;

                                a[j].arrtime=a[i].arrtime;        
                                a[j].sertime=a[i].sertime;
                                a[j].no=a[i].no;

                                a[i].no=n;
                                a[i].arrtime=l;
                                a[i].sertime=h;
                            }
                        }
                    }
                }
            if(a[i+1].arrtime>=time&&a[i+1].fintime==0){
                time=a[i+1].arrtime;
                for(int i=st-1;i                     {                               //如果两个进程同时到达,按在屏幕先输入的先运行
                        for(int j=i+1;j                         { 
                            if(a[j].sertime

[i].fintime==0)
                            {
                                l  =a[j].arrtime;            
                                h  =a[j].sertime;
                                n  =a[j].no;

                                a[j].arrtime=a[i].arrtime;        
                                a[j].sertime=a[i].sertime;
                                a[j].no=a[i].no;

                                a[i].no=n;
                                a[i].arrtime=l;
                                a[i].sertime=h;
                            }
                        }
                    }
                }
            }
    }
}
void HRRN(struct process a[],int count){//高响应比优先
                //p为指针头 及只记录队列首地址的指针
    float time=0,m=0;//m为优先级标志
    int i=0;
    float l,h,n;
    float ap[99];//记录优先级
    int count1=count;//记录优先级参数
    int ai=count;//未完成进程数标志
    for(i=0;i         a[i].fintime=0;
        a[i].aroundtime=0;
        a[i].pri=0;
        a[i].roundtime=0;
    }
    for( i=0;i     {                          //如果两个进程同时到达,按在屏幕先输入的先运行
        for(int j=i+1;j         {    
            if(a[j].arrtime             {    
                l  =a[j].arrtime;            
                h  =a[j].sertime;
                n  =a[j].no;

                a[j].arrtime=a[i].arrtime;        
                a[j].sertime=a[i].sertime;
                a[j].no=a[i].no;

                a[i].no=n;
                a[i].arrtime=l;
                a[i].sertime=h;
            }
        }
    }
    time=a[0].arrtime;
    for(i=0;i         if(a[i].fintime==0){//为每一个未完成的进程计算优先级
            a[i].pri=(time+a[i].sertime)/a[i].sertime;
            ap[i]=a[i].pri;
            }
    }
    for( i=0;i     {    
        float l;
        for(int j=i+1;j         { 
            if(ap[j]<=ap[i])
            {
                l =ap[j];          
                ap[j]=ap[i];      
                ap[i]=l;
            }
        }
    }
    m=ap[count-1];//记录最大优先级
    while(ai>0){//有无未完成进程
                for(i=0;i                     if(a[i].pri==m&&a[i].fintime==0){//服务
                        if(time                         {
                        a[i].fintime=time+a[i].sertime;
                        a[i].strtime=time;
                        a[i].roundtime=a[i].fintime-a[i].arrtime;
                        a[i].aroundtime=a[i].roundtime/a[i].sertime;
                        time=a[i].fintime;
                        ai--;break;
                        }
                    }
                }
                    for( i=0;i                     {    
                        ap[i]=0;
                    }
                    for(i=0;i                             if(a[i].fintime==0&&a[i].arrtime<=time){//为每一个未完成且到达的进程计算优先级
                            a[i].pri=(time-a[i].arrtime+a[i].sertime)/a[i].sertime;
                            ap[i]=a[i].pri;
                            }
                            if(a[i+1].fintime==0&&a[i+1].arrtime>=time&&a[i].fintime!=0){//如果当前进程已完成
                            //下一个应该到达的进程的到达时间大于当前时间
                            a[i+1].pri=(a[i+1].sertime)/a[i+1].sertime;
                            ap[i+1]=a[i+1].pri;
                            }
                    }
                    for( i=0;i                     {    
                            float l;
                            for(int j=i+1;j                             { 
                                if(ap[j]<=ap[i])
                                {
                                l =ap[j];          
                                ap[j]=ap[i];      
                                ap[i]=l;
                                }
                            }
                    }
                    m=ap[count-1];//记录最大优先级
    }
}
void FCFS(struct process a[],int count){//先来先服务
    int i;
    a[0].fintime=a[0].arrtime+a[0].sertime;
    a[0].strtime=a[0].arrtime;
    a[0].roundtime=a[0].fintime-a[0].arrtime;
    a[0].aroundtime=a[0].roundtime/a[0].sertime;
    for(i=1;i         if(a[i].arrtime         a[i].fintime=a[i-1].fintime+a[i].sertime;
        a[i].strtime=a[i-1].fintime;
        a[i].roundtime=a[i].fintime-a[i].arrtime;
        a[i].aroundtime=a[i].roundtime/a[i].sertime;
        }
        else{
        a[i].fintime=a[i].arrtime+a[i].sertime;
        a[i].strtime=a[i].arrtime;
        a[i].roundtime=a[i].fintime-a[i].arrtime;
        a[i].aroundtime=a[i].roundtime/a[i].sertime;
        }
        
    }
}
void main(){
    int count=0;
    int flag=0;
    process af[MAX];//fcfs
    process bs[MAX];//sjf
    process ch[MAX];//hrrn
    process *head;
    printf("请输入进程 服务时间为0停止\n");
    head=creat();
        {
        process *p;
        int i=0;
        p=head->next;
            while(p!=NULL){
                af[i].no=p->no;
                af[i].arrtime=p->arrtime;
                af[i].sertime=p->sertime;
                af[i].fintime=p->fintime;
                p=p->next;
                i++;
                count++;
            }
        }
        copy(af,bs,count);
        copy(af,ch,count);
    while(flag!=4){
        printf("请选择算法: 1 FCFS 2 SJF 3 HRRN 4退出 \n");
        scanf("%d",&flag);
        switch(flag){
        case 1:{LISTtime(af,count);FCFS(af,count);PrintFS(af,count);break;}
        case 2:{SJF(bs,count);PrintFS(bs,count);break;}
        case 3:    {HRRN(ch,count);printPf(ch,count);break;}
        case 4: break;
        default :printf("输入错误!");break;
        }
    }

}

这个程序可以运行出来但是我想知道有什么错误,希望有人能看到我这篇帖子,指出我的错误和不足

你可能感兴趣的:(SJF HRRN FCFS 算法)