C - цикл запускается только один раз для массива, который я изменяю - PullRequest
0 голосов
/ 09 марта 2019

Во-первых, извинения за возможно простой вопрос и плохой код, как и большинство людей, которые задают вопросы, я очень плохо знаком с рассматриваемым языком.

Назначение кода:

Для создания программы, имитирующей планирование процесса.Этот конкретный пример должен имитировать планирование «первым пришел первым обслужен».Рассматриваемые наборы данных упорядочены (например, PID с 0 по 5, все поступают в последовательности) и неупорядочены (например, 3 могут прибыть до 1 и т. Д.).

Чтобы достичь этого, я попытался найти наименьшую запись в моем прибытиивременной массив, чтобы гарантировать, что записи обрабатываются по порядку.Из-за этого я изменяю массивы по мере их прохождения через цикл for, изменяя наименьшее значение, чтобы оно не запускалось дважды (я думаю, что это может быть моей проблемой, но я не уверен)

Конкретный циклУ меня проблемы с:

for (i = 1; i < processes; i++) {
    atperm[position] = at[position];
    smallestentry();
    wt[position] = btt - at[position]; //wait time = total burst time - arrival time
    btt += bt[position]; //total burst time = total burst time + burst time
    awt += wt[position]; //average wait time = average wait time + wait time
    tat[position] = wt[position] + bt[position]; //turn around time = wait time + burst time
    atat += tat[position]; //average turn around time = average turn around time + turn around time
    changeline(position);
}

Полный код:

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

/* 
 * WT - Wait Time (TAT -BT)
 * BT - Bust Time
 * AT - Arrival Time
 * TAT - Turn Around Time (CT - AT)
 * AWT - Average Wait Time
 * ATAT - Average Turn Around Time
 */

int wt[10], bt[10], at[10], atperm[10], tat[10], processes, smallest, i, position;
float awt, atat;

void input() {
    printf("Enter number of processes:\n");
    scanf("%d", &processes);
    int i;
    for (i = 0; i < processes; i++) {
        printf("Enter burst time of process %d:", i + 1); //increase i by 1 but dont save
        scanf("%d", &bt[i]);
        printf("Enter arrival time of process %d:", i + 1);
        scanf("%d", &at[i]);
    }
}

void changeline(int position) {
    at[position] = 999;

    printf("AT\tBT\tWT\tTAT\tAT\n");
    for (i = 0; i < processes; i++) {
        printf("%3d\t%3d\t%3d\t%3d\t%3d\n", at[i], bt[i], wt[i], tat[i], atperm[i]);
    }
}

void smallestentry() {
    smallest = at[0];
    for (i = 0; i < processes; i++) {
        if (smallest > at[i]) {
            smallest = at[i];
            position = i;
        }
    }
}

void calculate() {
    smallestentry();
    wt[position] = 0; //sets the first entry in wait time array to equal 0
    atat = tat[position] = bt[position]; //sets the first entries in atat and tat array to equal first bt entry
    int btt = bt[position]; //to store total burst time sum
    atperm[position] = at[position];
    changeline(position);

    for (i = 1; i < processes; i++) {
        atperm[position] = at[position];
        smallestentry();
        wt[position] = btt - at[position]; //wait time = total burst time - arrival time
        btt += bt[position]; //total burst time = total burst time + burst time
        awt += wt[position]; //average wait time = average wait time + wait time
        tat[position] = wt[position] + bt[position]; //turn around time = wait time + burst time
        atat += tat[position]; //average turn around time = average turn around time + turn around time
        changeline(position);
    }
    atat /= processes; // atat = atat / processes
    awt /= processes; // awt = awt / processses
}

int main() {
    printf("FCFS CPU Scheduling Algorithm\n");
    input();
    calculate();
}

1 Ответ

0 голосов
/ 10 марта 2019

Ваша единственная проблема в том, что вы использовали i в качестве глобальной переменной.

int wt[10], bt[10], at[10], atperm[10], tat[10], processes, smallest, i, position;

в середине вашего цикла вы вызвали функцию smalllestentry (), которая также использовала i:

void smallestentry() {
smallest = at[0];
    for (i = 0; i < processes; i++) {
        if (smallest > at[i]) {
            smallest = at[i];
            position = i;
        }
    }
}

После завершения этой функции значение i было изменено, поэтому цикл выполнялся только один раз.

Я нашел проблему, поместив printf("%d",i); в цикл.

Вы можете решить эту проблему, изменив i на локальную переменную внутри ваших функций.

(Извините за неправильную формулировку, это мой первый ответ.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...