Advertisement
Guest User

Untitled

a guest
Sep 29th, 2016
62
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 6.33 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. #define TAMANHO_PALAVRA 51
  6. #define TAMANHO_REGISTRO 52
  7. #define MAX_FILENAME_SIZE 10
  8.  
  9. typedef struct tipoLivro{
  10.     char registro[TAMANHO_PALAVRA];
  11.     char disponivel; //Checa a disponibilidade
  12. }Livro;
  13.  
  14. typedef struct tipoBuffer{
  15.     Livro *item;
  16.     int M;
  17. }Buffer;
  18.  
  19. typedef struct tipoFita
  20. {
  21.     FILE *arquivo;
  22.     int flag;
  23. }Fita;
  24.  
  25. /*---------------------------------------------*/
  26. /*                                             */
  27. /*              Quicksort Interno              */
  28. /*                                             */
  29. /*---------------------------------------------*/
  30.  
  31. void Particao(int Esq, int Dir, int *i, int *j, Livro *A)
  32.     {
  33.         Livro x, w;
  34.         *i = Esq; *j = Dir;
  35.         x = A[(*i + *j) / 2]; /* obtem o pivo x */
  36.         do
  37.         {
  38.             while (strcmp(x.registro,A[*i].registro)>0) (*i)++;
  39.             while (strcmp(x.registro,A[*j].registro)<0) (*j)--;
  40.             if (*i <= *j) {
  41.             w = A[*i]; A[*i] = A[*j]; A[*j] = w;
  42.             (*i)++; (*j)--;
  43.         }
  44.     } while (*i <= *j);
  45. }
  46.  
  47. void Ordena(int Esq, int Dir, Livro *A)
  48. {
  49.     int i, j;
  50.     Particao(Esq, Dir, &i, &j, A);
  51.     if (Esq < j) Ordena(Esq, j, A);
  52.     if (i < Dir) Ordena(i, Dir, A);
  53. }
  54.  
  55. /*---------------------------------------------*/
  56. /*                                             */
  57. /*                                             */
  58. /*                                             */
  59. /*---------------------------------------------*/
  60.  
  61. void escreveRegistro(Livro *livro,FILE *output)
  62. {
  63.     fwrite(livro->registro,strlen(livro->registro),1,output);
  64.     fputc (' ', output);
  65.     fwrite(&livro->disponivel,1,1,output);
  66.     livro->registro[0] = '\0';
  67.     livro->disponivel = 'x';
  68. }
  69.  
  70. void escreveBuffer(Livro *bufferLivros, FILE *output,int M)
  71. {
  72.     int i;
  73.     for (i = 0; i < M; i++)
  74.         if(bufferLivros[i].disponivel != 'x')
  75.             escreveRegistro(&bufferLivros[i],output);
  76.    
  77.     fputs (" | ", output);
  78. }
  79.  
  80.  
  81. void esvaziaArquivos(Fita *fitas,int a,int b)
  82. {
  83.     int     i;
  84.     char    fileName[sizeof"fita100.txt"];
  85.  
  86.     for (i = a; i < b; i++)
  87.     {
  88.         sprintf(fileName,"fita%03d.txt",i);
  89.         freopen("fita%03d.txt,","w",fitas[i].arquivo);
  90.         freopen("fita%03d.txt,","w+",fitas[i].arquivo);
  91.     }
  92. }
  93.  
  94. void intercala(Fita *fitas, int a,int b,Livro *bufferLivros,int M,int N)
  95. {
  96.  
  97.     int     i; // Vai ser usado para controlar qual a ordem das fitas. EX: vao ser usadas as fitas 4,5 e 6. i=0 e a fita 4 e assim vai
  98.     char    aux[TAMANHO_PALAVRA];
  99.     char    menor[51] = {"{{{{{{{{{"};
  100.     int     indiceMenor;
  101.     int     k=0; // Conta qual arquivo destino está sendo usado
  102.     int     j;
  103.     int     escritas=0;
  104.     int     totalEscritas=0;
  105.  
  106.     //Adiciona livros na memoria
  107.     for (i = 0; i < M; i++)
  108.     {
  109.         if(bufferLivros[i].disponivel!='x' && fitas[i+a].flag==1 && fscanf(fitas[i+a].arquivo,"%s",aux) != EOF)
  110.         {
  111.             //Se não fim de bloco
  112.             if(aux[0]!='|')
  113.             {
  114.                 strcpy(bufferLivros[i].registro ,aux);
  115.  
  116.                 if(strcmp(bufferLivros[i].registro,menor)<0)
  117.                 {
  118.                     indiceMenor = i;
  119.                     strcpy(menor ,bufferLivros[i].registro);
  120.                 }
  121.                 fscanf(fitas[i+a].arquivo,"%c",&bufferLivros[i].disponivel);
  122.             }
  123.         }
  124.     }
  125.  
  126.     //Começa a intercalar
  127.     while(1)
  128.     {
  129.  
  130.         //Escreve o menor registro e o remove do buffer
  131.         escreveRegistro(&bufferLivros[indiceMenor],fitas[b+k].arquivo);
  132.         escritas++;
  133.         totalEscritas++;
  134.  
  135.         if(escritas==N)
  136.         {
  137.             esvaziaArquivos(fitas,a,a+M);
  138.             return;
  139.         }
  140.  
  141.         //Pega o proximo registro na fita do menor que acabou de ser escrito
  142.         if(fitas[a+indiceMenor].flag !=0 && fscanf(fitas[a+indiceMenor].arquivo,"%s",aux) != EOF)
  143.         {
  144.             if(aux[0]!='|')
  145.             {
  146.                 strcpy(bufferLivros[i].registro ,aux);
  147.  
  148.                 if(strcmp(bufferLivros[i].registro,menor)<0)
  149.                     indiceMenor = i;
  150.                
  151.                 fscanf(fitas[i+a].arquivo,"%c",&bufferLivros[i].disponivel);
  152.             }
  153.             else
  154.                 fitas[i+a].flag = 0;
  155.         }
  156.  
  157.         //Verifica quantas fitas estão inativas e qual o menor indice
  158.         j=0;
  159.         sprintf(menor,"{{{{{");
  160.         for (i = 0; i < M; i++)
  161.         {
  162.             if(bufferLivros[i].disponivel!='x')
  163.             {
  164.                 if (strcmp(bufferLivros[i].registro,menor)<0)
  165.                 {
  166.                     indiceMenor = i;
  167.                     strcpy(menor ,bufferLivros[i].registro );
  168.                 }
  169.             }
  170.             if(fitas[i+a].flag==0)
  171.                 j++;
  172.         }
  173.         if(j==M)
  174.         {
  175.             k++;
  176.             escritas=0;
  177.             for (i = 0; i < M; i++)
  178.                 fitas[i+a].flag=1;
  179.         }
  180.     }
  181. }
  182.  
  183. void voltaProInicioDosArquivos(Fita *fitas,int a,int b)
  184. {
  185.     int i;
  186.     for (i = a; i < b; i++)
  187.         fseek(fitas[i].arquivo,0,SEEK_SET);
  188. }
  189.  
  190.  
  191. // -----------------------------------------------------------------------//
  192.  
  193. int main(int argc, char* argv[])
  194. {
  195.     //--Variaveis--//
  196.  
  197.     int             N;      //Numero de livros na bibilioteca
  198.     int             M;      //Numero de livros que podem estar na memória
  199.     // int          E;      //Numero de estantes
  200.     // int          L;      //numero de livros suportados por cada estante
  201.     // int          K;      //numero de consultas a serem realizadas
  202.     unsigned int    i,j,k;  //contadores
  203.     char            fileName[sizeof"fita100.txt"]; //String que guarda o nome das fitas
  204.     //char          aux[TAMANHO_PALAVRA];
  205.     int             flag=0; //Usada para saber qual metade dos arquivos vai ser usada
  206.  
  207.     //Escaneando valores de entrada
  208.     scanf("%d %d",&N,&M);
  209.  
  210.     //inicializando vetor de fitas
  211.     Fita *fitas = malloc((2*M)*sizeof(Fita));
  212.  
  213.     //Abrindo arquivo de entrada
  214.     FILE *input = fopen("input","r+");
  215.  
  216.     //Iniciliaziando vetor que simula a memória para guardar os livros
  217.     Livro   *bufferLivros = malloc(M*sizeof(Livro));
  218.  
  219.  
  220.     //---------Abrindo os arquivos das fitas---------//
  221.  
  222.     for (i = 0; i < (2*M); i++)
  223.     {
  224.         sprintf(fileName,"fita%03d.txt",i);
  225.         fitas[i].arquivo = fopen(fileName,"w+");
  226.         fitas[i].flag = 1;
  227.     }
  228.  
  229.     //-----------------------------------------------//
  230.  
  231.     //---------Separando os primeiros blocos ordenados nas fitas---------//
  232.  
  233.     j=0;
  234.     k=0;
  235.     for (i = 0; i < N; i++)
  236.     {
  237.         fscanf(input,"%s %c",bufferLivros[j].registro,&bufferLivros[j].disponivel);
  238.         j++;
  239.         if(j==M || i==N-1)
  240.         {
  241.             Ordena(0,M-1,bufferLivros);
  242.             escreveBuffer(bufferLivros,fitas[k].arquivo,M);
  243.             j=0;
  244.             k++;
  245.         }
  246.         if(k==M)
  247.             k=0;
  248.     }
  249.  
  250.     //--------------------------------------------------------------------//
  251.  
  252.     //---------Ordenando---------//
  253.  
  254.  
  255.  
  256.  
  257.     //---------------------------//
  258.  
  259.     for (i = 0; i < (2*M); i++)
  260.     {
  261.         sprintf(fileName,"fita%03d.txt",i);
  262.         fclose(fitas[i].arquivo);
  263.         //if(remove(fileName)==-1)
  264.         //  fprintf(stderr,"Aqruivo %s nao pode ser removido\n",fileName);
  265.     }
  266.  
  267.  
  268.  
  269.     free(bufferLivros);
  270.     free(fitas);
  271.     fclose(input);
  272.  
  273.     //Ordena(0,M-1,bufferLivros);
  274.    
  275.     //fclose(entrada); 
  276.     return 0;
  277. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement