Advertisement
x0Henr1Must47d

TP AED III mod 1

May 8th, 2020
124
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 21.31 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <stdbool.h>
  4. #include <math.h>
  5. #include <errno.h>
  6. #include <time.h>
  7. #define FILENAME_DIR "filedir.dat"
  8. #define FILENAME_INDEX "fileindex.dat"
  9. #define FILENAME_MASTER "filemaster.dat"
  10. #define FOPEN_MODE "rb+"
  11. #define BUCKETS_PER_PAGE 2
  12. #define INITIAL_DEPTH 2
  13.  
  14. extern int errno ;
  15.  
  16. typedef struct Register{ //sctruct que será armazenada no arquivo mestre
  17.     unsigned int cpf;
  18.     char name[16];
  19.     char date[16];
  20.     char sex[1];
  21. }Register;
  22.  
  23. typedef struct Directory{
  24.     unsigned int globalDepth; //profundidade global
  25.     unsigned int *directory; //vetor dos valores do diretorio
  26. }Directory;
  27.  
  28. typedef struct Bucket{
  29.     int cpf; //chave primaria
  30.     int masterIndex; //posição do registro no arquivo mestre
  31. }Bucket;
  32.  
  33. typedef struct Index{
  34.     unsigned int localDepth; //profundidade local
  35.     Bucket *buckets; //buckets do indice
  36. }Index;
  37.  
  38. void testPrintError(){
  39.     printf("[%s]",strerror(errno));
  40. }
  41.  
  42. void errorFileNotFound(){
  43.     printf("\nErro! O arquivo nao foi criado. Execute a opcao 1 para cria-lo.\n");
  44.     testPrintError();
  45. }
  46.  
  47. int hash_function(int cpf, int depth){
  48.     return cpf % intpow(2,depth);
  49. }
  50.  
  51. void fillFile(FILE *file, int tam, int val){//preenche o arquivo "file" com o valor "val" repetido "tam" vezes
  52.     //printf("%i\n",val);
  53.     //fseek(file, 0, SEEK_SET);
  54.     for(int i=0;i<tam;i++){
  55.          fputc(val,file);
  56.     }
  57. }
  58.  
  59. void printBytes(char *msg, int bytes){//imprime a quantidade de bytes na tela
  60.     printf("%s: 0x%x (%i) bytes\n",msg,bytes,bytes);
  61. }
  62.  
  63. int getFileSize(FILE *file){
  64.     fseek(file,0,SEEK_END);
  65.     return ftell(file);
  66. }
  67.  
  68. int indexByteSize(){//tamanho de bytes por indice.
  69.     //4 bytes: p
  70.     //8 bytes: cpf e i do bucket (dois inteiros)
  71.     return (4+(8*BUCKETS_PER_PAGE));
  72. }
  73.  
  74. int masterByteSize(){//tamanho de bytes de uma posição no arquivo master
  75.     //4 bytes: CPF
  76.     //16 bytes: name
  77.     //16 bytes: date
  78.     //1 bytes: sex
  79.     return (4+16+16+1);
  80. }
  81.  
  82. Index loadIndex(int i){//carrega o index na posição i
  83.     FILE *file_index=fopen(FILENAME_INDEX,FOPEN_MODE);
  84.     Index ind;
  85.     if(getFileSize(file_index)<=0){//se o arquivo estiver vazio ou não existir
  86.         //errorFileNotFound();
  87.     }else{
  88.         fseek(file_index,i*indexByteSize(),SEEK_SET);
  89.         fread(&ind.localDepth,sizeof(int),1,file_index);//4 bytes: p
  90.         if(ind.localDepth<INITIAL_DEPTH){
  91.             ind.localDepth=INITIAL_DEPTH;
  92.         }
  93.         ind.buckets=malloc(sizeof(Bucket)*BUCKETS_PER_PAGE);
  94.         for(int j=0;j<BUCKETS_PER_PAGE;j++){
  95.             fread(&ind.buckets[j].cpf,sizeof(int),1,file_index);//4 bytes: cpf
  96.             fread(&ind.buckets[j].masterIndex,sizeof(int),1,file_index);//4 bytes: i
  97.         }
  98.     }
  99.     fclose(file_index);
  100.     return ind;
  101. }
  102.  
  103. void saveIndex(Index ind, int pos){//printf("[%i]",ind.localDepth);
  104.     int d;
  105.     FILE *file_index=fopen(FILENAME_INDEX,FOPEN_MODE);
  106.     fseek(file_index,pos*indexByteSize(),SEEK_SET);
  107.     d=fwrite(&ind.localDepth,sizeof(int),1,file_index);
  108.     for(int i=0;i<BUCKETS_PER_PAGE;i++){
  109.         fwrite(&ind.buckets[i].cpf,sizeof(int),1,file_index);
  110.         fwrite(&ind.buckets[i].masterIndex,sizeof(int),1,file_index);
  111.     }//printf("(%i)\n",d);
  112.     fclose(file_index);
  113. }
  114.  
  115. Register loadMaster(int masterIndex){//carrega o arquivo mestre na posição indicada
  116.     FILE *file_master=fopen(FILENAME_MASTER,FOPEN_MODE);
  117.     Register data;//cria um variável do tipo Register
  118.     if(getFileSize(file_master)<=0){//se o arquivo estiver vazio ou não existir
  119.         errorFileNotFound();
  120.     }else{
  121.         fseek(file_master,masterIndex*masterByteSize(),SEEK_SET);//vai até a posição especificada
  122.         fread(&data.cpf,sizeof(unsigned int),1,file_master);//começa leitura dos dados e grava na sctruct
  123.         fread(&data.date,sizeof(char),16,file_master);
  124.         fread(&data.name,sizeof(char),16,file_master);
  125.         fread(&data.sex,sizeof(char),1,file_master);
  126.     }
  127.     fclose(file_master);//fecha o arquivo
  128.     return data;//retorna a struct preechida
  129. }
  130.  
  131. void saveMaster(Register data, int masterIndex){//recebe a struct preenchida e salva na posição especificada
  132.     FILE *file_master=fopen(FILENAME_MASTER,FOPEN_MODE);//abre o arquivo para leitura
  133.     fseek(file_master,masterIndex*masterByteSize(),SEEK_SET);//vai para o final do arquivo
  134.     fwrite(&data.cpf,sizeof(unsigned int),1,file_master);//começa a escrever no final do arquivo
  135.     fwrite(&data.date,sizeof(char),16,file_master);
  136.     fwrite(&data.name,sizeof(char),16,file_master);
  137.     fwrite(&data.sex,sizeof(char),1,file_master);
  138.     fclose(file_master);//fecha o arquivo
  139. }
  140.  
  141. void loadDirectory(Directory *dir){//carrega o vetor de diretórios do arquivo FILENAME_DIR
  142.     //se o arquivo não existir, cria um vetor básico de p=2.
  143.     //o tamanho do arquivo precisa ser uma potência de 2 maior ou igual a 16, senão vai vir valor errado e não vai ser culpa minha.
  144.     FILE *file_dir=fopen(FILENAME_DIR,FOPEN_MODE);
  145.     int n=getFileSize(file_dir);
  146.     if(n<=0){//se o arquivo nao existir, ou se ele estiver vazio...
  147.         errorFileNotFound();
  148.     }else{
  149.         (*dir).directory=malloc(n);//cria o buffer com o mesmo tamanho do arquivo
  150.         n/=sizeof(int);//divide n pelo tamanho de cada inteiro, n agora é a quantidade de inteiros do arquivo
  151.         (*dir).globalDepth=log2(n);//log2 de n é o valor de p, pois 2^p=n
  152.         rewind(file_dir);//coloca a posição atual de leitura no inicio do arquivo
  153.         fread((*dir).directory,sizeof(int),n,file_dir);//lê todos os n numeros presentes no arquivo e os coloca no vetor directory da struct
  154.     }
  155.     fclose(file_dir);//fecha o arquivo
  156. }
  157.  
  158. void saveDirectory(Directory dir){//salva o diretório no arquivo.
  159.     FILE *file_dir=fopen(FILENAME_DIR,"wb");//abre o arquivo de diretório, no modo wb para apagar os dados anteriores
  160.     fwrite(dir.directory,sizeof(int),pow(2,dir.globalDepth),file_dir);//escreve 2^p numeros inteiros no arquivo, estes numeros inteiros sendo o proprio vetor da struct Directory
  161.     fclose(file_dir);//fecha o arquivo
  162. }
  163.  
  164. int intpow(int base, int exponent){//função de potenciação
  165.     //a função pow() retorna 0 em casos aleatórios então eu fiz essa mais básica.
  166.     int ret=1;
  167.     for(int i=0;i<exponent;i++){
  168.         ret*=base;
  169.     }
  170.     return ret;
  171. }
  172.  
  173. void doubleDirectory(Directory *dir){//dobra o diretório de tamanho, repetindo todos os valores da primeira metade na segunda metade.
  174.     int n=pow(2,(*dir).globalDepth);//obtém o tamanho atual do diretorio
  175.     (*dir).globalDepth++; //aumenta em 1 a profundidade
  176.     unsigned int *newDirectory=malloc(n*2*sizeof(int));//cria o vetor do novo diretorio, com o dobro do tamanho anterior
  177.     for(int i=0;i<(n*2);i++){
  178.         newDirectory[i]=(*dir).directory[i%n];//atribui os valores, o "mod n" aqui vai repetir os valores na mesma sequência.
  179.     }
  180.     free((*dir).directory); //libera o diretorio antigo da memoria
  181.     (*dir).directory=newDirectory;//atribui o novo diretorio à variável da struct
  182. }
  183.  
  184. int increaseIndex(){//adiciona um novo índice vazio no arquivo e retorna sua posição.
  185.     FILE *file_index=fopen(FILENAME_INDEX,FOPEN_MODE);//abre
  186.     //fseek(file_index,0,SEEK_END);//posiciona o indicador no ultimo byte escrito do arquivo do índice
  187.     //int pos=ftell(file_index);//como o indicador está no último byte, ftell irá retornar o tamanho total do arquivo, que também será o valor da posição do índice a ser inserido
  188.  
  189.     int pos=getFileSize(file_index); //isso faz a mesma coisa que as duas linhas comentadas acima
  190.     int size=indexByteSize();//busca o tamanho de bytes de cada índice
  191.     for(int i=0;i<size;i++){
  192.         fputc(0,file_index);//adiciona bytes 00 no arquivo até dar o tamaho de um índice
  193.     }
  194.     fclose(file_index);//fecha
  195.     pos/=size;//divide o tamanho total anterior pelo tamanho de bytes de cada índice, para obter a posição do registro novo
  196.     return pos;
  197. }
  198.  
  199. void testPrintArray(int *array,int n){//exibe os valores de um array int na tela, usado para testes
  200.     printf("\nARRAY[%i]: [",n);
  201.     for(int i=0;i<n;i++){
  202.         printf("%i,",array[i]);
  203.     }
  204.     printf("]\n");
  205. }
  206.  
  207. int getEmptyBucketPosition(Index ind){//busca pela posição do primeiro bucket do vetor de buckets do indice que estiver vazio.
  208.     //retorna -1 se não achar
  209.     //printf("\ngetEmptyBucketPositionk:::");
  210.     for(int i=0;i<BUCKETS_PER_PAGE;i++){
  211.         //printf("\nbucket[%i].cpf=%i",i,ind.buckets[i].cpf);
  212.         if(ind.buckets[i].cpf==0){
  213.             return i;
  214.         }
  215.     }
  216.     return -1;
  217. }
  218.  
  219. int getRegisterPosition(int cpf, Index ind){
  220.     for(int i=0;i<BUCKETS_PER_PAGE;i++){
  221.         if(ind.buckets[i].cpf==cpf){
  222.             return i;
  223.         }
  224.     }
  225.     return -1;
  226. }
  227.  
  228. void createFiles(){
  229.     //diretório
  230.     printf("Criando arquivo %s...\n",FILENAME_DIR);
  231.     FILE *file_dir=file_dir=fopen(FILENAME_DIR,"wb+");
  232.     for(int i=0;i<4;i++){
  233.         fwrite(&i,sizeof(int),1,file_dir);
  234.     }
  235.     int byteSize=getFileSize(file_dir);
  236.     fclose(file_dir);
  237.     printf("%s criado.\n",FILENAME_DIR);
  238.     printBytes("Tamanho",byteSize);
  239.  
  240.     //índice
  241.     printf("\nCriando arquivo %s...\n",FILENAME_INDEX);
  242.     FILE *file_index=fopen(FILENAME_INDEX,"wb+");
  243.     fillFile(file_index,indexByteSize()*4,0);
  244.     byteSize=getFileSize(file_index);
  245.     fclose(file_index);
  246.     printf("%s criado.\n",FILENAME_INDEX);
  247.     printBytes("Tamanho",byteSize);
  248.  
  249.     //mestre
  250.     printf("\nCriando arquivo %s...\n",FILENAME_MASTER);
  251.     FILE *file_master=fopen(FILENAME_MASTER,"wb+");
  252.     //fillFile(file_master,masterByteSize()*4,0);
  253.     byteSize=getFileSize(file_master);
  254.     fclose(file_master);
  255.     printf("%s criado.\n",FILENAME_MASTER);
  256.     printBytes("Tamanho",byteSize);
  257. }
  258.  
  259. void printDirectory(Directory dir){
  260.     int n=pow(2,dir.globalDepth);
  261.     printf("Diretorio\n");
  262.     printf("DIRECTORY(%i): [",n);
  263.     for(int i=0;i<n;i++){
  264.         printf("%i,",dir.directory[i]);
  265.     }
  266.     printf("]\n");
  267.     printf("\n");
  268. }
  269.  
  270. void printIndexes(){
  271.     FILE *file_index=fopen(FILENAME_INDEX,FOPEN_MODE);
  272.     int n=getFileSize(file_index)/indexByteSize();
  273.     Index ind;
  274.     printf("INDICE\n");
  275.     for(int i=0;i<n;i++){
  276.         ind=loadIndex(i);
  277.         printf("INDEX [%i]:\n\tP': %i\n\tBUCKETS: \n",i,ind.localDepth);
  278.         for(int j=0;j<BUCKETS_PER_PAGE;j++){
  279.             printf("\t\t[%i]: CPF: %i, MASTER_INDEX: %i\n",j,ind.buckets[j].cpf,ind.buckets[j].masterIndex);
  280.         }
  281.         //printf("\t\t]\n");
  282.         printf("\n");
  283.     }
  284.     fclose(file_index);
  285.     printf("\n");
  286. }
  287.  
  288. void printMaster(){
  289.     FILE *file_master=fopen(FILENAME_MASTER,FOPEN_MODE);
  290.     int n=getFileSize(file_master)/masterByteSize();
  291.     Register data;
  292.     printf("Mestre\n");
  293.     for(int i=0;i<n;i++){
  294.         data=loadMaster(i);
  295.         printf("MASTER [%i]:\n\tCPF: %i\n\tName: %s\n\tDate: %s\n\tSex: %s\n",i,data.cpf,data.name,data.date,data.sex);
  296.     }
  297.     printf("\n");
  298. }
  299.  
  300. void splitIndex(Index *ind, Directory *dir, int hash, Bucket b){//divide o índice em 2 e retorna o novo índice
  301.     printf("\n[split index]");
  302.     //printf("\ndir.globalDepth(%i),ind.localDepth(%i)",(*dir).globalDepth,(*ind).localDepth);
  303.     if((*dir).globalDepth==(*ind).localDepth){//se a profundidade global e local forem iguais
  304.         doubleDirectory(dir);//dobra o diretorio de tamanho
  305.     }
  306.     (*ind).localDepth++;
  307.     for(int i=0;i<BUCKETS_PER_PAGE;i++){
  308.         if((*ind).buckets[i].cpf>0){//se o valor do cpf for maior do que 0, ou seja, se o bucket não estiver vazio
  309.             int rehash=hash_function((*ind).buckets[i].cpf,(*dir).globalDepth);//recalcula a hash do registro já inserido, baseado no p local
  310.             //printf("\noldHash: %i,newHash: %i, CPFval[%i]:%i\n",hash,newHash,i,(*ind).buckets[i].cpf);
  311.             //printf("\n\tREHASH ([%i]%i mod %i) directory[%i]=%i (newindex %i)",i,(*ind).buckets[i].cpf,intpow(2,(*ind).localDepth),newHash,(*dir).directory[newHash],new_index_index);
  312.             //if((*dir).directory[newHash]==new_index_index){//se a nova hash retonar o valor correspondente á posição do índice novo no diretório
  313.             if(hash!=rehash){
  314.                 Index rehashIndex;
  315.                 int rehash_index_index;
  316.                 if((*dir).directory[hash]==(*dir).directory[rehash]){
  317.                     rehash_index_index=increaseIndex();
  318.                     (*dir).directory[rehash]=rehash_index_index;
  319.                     rehashIndex=loadIndex(rehash_index_index);
  320.                     rehashIndex.localDepth=(*ind).localDepth;
  321.                 }else{
  322.                     rehash_index_index=(*dir).directory[rehash];
  323.                     rehashIndex=loadIndex(rehash_index_index);
  324.                 }
  325.  
  326.                 int emptyBucket=getEmptyBucketPosition(rehashIndex);//busca o primeiro espaço vazio do novo índice
  327.                 if(emptyBucket>=0){
  328.                     rehashIndex.buckets[emptyBucket]=(*ind).buckets[i];//coloca o bucket nesse espaço
  329.                     (*ind).buckets[i].cpf=0;//"esvazia" o bucket no indice antigo
  330.                 }
  331.                 saveIndex(rehashIndex,rehash_index_index);
  332.             }else if(b.cpf<(*ind).buckets[i].cpf){
  333.                 Bucket temp=(*ind).buckets[i];
  334.                 (*ind).buckets[i]=b;
  335.                 b=temp;
  336.             }
  337.         }
  338.     }
  339.  
  340.     //inserindo o novo bucket.
  341.     int newHash=hash_function(b.cpf,(*dir).globalDepth);//busca a posição diretório
  342.     int new_index_index;
  343.     Index newIndex;
  344.     if(hash!=newHash){
  345.         if((*dir).directory[hash]==(*dir).directory[newHash]){
  346.             new_index_index=increaseIndex();
  347.             (*dir).directory[newHash]=new_index_index;
  348.             newIndex=loadIndex(new_index_index);
  349.             newIndex.localDepth=(*ind).localDepth;
  350.         }else{
  351.             new_index_index=(*dir).directory[newHash];
  352.             newIndex=loadIndex(new_index_index);
  353.         }
  354.         int emptyBucket=getEmptyBucketPosition(newIndex);
  355.         if(emptyBucket>=0){
  356.             newIndex.buckets[emptyBucket]=b;
  357.         }else{
  358.             splitIndex(&newIndex,dir,newHash,b);
  359.         }
  360.         saveIndex(newIndex,new_index_index);
  361.     }else{
  362.         int emptyBucket=getEmptyBucketPosition((*ind));
  363.         if(emptyBucket>=0){
  364.             (*ind).buckets[emptyBucket]=b;
  365.         }else{
  366.             splitIndex(ind,dir,hash,b);
  367.         }
  368.     }
  369. }
  370.  
  371. void Simulation(Directory dir, int i){
  372.     Register data;
  373.     //int RandomCPF = (rand() % 9999999999);
  374.     data.cpf=i+1;
  375.    
  376.     FILE *file_master=fopen(FILENAME_MASTER,FOPEN_MODE);//abre o arquivo mestre para obter o tamanho dele
  377.     int masterIndex=getFileSize(file_master)/masterByteSize();//a posição no arquivo mestre será o tamanho total do arquivo / quantidade de bytes por registro
  378.     fclose(file_master);//fecha o arquivo mestre
  379.    
  380.     //cria um bucket com o cpf atual e a posição do registro no arquivo mestre.
  381.     Bucket b;
  382.     b.cpf = data.cpf;
  383.     b.masterIndex = masterIndex;
  384.  
  385.     int hash=hash_function(b.cpf, dir.globalDepth);//a função hash retorna a posição do diretório onde se encontra a posição do índice onde deve ficar o bucket com o cpf do novo registro.
  386.     int index_index=dir.directory[hash];//busca a posição do índice onde o bucket será inserido.
  387.     printf("\nHash function result: %i\nValue in directory: %i\nMaster index: %i\n",hash,index_index,masterIndex);
  388.  
  389.     Index ind=loadIndex(index_index);//carrega o índice do arquivo
  390.     int emptyBucket=getEmptyBucketPosition(ind);//busca a primeira posição vazia dos buckets do índice
  391.         if(emptyBucket>=0){//se houver um bucket vazio no índice...
  392.             ind.buckets[emptyBucket]=b;//colocar o bucket criado naquele espaço.
  393.             printf("\nInserido!\n");
  394.         }else{//senao, divide o índice.
  395.             splitIndex(&ind,&dir,hash,b);
  396.         }
  397.     saveIndex(ind, index_index);//salva o índice no arquivo.
  398.     saveDirectory(dir);//salva o diretório.
  399.     saveMaster(data,masterIndex);//salva todos os dados inseridos no arquivo mestre.
  400. }
  401.  
  402. int main(){
  403.     //unsigned int p=INITIAL_DEPTH, p_, index_tam=pow(2,INITIAL_DEPTH);//p é o tamanho do diretório; p_ é o p';
  404.     //int masterIndex=-1;//masterIndex é a posição no arquivo mestre;
  405.     //int dir_index;
  406.     Register data;
  407.     //Index *indices=malloc(index_tam*sizeof(Index));
  408.     //loadIndexes(indices, dir);
  409.  
  410.     Directory dir;
  411.     loadDirectory(&dir);
  412.  
  413.     int op;
  414.     printf("~Sistema de Cadastro de Prontuarios para uma Empresa de Planos de Saude~\n");
  415.     while(true){
  416.         printf("\n========[MENU]========\n");
  417.         printf("[0]\tExit\n[1]\tCriar arquivos\n[2]\tInserir registro\n[3]\tEditar registro\n[4]\tRemover registro\n[5]\tImprimir arquivos\n[6]\tSimulacao\n\n");
  418.         printf("Digite a opcao: ");
  419.         scanf("%i",&op);
  420.         printf("\n");
  421.         switch(op){
  422.             default:
  423.                 printf("Opcao invalida!!!\n");
  424.             break;
  425.             case 1: //Criar arquivos
  426.                 createFiles();
  427.                 loadDirectory(&dir);
  428.             break;
  429.             case 2: //Inserir registro
  430.                 printf("CPF do cliente: ");
  431.                 scanf("%d", &data.cpf);
  432.                 printf("Nome do cliente: ");
  433.                 scanf("%s", &data.name);
  434.                 printf("Data de nascimento: ");
  435.                 scanf("%s", &data.date);
  436.                 printf("Sexo (m ou f): ");
  437.                 scanf("%s", &data.sex);
  438.  
  439.                 FILE *file_master=fopen(FILENAME_MASTER,FOPEN_MODE);//abre o arquivo mestre para obter o tamanho dele
  440.                 int masterIndex=getFileSize(file_master)/masterByteSize();//a posição no arquivo mestre será o tamanho total do arquivo / quantidade de bytes por registro
  441.                 fclose(file_master);//fecha o arquivo mestre
  442.  
  443.                 //cria um bucket com o cpf atual e a posição do registro no arquivo mestre.
  444.                 Bucket b;
  445.                 b.cpf = data.cpf;
  446.                 b.masterIndex = masterIndex;
  447.  
  448.                 int hash=hash_function(b.cpf, dir.globalDepth);//a função hash retorna a posição do diretório onde se encontra a posição do índice onde deve ficar o bucket com o cpf do novo registro.
  449.                 int index_index=dir.directory[hash];//busca a posição do índice onde o bucket será inserido.
  450.                 printf("\nHash function result: %i\nValue in directory: %i\nMaster index: %i\n",hash,index_index,masterIndex);
  451.  
  452.                 Index ind=loadIndex(index_index);//carrega o índice do arquivo
  453.                 int emptyBucket=getEmptyBucketPosition(ind);//busca a primeira posição vazia dos buckets do índice
  454.                     if(emptyBucket>=0){//se houver um bucket vazio no índice...
  455.                         ind.buckets[emptyBucket]=b;//colocar o bucket criado naquele espaço.
  456.                     }else{//senao, divide o índice.
  457.                         splitIndex(&ind,&dir,hash,b);
  458.                     }
  459.                 saveIndex(ind, index_index);//salva o índice no arquivo.
  460.                 saveDirectory(dir);//salva o diretório.
  461.                 saveMaster(data,masterIndex);//salva todos os dados inseridos no arquivo mestre.
  462.             break;
  463.             case 3:
  464.                 printf("Qual registro deseja editar?\n");
  465.                 scanf("%i", &data.cpf);
  466.                 hash=hash_function(data.cpf, dir.globalDepth);//hash recebe o resultado da função hash
  467.                 index_index=dir.directory[hash];//index_index recebe o apontador presente na posição especificada pela hash
  468.                 ind=loadIndex(index_index);//carrega o indice da posicao especificada
  469.                 int bucketRegister=getRegisterPosition(data.cpf,ind);//procura o registro especificado no indice
  470.                 if(bucketRegister==-1){//se o retorno for -1 o registro não existe
  471.                     printf("Registro inexistente");
  472.                     break;
  473.                 }
  474.  
  475.                 printf("Nome do cliente: ");
  476.                 scanf("%s", &data.name);
  477.                 printf("Data de nascimento: ");
  478.                 scanf("%s", &data.date);
  479.                 printf("Sexo (m ou f): ");
  480.                 scanf("%s", &data.sex);
  481.  
  482.                 int pos_m=ind.buckets[bucketRegister].masterIndex;//pos_m recebe a posição do registro no arquivo master
  483.                 saveMaster(data,pos_m);//salva todos os dados inseridos no arquivo mestre.
  484.             break;
  485.             case 4://remover registro
  486.                 printf("Qual registro deseja excluir?\n");
  487.                 scanf("%i", &data.cpf);
  488.                 hash=hash_function(data.cpf, dir.globalDepth);//hash recebe o resultado da função hash
  489.                 index_index=dir.directory[hash];//index_index recebe o apontador presente na posição especificada pela hash
  490.                 ind=loadIndex(index_index);//carrega o indice da posicao especificada
  491.                 bucketRegister=getRegisterPosition(data.cpf,ind);//procura o registro especificado no indice
  492.                 if(bucketRegister==-1){//se o retorno for -1 o registro não existe
  493.                     printf("Registro inexistente");
  494.                     break;
  495.                 }
  496.                 b.cpf=0;
  497.                 ind.buckets[bucketRegister]=b;
  498.                 saveIndex(ind, index_index);//salva o índice no arquivo.
  499.             break;
  500.             case 5://imprimir arquivos
  501.                 printDirectory(dir);
  502.                 printIndexes();
  503.                 printMaster();
  504.             break;
  505.             case 6:
  506.                 for(int i=0; i<50; i++)
  507.                     Simulation(dir,i);
  508.             break;            
  509.         }
  510.     }
  511.     return 0;
  512. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement