Алгоритм планирования кратчайшего задания сначала в задачах C

Я создал программу C для имитации алгоритма «Сначала кратчайшее задание без вытеснения», но в нем есть ошибки с некоторыми входными данными. Программа-алгоритм кратчайшего задания принимает входные данные для времени поступления и всплеска необходимого количества процессов и распределяет процессы по 2 этапам. Первая фаза включает в себя упорядочение программы по времени прибытия, а 2-я фаза упорядочивает их по времени пакета, учитывая, что их время прибытия меньше, чем время завершения предыдущего процесса. Это все затем компилируется в конце и показывается.

#include <stdio.h>

// n - total processes
// p - process no. array
// bt - burst time array
// at - arrival time array
// wt - the time taken for the process to start from it's arrival time array
// tat - time spent by process in cpu array
int i, n, j, m, min, sum = 0, x = 1, btTally = 0, p[20], bt[20], at[20], wt[20], tat[20], ta = 0;
float tatTally = 0, wtTally = 0;

//function grabs arrival and burst times of each process and stores it in its respective array
void getInput(){
    printf("\nEnter the total number of processes: ");
    scanf("%d", & n);

    // For Loop for user to input info about the processes
    for (i = 0; i < n; i++) {
        p[i] = i + 1;
        printf("\nEnter the arrival time of process %d: ", p[i]);
        scanf(" %d", & at[i]);
        printf("\nEnter the burst time of process %d: ", p[i]);
        scanf(" %d", & bt[i]);
    }
}

//Function arranges processes according to their arrival times
void arrangePhase1(){
    for (i = 0; i < n; i++) {
        for (j = 0; j < n; j++) {
            if (at[j] > at[i]) {
                m = p[j];
                p[j] = p[i];
                p[i] = m;

                m = at[j];
                at[j] = at[i];
                at[i] = m;

                m = bt[j];
                bt[j] = bt[i];
                bt[i] = m;
            }
        }
    }
}

//Function arranges the processes according to Burst time
void arrangePhase2(){
    for (i = 0; i < n; i++) {
        btTally = btTally + bt[i];
        min = bt[x];
        for (j = x; j < n; j++) {
            if (bt[j] < min && btTally >= at[j]) {
                m = p[x];
                p[x] = p[j];
                p[j] = m;

                m = at[x];
                at[x] = at[j];
                at[j] = m;

                m = bt[x];
                bt[x] = bt[j];
                bt[j] = m;
            }
        }
        x++;
    }
}

//Function calculates the tallies of turnaround time and waiting time
void calcTallies(){
    for (i = 0; i < n; i++) {
        ta = ta + bt[i];
        tat[i] = ta - at[i];
        tatTally = tatTally + tat[i];
    }

    wt[0] = 0;
    for (i = 1; i < n; i++) {
        sum = sum + bt[i - 1];
        wt[i] = sum - at[i];
        wtTally = wtTally + wt[i];
    }

}

//Function displays all of the information about the algorithm running
void showFinal(){
    printf("\nProcess\t Arrival Time\t Burst Time\t Waiting Time\t Turnaround Time");
    for (i = 0; i < n; i++) {
        printf("\n p%d\t %d\t\t %d\t\t %d\t\t %d", p[i], at[i], bt[i], wt[i], tat[i]);
    }

    printf("\nAverage Waiting Time: %.2f", (wtTally / n));
    printf("\nAverage Turn Around Time: %.2f", (tatTally / n));
}

int main() {
    getInput();
    arrangePhase1();
    arrangePhase2();
    arrangePhase2();
    calcTallies();
    showFinal();
    return 0;
}

Это ожидаемые результаты:

Вот результаты, которые я получаю с моей программой:

Любая помощь будет действительно оценена. Спасибо!

В arrangePhase2 расскажите мне, что вы думаете о переменной min.

Surt 09.12.2020 21:00

Я использовал его для хранения значения bt[x], которое изменяется после завершения внутреннего цикла.

agb2k 09.12.2020 21:18
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
692
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я... немного перестрою вашу программу...

#include <stdio.h>
#include <stdlib.h>

typedef struct {
  int p, at, bt, wt, tat;
} Job;
#define maxN (20)
Job jobs[maxN ];
int n, btTally = 0, sum = 0, ta = 0;
float tatTally = 0, wtTally = 0;

#define TestSize (5)
Job Test[TestSize] = {
  { 1, 2, 1, 0, 0 },
  { 2, 1, 5, 0, 0 },
  { 3, 4, 1, 0, 0 },
  { 4, 0, 6, 0, 0 },
  { 5, 2, 3, 0, 0 }
};

void getInput(){
    int i;
    printf("\nEnter the total number of processes: ");
    scanf("%d", & n);

    if (n == 0) {
      for (i = 0; i < TestSize; ++i)
        jobs[i] = Test[i];
      n = TestSize;
      return;
    }

    // For Loop for user to input info about the processes
    for (i = 0; i < n; i++) {
        jobs[i].p = i + 1;
        printf("\nEnter the arrival time of process %d: ", jobs[i].p);
        scanf(" %d", & jobs[i].at);
        printf("\nEnter the burst time of process %d: ", jobs[i].p);
        scanf(" %d", & jobs[i].bt);
    }
}

int compareAT (const void * a, const void * b) {
  Job *jobA = (Job *)a;
  Job *jobB = (Job *)b;

  return ( jobA->at - jobB->at );
}

void arrangePhase1(){
  qsort (jobs, n, sizeof(Job), compareAT);
}

void Swap(int i, int j) {
  Job m = jobs[i];
  jobs[i] = jobs[j];
  jobs[j] = m;
}



void calcTallies(){
    int i;
    for (i = 0; i < n; i++) {
        ta = ta + jobs[i].bt;
        jobs[i].tat = ta - jobs[i].at;
        tatTally = tatTally + jobs[i].tat;
    }

    jobs[0].wt = 0;
    for (i = 1; i < n; i++) {
        sum = sum + jobs[i - 1].bt;
        jobs[i].wt = sum - jobs[i].at;
        wtTally = wtTally + jobs[i].wt;
    }
}

void showFinal(){
    int i;
    printf("\nProcess\t Arrival Time\t Burst Time\t Waiting Time\t Turnaround Time");
    for (i = 0; i < n; i++) {
        printf("\n p%d\t %d\t\t %d\t\t %d\t\t %d", jobs[i].p, jobs[i].at, jobs[i].bt, jobs[i].wt, jobs[i].tat);
    }

    printf("\nAverage Waiting Time: %.2f", (wtTally / n));
    printf("\nAverage Turn Around Time: %.2f", (tatTally / n));
}

void arrangePhase2() {
    int i, j, min, x = 1;

    for (i = 0; i < n; i++) {
        btTally = btTally + jobs[i].bt;
        min = jobs[x].bt;
        for (j = x; j < n; j++) {
            if (jobs[j].bt < min && btTally >= jobs[j].at) {
              Swap(x, j);
              min = jobs[x].bt;
              showFinal();
            }
        }
        x++;
    }
}

int main() {
    getInput();
    arrangePhase1();
    showFinal();
    arrangePhase2();
//    arrangePhase2();
    calcTallies();
    showFinal();
    return 0;
}

И оставил в нем тест и отпечатки.

Основная проблема в том, что min не обновляется. Попробуйте добавить обновление в исходную программу и посмотрите, работает ли оно. Далее нужно переместить int i,j; в функции, теперь это работает? (без этого не получится, если вы просто добавите тест showFinal(); в свой код).

Теперь код, который я сделал, не является единственной правдой, это просто пример того, кто не программировал на C десятилетиями.

Краткий обзор кода. Использование глобальных переменных плохо в C, у вас легко возникнут проблемы с вашими циклами, если вы используете глобальные переменные для управления циклом, здесь i, j часто используются повторно.

Вы могли бы использовать больше структур, по крайней мере, для трех основных значений, что немного упрощает сортировку. В любом случае наличие функции Swap упрощает проверку и понимание кода.

void SwapInt(int *i, int *j) {
  int m = *i;
  *i = *j;
  *j = m;
}

SwapInt(&at[i], &at[j]); // example of calling swapping

Второй вызов arrangePhase2(); ничего не делает.

Другие вопросы по теме

Сортировка массива по возрастанию внутри массива в JS
Как я могу сгенерировать все уникальные вложенные 2-кортежи (вложенные пары) набора из n объектов в Python?
Алгоритмический способ объединения разных контактных номеров и адресов электронной почты для одного и того же контакта
Каков самый быстрый способ суммировать две строки, состоящие только из чисел, но без предварительного преобразования каждой из них в int?
Генерация кода Хаффмана, который никогда не создает строку «00» при кодировании
Какова временная сложность массива, отсортированного в порядке возрастания, если он передается в алгоритм Reversort?
Создайте компактный набор моментальных снимков
Неправильный вывод алгоритма Дейкстры с использованием C#
Задача интервью с массивом целых чисел, представляющих блочные башни, необходимо создать ступенчатый шаблон за минимальное количество ходов
Временная и пространственная сложность нарезки списка Python внутри рекурсивных вызовов