DiegoDF1445

SO P&T - 5 (processos)

Oct 25th, 2018
165
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.56 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <unistd.h>
  3. #include <stdlib.h>
  4. #include <sys/types.h>
  5. #include <fcntl.h>
  6. #include <sys/syscall.h>
  7.  
  8. //Tamanho do vetor
  9. #define MAXN 100005
  10.  
  11. //Maior elemento permitido
  12. #define AMAX 100005
  13.  
  14. int cnt[AMAX], arr[MAXN], n;
  15.  
  16. //Função para calcular o numero de bytes de um numero (log10..)
  17. int logdez(int x){
  18.     int ans = 0;
  19.     while(x){
  20.         ans++;
  21.         x /= 10;
  22.     }
  23.     return ans;
  24. }
  25.  
  26. void count(int l, int r, int v){
  27.     int i, fd;
  28.     //array auxiliar para o counting sort
  29.     int ord[(n >> 1)+1];
  30.    
  31.     // nome do arquivo e string para printar no arquivo, respectivamente
  32.     char nome[8], x[10];
  33.    
  34.     //Nome do arquivo que vai ser criado para salvar o resultado
  35.     sprintf(nome, "FP%d.txt", v);
  36.    
  37.     //COUNTING SORT
  38.     for(i = l; i < r; i++) cnt[ arr[i] ]++;
  39.     for(i = 1; i < AMAX; i++) cnt[i] += cnt[i - 1];
  40.     for(i = l; i < r; i++) ord[ --cnt[ arr[i] ] ] = arr[i];
  41.    
  42.     //Caso ja exista um arquivo de uma execução passada
  43.     remove(nome);
  44.     //Criaçao do arquivo
  45.     fd = open(nome, O_CREAT | O_TRUNC | O_APPEND | O_RDWR , S_IRWXU );
  46.    
  47.     //Printamos o resultado no arquivo de texto para ser usado futuramente
  48.     r = r - l;
  49.     for(i = 0 ; i < r; i++){
  50.         sprintf(x, "%d ", ord[i]);
  51.         write(fd, x, logdez(ord[i]) + 1);
  52.     }
  53.    
  54.     close(fd);
  55. }
  56.  
  57. int main(){
  58.    
  59.     //freopen("input.txt", "r", stdin);
  60.     //freopen("output.txt", "w", stdout);
  61.     int i;
  62.  
  63.     //Entrada dos dados
  64.     scanf("%d", &n);
  65.  
  66.     for(i = 0; i < n; i++){
  67.         scanf("%d", arr + i);
  68.     }
  69.  
  70.     int p = fork();
  71.    
  72.     // p == 0 ? processo filho : processo original
  73.     if(!p){
  74.         //Counting sort na primeira metade
  75.         count(0, n >> 1, 0);
  76.         exit(1);
  77.     } else {
  78.         //counting sort na segunda metade
  79.         count(n >> 1, n, 1);
  80.     }
  81.  
  82.     //Arrays para guardar os dados lidos dos arquivos de texto
  83.     int fp[MAXN], fs[MAXN];    
  84.    
  85.     //LEITURA DOS DADOS
  86.     freopen("FP0.txt", "r", stdin);
  87.  
  88.  
  89.     int l, r;
  90.     for(l = 0, r = n >> 1; l < r; l++){
  91.         scanf("%d ", fp + l);
  92.     }
  93.  
  94.     freopen("FP1.txt", "r", stdin);
  95.    
  96.     int a, b;
  97.     for(a = 0, b = r + (n & 1) ; a < b; a++){
  98.         scanf("%d ", fs + a);
  99.     }
  100.  
  101.     a = l = 0;
  102.  
  103.     //Duas sequencias ordenadas, podemos juntar as duas em uma unica sequencia ordenada em O(n). (merge)
  104.     while(a < b && l < r){
  105.         if(fp[l] < fs[a]) printf("%d ", fp[l++]);
  106.         else printf("%d ", fs[a++]);
  107.     }
  108.     while(a < b) printf("%d ", fs[a++]);
  109.     while(l < r) printf("%d ", fp[l++]);
  110.     putchar('\n');
  111.  
  112.     exit(1);
  113. }
Add Comment
Please, Sign In to add comment