进程调度算法 (总)

// 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;
	}
	
}

 

转载于:https://my.oschina.net/u/3761238/blog/2441639

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值