注:在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;
}
测试截图