fcfs(先来先服务),sjf(短作业优先)Linux下实现算法

#include<stdio.h>
#include<string.h>

//定义一个结构体 
typedef struct  job{
	char name[8];//进程的名字
	int arrivetime;//进程到达时间 
	int runtime;//进程运行时间 
	int cycletime;//进程周转时间 
	int waittime;//进程等待时间 
	int finishtime;//进程完成时间 
	float dqzztime;//进程带权周转时间 
	
	 
}job; 
int fcfs(struct job jobs[50],int n){
	int i,j;
	job tmp;
	//将进程到达时间从小到大排列 
	for(i=0;i<n-1;i++){
		for(j=i+1;j<n;j++){
			if(jobs[i].arrivetime>jobs[j].arrivetime){
				tmp=jobs[i];
				jobs[i]=jobs[j];
				jobs[j]=tmp; 
				
			}
		}	
	}
	
	jobs[0].finishtime=jobs[0].arrivetime+jobs[0].runtime;
	jobs[0].cycletime=jobs[0].finishtime-jobs[0].arrivetime;
	jobs[0].waittime=jobs[0].cycletime-jobs[0].runtime;
	jobs[0].dqzztime=jobs[0].cycletime* 1.0/jobs[0].runtime* 1.0;
	
	//printf(jobs[0].name);
	
	for(i=1;i<n;i++){
		if(jobs[i].arrivetime<jobs[i-1].finishtime){
			jobs[i].finishtime=jobs[i-1].finishtime+jobs[i].runtime;
		} else{
			jobs[i].finishtime=jobs[i].arrivetime+jobs[i].runtime;
			
		}
			jobs[i].cycletime=jobs[i].finishtime-jobs[i].arrivetime;
			jobs[i].waittime=jobs[i].cycletime-jobs[i].runtime;
			jobs[i].dqzztime=jobs[i].cycletime* 1.0/jobs[i].runtime* 1.0;
	} 
	//	printf("到达时间\n"); 
		 printf("作业名\t到达时间\t运行时间\t周转时间\t等待时间\t完成时间\t带权周转时间\n");
	for(i=0;i<n;i++){
	
		printf("%s\t   %d\t\t   %d\t\t   %d\t\t   %d\t\t   %d\t\t   %.2f\n",jobs[i].name,jobs[i].arrivetime,jobs[i].runtime,jobs[i].cycletime,jobs[i].waittime,jobs[i].finishtime,jobs[i].dqzztime);
		printf("\n");
	}
	
	/*for(i=0;i<n-1;i++){
			printf("进程名%d,到达时间%d,运行时间%d,周转时间%d,等待时间%d,完成时间%,带权周转时间%.2f\n",jobs[i].name,jobs[i].arrivetime,jobs[i].runtime,jobs[i].cycletime,jobs[i].waittime,jobs[i].finishtime,jobs[i].dqzztime);
		//	printf(jobs[i].name,jobs[i].arrivetime,jobs[i].runtime,jobs[i].cycletime,jobs[i].waittime,jobs[i].finishtime,jobs[i].dqzztime);
	}*/
}

int sjf(struct job jobs[50],int n){
		//int i,j,tmp;
		
			int i,j;
			job tmp;
			
			//先将到达时间从小打到排序,算出第一个的短作业优先 
	for(i=0;i<n-1;i++){
		for(j=i+1;j<n;j++){
			if(jobs[i].arrivetime>jobs[j].arrivetime){
				tmp=jobs[i];
				jobs[i]=jobs[j];
				jobs[j]=tmp; 
				
			}
		}	
	}
	
	jobs[0].cycletime=jobs[0].finishtime-jobs[0].arrivetime;
	jobs[0].waittime=jobs[0].cycletime-jobs[0].runtime;
	jobs[0].finishtime=jobs[0].arrivetime+jobs[0].runtime;
	jobs[0].dqzztime=jobs[0].cycletime* 1.0/jobs[0].runtime* 1.0;
		
		//将运行时间从小到大排序 
	for(i=1;i<n-1;i++){
		for(j=i+1;j<n;j++){
			if(jobs[i].runtime>jobs[j].runtime){
				tmp=jobs[i];
				jobs[i]=jobs[j];
				jobs[j]=tmp; 
				
			}
		}	
		//printf(jobs[i].name,jobs[i].runtime);
	}
	
	for(i=1;i<n;i++){
		if(jobs[i-1].finishtime>jobs[i].arrivetime){
			jobs[i].finishtime=jobs[i-1].finishtime+jobs[i].runtime;
			jobs[i].cycletime=jobs[i].finishtime-jobs[i].arrivetime;
			jobs[i].waittime=jobs[i].cycletime-jobs[i].runtime;
			jobs[i].dqzztime=jobs[i].cycletime* 1.0/jobs[i].runtime* 1.0;
			
			
		}else{
			//jobs[i]=jobs[i+1];
			jobs[i+1].finishtime=jobs[i-1].finishtime+jobs[i+1].runtime;
			jobs[i+1].cycletime=jobs[i+1].finishtime-jobs[i+1].arrivetime;
			jobs[i+1].waittime=jobs[i+1].cycletime-jobs[i+1].runtime;
			jobs[i+1].dqzztime=jobs[i+1].cycletime* 1.0/jobs[i+1].runtime* 1.0;
			
		}
		
		
	}
	 printf("作业名\t到达时间\t运行时间\t周转时间\t等待时间\t完成时间\t带权周转时间\n");
	for(i=0;i<n;i++){
	
		printf("%s\t   %d\t\t   %d\t\t   %d\t\t   %d\t\t   %d\t\t   %.2f\n",jobs[i].name,jobs[i].arrivetime,jobs[i].runtime,jobs[i].cycletime,jobs[i].waittime,jobs[i].finishtime,jobs[i].dqzztime);
		printf("\n");
	}
	
	

}



int main(){
	struct job jobs[50];
	int n,i;
	//int tmp;//储存临时变量 
	
/*	printf("输入进程个数:");
	scanf("%d",&n);
	printf("输入进程的名字,到达时间,运行时间:\n");
	for(i=0;i<n;i++){
		
		scanf("%s",jobs[i].name);//作业名 
		scanf("%d",jobs[i].arrivetime);//到达时间 
		scanf("%d",jobs[i].runtime);//运行时间 
	}
	
	printf("\n");
		printf("进程名\t到达时间\t运行时间\n");
	for(i=0;i<n;i++){
		printf("%s\t   %d\t    %d\n",jobs[i].name,jobs[i].arrivetime,jobs[i].runtime);
	}*/
	 printf("输入作业个数:");
    scanf("%d",&n);
    printf("输入每个作业的作业名,到达时间,服务时间:\n");
    for(i=0;i<n;i++)
    {
        scanf("%s",jobs[i].name); //作业名
        scanf("%d",&jobs[i].arrivetime);//到达时间
        scanf("%d",&jobs[i].runtime);//运行(服务时间)时间
    }
    printf("\n");
    printf("作业名\t到达系统时间\t运行时间\n");
    for(i=0;i<n;i++)
    {
    printf("%s\t      %d\t         %d\n",jobs[i].name,jobs[i].arrivetime,jobs[i].runtime);
    }


	printf("先来先服务算法结果:\n");
	fcfs(jobs,n);
	
	

		printf("短作业优先算法结果:\n");
		sjf(jobs,n);
	
} 

 执行c语言程序得先另存,后编译,最后运行
mv 另存名字 文件名.c
gcc -o tt 文件名.c
./tt

如果出现linux 下gcc 编译结构体问题

解决方法如下:

 

linux 下gcc 编译结构体问题 - 搬砖中 - 博客园 (cnblogs.com)

  • 2
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值