天天看點

作業排程模拟程式

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


int   Number=0;                                //作業個數
float AverageTurnaroundTime=0;                //平均周轉時間
float AverageTurnaroundTimeWithWeight=0;    //平均帶權周轉時間
struct work
{
    char  Name[10];                    //工作名稱
    int   ArrivalTime;                //到達時間
    int   NeetTime;                    //所需時間
    int   StartTime;                //開始時間
    int   FinishTime;                //完成時間
    int   TurnaroundTime;            //周轉時間
    float TurnaroundTimeWithWeight;    //帶權周轉時間
    float ResponseRation;            //響應比
    int   Buff;                        //工作狀态(-2:不可進入  -1:可進入  0:進入  1:完成)
};                           
typedef work WORK;
WORK CY[32];


int   IntegerCheck(int Min,int Max);    //整數校驗子產品

void  TheMainMenu();                    //主菜單界面
void  ManualInput();
void  FCFS_Algorithm(                    //輸出子產品
);                    //先來先服務算法
void  SJF_Algorithm();                                //手動輸入子產品
void  AlgorithmSelectMenu();            //算法選擇菜單
void  Output();                //最短作業優先算法
void  HRRF_Algorithm();                    //最高響應比優先算法


main()
{
    while(1)
    {
        TheMainMenu();
    }
}

                                                            
int IntegerCheck(int Min,int Max)
{
    int n,b;
    do
    {
        while(scanf("%d",&n)!=1)
        {
            fflush(stdin);
            printf("\n\t格式錯誤!請重新輸入:");
        }
        if(n<Min||n>Max)
        {
            printf("\n\t範圍錯誤!請重新輸入<%d--%d>:",Min,Max);
            continue;
        }
        b=0;
    }while(b);
    return n;
}


void TheMainMenu()
{
    int n;
    system("cls");
    printf("\n\n\t============================ 主選菜單 ============================");
    printf("\n\n\t1.手動輸入作業資訊");
    printf("\n\n\t0.退出");
    printf("\n\n\t==================================================================");
    printf("\n\t請輸入選項<0--1>:");
    n=IntegerCheck(0,1);
    switch(n)
    {
        case 1:ManualInput();break;
        case 2:break;
        case 3:break;
        case 4:break;
        case 0:exit(0);break;
    }
}


void ManualInput()
{
    int i;
    system("cls");
    printf("\n\n\t======================== 手動輸入作業資訊 ========================");
    printf("\n\n\t==================================================================");    
    printf("\n\n\t請輸入個數<2-32>");
    Number=IntegerCheck(2,32);
    for(i=0;i<Number;i++)
    {
        printf("\n\n\t請輸入第%d個數",i+1);
        printf("\n\t================");    
        printf("\n\t作業名稱:");
        scanf("%s",&CY[i].Name);
        printf("\n\t到達時間:");
        CY[i].ArrivalTime=IntegerCheck(0,1024);
        printf("\n\t所需時間:");
        CY[i].NeetTime=IntegerCheck(1,1024);
        CY[i].StartTime=-1;
        CY[i].FinishTime=-1;
        CY[i].TurnaroundTime=-1;
        CY[i].TurnaroundTimeWithWeight=-1;
        CY[i].ResponseRation=-1;
        CY[i].Buff=-2;
    }
    AlgorithmSelectMenu();
}


void ArrivalTimeSort()
{
    int i,j;
    WORK Temp;
    printf("\n\n\t名稱\t到達\t需要");
    for(i=0;i<Number;i++)
    {
        for(j=i;j<Number;j++)
        {
            if(CY[i].ArrivalTime>CY[j].ArrivalTime)
            {
                Temp=CY[j];
                CY[j]=CY[i];
                CY[i]=Temp;
            }
        }
        printf("\n\t%s\t%d\t%d",CY[i].Name,CY[i].ArrivalTime,CY[i].NeetTime);
    }
}


void  AlgorithmSelectMenu()
{
    int n;
    system("cls");
    printf("\n\n\t========================== 算法選擇菜單 ==========================");
    ArrivalTimeSort();
    printf("\n\n\t==================================================================");
    printf("\n\n\t1.FCFS    (先來先服務      First Come First Served)");
    printf("\n\n\t2.SJF     (最短作業優先    Shortest Job First)");
    printf("\n\n\t3.HRRF    (最高響應比優先  Highest Response Ratio First)");
    printf("\n\n\t==================================================================");
    printf("\n\t請輸入選項<1--3>:");
    n=IntegerCheck(1,3);
    switch(n)
    {
        case 1:FCFS_Algorithm();break;
        case 2:SJF_Algorithm();break;
        case 3:HRRF_Algorithm();break;
    }
}


void Output()
{
    int i,j,a,b,x,suma,sumb;
    x=0;
    printf("\n\n\t==================================================================");
    printf("\n\n\t名稱\t到達\t需要\t開始\t完成\t周轉\t帶權");
    for(j=0;j<Number;j++)
    {
        if(CY[j].Buff == 0)
        {
            printf("\n\t%s\t%d\t%d\t%d"
                ,CY[j].Name,CY[j].ArrivalTime,CY[j].NeetTime,CY[j].StartTime);
        }
        else if(CY[j].Buff == 1)
        {
            x++;
            printf("\n\t%s\t%d\t%d\t%d\t%d\t%d\t%3.2f"
                ,CY[j].Name,CY[j].ArrivalTime,CY[j].NeetTime,CY[j].StartTime,CY[j].FinishTime,CY[j].TurnaroundTime,CY[j].TurnaroundTimeWithWeight);
        }
        if(x==Number)//加到作業個數
        {
            suma=0;
            sumb=0;
            printf("\n\n\t==================================================================");
            for(i=0;i<Number;i++)
            {
                a=10000*(int)CY[i].TurnaroundTime;
                suma+=a;
                b=(int)(CY[i].TurnaroundTime*10000)%10000;
                sumb+=b;
            }
            AverageTurnaroundTime=((float)(suma+sumb)/10000/Number);
            printf("\n\n\t平均周轉時間為 %4.4f",AverageTurnaroundTime);
            suma=0;
            sumb=0;
            for(i=0;i<Number;i++)
            {
                a=10000*(int)CY[i].TurnaroundTimeWithWeight;
                suma+=a;
                b=(int)(CY[i].TurnaroundTimeWithWeight*10000)%10000;
                sumb+=b;
            }
            AverageTurnaroundTimeWithWeight=((float)(suma+sumb)/10000/Number);
            printf("\n\n\t平均帶權周轉時間為 %4.4f",AverageTurnaroundTimeWithWeight);
        }
    }
    getchar();
}
 

void  FCFS_Algorithm()//先來先服務算法
{
    int i,j,x,Time;
    Time=CY[0].ArrivalTime;

    getchar();
    for(i=0;i<Number;i++)
    {
        x=1;
        while(x)
        {
            for(j=i;j<Number;j++)
            {
                if(CY[j].ArrivalTime<=Time)
                {
                    CY[j].Buff=-1;
                    x=0;
                }
            }
        }
        system("cls");
        printf("\n\n\t目前系統時間為%d",Time);
        printf("\t\t%d号作業%s進入",i+1,CY[i].Name);
        CY[i].StartTime=Time;
        CY[i].Buff=0;
        Output();
        
        while(CY[i].NeetTime>(Time-CY[i].StartTime))
        {
            Time++;
        }
        CY[i].FinishTime=Time; 
        CY[i].TurnaroundTime=CY[i].FinishTime-CY[i].ArrivalTime;
        CY[i].TurnaroundTimeWithWeight=(float)CY[i].TurnaroundTime/CY[i].NeetTime;
        CY[i].Buff=1;
        system("cls");
        printf("\n\n\t目前系統時間為%d",Time);
        printf("\t\t%d号作業%s完成",i+1,CY[i].Name);
        Output();

        if(i!=Number-1)
        {
            while(CY[i+1].ArrivalTime>Time)
            {
                Time++;
            }
        }
    }
}


void  SJF_Algorithm()//最短作業優先算法
{
    int i,j,x,Time;
    WORK Temp;
    Time=CY[0].ArrivalTime;

    getchar();
    for(i=0;i<Number;i++)
    {
        x=1;
        while(x)
        {
            for(j=i;j<Number;j++)
            {
                if(CY[j].ArrivalTime<=Time)
                {
                    CY[j].Buff=-1;
                    x=0;
                }
            }
            if(x==1)
                Time++;
        }
        for(j=i;j<Number;j++)
        {
            if((CY[i].NeetTime>CY[j].NeetTime)&&(CY[j].Buff==-1))
            {
                Temp=CY[j];
                CY[j]=CY[i];
                CY[i]=Temp;
            }
        }
        system("cls");
        printf("\n\n\t目前系統時間為%d",Time);
        printf("\t\t%d号作業%s進入",i+1,CY[i].Name);
        CY[i].StartTime=Time;
        CY[i].Buff=0;
        Output();

        while(CY[i].NeetTime>(Time-CY[i].StartTime))
        {
            Time++;
        }
        CY[i].FinishTime=Time;
        CY[i].TurnaroundTime=CY[i].FinishTime-CY[i].ArrivalTime;
        CY[i].TurnaroundTimeWithWeight=(float)CY[i].TurnaroundTime/CY[i].NeetTime;
        CY[i].Buff=1;
        system("cls");
        printf("\n\n\t目前系統時間為%d",Time);
        printf("\t\t%d号作業%s完成",i+1,CY[i].Name);
        Output();
    }
}


void  HRRF_Algorithm()//最高響應比優先算法
{
    int i,j,x,Time;
    WORK Temp;
    Time=CY[0].ArrivalTime;

    getchar();
    for(i=0;i<Number;i++)
    {
        x=1;
        while(x)
        {
            for(j=i;j<Number;j++)
            {
                if(CY[j].ArrivalTime<=Time)
                {
                    CY[j].Buff=-1;
                    CY[j].ResponseRation=(float)(1+(float)(Time-CY[j].ArrivalTime)/CY[j].NeetTime);
                    x=0;
                    printf("\n*\nCY[%d](%s).ResponseRation=%3.2f\n*\n",j,CY[j].Name,CY[j].ResponseRation);
                }
            }
            if(x==1)
                Time++;
        }
        for(j=i;j<Number;j++)
        {
            if((CY[i].ResponseRation<CY[j].ResponseRation)&&(CY[j].Buff==-1))
            {
                Temp=CY[j];
                CY[j]=CY[i];
                CY[i]=Temp;
            }
        }
        system("cls");
        printf("\n\n\t目前系統時間為%d",Time);
        printf("\t\t%d号作業%s進入",i+1,CY[i].Name);
        CY[i].StartTime=Time;
        CY[i].Buff=0;
        Output();

        while(CY[i].NeetTime>(Time-CY[i].StartTime))
        {
            Time++;
        }
        CY[i].FinishTime=Time;
        CY[i].TurnaroundTime=CY[i].FinishTime-CY[i].ArrivalTime;
        CY[i].TurnaroundTimeWithWeight=(float)CY[i].TurnaroundTime/CY[i].NeetTime;
        CY[i].Buff=1;
        system("cls");
        printf("\n\n\t目前系統時間為%d",Time);
        printf("\t\t%d号作業%s完成",i+1,CY[i].Name);
        Output();
    }
}
        
作業排程模拟程式
作業排程模拟程式
作業排程模拟程式
作業排程模拟程式
作業排程模拟程式
作業排程模拟程式
上一篇: 詞法分析