操作系统_高响应比优先算法_c语言实现

在这里插入图片描述
注:在PTA上面提交时务必把scanf_s改成scanf,(编译器用的是vs2019).

主函数

int main()
{
	int n;              //进程数量
	scanf_s("%d", &n);
	struct pcb p[333];
	input(p, n);
	sort(p, n);
	hrrf(p, n);
	output(p, n);
	return 0;
}

核心算法 高响应比优先

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;		       //记录下一个要运行的位置下标
	
		//扫描找出有max响应比的进程下标
		for (int i = unfinishedposition; (i < n && p[i].atime <= nowtime&&i!=0); i++) {
			if (p[i].state == 1) {	 
				continue;
			}
			if (p[i].rp > max_rp) {			//扫描对比rp
				max_rp = p[i].rp;
				next = i;					//记录下一个要执行进程下标
			}
		}

		if (nowtime < p[unfinishedposition].atime * 1.0)	 //考虑到达的进程都运行完了, 有些进程还没到达的情况
		{
			nowtime = p[unfinishedposition].atime * 1.0;
			next = unfinishedposition;
		}

		//运行阶段
		{
			nowtime = nowtime + p[next].rtime;		//更新现在时间
			p[next].state = 1;						 //记录运行状态
			p[next].ftime = nowtime;	     		 //完成时间=现在时间
			p[next].ttime = nowtime - p[next].atime;			//周转=现在时间-到达
			p[next].wtime = 1.0 * p[next].ttime / p[next].rtime;		//带权周转=周转/运行
			
			for (int i = unfinishedposition; i < n; i++) {		//指向下一个未运行的进程
				if (p[i].state == 0) {
					unfinishedposition = i;
					break;
				}
			}
			finishedcount++;		//运行完成的个数
		}

		//循环计算rp,响应比=(现在时间+运行时间-到达时间)/运行时间
		for (int i = 0; i < n && (p[i].atime <= nowtime); i++) {
			if (p[i].state == 1) {		//已经完成的就不要算响应比了
				continue;
			}
			else {

				p[i].rp = (nowtime + p[i].rtime-p[i].atime) / p[i].rtime;
			}
		}
	}
}

源程序代码

#include<stdio.h>
#include<stdlib.h>
//每运行完一次就要计算一次等待时间和响应比=(等待+服务)/服务
//进程结构体
struct pcb
{
	char name[10];   //进程名
	int  atime;      //到达时间
	int  rtime;    //运行时间
	int  stime;		//开始时间
	int  ftime;      //完成时间
	int  ttime;      //周转时间
	double wtime;    //带权周转时间
	double rp;		//响应比
	int state;		//执行状态  1表示已经执行
};

//输入模块
void input(struct pcb* p, int n)
{
	for (int i = 0; i < n; i++) {
		scanf_s("%s", p[i].name, sizeof(p[i]));
	}
	for (int i = 0; i < n; i++) {
		scanf_s("%d", &p[i].atime);
	}
	for (int i = 0; i < n; i++) {
		scanf_s("%d", &p[i].rtime);
	}
}

//输出模块
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].atime);
			printf("\n");
		}
		else {
			printf("%d ", p[i].atime);
		}
	}

	printf("服务时间:");
	for (int i = 0; i < n; i++) {
		if (i == n - 1) {				//最后一行要加回车 这样做其实不方便
			printf("%d", p[n - 1].rtime);
			printf("\n");
		}
		else {
			printf("%d ", p[i].rtime);
		}
	}
	printf("完成时间:");
	for (int i = 0; i < n; i++) {
		if (i == n - 1) {
			printf("%d", p[n - 1].ftime);
			printf("\n");
		}
		else {
			printf("%d ", p[i].ftime);
		}
	}
	printf("周转时间:");
	for (int i = 0; i < n; i++) {
		if (i == n - 1) {
			printf("%d", p[n - 1].ttime);
			printf("\n");
		}
		else {
			printf("%d ", p[i].ttime);
		}
	}
	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);
		}
	}

}

//atime升序
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].atime > p[j + 1].atime)
			{
				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;		       //记录下一个要运行的位置下标
	
		//扫描找出有max响应比的进程下标
		for (int i = unfinishedposition; (i < n && p[i].atime <= nowtime&&i!=0); i++) {
			if (p[i].state == 1) {	 
				continue;
			}
			if (p[i].rp > max_rp) {			//扫描对比rp
				max_rp = p[i].rp;
				next = i;					//记录下一个要执行进程下标
			}
		}

		if (nowtime < p[unfinishedposition].atime * 1.0)	 //考虑到达的进程都运行完了, 有些进程还没到达的情况
		{
			nowtime = p[unfinishedposition].atime * 1.0;
			next = unfinishedposition;
		}

		//运行阶段
		{
			nowtime = nowtime + p[next].rtime;		//更新现在时间
			p[next].state = 1;						 //记录运行状态
			p[next].ftime = nowtime;	     		 //完成时间=现在时间
			p[next].ttime = nowtime - p[next].atime;			//周转=现在时间-到达
			p[next].wtime = 1.0 * p[next].ttime / p[next].rtime;		//带权周转=周转/运行
			
			for (int i = unfinishedposition; i < n; i++) {		//指向下一个未运行的进程
				if (p[i].state == 0) {
					unfinishedposition = i;
					break;
				}
			}
			finishedcount++;		//运行完成的个数
		}

		//循环计算rp,响应比=(现在时间+运行时间-到达时间)/运行时间
		for (int i = 0; i < n && (p[i].atime <= nowtime); i++) {
			if (p[i].state == 1) {		//已经完成的就不要算响应比了
				continue;
			}
			else {

				p[i].rp = (nowtime + p[i].rtime-p[i].atime) / p[i].rtime;
			}
		}
	}
}


int main()
{
	int n;              //进程数量
	scanf_s("%d", &n);
	struct pcb p[333];
	input(p, n);
	sort(p, n);
	hrrf(p, n);
	output(p, n);
	return 0;
}

测试截图
在这里插入图片描述
在这里插入图片描述

  • 31
    点赞
  • 173
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值