// sun.cpp : 定义控制台应用程序的入口点。
//本算法包含四种调度:先到先服务,短作业优先,时间片轮转,优先级调度
#include<stdio.h>
#define N 50
void main()
{
void fcfs(); //先来先服务
void sjf(); //短作业优先
void rr(); //时间片轮转
void yxj(); //优先级调度
int a;
while(true)
{
printf("\n\n");
printf("\t/*************************/");
printf("\n\t/* 1、先到先服务 调 度 */");
printf("\n\t/* 2、短作业优先 调 度 */");
printf("\n\t/* 3、时间片轮转 调 度 */");
printf("\n\t/* 4、优先级优先 调 度 */");
printf("\n\t/* 0、 退 出 */\n");
printf("\t/*************************/");
printf("\n\n\t请选择菜单项:\t");
scanf("%d",&a);
printf("\n");
switch(a){
case 1: fcfs();break;
case 2: sjf();break;
case 3: rr();break;
case 4: yxj();break;
default: break;
}
if(a<0&&a>4) break;
}
}
/***********************先来先服务**************************/
/***********************************************************/
void fcfs()
{
int i,j,n,min,px; //n:进程个数 px:输出方式选择
float sum1,sum2;
printf("\t请输入有n个进程(0<n<=50):");
scanf("%d",&n);
while(n>50||n<=0)
{
printf("n\t请重新输入:");
scanf("%d",&n);
}
printf("\n\n");
struct Gzuo{
int id; //进程名字
int dt; //到达时刻
int st; //服务时间
int wct; //完成时刻
float zt; //周转时间
float dczt; //带权周转时间
};
Gzuo a[N];
for(i=0;i<n;i++)
{
a[i].id=i+1;
printf("\t进程%d 到达时间:",a[i].id);
scanf("%d",&a[i].dt);
printf("\t进程%d 服务时间:",a[i].id);
scanf("%d",&a[i].st);
printf("\n");
}
for(j=n-1;j>=0;j--)
{
for(i=0;i<j;i++)
{
if(a[i].dt>a[i+1].dt)
{
min=a[i].id;
a[i].id=a[i+1].id;
a[i+1].id=min;
min=a[i].dt;
a[i].dt=a[i+1].dt;
a[i+1].dt=min;
min=a[i].st;
a[i].st=a[i+1].st;
a[i+1].st=min;
}
}
}
a[0].wct=a[0].dt+a[0].st; //完成时刻=到达时刻+服务时间
a[0].zt=(float)a[0].st; //第一个 周转时间=服务时间
a[0].dczt=a[0].zt/a[0].st; //带权周转时间=周转时间/服务时间
for(i=1;i<n;i++)
{
if(a[i].dt>a[i-1].wct) //当 a[i]到达时刻>a[i-1]完成时刻
{
a[i].wct=a[i].dt+a[i].st; //a[i]完成时刻=到达时刻+服务时间
a[i].zt=(float)a[i].st; //此时,周转时间=服务时间
a[i].dczt=a[i].zt/a[i].st; //带权周转时间=周转时间/服务时间
}
else
{
a[i].wct=a[i-1].wct+a[i].st; //a[i]完成时刻=a[i-1]完成时刻+a[i]服务时间
a[i].zt=(float)(a[i].wct-a[i].dt); //周转时间=完成时刻-到达时刻
a[i].dczt=a[i].zt/a[i].st; //带权周转时间=周转时间/服务时间
}
}
printf("\t1、按id号依次输出\n");
printf("\t2、按完成顺序依次输出\n");
printf("\n\t请选择输出顺序:\t");
scanf("%d",&px);
printf("\nid:到达时间\t服务时间\t完成时间\t周转时间\t带权周转时间\n");
sum1=0;
sum2=0;
switch(px)
{
case 1: //1.按id号依次输出
{
for(j=0;j<n;j++)
{
for(i=0;i<n;i++)
if(a[i].id==j+1)
{
printf("%d: %d\t\t%d\t\t%d\t\t%.0f\t\t%.2f\n",a[i].id,a[i].dt,a[i].st,a[i].wct,a[i].zt,a[i].dczt);
sum1+=a[i].zt;
sum2+=a[i].dczt;
}
}
printf("\n平均周转时间:%.2f\n",sum1/n);
printf("\n平均带权周转时间:%.2f\n\n",sum2/n);
break;
}
case 2: //2.按完成顺序依次输出
{
for(i=0;i<n;i++)
{
printf("%d: %d\t\t%d\t\t%d\t\t%.0f\t\t%.2f\n",a[i].id,a[i].dt,a[i].st,a[i].wct,a[i].zt,a[i].dczt);
sum1+=a[i].zt;
sum2+=a[i].dczt;
}
printf("\n平均周转时间:%.2f\n",sum1/n);
printf("\n平均带权周转时间:%.2f\n\n",sum2/n);
break;
}
default: break;
}
}
/**********************************短作业优先*******************************/
/***************************************************************************/
void sjf()
{
int i,j,n,min,px; //n:进程个数 px:输出方式选择
int b=0,z;
float sum1,sum2;
printf("\n\t请输入有n个进程(0<n<=50): ");
scanf("%d/n",&n);
while(n>50||n<=0)
{
printf("n\t请重新输入:");
scanf("%d",&n);
}
printf("\n");
struct Gzuo{
int id; //进程名字
int dt; //到达时刻
int st; //服务时间
int wct; //完成时刻
float zt; //周转时间
float dczt; //带权周转时间
};
Gzuo a[N];
for(i=0;i<n;i++)
{
a[i].id=i+1;
printf("\t进程%d 到达时间:",a[i].id);
scanf("%d",&a[i].dt);
printf("\t进程%d 服务时间:",a[i].id);
scanf("%d",&a[i].st);
printf("\n");
}
min=a[0].dt;
for(j=n-1;j>=0;j--)
{
for(i=0;i<j;i++)
{
if(a[i].dt>a[i+1].dt) //如果a[i]的到达时刻>a[i+1]的到达时刻
{
min=a[i].id;
a[i].id=a[i+1].id;
a[i+1].id=min;
min=a[i].dt;
a[i].dt=a[i+1].dt;
a[i+1].dt=min;
min=a[i].st;
a[i].st=a[i+1].st;
a[i+1].st=min;
}
if(a[i].dt==a[i+1].dt&&a[i].st>a[i+1].st) //同时到达且a[i]更短
{
min=a[i].id;
a[i].id=a[i+1].id;
a[i+1].id=min;
min=a[i].dt;
a[i].dt=a[i+1].dt;
a[i+1].dt=min;
min=a[i].st;
a[i].st=a[i+1].st;
a[i+1].st=min;
}
}
}
a[0].wct=a[0].st+a[0].dt;
a[0].zt=(float)a[0].st;
a[0].dczt=a[0].zt/a[0].st;
for(i=1;i<n;i++)
{
if(a[i].dt>a[0].wct) ;
else b=b+1;
}
for(j=b-1;j>=1;j--)
{
for(i=1;i<j;i++)
{
if(a[i].st>a[i+1].st)
{
min=a[i].dt;
a[i].dt=a[i+1].dt;
a[i+1].dt=min;
min=a[i].st;
a[i].st=a[i+1].st;
a[i+1].st=min;
min=a[i].id;
a[i].id=a[i+1].id;
a[i+1].id=min;
}
}
}
for(i=1;i<n;i++)
{
if(a[i].dt>a[i-1].wct)
{
a[i].wct=a[i].dt+a[i].st;
a[i].zt=(float)a[i].st;
a[i].dczt=a[i].zt/a[i].st;
}
else
{
a[i].wct=a[i-1].wct+a[i].st;
a[i].zt=(float)(a[i].wct-a[i].dt);
a[i].dczt=a[i].zt/a[i].st;
}
for(j=i+1,b=j;j<n;j++)
{
if(a[j].dt>a[i].wct) ;
else b=b+1;
}
for(j=b-1;j>=i;j--)
{
for(z=i;z<j;z++)
{
if(a[z].st>a[z+1].st)
{
min=a[z].dt;
a[z].dt=a[z+1].dt;
a[z+1].dt=min;
min=a[z].st;
a[z].st=a[z+1].st;
a[z+1].st=min;
min=a[i].id;
a[i].id=a[i+1].id;
a[i+1].id=min;
}
}
}
}
printf("\n\t请选择输出顺序\n");
printf("\t1、按id号依次输出\n");
printf("\t2、按完成顺序依次输出\n");
scanf("%d",&px);
printf("\nid:到达时间\t服务时间\t完成时间\t周转时间\t带权周转时间\n");
sum1=0;
sum2=0;
switch(px)
{
case 1: //1、按id号依次输出
{
for(j=0;j<n;j++)
{
for(i=0;i<n;i++)
if(a[i].id==j+1)
{
printf("%d: %d\t\t%d\t\t%d\t\t%.0f\t\t%.2f\n",a[i].id,a[i].dt,a[i].st,a[i].wct,a[i].zt,a[i].dczt);
sum1+=a[i].zt;
sum2+=a[i].dczt;
}
}
printf("\n平均周转时间:%.2f\n",sum1/n);
printf("\n平均带权周转时间:%.2f\n\n",sum2/n);
break;
}
case 2: //2、按完成顺序依次输出
{
for(i=0;i<n;i++)
{
printf("%d: %d\t\t%d\t\t%d\t\t%.0f\t\t%.2f\n",a[i].id,a[i].dt,a[i].st,a[i].wct,a[i].zt,a[i].dczt);
sum1+=a[i].zt;
sum2+=a[i].dczt;
}
printf("\n平均周转时间:%.2f\n",sum1/n);
printf("\n平均带权周转时间:%.2f\n\n",sum2/n);
break;
}
default: break;
}
}
/***************************时间片轮转调度******************************/
/***********************************************************************/
void rr()
{
int i,j,n,min,px,rr,time;
float sum1,sum2;
bool flag=true;
printf("\n\t请输入有n个进程(0<n<=50): ");
scanf("%d",&n);
while(n>50||n<=0)
{
printf("n\t请重新输入: ");
scanf("%d",&n);
}
printf("\n\n");
printf("\t请输入时间片大小(0<rr): ");
scanf("%d",&rr);
while(rr<=0)
{
printf("n\t请重新输入: ");
scanf("%d",&rr);
}
struct Gzuo{
int id; //进程名字
int dt; //到达时刻
int st; //服务时间
int wct; //完成时刻
int st2; //标志是否完成
float zt; //周转时间
float dczt; //带权周转时间
};
Gzuo a[N];
for(i=0;i<n;i++)
{
a[i].id=i+1;
printf("\t进程%d 到达时间:",a[i].id);
scanf("%d",&a[i].dt);
printf("\t进程%d 服务时间:",a[i].id);
scanf("%d",&a[i].st);
a[i].st2 = a[i].st;
printf("\n");
}
for(j=n-1;j>=0;j--)
{
for(i=0;i<j;i++)
{
if(a[i].dt>a[i+1].dt)
{
min=a[i].dt;
a[i].dt=a[i+1].dt;
a[i+1].dt=min;
min=a[i].st;
a[i].st=a[i+1].st;
a[i+1].st=min;
min=a[i].st2;
a[i].st2=a[i+1].st2;
a[i+1].st2=min;
min=a[i].id;
a[i].id=a[i+1].id;
a[i+1].id=min;
}
}
}
time = a[0].dt;
//printf("赋值后TIME值为:%d\n",time);
min = 0;
while(min<n)
{
flag = true;
for(i = 0;i<n;i++)
{
if(a[i].st2>0&&a[i].dt<=time)
flag = false;
}
for(i=0;i<n;i++)
{
if(a[i].st2 > 0 )
{
if(a[i].dt<=time)
{
//printf("当前a[%d].st2值为:%d\n",i,a[i].st2);
a[i].st2 = a[i].st2 - rr;
//printf("运算后当前a[%d].st2值为:%d\n",i,a[i].st2);
//printf("当前TIME值为:%d\n",time);
time = time + rr;
//printf("增加之后TIME值为:%d\n",time);
if(a[i].st2<=0)
{
a[i].wct = time + a[i].st2;
a[i].zt=(float)(a[i].wct-a[i].dt);
a[i].dczt=a[i].zt/a[i].st;
min++;
}
}else if(flag)
{
for(i=0;i<n;i++)
{
if(a[i].st2>0&&a[i].dt>time)
{
time = a[i].dt;
break;
}
}
}
}
}
}
printf("\t1、按id号依次输出\n");
printf("\t2、按完成顺序依次输出\n");
printf("\n\t请选择输出顺序:\t");
scanf("%d",&px);
printf("\nid:到达时间\t服务时间\t完成时间\t周转时间\t带权周转时间\n");
sum1=0;
sum2=0;
switch(px)
{
case 2:
{
for(i=0;i<n;i++)
{
printf("%d: %d\t\t%d\t\t%d\t\t%.0f\t\t%.2f\n",a[i].id,a[i].dt,a[i].st,a[i].wct,a[i].zt,a[i].dczt);
sum1+=a[i].zt;
sum2+=a[i].dczt;
}
printf("\n平均周转时间:%.2f\n",sum1/n);
printf("\n平均带权周转时间:%.2f\n\n",sum2/n);
break;
}
case 1:
{
for(j=0;j<n;j++)
{
for(i=0;i<n;i++)
if(a[i].id==j+1)
{
printf("%d: %d\t\t%d\t\t%d\t\t%.0f\t\t%.2f\n",a[i].id,a[i].dt,a[i].st,a[i].wct,a[i].zt,a[i].dczt);
sum1+=a[i].zt;
sum2+=a[i].dczt;
}
}
printf("\n平均周转时间:%.2f\n",sum1/n);
printf("\n平均带权周转时间:%.2f\n\n",sum2/n);
break;
}
default: break;
}
}
/***************************优先级调度****************************/
/*****************************************************************/
void yxj()
{
int i,j,n,min,px;
int b=0,z;
float sum1,sum2;
printf("\n\t\t请输入有n个进程(0<n<=50):\t");
scanf("%d/n",&n);
while(n>50||n<=0)
{
printf("n\t请重新输入: ");
scanf("%d",&n);
}
printf("\n");
struct Gzuo{
int id; //进程名字
int dt; //到达时刻
int st; //服务时间
int yxj; //优先级
int wct; //完成时刻
float zt; //周转时间
float dczt; //带权周转时间
};
Gzuo a[N];
for(i=0;i<n;i++)
{
a[i].id=i+1;
printf("\t到达时间: ");
scanf("%d",&a[i].dt);
printf("\t服务时间: ");
scanf("%d",&a[i].st);
printf("\t优先级: ");
scanf("%d",&a[i].yxj);
printf("\n");
}
min=a[0].dt;
for(j=n-1;j>=0;j--)
{
for(i=0;i<j;i++)
{
if(a[i].dt>a[i+1].dt)
{
min=a[i].dt;
a[i].dt=a[i+1].dt;
a[i+1].dt=min;
min=a[i].st;
a[i].st=a[i+1].st;
a[i+1].st=min;
min=a[i].id;
a[i].id=a[i+1].id;
a[i+1].id=min;
min=a[i].yxj;
a[i].yxj=a[i+1].yxj;
a[i+1].yxj=min;
}
if(a[i].dt==a[i+1].dt&&a[i].yxj<a[i+1].yxj)
{
min=a[i].dt;
a[i].dt=a[i+1].dt;
a[i+1].dt=min;
min=a[i].st;
a[i].st=a[i+1].st;
a[i+1].st=min;
min=a[i].id;
a[i].id=a[i+1].id;
a[i+1].id=min;
min=a[i].yxj;
a[i].yxj=a[i+1].yxj;
a[i+1].yxj=min;
}
}
}
a[0].wct=a[0].st+a[0].dt;
a[0].zt=(float)a[0].st;
a[0].dczt=a[0].zt/a[0].st;
for(i=1;i<n;i++)
{
if(a[i].dt>a[0].wct) ;
else b++;
}
for(j=b-1;j>=1;j--)
{
for(i=1;i<j;i++)
{
if(a[i].yxj<a[i+1].yxj)
{
min=a[i].dt;
a[i].dt=a[i+1].dt;
a[i+1].dt=min;
min=a[i].st;
a[i].st=a[i+1].st;
a[i+1].st=min;
min=a[i].id;
a[i].id=a[i+1].id;
a[i+1].id=min;
min=a[i].yxj;
a[i].yxj=a[i+1].yxj;
a[i+1].yxj=min;
}
}
}
for(i=1;i<n;i++)
{
if(a[i].dt>a[i-1].wct)
{
a[i].wct=a[i].dt+a[i].st;
a[i].zt=(float)a[i].st;
a[i].dczt=a[i].zt/a[i].st;
}
else
{
a[i].wct=a[i-1].wct+a[i].st;
a[i].zt=(float)(a[i].wct-a[i].dt);
a[i].dczt=a[i].zt/a[i].st;
}
for(j=i+1,b=j;j<n;j++)
{
if(a[j].dt>a[i].wct) ;
else b=b+1;
}
for(j=b-1;j>=i;j--)
{
for(z=i;z<j;z++)
{
if(a[z].yxj<a[z+1].yxj)
{
min=a[z].dt;
a[z].dt=a[z+1].dt;
a[z+1].dt=min;
min=a[z].st;
a[z].st=a[z+1].st;
a[z+1].st=min;
min=a[i].id;
a[i].id=a[i+1].id;
a[i+1].id=min;
}
}
}
}
printf("\n\t请选择输出顺序\n");
printf("\t1、按id号依次输出\n");
printf("\t2、按完成顺序依次输出\n");
scanf("%d",&px);
printf("\nid:到达时间\t服务时间\t优先级\t完成时间\t周转时间\t带权周转时间\n");
sum1=0;
sum2=0;
switch(px)
{
case 2:
{
for(i=0;i<n;i++)
{
printf("%d: %d\t\t%d\t\t%d\t\t%d\t\t%.0f\t\t%.2f\n",a[i].id,a[i].dt,a[i].yxj,a[i].st,a[i].wct,a[i].zt,a[i].dczt);
sum1+=a[i].zt;
sum2+=a[i].dczt;
}
printf("\n平均周转时间:%.2f\n",sum1/n);
printf("\n平均带权周转时间:%.2f\n\n",sum2/n);
break;
}
case 1:
{
for(j=0;j<n;j++)
{
for(i=0;i<n;i++)
if(a[i].id==j+1)
{
printf("%d: %d\t\t%d\t\t%d\t\t%d\t\t%.0f\t\t%.2f\n",a[i].id,a[i].dt,a[i].yxj,a[i].st,a[i].wct,a[i].zt,a[i].dczt);
sum1+=a[i].zt;
sum2+=a[i].dczt;
}
}
printf("\n平均周转时间:%.2f\n",sum1/n);
printf("\n平均带权周转时间:%.2f\n\n",sum2/n);
break;
}
default: break;
}
}