1. 程式人生 > >程序排程演算法 (總)

程序排程演算法 (總)

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