Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Brayan Rastelli

[Resolvido] Simular um processador

Recommended Posts

Bom dia galera,

to simulando um processador, um trabalho pra materia de arquitetura de computadores..

o problema é o seguinte:

 

a principio tinha criado um vetor, tava funcionando bem para oq eu precisava, a entrada de dados era o Numero de processos a serem executados. Exemplo

Numero de processos : 2

 

ai ele gerava 4 numeros aleatorios e jogava-os no vetor( q eram os jobs de cada processo), e depois os imprimia conforme o numero gerado e o num do processo:

 

processo 1: 6 jobs

processo 2: 4 jobs

 

111111|2222

 

só q ai foi passado uma outra implementação, q era ordenar a execução dos jobs por ordem crescente, ou seja, teria q ficar assim:

 

processo 1: 6 jobs

processo 2: 4 jobs

 

2222|111111

 

só q do jeito q fiz, ordenei o vetor mas a impressao, é obvio saiu assim:

 

1111|222222

 

ai é q ta o problema, eu nao tinha como saber qual o processo de cada job armazenado no vetor, entao criei uma struct, com o num do processo e o num de jobs

 

Só q agora to com problema pra ordenar essa struct.. nao tenho a minima ideia d como fazer isso :S. Segue o código abaixo, se puderem dar alguma dica :D

 

valeu.

 

 

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

typedef struct{ //possivel implementacao da struct
	int jobs, nproc;
}PROC;

void printproc(PROC *proc);
void printjob(int *vet);
void ordena(int *vet);

int i,j,np,aux,total = 0;

int main() {

    srand(time(NULL));

    int *vet, opc;
    printf("\t\tBelezia pague a aposta ;)\n1-Sim\n2-Nao\nOpcao: ");
    scanf("%d",&opc);

    printf("Numero de Processos:");

    scanf("%d",&np);

    PROC proc[np];			//gambiarra pra criar a struct.. vai ser dinamico

    vet = calloc(np, sizeof(int));			//cria um vetor conforme o numero de processos

    for ( i = 0;i < np;i++ ) {

      vet[i]=4+rand()%12;	//alocando valores random  
      proc[i].jobs = vet[i];  //armazena na struct valores random pros jobs
      proc[i].nproc = i;		//armazena o numero do processo

      if( i+1 != np )
      	 total += vet[i];	//calcula tempo total de espera

    }  

	printproc(proc);	  	//impressao dos processos e quantos jobs tem	
	ordena(vet); 			//ordenacao do vetor em ordem crescente
	printjob(vet);    		//impressao dos jobs sendo executados, tempo de uso e total da espera da cpu

}

void printproc(PROC *proc) {	//aqui a implementacao da struct ta funcionando normalmente

    for( i = 0;i < np;i++ ) 
       printf("\nProcesso %d: %d Jobs\n",proc[i].nproc,proc[i].jobs);    

    printf("\n");

}

void printjob(int *vet) {

    int seg = 0;

    for ( aux = 0; aux < np; aux++ ) {

		for ( j = 0;j < vet[aux];j++ ) {

			printf("%d",aux+1); //alterar aki pra o numero do processo, ja q ele nao ta mais na ordem criada, usando a struct
			seg++;

		}

		if( aux+1 != np )
	          printf("|");

    }

    printf("\n\nTempo de uso da CPU: %d\n",seg);
    printf("Tempo total de espera: %d\n\n",total);

}

void ordena(int *vet) { 		//trocar para a ordenação da struct

	for ( j = 0; j < np; j++ )

	  for ( i = 0; i < np - 1; i++ )

	    if ( vet[i] > vet[i+1] ) {

		  aux      = vet[i];
		  vet[i]   = vet[i+1];
		  vet[i+1] = aux;

 	    }

}

 

 

ai ele gerava 4 numeros aleatorios e jogava-os no vetor( q eram os jobs de cada processo), e depois os imprimia conforme o numero gerado e o num do processo:

Correção: gerava 2 numeros.. eu ia por um exemplo com 4 mas ia ficar muito extenso =]

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não sei se é bug ou oq, + esse spoiler ai n abriu aki cmg.

tenta implementar com a tag [code.]

 

[]s

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ta ai.. usei o spoiler pra nao ficar mt grande o post =]

 

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

typedef struct{ //possivel implementacao da struct
        int jobs, nproc;
}PROC;

void printproc(PROC *proc);
void printjob(int *vet);
void ordena(int *vet);

int i,j,np,aux,total = 0;

int main() {

    srand(time(NULL));

    int *vet;
    printf("Numero de Processos:");

    scanf("%d",&np);

    PROC proc[np];                      //gambiarra pra criar a struct.. vai ser dinamico

    vet = calloc(np, sizeof(int));                      //cria um vetor conforme o numero de processos

    for ( i = 0;i < np;i++ ) {

      vet[i]=4+rand()%12;       //alocando valores random  
      proc[i].jobs = vet[i];  //armazena na struct valores random pros jobs
      proc[i].nproc = i;                //armazena o numero do processo

      if( i+1 != np )
         total += vet[i];       //calcula tempo total de espera

    }  

        printproc(proc);                //impressao dos processos e quantos jobs tem    
        ordena(vet);                    //ordenacao do vetor em ordem crescente
        printjob(vet);                  //impressao dos jobs sendo executados, tempo de uso e total da espera da cpu

}

void printproc(PROC *proc) {    //aqui a implementacao da struct ta funcionando normalmente

    for( i = 0;i < np;i++ ) 
       printf("\nProcesso %d: %d Jobs\n",proc[i].nproc,proc[i].jobs);    

    printf("\n");

}

void printjob(int *vet) {

    int seg = 0;

    for ( aux = 0; aux < np; aux++ ) {

                for ( j = 0;j < vet[aux];j++ ) {

                        printf("%d",aux+1); //alterar aki pra o numero do processo, ja q ele nao ta mais na ordem criada, usando a struct
                        seg++;

                }

                if( aux+1 != np )
                  printf("|");

    }

    printf("\n\nTempo de uso da CPU: %d\n",seg);
    printf("Tempo total de espera: %d\n\n",total);

}

void ordena(int *vet) {                 //trocar para a ordenação da struct

        for ( j = 0; j < np; j++ )

          for ( i = 0; i < np - 1; i++ )

            if ( vet[i] > vet[i+1] ) {

                  aux      = vet[i];
                  vet[i]   = vet[i+1];
                  vet[i+1] = aux;

            }

}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Como assim, ordenar a struct? O que você ordena é o array. Os campos da struct são a chave de ordenação.

Se eu entendi direito, você vai acabar jogando o array fora.

 

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

typedef struct{ //possivel implementacao da struct
	int jobs, nproc;
}PROC;

void printproc(PROC *proc);
void printjob(PROC *vet);
void ordena(PROC *vet);

int np,total = 0;

int main() {

srand(time(NULL));
printf("Numero de Processos:");

scanf("%d",&np);

PROC proc[np];

int i;
for ( i = 0;i < np;i++ ) {

	proc[i].jobs = 4+rand()%12;
	proc[i].nproc = i; 	//armazena o numero do processo

	if( i+1 != np )
	total += proc[i].jobs; 	//calcula tempo total de espera

} 

	printproc(proc); 	//impressao dos processos e quantos jobs tem	
	ordena(proc); 	//ordenacao do vetor em ordem crescente
	printjob(proc); 	//impressao dos jobs sendo executados, tempo de uso e total da espera da cpu

return 0;
}

void printproc(PROC *proc) {
int i;
for( i = 0;i < np;i++ ) 
	printf("\nProcesso %d: %d Jobs\n",proc[i].nproc,proc[i].jobs);	

printf("\n");

}

void printjob(PROC *vet) {

int seg = 0;
int i, j;
for ( i = 0; i < np; i++ ) {

	for ( j = 0;j < vet[i].jobs;j++ ) {
	printf("%d",vet[i].nproc);
	}

	seg += vet[i].jobs;

	if( i+1 != np ) {
	printf("|");
	}

}

printf("\n\nTempo de uso da CPU: %d\n",seg);
printf("Tempo total de espera: %d\n\n",total);

}

void ordena(PROC *vet) {
int i,j;
PROC aux;
	for ( j = 0; j < np; j++ ) {

	for ( i = 0; i < np - 1; i++ )

	if ( vet[i].jobs > vet[i+1].jobs ) {

	aux 	= vet[i];
	vet[i] = vet[i+1];
	vet[i+1] = aux;

	}
	}
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Putz.. nao achei que fosse tão simples assim.. heheh

Achei q ia ter q trocar cada um dos membros da struct de uma pra outra.. lol

 

era isso ai mesmo.. o vetor ficou inutil ja no programa

 

valeu Isis http://forum.imasters.com.br/public/style_emoticons/default/joia.gif

 

tem mais algumas outras implementações após esta, vou fazê-las aqui.

 

só uma pergunta, existe alguma perda de desempenho em deixar as variaveis globais?

percebi q você retirou quase todas e declarou elas em cada uma das funções

 

[]'s

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.