c - RoundRobin 使用链表。完成时间计算问题
问题描述
我们正在尝试使用链表实现循环算法。但我的逻辑有一些错误。当我尝试为 3 个进程运行它时,第一个进程值是错误的,有时对于下面的其他进程是正确的。请帮我。
我试过搜索逻辑
代码链接:https ://pastebin.com/FkbtUEaQ
#include<stdio.h>
struct process
{
char na[20];
int at, bt, ft, tat, rem;
//float ntat;
} Q[5], temp;
void roundRobin()
{
int rr[20], q, x, k;
int f, r, n, i, j, tt = 0, qt, t, flag, wt = 0;
float awt = 0, antat = 0, atat = 0;
printf("Enter the no. of jobs:");
scanf("%d", &n);
for (r = 0; r < n; r++)// aceppting arrival; and burst time
{
printf("Enter process name,arrival time and burst time:\n");
scanf("%s%d%d", Q[r].na, &Q[r].at, &Q[r].bt);
}
printf("Enter quantum:\n");
scanf("%d", &qt);
for (i = 0; i < n; i++)
{
for (j = i + 1; j < n; j++)
{
if (Q[i].at < Q[j].at) {
temp = Q[i];
Q[i] = Q[j];
Q[j] = temp;
}
}
}
for (i = 0; i < n; i++)
{
Q[i].rem = Q[i].bt;
Q[i].ft = 0;
}
tt = 0;
q = 0;
rr[q] = 0;
do
{
for (j = 0; j < n; j++)
if (tt >= Q[j].at)
{
x = 0;
for (k = 0; k <= q; k++)
if (rr[k] == j)
x++;
if (x == 0)
{
q++;
rr[q] = j;
}
}
if (q == 0)
i = 0;
if (Q[i].rem == 0)
i++;
if (i > q)
i = (i - 1) % q;
if (i <= q)
{
if (Q[i].rem > 0)
{
if (Q[i].rem < qt)
{
tt += Q[i].rem;
Q[i].rem = 0;
} else
{
tt += qt;
Q[i].rem -= qt;
}
Q[i].ft = tt;
}
i++;
}
flag = 0;
for (j = 0; j < n; j++)
if (Q[j].rem > 0)
flag++;
} while (flag != 0);
printf("\n\n\t\tROUND ROBIN ALGORITHM");
printf("\n***************************");
printf("\nprocesses Arrival time burst time finish time tat wt ntat");
for (f = 0; f < n; f++) {
wt = Q[f].ft - Q[f].bt - Q[f].at;
Q[f].tat = Q[f].ft - Q[f].at;
Q[f].ntat = (float) Q[f].tat / Q[f].bt;
antat += Q[f].ntat;
atat += Q[f].tat;
awt += wt;
printf("\n\t%s\t%d\t%d\t%d\t%d\t%d %f", Q[f].na, Q[f].at, Q[f].bt,
Q[f].ft, Q[f].tat, wt, Q[f].ntat);
}
antat /= n;
atat /= n;
awt /= n;
printf("\nAverage tat is %f", atat);
printf("\nAverage normalised tat is %f", antat);
printf("\n average waiting time is %f", awt);
}
void main()
{
roundRobin();
getch();
clrscr();
}
第一个过程给出了错误的值
processes | ArrivalTime | BurstTime | FinishTime | Tat | WaitTime
a 0 10 60 60 50
b 0 20 30 30 10
c 0 30 50 50 20
解决方案
在do
while
循环中,您使用有效i
索引rr
0 到q的Q
数组以及有效索引 0 到n - 1的数组进行索引,其中只有前者是正确的。Q[i]
因此,您必须将此循环中的每次出现更改为Q[rr[i]]
.
之后,仍然是语句的顺序
if (Q[rr[i]].rem == 0)
i++;
if (i > q)
i = (i - 1) % q;
是错误的 -Q[rr[i]].rem == 0
每次i
选择新的时都要进行测试,例如:
while (Q[rr[i %= q+1]].rem == 0) i++;
推荐阅读
- java - Elki GDBSCAN Java/Scala - 如何修改 CorePredicate
- r - 重铸数据集。我无法重塑我的数据集。r 代码昨天运行但今天没有运行 背后的问题是什么?
- javascript - React App 生产构建空白只有一个空白页面
- ios - ios 中的 react-native 构建失败
- python - 在python中以不同格式返回日期
- android - 活动未在紧密循环中更新
- reactjs - Reactjs 中的分页范围
- assembly - 如何在avr中将int8转换为int16
- node.js - Express JS 中的验证器错误 http POST 响应
- javascript - 如何替换子元素的类?