Tututou. 2022-05-13 21:35 采纳率: 66.7%
浏览 107
已结题

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

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

#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条回答

      报告相同问题?

      相关推荐 更多相似问题

      问题事件

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

      悬赏问题

      • ¥15 内存管理的一段代码不是很理解
      • ¥20 打开anaconda时卡在Loading applications无法进入界面
      • ¥15 网页超时时间设置失效
      • ¥15 有关绿色信贷毕业论文的问题
      • ¥30 关于#机器人#的问题,如何解决?
      • ¥15 求MATLAB函数ScalarLayerDisplay的代码
      • ¥15 安卓如何自动执行检测到的NFC标签,无需再点确认
      • ¥15 pyHM库mouse模块的ValueError错误
      • ¥15 python opencv 摄像头 传感器
      • ¥30 eMMC&Android&C&Linux