Guest User

Untitled

a guest
Jan 21st, 2018
61
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.99 KB | None | 0 0
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<string.h>
  4. #include<limits.h>
  5. #include <pthread.h>
  6.  
  7.  
  8. pthread_t *tid; //recebe os identificadores das threads
  9.  
  10. void *organizadorDeCestas(void *indice_cesta_void);
  11. int comparar(const void *a, const void *b);
  12.  
  13. int in_numeros[300], qtd_numeros, qtd_threads, qtd_cestas, menor_numero, maior_numero;
  14. int **cestas, diferenca_por_cesta, *num_item_por_cesta, i, j;
  15.  
  16.  
  17. //argv[1] = numeros de threads
  18. //argv[2] = numeros de cestas (total)
  19. int main (int argc, char *argv[])
  20. {
  21.     FILE *in;
  22.     qtd_numeros = 0;
  23.     menor_numero = INT_MAX;
  24.     maior_numero = INT_MIN;
  25.     if (argc < 3)
  26.     {
  27.       printf("[ERRO] quantidade insuficiente de parâmetros.\n");
  28.        return -1;            
  29.     }
  30.     qtd_threads = atoi(argv[1]);
  31.     qtd_cestas  = atoi(argv[2]);
  32.     //linha adicionada para "simplificar" o problema
  33.     qtd_cestas = qtd_threads;
  34.     printf("qtd_cestas %d\n", qtd_cestas);    
  35.     //tratar erro aqui de qtds ser não válido
  36.     tid = (pthread_t*)malloc(sizeof(pthread_t)*qtd_threads);
  37.     cestas = (int**)malloc(sizeof(int*)*qtd_cestas);
  38.     memset(cestas, 0x00, sizeof(int*)*qtd_cestas);
  39.     num_item_por_cesta = (int*)malloc(sizeof(int)*qtd_cestas);
  40.     memset(num_item_por_cesta, 0x00, sizeof(int)*qtd_cestas);
  41.     in = fopen("entrada.txt", "r");
  42.     if (!in)
  43.     {
  44.        printf("[ERRO] erro ao abrir arquivo de entrada.\n");
  45.        return -1;
  46.     }
  47.     //pegando entrada
  48.     //considera-se que nao haverá mais de 300 numeros no arquivo
  49.     while (!feof(in))
  50.     {
  51.           fscanf(in, "%d\n", &in_numeros[qtd_numeros]);
  52.            printf("numero %d\n", in_numeros[qtd_numeros]);
  53.           if (in_numeros[qtd_numeros] < menor_numero)
  54.              menor_numero = in_numeros[qtd_numeros];
  55.           if (in_numeros[qtd_numeros] > maior_numero)
  56.              maior_numero = in_numeros[qtd_numeros];
  57.           qtd_numeros++;
  58.     }
  59.  
  60.     //organizando cestas
  61.     diferenca_por_cesta = (maior_numero - menor_numero)/qtd_cestas;
  62.      printf("diferenca_por_cesta %d = (%d -%d)/%d\n", diferenca_por_cesta,maior_numero,menor_numero,qtd_cestas);
  63.     if (diferenca_por_cesta <= 0)
  64.     {
  65.        printf("[ERRO] erro no maior_valor e menor_valor.\n");
  66.        return -1;
  67.     }
  68.  
  69.     //por favor, nao me mate... vou melhorar isso... vou mudar nao.. time que ta ganhando nao se mexe
  70.     for (i = 0; i < qtd_numeros; i++)
  71.     {
  72. //        printf("menor numero %d\n", menor_numero);
  73.         printf("item n %d valor %d, diferenca por cesta %d\n", i,in_numeros[i],diferenca_por_cesta);
  74.         int cesta_alvo = (in_numeros[i] - menor_numero)/diferenca_por_cesta;
  75.         printf("cesta_alvo %d\n", cesta_alvo);
  76.         cestas[cesta_alvo] = (int*)realloc(cestas[cesta_alvo],(num_item_por_cesta[cesta_alvo]+1)*sizeof(int));
  77.         printf("aumentando de %d para %d\n",num_item_por_cesta[cesta_alvo],num_item_por_cesta[cesta_alvo]+1);
  78.         if (cestas[cesta_alvo] == NULL)
  79.            printf("loucura...\n");
  80.         printf("adicionando na posicao %d o valor de %d\n", num_item_por_cesta[cesta_alvo],in_numeros[i]);
  81.         cestas[cesta_alvo][num_item_por_cesta[cesta_alvo]] = in_numeros[i];//será que nao fura o limite?
  82.         num_item_por_cesta[cesta_alvo]++;
  83.     }
  84.     //dividindo as cestas
  85.     printf("dividindo as cestas\n");
  86.     for (i=0; i<qtd_threads; i++)
  87.     {  
  88.         pthread_create(&tid[i], NULL, organizadorDeCestas, (void *) (&i));
  89.     }
  90.     for (i = 0; i < qtd_threads; i++)
  91.     {
  92.         pthread_join(tid[i], NULL);    
  93.     }
  94.     for (i = 0; i < qtd_cestas; i++)
  95.     {
  96.         for (j = 0; j < num_item_por_cesta[i]; j++)
  97.         {
  98.                  printf("%d\n", cestas[i][j]);
  99.         }
  100.     }
  101.     scanf("%d", qtd_numeros);
  102.     return 0;    
  103. }
  104.  
  105. void *organizadorDeCestas(void *indice_cesta_void)
  106. {
  107.         int indice_cesta = *((int*)indice_cesta_void);
  108.         qsort( cestas[indice_cesta], num_item_por_cesta[indice_cesta], sizeof(int), comparar);
  109. }
  110.  
  111. int comparar(const void *a, const void *b)
  112. {
  113.   return(*(int*)a - *(int*)b);
  114. }
Add Comment
Please, Sign In to add comment