#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();
}
}
作業排程模拟程式
作業排程模拟程式
作業排程模拟程式
作業排程模拟程式
作業排程模拟程式
作業排程模拟程式