Ir ao conteúdo
  • Cadastre-se

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


Posts recomendados

Boa Tarde. Preciso de ajuda pra esse código que mostra o tempo de exibição de processos. porém, 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
------------------------

Quem puder me ajudar eu agradeço.

#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;
}

 

Link para o comentário
Compartilhar em outros sites

  • 2 semanas depois...
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");
    }

O problema está nesse trecho, ele está imprimindo conforme a ordem, você teria que imprimir na ordem contrária. Começando do índice final e vir diminuindo até o inicial. E também tem um erro aí no segundo 'for', se o tempo de chegada = 0 e j = 0, não tem sentido dizer 'j < tempo_chegada; j++'. Teria de seguir o mesmo padrão do 'for' seguinte.

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!