作业调度算法--高响应比优先

作业调度算法–高响应比优先

问题描述:
输入N(N>0)个作业,输入每个作业的名字,到达时间,服务时间,按照高响应比优先算法,计算每个作业的完成时间,周转时间,带权周转时间(保留2位小数)。

输入格式:
第一行输入作业数目,第二行输入作业的名字,第三行输入到达时间,第四行输入服务时间。

输出格式:
按照到达时间从小到大排序,第一行输出作业的名字,第二行输出到达时间,第三行输出服务时间,第四行输出完成时间,第五行输出完成时间,第六行输出带权周转时间。

输入样例:
在这里给出一组输入。例如:

5
A B C D E
0 1 2 3 4
4 3 4 2 4

输出样例:
在这里给出相应的输出。例如:

作 业 名:A B C D E
到达时间:0 1 2 3 4
服务时间:4 3 4 2 4
完成时间:4 7 13 9 17
周转时间:4 6 11 6 13
带权周转时间:1.00 2.00 2.75 3.00 3.25

代码实现(C语言):

#include<stdio.h>
#include<stdlib.h>
struct pcb
{
	char name[10];   
	int  ASD;      
	int  DD;    
	int  NN;		
	int  NC;       
	int  ww;      
	double wtime;    
	double rp;		
	int state;		
};

void input(struct pcb* p, int n)
{
	for (int i = 0; i < n; i++) {
		scanf("%s", p[i].name, sizeof(p[i]));
	}
	for (int i = 0; i < n; i++) {
		scanf("%d", &p[i].ASD);
	}
	for (int i = 0; i < n; i++) {
		scanf("%d", &p[i].DD);
	}
}

void output(struct pcb* p, int n)
{

	printf("作 业 名:");
	for (int i = 0; i < n; i++) {
		if (i == n - 1) {
			printf("%s", p[n - 1].name);
			printf("\n");
		}
		else {
			printf("%s ", p[i].name);
		}
	}
	printf("到达时间:");
	for (int i = 0; i < n; i++) {
		if (i == n - 1) {
			printf("%d", p[n - 1].ASD);
			printf("\n");
		}
		else {
			printf("%d ", p[i].ASD);
		}
	}

	printf("服务时间:");
	for (int i = 0; i < n; i++) {
		if (i == n - 1) {				
			printf("%d", p[n - 1].DD);
			printf("\n");
		}
		else {
			printf("%d ", p[i].DD);
		}
	}
	printf("完成时间:");
	for (int i = 0; i < n; i++) {
		if (i == n - 1) {
			printf("%d", p[n - 1].NC);
			printf("\n");
		}
		else {
			printf("%d ", p[i].NC);
		}
	}
	printf("周转时间:");
	for (int i = 0; i < n; i++) {
		if (i == n - 1) {
			printf("%d", p[n - 1].ww);
			printf("\n");
		}
		else {
			printf("%d ", p[i].ww);
		}
	}
	printf("带权周转时间:");
	for (int i = 0; i < n; i++) {
		if (i == n - 1) {
			printf("%.2f", p[n - 1].wtime);
			printf("\n");
		}
		else {
			printf("%.2f ", p[i].wtime);
		}
	}

}

//ASD升序
void sort(struct pcb* p, int n)
{

	for (int i = 0; i < n - 1; i++)
	{
		struct pcb temp;
		for (int j = 0; j < n - i - 1; j++)
		{
			if (p[j].ASD > p[j + 1].ASD)
			{
				temp = p[j];
				p[j] = p[j + 1];
				p[j + 1] = temp;
			}
		}
	}
}



void hrrf(struct pcb* p, int n) {
	int finishedcount = 0;		  //记录已经完成的进程数
	int unfinishedposition = 0;		//记录未完成进程的位置
	double nowtime = 0;		     //现在时间
	for (int i = 0; i < n; i++) {		
		p[i].state = 0;
	}
	while (finishedcount < n) {

		double max_rp = 0;			//中间变量比较响应比
		int next = 0;		       //记录下一个要运行的位置下标
	
	
		for (int i = unfinishedposition; (i < n && p[i].ASD <= nowtime&&i!=0); i++) {
			if (p[i].state == 1) {	 
				continue;
			}
			if (p[i].rp > max_rp) {			
				max_rp = p[i].rp;
				next = i;					
			}
		}

		if (nowtime < p[unfinishedposition].ASD * 1.0)	 
		{
			nowtime = p[unfinishedposition].ASD * 1.0;
			next = unfinishedposition;
		}

	
		{
			nowtime = nowtime + p[next].DD;		
			p[next].state = 1;						
			p[next].NC = nowtime;	     		
			p[next].ww = nowtime - p[next].ASD;			
			p[next].wtime = 1.0 * p[next].ww / p[next].DD;		
			
			for (int i = unfinishedposition; i < n; i++) {		
				if (p[i].state == 0) {
					unfinishedposition = i;
					break;
				}
			}
			finishedcount++;		
		}

	
		for (int i = 0; i < n && (p[i].ASD <= nowtime); i++) {
			if (p[i].state == 1) {	
				continue;
			}
			else {

				p[i].rp = (nowtime + p[i].DD-p[i].ASD) / p[i].DD;
			}
		}
	}
}


int main()
{
	int n;            
	scanf("%d", &n);
	struct pcb p[333];
	input(p, n);
	sort(p, n);
	hrrf(p, n);
	output(p, n);
	return 0;
}


写在最后各位看到此博客的小伙伴,如有疑问或者不对的地方请及时通过私信我或者评论此博客的方式指出,以免误人子弟。多谢!

谢谢浏览!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值