RoundRobin使用链接列表。完成时间计算问题

问题描述 投票:0回答:1

我们正在尝试使用链表实现循环算法。但是我的逻辑有一些错误。当我尝试为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
c data-structures
1个回答
0
投票

do while循环中,您使用i索引有效索引0到qrr数组以及有效索引0到n- 1,其中只有前者是正确的。因此,您必须将此循环中每次出现的Q都更改为Q[i]

之后,仍然是语句的顺序

Q[rr[i]]

是错误的-每次选择新的 if (Q[rr[i]].rem == 0) i++; if (i > q) i = (i - 1) % q; 时都要进行Q[rr[i]].rem == 0的测试。 g。:

i
© www.soinside.com 2019 - 2024. All rights reserved.