Jump to content
Fórum Script Brasil
  • 0

Exibição errada do SJF no Gráfico de Guntts


Ariel Rodrigo Campos

Question

Boa Tarde. Preciso de ajuda pra esse código que mostra o tempo de exibição de processos. Porem, ele mostra o Gráfico de um jeito errado. Ao invés dele mostrar o gráfico assim:
Gráfico de Gantt:
------------------------
1: ---XXX
2: -XX
3: X
------------------------
Ele me mostra assim:
Gráfico de Gantt:
------------------------
3: X
2: -XX
1: ---XXX
------------------------

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

typedef struct {
    char nome[20];
    int tempo_execucao;
    int tempo_espera_inicial;
    int tempo_processamento;
    int tempo_espera_final;
} Processo;

void fcfs(Processo* processos, int n) {
    int tempo_chegada = 0;
    int tempo_total = 0;
    printf("Gráfico de Gantt:\n");
    printf("------------------------\n");
    for (int i = 0; i < n; i++) {
        printf("%s: ", processos[i].nome);
        for (int j = 0; j < tempo_chegada; j++)
            printf("-");
        for (int j = 0; j < processos[i].tempo_execucao; j++)
            printf("X");
        printf("\n");
        tempo_chegada += processos[i].tempo_execucao;
        processos[i].tempo_espera_inicial = tempo_chegada - processos[i].tempo_execucao;
        processos[i].tempo_espera_final = tempo_total - processos[i].tempo_execucao;
        tempo_total += processos[i].tempo_execucao;
        processos[i].tempo_processamento = processos[i].tempo_execucao;
    }

    printf("\nDados adicionais:\n");
    printf("Tempo de espera para iniciar o processo:\n");
    for (int i = 0; i < n; i++) {
        printf(" %s)", processos[i].nome);
        printf("%d -", processos[i].tempo_espera_inicial);}
    printf("\nTempo de processamento do processo:\n");
    for (int q = 0; q < n; q++){
      printf(" %s)", processos[q].nome);
      printf("%d -", processos[q].tempo_processamento);
    }
    printf("\nTempo de espera para finalizar o processo:\n");
  for (int e = 0; e < n; e++){
      printf(" %s)", processos[e].nome);
      printf("%d -", 0);
    }
    printf("\n");
  
    double tempo_medio_espera_inicial = 0.0;
    double tempo_medio_espera_final = 0.0;
    for (int i = 0; i < n; i++) {
        tempo_medio_espera_inicial += processos[i].tempo_espera_inicial;
        tempo_medio_espera_final += processos[i].tempo_espera_final;
    }
    tempo_medio_espera_inicial /= n;
    tempo_medio_espera_final /= n;

    printf("Tempo médio de espera para iniciar cada processo: %.2lf\n", tempo_medio_espera_inicial);
    printf("Tempo total de processador: %d\n", tempo_total);
}

void sjf(Processo* processos, int n) {
    // Ordena os processos pelo tempo de execução (SJF)
for (int i = 0; i < n - 1; i++) {
    int menor_tempo = i;  // Índice do processo com menor tempo de execução

    for (int j = i + 1; j < n; j++) {
        if (processos[j].tempo_execucao < processos[menor_tempo].tempo_execucao) {
            menor_tempo = j;
        }
    }

    // Troca os elementos somente no final da iteração
    Processo temp = processos[i];
    processos[i] = processos[menor_tempo];
    processos[menor_tempo] = temp;
}

    int tempo_chegada = 0;
    int tempo_total = 0;
    printf("Gráfico de Gantt:\n");
    printf("------------------------\n");
    for (int i = 0; i < n; i++) {
        printf("%s: ", processos[i].nome);
        for (int j = 0; j < tempo_chegada; j++)
            printf("-");
        for (int j = 0; j < processos[i].tempo_execucao; j++)
            printf("X");
        printf("\n");
        tempo_chegada += processos[i].tempo_execucao;
        processos[i].tempo_espera_inicial = tempo_chegada - processos[i].tempo_execucao;
        processos[i].tempo_espera_final = tempo_total - processos[i].tempo_execucao;
        tempo_total += processos[i].tempo_execucao;
        processos[i].tempo_processamento = processos[i].tempo_execucao;
    }

    printf("\nDados adicionais:\n");
    printf("Tempo de espera para iniciar o processo:\n");
    for (int i = 0; i < n; i++) {
        printf(" %s)", processos[i].nome);
        printf("%d -", processos[i].tempo_espera_inicial);}
    printf("\nTempo de processamento do processo:\n");
    for (int q = 0; q < n; q++){
      printf(" %s)", processos[q].nome);
      printf("%d -", processos[q].tempo_processamento);
    }
    printf("\nTempo de espera para finalizar o processo:\n");
  for (int e = 0; e < n; e++){
      printf(" %s)", processos[e].nome);
      printf("%d -", 0);
    }
    printf("\n");
  

    double tempo_medio_espera_inicial = 0.0;
    double tempo_medio_espera_final = 0.0;
    for (int i = 0; i < n; i++) {
        tempo_medio_espera_inicial += processos[i].tempo_espera_inicial;
        tempo_medio_espera_final += processos[i].tempo_espera_final;
    }
    tempo_medio_espera_inicial /= n;
    tempo_medio_espera_final /= n;

    printf("Tempo médio de espera para iniciar cada processo: %.2lf\n", tempo_medio_espera_inicial);
    printf("Tempo total de processador: %d\n", tempo_total);
}

void circular(Processo* processos, int n, int quantum) {
    int* temp_restante = (int*)malloc(n * sizeof(int));
    for (int i = 0; i < n; i++)
        temp_restante[i] = processos[i].tempo_execucao;

    int tempo_chegada = 0;
    int tempo_total = 0;

    // Determinar o comprimento máximo do nome dos processos
    int max_length = 0;
    for (int i = 0; i < n; i++) {
        int length = strlen(processos[i].nome);
        if (length > max_length)
            max_length = length;
    }

    printf("Gráfico de Gantt:\n");
    printf("------------------------\n");
    while (1) {
        int finalizados = 1;
        for (int i = 0; i < n; i++) {
            if (temp_restante[i] > 0) {
                finalizados = 0;
                if (temp_restante[i] > quantum) {
                    printf("%-*s: ", max_length, processos[i].nome);

                    // Adicionar espaços em branco para alinhar o gráfico de Gantt
                    for (int j = 0; j < tempo_chegada; j++)
                        printf("-");
                    for (int j = 0; j < quantum; j++)
                        printf("X");
                    printf("\n");

                    tempo_chegada += quantum;
                    temp_restante[i] -= quantum;
                    processos[i].tempo_processamento += quantum;
                } else {
                    printf("%-*s: ", max_length, processos[i].nome);

                    // Adicionar espaços em branco para alinhar o gráfico de Gantt
                    for (int j = 0; j < tempo_chegada; j++)
                        printf("-");
                    for (int j = 0; j < temp_restante[i]; j++)
                        printf("X");
                    printf("\n");

                    tempo_chegada += temp_restante[i];
                    processos[i].tempo_processamento += temp_restante[i];
                    temp_restante[i] = 0;
                }
            }
        }
        if (finalizados)
            break;
    }

    tempo_total = tempo_chegada;

    printf("\nDados adicionais:\n");
    for (int i = 0; i < n; i++) {
        processos[i].tempo_espera_inicial = processos[i].tempo_espera_inicial - processos[i].tempo_processamento;
        processos[i].tempo_espera_final = tempo_chegada - processos[i].tempo_processamento;
        printf("Tempo de espera para iniciar o processo %-*s: %d\n", max_length, processos[i].nome, processos[i].tempo_espera_inicial);
        printf("Tempo de processamento do processo %-*s: %d\n", max_length, processos[i].nome, processos[i].tempo_processamento);
        printf("Tempo de espera para finalizar o processo %-*s: %d\n", max_length, processos[i].nome, processos[i].tempo_espera_final);
    }

    double tempo_medio_espera_inicial = 0.0;
    double tempo_medio_espera_final = 0.0;
    for (int i = 0; i < n; i++) {
        tempo_medio_espera_inicial += processos[i].tempo_espera_inicial;
        tempo_medio_espera_final += processos[i].tempo_espera_final;
    }
    tempo_medio_espera_inicial /= n;
    tempo_medio_espera_final /= n;

    printf("Tempo médio de espera para iniciar cada processo: %.2lf\n", tempo_medio_espera_inicial);
    printf("Tempo médio de espera para finalizar cada processo: %.2lf\n", tempo_medio_espera_final);
    printf("Tempo total de processador: %d\n", tempo_total);

    free(temp_restante);
}

int main() {
    int n;
    printf("Quantos processos deseja cadastrar? ");
    scanf("%d", &n);

    Processo* processos = (Processo*)malloc(n * sizeof(Processo));
    for (int i = 0; i < n; i++) {
        printf("Nome do processo %d: ", i + 1);
        scanf("%s", processos[i].nome);
        printf("Tempo de execução do processo %d: ", i + 1);
        scanf("%d", &processos[i].tempo_execucao);
    }

    char algoritmo[20];
    printf("Qual algoritmo de escalonamento deseja utilizar? (FCFS/SJF/Circular): ");
    scanf("%s", algoritmo);

    if (strcmp(algoritmo, "FCFS") == 0) {
        fcfs(processos, n);
    } else if (strcmp(algoritmo, "SJF") == 0) {
        sjf(processos, n);
    } else if (strcmp(algoritmo, "Circular") == 0) {
        int quantum;
        printf("Informe o quantum: ");
        scanf("%d", &quantum);
        circular(processos, n, quantum);
    } else {
        printf("Algoritmo de escalonamento inválido.\n");
    }

    free(processos);
    return 0;
}


Quem souber como me ajudar fico agradecido!

Edited by Ariel Rodrigo Campos
Inseri meu código de maneira errada
Link to comment
Share on other sites

0 answers to this question

Recommended Posts

There have been no answers to this question yet

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



  • Forum Statistics

    • Total Topics
      152.1k
    • Total Posts
      651.8k
×
×
  • Create New...