Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <time.h>
- #include <string.h>
- #include <math.h>
- int glob=2;
- FILE *arquivo_clientes;
- char* CLIENTE="clientes.txt";
- int loc=0;
- typedef struct REGISTRO{
- int vazio;
- int linha;
- char nome[50];
- float conta;
- float limite;
- float saldo;
- struct REGISTRO *prox;
- }reg;
- typedef struct HASH{
- int profundidadelocal;
- int local;
- reg* primeiro;
- struct HASH *prox;
- }hash;
- typedef struct POOL{
- int global;
- hash *ini;
- }pool;
- int remove_banco(int conta);
- int tobinario(int num,hash* nhash){ //verifica se é o bucket certo retorna 1 se ok
- //retorna 1 se o final binário do numero for igual, senão retorna zero
- //basicamente verifica qual o bucket
- int potencia= pow(2,glob);
- if(num%potencia == nhash->local ){ //divide o numero da conta pelo numero de entradas na pool e compara o resto com o id da hash
- return 1;
- }else{
- return 0;
- }
- }
- void cadastra_cliente();
- int verifica_existencia();
- int criar_banco();
- void consuta_cliente();
- int consultar(float conta);
- reg* inicializa_reg(){
- reg* novo= (reg*)malloc(sizeof(reg));
- novo->vazio=1;
- novo->limite=0;
- novo->conta=0;
- novo->saldo=0;
- novo->linha=0;
- strcpy(novo->nome,"");
- novo->prox=NULL;
- return novo;
- }
- hash* inicializa_hash(){
- hash* novo=(hash*)malloc(sizeof(hash));
- reg* aux1=inicializa_reg();
- reg* aux2=inicializa_reg();
- reg* aux3=inicializa_reg();
- reg* aux4=inicializa_reg();
- novo->local=loc;
- loc++;
- novo->profundidadelocal=glob;
- novo->prox=NULL;
- novo->primeiro=aux1;
- aux1->prox=aux2;
- aux2->prox=aux3;
- aux3->prox=aux4;
- return novo;
- }
- hash* inicializa_hash2(hash* h){
- reg* aux1=inicializa_reg();
- reg* aux2=inicializa_reg();
- reg* aux3=inicializa_reg();
- reg* aux4=inicializa_reg();
- h->primeiro=aux1;
- aux1->prox=aux2;
- aux2->prox=aux3;
- aux3->prox=aux4;
- return h;
- }
- pool* inicializa_pool(){
- pool* nova= (pool*)malloc(sizeof(pool));
- hash* aux1=inicializa_hash();
- hash* aux2=inicializa_hash();
- hash* aux3=inicializa_hash();
- hash* aux4=inicializa_hash();
- nova->ini=aux1;
- nova->global=2;
- aux1->prox=aux2;
- aux2->prox=aux3;
- aux3->prox=aux4;
- return nova;
- }
- void imprime_hash(pool* p){
- int numdir=0;
- hash* aux=p->ini;
- reg* auxi;
- char s[50];
- while(aux!=NULL){
- auxi=aux->primeiro;
- printf("Bucket %s\nProfundidade Local: %d ",itoa(aux->local,s,2),aux->profundidadelocal);
- while(auxi!=NULL){
- if(auxi->vazio!=1){
- printf("Conta: %.0f - Linha %d ||",auxi->conta,auxi->linha);
- numdir++;
- }
- else
- printf("\n");
- auxi=auxi->prox;
- }
- printf("\n");
- aux=aux->prox;
- }
- printf("Profundidade global: %d\nNumero de diretorios: %d",p->global,numdir);
- }
- void reorganiza_hash(hash*h,pool*p);
- void limpa_hash(hash* h){
- h=inicializa_hash2(h);
- }
- int insere_hash(int linha,pool* p, float nconta, float nlimite, float nsaldo, char nnome[]){
- hash* aux2;
- hash* aux=p->ini;
- int verificador=0;
- int auxcontador=2;
- int auxiliarparaglobal=glob;
- while(aux!=NULL){
- if(tobinario(nconta,aux)==1){
- reg* auxi=aux->primeiro;
- while(auxi!=NULL && verificador!=1){
- if(auxi->vazio==1){
- verificador=1;
- auxi->conta=nconta;
- auxi->linha=linha;
- strcpy(auxi->nome,nnome);
- auxi->limite=nlimite;
- auxi->saldo=nsaldo;
- auxi->vazio=0;
- }
- if(verificador!=1)
- auxi=auxi->prox;
- }
- if(verificador!=1 && aux->profundidadelocal>=4){
- printf("O número não pode ser inserido por falta de espaço no Hash.\n");
- return 100;
- }
- else if(verificador!=1 && aux->profundidadelocal<4){
- printf("Overflow.\n");//overflow
- if(aux->profundidadelocal==2){// prof local = 2
- if(p->global==2){
- p->global=3;
- glob++;
- hash* auxHash1=inicializa_hash();
- hash* auxHash2=inicializa_hash();
- hash* auxHash3=inicializa_hash();
- hash* auxHash4=inicializa_hash();
- hash* auxover= p->ini;
- while(auxover->prox!=NULL){
- auxover= auxover->prox;
- }
- auxover->prox =auxHash1;
- auxHash1->prox=auxHash2;
- auxHash2->prox=auxHash3;
- auxHash3->prox=auxHash4;
- auxHash4->prox=NULL;
- }
- aux->profundidadelocal=3;
- hash* auxiliar=(hash*)malloc(sizeof(hash));
- auxiliar->primeiro=aux->primeiro;
- auxiliar->primeiro->prox=aux->primeiro->prox;
- auxiliar->primeiro->prox->prox=aux->primeiro->prox->prox;
- auxiliar->primeiro->prox->prox->prox=aux->primeiro->prox->prox->prox;
- limpa_hash(aux);
- insere_hash(auxiliar->primeiro->linha,p,auxiliar->primeiro->conta,auxiliar->primeiro->limite,auxiliar->primeiro->saldo,auxiliar->primeiro->nome);
- insere_hash(auxiliar->primeiro->prox->linha,p,auxiliar->primeiro->prox->conta,auxiliar->primeiro->prox->limite,auxiliar->primeiro->prox->saldo,auxiliar->primeiro->prox->nome);
- insere_hash(auxiliar->primeiro->prox->prox->linha,p,auxiliar->primeiro->prox->prox->conta,auxiliar->primeiro->prox->prox->limite,auxiliar->primeiro->prox->prox->saldo,auxiliar->primeiro->prox->prox->nome);
- insere_hash(auxiliar->primeiro->prox->prox->prox->linha,p,auxiliar->primeiro->prox->prox->prox->conta,auxiliar->primeiro->prox->prox->prox->limite,auxiliar->primeiro->prox->prox->prox->saldo,auxiliar->primeiro->prox->prox->prox->nome);
- printf("\ndiretorio global duplicado, profundidade 3\n");
- insere_hash(linha,p,nconta,nlimite,nsaldo,nnome);
- return ;
- }
- else if(aux->profundidadelocal==3){//prof local = 3
- if(p->global==3){
- int k;
- for(k=0;k<2;k++){
- p->global=4;
- if(glob!=4)
- glob++;
- hash* auxHash1=inicializa_hash();
- hash* auxHash2=inicializa_hash();
- hash* auxHash3=inicializa_hash();
- hash* auxHash4=inicializa_hash();
- hash* auxover=p->ini;
- while(auxover->prox!=NULL){
- auxover= auxover->prox;
- }
- auxover->prox=auxHash1;
- auxHash1->prox=auxHash2;
- auxHash2->prox=auxHash3;
- auxHash3->prox=auxHash4;
- auxHash4->prox=NULL;
- }
- }
- aux->profundidadelocal=4;
- hash* a= (hash*)malloc(sizeof(hash));
- a->primeiro=aux->primeiro;
- printf("SERAQUE");
- a->primeiro->prox=aux->primeiro->prox;
- printf("NA");
- a->primeiro->prox->prox=aux->primeiro->prox->prox;
- printf("EERR");
- a->primeiro->prox->prox->prox=aux->primeiro->prox->prox->prox;
- printf("EERR");
- limpa_hash(aux);
- insere_hash(a->primeiro->linha,p,a->primeiro->conta,a->primeiro->limite,a->primeiro->saldo,a->primeiro->nome);
- insere_hash(a->primeiro->prox->linha,p,a->primeiro->prox->conta,a->primeiro->prox->limite,a->primeiro->prox->saldo,a->primeiro->prox->nome);
- insere_hash(a->primeiro->prox->prox->linha,p,a->primeiro->prox->prox->conta,a->primeiro->prox->prox->limite,a->primeiro->prox->prox->saldo,a->primeiro->prox->prox->nome);
- insere_hash(a->primeiro->prox->prox->prox->linha,p,a->primeiro->prox->prox->prox->conta,a->primeiro->prox->prox->prox->limite,a->primeiro->prox->prox->prox->saldo,a->primeiro->prox->prox->prox->nome);
- printf("EERR");
- printf("\ndiretorio duplicado, profundidade 4\n");
- insere_hash(linha,p,nconta,nlimite,nsaldo,nnome);
- return;
- }
- }
- }
- aux=aux->prox;
- }
- }
- void reorganiza_hash(hash* h,pool*p){
- hash* auxiliar=(hash*)malloc(sizeof(hash));
- auxiliar->primeiro=h->primeiro;
- auxiliar->primeiro->prox=h->primeiro->prox;
- auxiliar->primeiro->prox->prox=h->primeiro->prox->prox;
- auxiliar->primeiro->prox->prox->prox=h->primeiro->prox->prox->prox;
- printf("||%d||%d||%d||%d||",auxiliar->primeiro->conta,auxiliar->primeiro->prox->conta,auxiliar->primeiro->prox->conta);
- h=inicializa_hash();
- insere_hash(auxiliar->primeiro->linha,p,auxiliar->primeiro->conta,auxiliar->primeiro->limite,auxiliar->primeiro->saldo,auxiliar->primeiro->nome);
- insere_hash(auxiliar->primeiro->prox->linha,p,auxiliar->primeiro->prox->conta,auxiliar->primeiro->prox->limite,auxiliar->primeiro->prox->saldo,auxiliar->primeiro->prox->nome);
- insere_hash(auxiliar->primeiro->prox->prox->linha,p,auxiliar->primeiro->prox->prox->conta,auxiliar->primeiro->prox->prox->limite,auxiliar->primeiro->prox->prox->saldo,auxiliar->primeiro->prox->prox->nome);
- insere_hash(auxiliar->primeiro->prox->prox->prox->linha,p,auxiliar->primeiro->prox->prox->prox->conta,auxiliar->primeiro->prox->prox->prox->limite,auxiliar->primeiro->prox->prox->prox->saldo,auxiliar->primeiro->prox->prox->prox->nome);
- }
- void preenche_hash(pool* p){
- FILE* arq= fopen(CLIENTE,"r+");
- int linha;
- float conta, limite, saldo;
- char nome[50];
- fscanf(arq,"%d|%f|%f|%f|%s\n",&linha,&conta,&limite,&saldo,nome);
- rewind(arq);
- if(linha==1 || linha==999){
- while(!feof(arq)){
- fscanf(arq,"%d|%f|%f|%f|%s\n",&linha,&conta,&limite,&saldo,nome);
- if(linha!=999)
- insere_hash(linha, p,conta,limite,saldo,nome);
- }
- }
- }
- int main(){
- pool* p = inicializa_pool();
- int arquivos, bancos, loop;
- arquivos = verifica_existencia();
- if (arquivos == 0){
- bancos = criar_banco();
- if(bancos == 0) return 0;
- }
- else
- preenche_hash(p);
- int op=6;
- printf("\n\n");
- imprime_hash(p);
- while("TRUE"){
- printf("\nDigite sua opcao de uso.\n1-Cadastrar\n2-Remover\n3-Consultar por conta\n0-Sair\n");
- scanf("%d",&op);
- if(op!=1 && op!=2 && op!=3 && op!=4 && op!=0)
- printf("\nPor favor digite uma opcao valida.\n");
- if(op==1){
- cadastra_cliente(p);
- }
- if(op==2){
- printf("Digite o numero da conta que deseja remover\n");
- int count;
- scanf("%d",&count);
- remove_banco(count);
- }
- if(op==3){
- //consuta_cliente();
- }
- if(op==0){
- exit(1);
- }
- if(op==4){
- imprime_hash(p);
- scanf("");
- }
- }
- }
- int criar_banco(){
- printf("\nCriando banco de dados...");
- FILE *arq= fopen(CLIENTE, "a");
- printf("\nClientes.txt criado. Continuando execucao...");
- fclose(arq);
- return 1;
- }
- int verifica_existencia(){
- fflush(stdin);
- printf("Verificando banco de dados...");
- FILE *arquivo_clientes = fopen(CLIENTE, "r");
- if (arquivo_clientes == NULL){
- printf("\nO arquivo Clientes, de dados, nao existe. Necessita criar um novo banco de dados....\n");
- return 0;
- }
- printf("\nBanco de Dados Consistente. Continuando execucao...\n");
- fclose(arquivo_clientes);
- return 1; //Ambos os arquivos existem.
- }
- void cadastra_cliente(pool* p){
- int numlinha=0,linha;
- int ja_existe;
- float numconta,contalim,contasaldo,conta,saldo,limite;
- char nome[50],nomecliente[50];
- printf("Digite o numero da conta\n");
- scanf("%f",&conta);
- ja_existe = consultar(conta);
- while(ja_existe==1){
- printf("Conta existente no banco de dados.\nPor favor digite outro número de conta.\n");
- scanf("%f",&conta);
- ja_existe=consultar(conta);
- }
- printf("Digite o nome do cliente\n");
- scanf("%s",nomecliente);
- printf("Digite o limite do cliete\n");
- scanf("%f",&limite);
- printf("Digite o saldo inicial do cliente\n");
- scanf("%f",&saldo);
- int auxil;
- auxil=insere_hash(linha,p,conta,limite, saldo, nome);
- if(auxil == 100)
- return;
- FILE *arq= fopen(CLIENTE,"r+");
- while(!feof(arq)){
- fscanf(arq,"%d|%f|%f|%f|%s\n",&numlinha,&numconta,&contalim,&contasaldo,nome);
- }
- numlinha++;
- fprintf(arq,"00%d|%.0f|%.2f|%.2f|%s\n",numlinha,conta,limite,saldo,nomecliente);
- int auxiliar;
- fclose(arq);
- arq=fopen(CLIENTE,"r");
- printf("AAA");
- while(auxiliar!=conta && !feof(arq)){
- fscanf(arq,"%d|%f|%f|%f|%s\n",&linha,&conta,&limite,&saldo,nome);
- }
- printf("BBB");
- printf("CCC");
- fclose(arq);
- }
- /*void consuta_cliente(pool* p){
- float chave;
- hash* aux= p->primeiro->aux
- printf("\nDigite a conta desejado:\t");
- scanf("%f",&chave);
- printf("\n %s :\n \t CPF: %.0f \t limite: %.2f \t saldo: %.2f \t linha: %d \n",nome,numconta,contalim,contasaldo,numlinha);
- printf("Digite enter para sair.");
- scanf(""); ;
- }*/
- int consultar(float conta){
- int aux=0;
- int numlinha;
- float numconta,contalim,contasaldo;
- char nome[50];
- FILE* arq= fopen(CLIENTE,"r+");
- while(numconta!=conta && !feof(arq)){
- fscanf(arq,"%d|%f|%f|%f|%s",&numlinha,&numconta,&contalim,&contasaldo,nome);
- if(numconta==conta)
- aux=1;
- }
- fclose(arq);
- return aux;
- }
- int remove_banco(int conta ){
- long int posicao;
- int aux=0;
- int i;
- int ver=0;
- int numlinha;
- printf("AAA");
- float numconta,contalim,contasaldo;
- char nome[50];
- FILE* arq= fopen(CLIENTE,"r+");
- printf("Conta: %d",conta);
- rewind(arq);
- while(numconta!=conta || !feof(arq)){
- fscanf(arq,"%d|%f|%f|%f|%s\n",&numlinha,&numconta,&contalim,&contasaldo,nome);
- printf("Numconta: %d",numconta);
- aux++;
- }
- if(numconta==conta){
- printf("%d ",numconta);
- rewind(arq);
- for(i=0;i<aux;i++)
- fscanf(arq,"%d|%f|%f|%f|%s",&numlinha,&numconta,&contalim,&contasaldo,nome);
- fprintf(arq,"999");
- ver=1;
- //re
- }
- if(ver==0)
- printf("Conta não encontrada.\n");
- else
- printf("Exclusao concluida.\n");
- return 0;
- fclose(arq);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement