IMfine. 2022-05-13 21:35 采纳率: 75%
浏览 114
已结题

可以看看这个短进程优先算法哪里有问题嘛

其他的地方都没有问题,我写的这个短进程优先算法在主函数里没有运行,导致无输出不知道为什么,有没有朋友知道哪里出问题了呀

#include<stdio.h>
#include<stdlib.h>

#define MAX 10

struct task_struct
{      
    char name[10];          //进程名称     
    int number;             //进程编号     
    float come_time;         //到达时间    
    float run_begin_time;     //开始运行时间     
    float run_time;           //运行时间   
    float run_end_time;       //运行结束时间
    float turn_time;           //周转时间
    float power_time;         //带权周转时间
    int order;               //运行次序    
    int run_flag;             //调度标志   
}tasks[MAX]; 

int counter;             //实际进程个数
int fcfs();              //先来先服务
int sjf();              //短作业优先
int hrrn();             //响应比高优先
int pinput();            //进程参数输入
int poutput();           //调度结果输出 

void main() 
{

    int option;
    pinput(); 
    while(1)
    {
        
        printf("请选择调度算法(0~2):\n");
        printf("1.先来先服务\n");
        printf("2.短作业优先\n");
        printf("3.最高相应比优先\n");
        printf("0.退出\n");
        scanf("%d",&option);
        switch(option)
         { 
            case 0:      
                printf("运行结束。\n");    
                exit(0);
                break; 
            case 1:      
               printf("对进程按先来先服务调度。\n\n");     
               fcfs(); 
               poutput();     
               break;
            case 2:             
              printf("对进程按短作业优先调度。\n\n");     
              sjf();      
              poutput();     
              break;
            case 3:             
              printf("对进程按响应比高优先调度。\n\n");    
              hrrn();     
              poutput();     
              break;
        }
    }
} 

int fcfs()   //先来先服务
{ 
    for(int m=0;m<counter;m++)                //遍历对比找出进程先后顺序
    {
        int torder=1;
        for(int n=0;n<counter;n++)          
        {
            if(m==n)
            {
                n++;
            }
            if((tasks[m].come_time>tasks[n].come_time)&&(n<counter))
            {
                torder++;
            }
        }
        tasks[m].order=torder;
    }
    for(int p=1;p<=counter;p++)                //计算进程开始和结束时间
    {
        for(int k=0;k<counter;k++)
        {
            if(tasks[k].order==p)
            {
                if(p==1)
                {
                    tasks[k].run_begin_time=tasks[k].come_time;
                    tasks[k].run_end_time=tasks[k].run_begin_time+tasks[k].run_time;
                }
                else
                {
                    for(int q=0;q<counter;q++)
                    {
                        if(tasks[q].order==tasks[k].order-1)
                        {tasks[k].run_begin_time=tasks[q].run_end_time;
                        tasks[k].run_end_time=tasks[k].run_begin_time+tasks[k].run_time;}
                    }
                }
            }
        }
    }
    return 0;
}  
 
int sjf()     //短作业优先  
{
    int minindex[1000],a[1000],cou=counter,minindex0;
    float min=99999;
    for(int mm=0;mm<counter+1;mm++)
    {
        int k=0;
        float min1=99999;
        if(cou==counter)
        {
            for(int i=0;i<counter;i++)
            {
                if(tasks[i].come_time<min)
                {
                    min=tasks[i].come_time;
                    minindex0=i;
                }
            }
            for(int j=0;j<counter;j++)
            {
                while(tasks[j].come_time==tasks[minindex0].come_time)
                {
                    a[k]=j;                                            //a[]存放第一个到达的进程下标(可能有多个)
                    k++;
                    break;
                }
            }
        }
        else if(cou<counter)
        {
            for(int j1=0;j1<counter;j1++)
            {
                if(tasks[j1].run_flag==1)
                    continue;
                while(tasks[j1].come_time<=tasks[minindex[mm]].run_end_time)
                {
                    a[k]=j1;                                        
                    k++;
                    break;
                }
            }
    
        }
        for(int b=0;b<k;b++)                                    //k为第一个到达的进程的个数
        {
            if(tasks[a[b]].run_time<min1)                        //这里比较多个第一个到达的进程的运行时间,选出其中运行时间最小的进程
            {
                min1=tasks[a[b]].run_time;
                minindex[mm+1]=a[b];
            }
        }
        tasks[minindex[mm+1]].order=mm+1;
        tasks[minindex[mm+1]].run_flag=1;
        if(cou==counter)
            tasks[minindex[mm+1]].run_begin_time=tasks[minindex[mm+1]].come_time;
        else if(cou<counter)
            tasks[minindex[mm+1]].run_begin_time=tasks[minindex[mm]].run_end_time;
        tasks[minindex[mm+1]].run_end_time=tasks[minindex[mm+1]].run_begin_time+tasks[minindex[mm+1]].run_time;
        cou--;
    }
    return 0;
}  

int hrrn() /*响应比高优先*/
{  
    return 0;
}


int pinput() //进程参数输入
{
    int i;
    printf("请输入进程的数量:\n");
    scanf("%d",&counter);
    for(i=0;i<counter;i++)
    {
        printf("请输入第%d个进程信息  :\n",i+1);
        printf("请输入进程名字:\n");
        scanf("%s",tasks[i].name);
        printf("请输入进程编号:\n");   
        scanf("%d",&tasks[i].number);    
        printf("请输入进程到达时间:\n");   
        scanf("%f",&tasks[i].come_time);   
        printf("请输入进程运行时间:\n");   
        scanf("%f",&tasks[i].run_time);   
        printf("%s %f %f ",tasks[i].name,tasks[i].come_time,tasks[i].run_time);
        tasks[i].run_begin_time=0;   
        tasks[i].run_end_time=0;   
        tasks[i].order=0;   
        tasks[i].run_flag=0;
    } 
    return 0;
} 


int poutput() //调度结果输出
{
    
    int i; 
    float turn_round_time=0,f1,w=0; 
    printf("进程名字 进程编号 到达时间 运行时间 开始时间 结束时间  运行次序 周转时间\n");
    for(i=0;i<counter;i++)
    {    
        f1=tasks[i].run_end_time-tasks[i].come_time;   //完成时间-提交时间
        turn_round_time+=f1;   
        w+=(f1/tasks[i].run_time);    
        printf("%s, %d, %5.3f, %5.3f, %5.3f, %5.3f,%d,%5.3f\n",tasks[i].name,tasks[i].number,tasks[i].come_time,tasks[i].run_time,tasks[i].run_begin_time,tasks[i].run_end_time,tasks[i].order,f1);
    } 

    printf("平均周转时间=%5.2f\n",turn_round_time/counter);
    printf("平均带权周转时间=%5.2f\n",w/counter);
    return 0;
}


  • 写回答

2条回答 默认 最新

  • 张世争 2022-05-13 23:04
    关注

    算法在哪里调用的呢?算法实现在哪里?

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 5月22日
  • 已采纳回答 5月14日
  • 修改了问题 5月14日
  • 赞助了问题酬金5元 5月13日
  • 展开全部

悬赏问题

  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?
  • ¥15 求daily translation(DT)偏差订正方法的代码
  • ¥15 js调用html页面需要隐藏某个按钮
  • ¥15 ads仿真结果在圆图上是怎么读数的
  • ¥20 Cotex M3的调试和程序执行方式是什么样的?
  • ¥20 java项目连接sqlserver时报ssl相关错误