Ir ao conteúdo

Posts recomendados

Postado

preciso de um heeelp nisso aqui gente. 

implementar um codigo em c com metodo de escalonamento nao preemptivo (sem prioridade), sendo que minha entrada é atraves de um arquivo.txt exemplificado aqui como a minha variavel tarefa, porém queria saber como faço para o meu código fazer a compreensão de que tenho 3 tarefas composto por 4 valores numericos que estão ali separados pelo caractere # onde respectivamente é meu pid, tempo de chegada, burst e prioridade. no final preciso fazer o calculo do tempo médio de espera.

 

pensei em fazer através de funções um para o calculo de espera de cada pid e outro para a impressão do calculo médio

 

alguma sugestão?

 

exemplo de entrada:
3
1#2#06#3
2#6#08#2
3#8#10#1

exemplo de saída:
1->0
2->2
3->8

tme = 3.33

 

 

esse aqui é o inicio do meu codigo CODE<>

 

int main(int argc, char **argv){

int n = -1, i = 0; char tarefa[32];

scanf("%d", &n);

printf("%d\n", n);

 

for(i=0; i;>

scanf("%s", tarefa);

printf("%s\n", tarefa);

}

 

printf("\n");

 

return exit_success;

 

}

Postado

image.png.bc4d1073f9145a7035252120ec257858.png

Veja o arquivo.txt aberto no editor, com fundo preto. E ja janela de cima o tal Super Hex Editor aberto no Windows 10 com o mesmo arquivo, para ver o que tem dentro do arquivo byte por byte. Isso é o que tem lá pra ler. As linhas, separadas por um tal newline, o '\n', o ENTER. Por razões históricas é gravado como um par, esses grupos OD 0A que você vê na janela acima. 

 

Em seu programa você já usou scanf(). Essa função foi escrita para ler esse tipo de dados. Talvez não tenha lido o manual afinal. Vendo o que tem pra ler você monta o especificador de scanf(). Nada mais. Num programa de produção se toma muito cuidado para tratar as possíveis condições de erro, mas num programa de estudo é tudo mais simples.

 

O especificador

 

É preciso consumir todos os dados. Cada linha deve ter os campos e terminar por um enter, uma letrinha no popular. O separador de campo é '#'. Então um especificador poderia ser
 

    "%d#%d#%d#%d%c"

 

Para ler quatro int separados por '#' e uma letra no fim que será o enter. Mas o enter não será usado: só precisa sair do caminho para ler o próximo grupo. Tem um modificador para isso: um asterisco indica que o campo deve ser lido mas desprezado, e então 

 

    "%d#%d#%d#%d%*c"

 

serviria também. 

 

EXEMPLO

 

"arquivo.txt"
 

3
1#2#06#3
2#6#08#2
3#8#10#1
3#-8#-10#1

 

Esse arquivo tem uma linha a mais com valores negativos para ver se o sinal é tratado direito, mas é o mesmo que postou como exemplo. 

 

O programa abaixo apenas ignora a primeira linha e lê os parâmetros um por um até acabar o arquivo, e mostra na tela. O simples.


Eis a saída
 

[scanf() leu 4 itens]   pid = 1, tempo = 2, burst = 6, prioridade = 3
[scanf() leu 4 itens]   pid = 2, tempo = 6, burst = 8, prioridade = 2
[scanf() leu 4 itens]   pid = 3, tempo = 8, burst = 10, prioridade = 1
[scanf() leu 4 itens]   pid = 3, tempo = -8, burst = -10, prioridade = 1

 

Do programa

 

#include <stdio.h>

int main(void)
{
    FILE* in = fopen("arquivo.txt", "r");
    if (in == NULL) return 1;

    char linha[80];
    fgets(linha, sizeof(linha), in); // ignora a primeira linha
    const char* mascara = "%d#%d#%d#%d%*c"; // 4 numeros e o enter
    int res = 0;
    int pid = 0;      int tempo = 0;
    int burst = 0;    int prioridade = 0;
    while (!feof(in))
    {
        res = fscanf(in, mascara, &pid, &tempo, &burst, &prioridade);
        if (res > 3) printf("\
[scanf() leu %d itens]\
\tpid = %d, tempo = %d, burst = %d, prioridade = %d\n",
res, pid, tempo, burst, prioridade);
    };
    return 0;
}

 

E vai entender como funciona

 

Ou não?

 

 

  • Curtir 1
Postado

@arfneto sim, consegui compreender!

mas e se a minha entrada será lida através do meu console, meu código mudaria alguma coisa?

eu preciso que a saida seja: o calculo de espera de cada pid (que é a diferença do tempo que ele começou a processar pelo tempo que ele chegou) e o tempo médio de espera (tempopid1+tempopid2+tempopd3/3)

 

exemplo de saída:
1->0
2->2
3->8

tme = (0+2+8)/3 =  3.33

Postado
2 horas atrás, BRUNA2 disse:

mas e se a minha entrada será lida através do meu console, meu código mudaria alguma coisa?

 

Não sei o que dizer. Foi exatamente o que te mostrei então não muda nada.

 

Ao receber os processos calcule o tempo.

  • Curtir 1

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...

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!