Advertisement
Guest User

Untitled

a guest
Oct 17th, 2017
52
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 14.14 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4. #include <string.h>
  5. #include <math.h>
  6. int glob=2;
  7.  
  8. FILE *arquivo_clientes;
  9. char* CLIENTE="clientes.txt";
  10.  
  11. int loc=0;
  12.  
  13. typedef struct REGISTRO{
  14. int vazio;
  15. int linha;
  16. char nome[50];
  17. float conta;
  18. float limite;
  19. float saldo;
  20. struct REGISTRO *prox;
  21. }reg;
  22.  
  23. typedef struct HASH{
  24. int profundidadelocal;
  25. int local;
  26. reg* primeiro;
  27. struct HASH *prox;
  28. }hash;
  29.  
  30. typedef struct POOL{
  31. int global;
  32. hash *ini;
  33. }pool;
  34. int remove_banco(int conta);
  35. int tobinario(int num,hash* nhash){ //verifica se é o bucket certo retorna 1 se ok
  36. //retorna 1 se o final binário do numero for igual, senão retorna zero
  37. //basicamente verifica qual o bucket
  38.  
  39. int potencia= pow(2,glob);
  40. 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
  41. return 1;
  42. }else{
  43. return 0;
  44. }
  45. }
  46.  
  47. void cadastra_cliente();
  48. int verifica_existencia();
  49. int criar_banco();
  50. void consuta_cliente();
  51. int consultar(float conta);
  52.  
  53. reg* inicializa_reg(){
  54. reg* novo= (reg*)malloc(sizeof(reg));
  55. novo->vazio=1;
  56. novo->limite=0;
  57. novo->conta=0;
  58. novo->saldo=0;
  59. novo->linha=0;
  60. strcpy(novo->nome,"");
  61. novo->prox=NULL;
  62. return novo;
  63. }
  64.  
  65. hash* inicializa_hash(){
  66. hash* novo=(hash*)malloc(sizeof(hash));
  67. reg* aux1=inicializa_reg();
  68. reg* aux2=inicializa_reg();
  69. reg* aux3=inicializa_reg();
  70. reg* aux4=inicializa_reg();
  71. novo->local=loc;
  72. loc++;
  73. novo->profundidadelocal=glob;
  74. novo->prox=NULL;
  75. novo->primeiro=aux1;
  76. aux1->prox=aux2;
  77. aux2->prox=aux3;
  78. aux3->prox=aux4;
  79. return novo;
  80. }
  81. hash* inicializa_hash2(hash* h){
  82. reg* aux1=inicializa_reg();
  83. reg* aux2=inicializa_reg();
  84. reg* aux3=inicializa_reg();
  85. reg* aux4=inicializa_reg();
  86. h->primeiro=aux1;
  87. aux1->prox=aux2;
  88. aux2->prox=aux3;
  89. aux3->prox=aux4;
  90. return h;
  91. }
  92. pool* inicializa_pool(){
  93. pool* nova= (pool*)malloc(sizeof(pool));
  94. hash* aux1=inicializa_hash();
  95. hash* aux2=inicializa_hash();
  96. hash* aux3=inicializa_hash();
  97. hash* aux4=inicializa_hash();
  98. nova->ini=aux1;
  99. nova->global=2;
  100. aux1->prox=aux2;
  101. aux2->prox=aux3;
  102. aux3->prox=aux4;
  103. return nova;
  104. }
  105.  
  106. void imprime_hash(pool* p){
  107. int numdir=0;
  108. hash* aux=p->ini;
  109. reg* auxi;
  110. char s[50];
  111. while(aux!=NULL){
  112. auxi=aux->primeiro;
  113. printf("Bucket %s\nProfundidade Local: %d ",itoa(aux->local,s,2),aux->profundidadelocal);
  114. while(auxi!=NULL){
  115. if(auxi->vazio!=1){
  116. printf("Conta: %.0f - Linha %d ||",auxi->conta,auxi->linha);
  117. numdir++;
  118. }
  119. else
  120. printf("\n");
  121. auxi=auxi->prox;
  122. }
  123. printf("\n");
  124. aux=aux->prox;
  125. }
  126. printf("Profundidade global: %d\nNumero de diretorios: %d",p->global,numdir);
  127. }
  128.  
  129. void reorganiza_hash(hash*h,pool*p);
  130.  
  131. void limpa_hash(hash* h){
  132. h=inicializa_hash2(h);
  133.  
  134. }
  135.  
  136. int insere_hash(int linha,pool* p, float nconta, float nlimite, float nsaldo, char nnome[]){
  137. hash* aux2;
  138. hash* aux=p->ini;
  139. int verificador=0;
  140. int auxcontador=2;
  141. int auxiliarparaglobal=glob;
  142. while(aux!=NULL){
  143. if(tobinario(nconta,aux)==1){
  144. reg* auxi=aux->primeiro;
  145. while(auxi!=NULL && verificador!=1){
  146. if(auxi->vazio==1){
  147. verificador=1;
  148. auxi->conta=nconta;
  149. auxi->linha=linha;
  150. strcpy(auxi->nome,nnome);
  151. auxi->limite=nlimite;
  152. auxi->saldo=nsaldo;
  153. auxi->vazio=0;
  154. }
  155. if(verificador!=1)
  156. auxi=auxi->prox;
  157.  
  158. }
  159. if(verificador!=1 && aux->profundidadelocal>=4){
  160. printf("O número não pode ser inserido por falta de espaço no Hash.\n");
  161. return 100;
  162. }
  163. else if(verificador!=1 && aux->profundidadelocal<4){
  164. printf("Overflow.\n");//overflow
  165. if(aux->profundidadelocal==2){// prof local = 2
  166. if(p->global==2){
  167. p->global=3;
  168. glob++;
  169. hash* auxHash1=inicializa_hash();
  170. hash* auxHash2=inicializa_hash();
  171. hash* auxHash3=inicializa_hash();
  172. hash* auxHash4=inicializa_hash();
  173. hash* auxover= p->ini;
  174. while(auxover->prox!=NULL){
  175. auxover= auxover->prox;
  176. }
  177. auxover->prox =auxHash1;
  178. auxHash1->prox=auxHash2;
  179. auxHash2->prox=auxHash3;
  180. auxHash3->prox=auxHash4;
  181. auxHash4->prox=NULL;
  182. }
  183. aux->profundidadelocal=3;
  184. hash* auxiliar=(hash*)malloc(sizeof(hash));
  185. auxiliar->primeiro=aux->primeiro;
  186. auxiliar->primeiro->prox=aux->primeiro->prox;
  187. auxiliar->primeiro->prox->prox=aux->primeiro->prox->prox;
  188. auxiliar->primeiro->prox->prox->prox=aux->primeiro->prox->prox->prox;
  189. limpa_hash(aux);
  190. insere_hash(auxiliar->primeiro->linha,p,auxiliar->primeiro->conta,auxiliar->primeiro->limite,auxiliar->primeiro->saldo,auxiliar->primeiro->nome);
  191. insere_hash(auxiliar->primeiro->prox->linha,p,auxiliar->primeiro->prox->conta,auxiliar->primeiro->prox->limite,auxiliar->primeiro->prox->saldo,auxiliar->primeiro->prox->nome);
  192. 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);
  193. 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);
  194. printf("\ndiretorio global duplicado, profundidade 3\n");
  195. insere_hash(linha,p,nconta,nlimite,nsaldo,nnome);
  196. return ;
  197. }
  198. else if(aux->profundidadelocal==3){//prof local = 3
  199. if(p->global==3){
  200. int k;
  201. for(k=0;k<2;k++){
  202. p->global=4;
  203. if(glob!=4)
  204. glob++;
  205. hash* auxHash1=inicializa_hash();
  206. hash* auxHash2=inicializa_hash();
  207. hash* auxHash3=inicializa_hash();
  208. hash* auxHash4=inicializa_hash();
  209. hash* auxover=p->ini;
  210. while(auxover->prox!=NULL){
  211. auxover= auxover->prox;
  212. }
  213. auxover->prox=auxHash1;
  214. auxHash1->prox=auxHash2;
  215. auxHash2->prox=auxHash3;
  216. auxHash3->prox=auxHash4;
  217. auxHash4->prox=NULL;
  218. }
  219. }
  220. aux->profundidadelocal=4;
  221. hash* a= (hash*)malloc(sizeof(hash));
  222. a->primeiro=aux->primeiro;
  223. printf("SERAQUE");
  224. a->primeiro->prox=aux->primeiro->prox;
  225. printf("NA");
  226. a->primeiro->prox->prox=aux->primeiro->prox->prox;
  227. printf("EERR");
  228. a->primeiro->prox->prox->prox=aux->primeiro->prox->prox->prox;
  229. printf("EERR");
  230. limpa_hash(aux);
  231. insere_hash(a->primeiro->linha,p,a->primeiro->conta,a->primeiro->limite,a->primeiro->saldo,a->primeiro->nome);
  232. insere_hash(a->primeiro->prox->linha,p,a->primeiro->prox->conta,a->primeiro->prox->limite,a->primeiro->prox->saldo,a->primeiro->prox->nome);
  233. 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);
  234. 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);
  235. printf("EERR");
  236. printf("\ndiretorio duplicado, profundidade 4\n");
  237.  
  238. insere_hash(linha,p,nconta,nlimite,nsaldo,nnome);
  239. return;
  240. }
  241. }
  242. }
  243. aux=aux->prox;
  244. }
  245.  
  246. }
  247. void reorganiza_hash(hash* h,pool*p){
  248. hash* auxiliar=(hash*)malloc(sizeof(hash));
  249. auxiliar->primeiro=h->primeiro;
  250. auxiliar->primeiro->prox=h->primeiro->prox;
  251. auxiliar->primeiro->prox->prox=h->primeiro->prox->prox;
  252. auxiliar->primeiro->prox->prox->prox=h->primeiro->prox->prox->prox;
  253. printf("||%d||%d||%d||%d||",auxiliar->primeiro->conta,auxiliar->primeiro->prox->conta,auxiliar->primeiro->prox->conta);
  254. h=inicializa_hash();
  255. insere_hash(auxiliar->primeiro->linha,p,auxiliar->primeiro->conta,auxiliar->primeiro->limite,auxiliar->primeiro->saldo,auxiliar->primeiro->nome);
  256. insere_hash(auxiliar->primeiro->prox->linha,p,auxiliar->primeiro->prox->conta,auxiliar->primeiro->prox->limite,auxiliar->primeiro->prox->saldo,auxiliar->primeiro->prox->nome);
  257. 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);
  258. 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);
  259. }
  260. void preenche_hash(pool* p){
  261. FILE* arq= fopen(CLIENTE,"r+");
  262. int linha;
  263. float conta, limite, saldo;
  264. char nome[50];
  265. fscanf(arq,"%d|%f|%f|%f|%s\n",&linha,&conta,&limite,&saldo,nome);
  266. rewind(arq);
  267. if(linha==1 || linha==999){
  268. while(!feof(arq)){
  269. fscanf(arq,"%d|%f|%f|%f|%s\n",&linha,&conta,&limite,&saldo,nome);
  270. if(linha!=999)
  271. insere_hash(linha, p,conta,limite,saldo,nome);
  272.  
  273. }
  274. }
  275. }
  276.  
  277. int main(){
  278. pool* p = inicializa_pool();
  279. int arquivos, bancos, loop;
  280. arquivos = verifica_existencia();
  281. if (arquivos == 0){
  282. bancos = criar_banco();
  283. if(bancos == 0) return 0;
  284. }
  285. else
  286. preenche_hash(p);
  287. int op=6;
  288. printf("\n\n");
  289. imprime_hash(p);
  290.  
  291. while("TRUE"){
  292. printf("\nDigite sua opcao de uso.\n1-Cadastrar\n2-Remover\n3-Consultar por conta\n0-Sair\n");
  293. scanf("%d",&op);
  294. if(op!=1 && op!=2 && op!=3 && op!=4 && op!=0)
  295. printf("\nPor favor digite uma opcao valida.\n");
  296. if(op==1){
  297. cadastra_cliente(p);
  298. }
  299. if(op==2){
  300. printf("Digite o numero da conta que deseja remover\n");
  301. int count;
  302. scanf("%d",&count);
  303. remove_banco(count);
  304. }
  305. if(op==3){
  306. //consuta_cliente();
  307. }
  308. if(op==0){
  309. exit(1);
  310. }
  311. if(op==4){
  312. imprime_hash(p);
  313. scanf("");
  314. }
  315. }
  316.  
  317. }
  318.  
  319. int criar_banco(){
  320. printf("\nCriando banco de dados...");
  321. FILE *arq= fopen(CLIENTE, "a");
  322. printf("\nClientes.txt criado. Continuando execucao...");
  323. fclose(arq);
  324. return 1;
  325.  
  326. }
  327.  
  328. int verifica_existencia(){
  329. fflush(stdin);
  330. printf("Verificando banco de dados...");
  331. FILE *arquivo_clientes = fopen(CLIENTE, "r");
  332. if (arquivo_clientes == NULL){
  333. printf("\nO arquivo Clientes, de dados, nao existe. Necessita criar um novo banco de dados....\n");
  334. return 0;
  335. }
  336. printf("\nBanco de Dados Consistente. Continuando execucao...\n");
  337. fclose(arquivo_clientes);
  338. return 1; //Ambos os arquivos existem.
  339. }
  340.  
  341. void cadastra_cliente(pool* p){
  342. int numlinha=0,linha;
  343. int ja_existe;
  344. float numconta,contalim,contasaldo,conta,saldo,limite;
  345. char nome[50],nomecliente[50];
  346. printf("Digite o numero da conta\n");
  347. scanf("%f",&conta);
  348. ja_existe = consultar(conta);
  349. while(ja_existe==1){
  350. printf("Conta existente no banco de dados.\nPor favor digite outro número de conta.\n");
  351. scanf("%f",&conta);
  352. ja_existe=consultar(conta);
  353. }
  354. printf("Digite o nome do cliente\n");
  355. scanf("%s",nomecliente);
  356. printf("Digite o limite do cliete\n");
  357. scanf("%f",&limite);
  358. printf("Digite o saldo inicial do cliente\n");
  359. scanf("%f",&saldo);
  360. int auxil;
  361. auxil=insere_hash(linha,p,conta,limite, saldo, nome);
  362. if(auxil == 100)
  363. return;
  364. FILE *arq= fopen(CLIENTE,"r+");
  365. while(!feof(arq)){
  366. fscanf(arq,"%d|%f|%f|%f|%s\n",&numlinha,&numconta,&contalim,&contasaldo,nome);
  367. }
  368. numlinha++;
  369. fprintf(arq,"00%d|%.0f|%.2f|%.2f|%s\n",numlinha,conta,limite,saldo,nomecliente);
  370. int auxiliar;
  371. fclose(arq);
  372. arq=fopen(CLIENTE,"r");
  373. printf("AAA");
  374. while(auxiliar!=conta && !feof(arq)){
  375. fscanf(arq,"%d|%f|%f|%f|%s\n",&linha,&conta,&limite,&saldo,nome);
  376. }
  377. printf("BBB");
  378. printf("CCC");
  379. fclose(arq);
  380. }
  381.  
  382. /*void consuta_cliente(pool* p){
  383. float chave;
  384. hash* aux= p->primeiro->aux
  385. printf("\nDigite a conta desejado:\t");
  386. scanf("%f",&chave);
  387.  
  388. printf("\n %s :\n \t CPF: %.0f \t limite: %.2f \t saldo: %.2f \t linha: %d \n",nome,numconta,contalim,contasaldo,numlinha);
  389. printf("Digite enter para sair.");
  390. scanf(""); ;
  391. }*/
  392.  
  393. int consultar(float conta){
  394. int aux=0;
  395. int numlinha;
  396. float numconta,contalim,contasaldo;
  397. char nome[50];
  398. FILE* arq= fopen(CLIENTE,"r+");
  399. while(numconta!=conta && !feof(arq)){
  400. fscanf(arq,"%d|%f|%f|%f|%s",&numlinha,&numconta,&contalim,&contasaldo,nome);
  401. if(numconta==conta)
  402. aux=1;
  403. }
  404. fclose(arq);
  405. return aux;
  406. }
  407.  
  408. int remove_banco(int conta ){
  409.  
  410. long int posicao;
  411. int aux=0;
  412. int i;
  413. int ver=0;
  414. int numlinha;
  415. printf("AAA");
  416. float numconta,contalim,contasaldo;
  417. char nome[50];
  418. FILE* arq= fopen(CLIENTE,"r+");
  419. printf("Conta: %d",conta);
  420. rewind(arq);
  421. while(numconta!=conta || !feof(arq)){
  422. fscanf(arq,"%d|%f|%f|%f|%s\n",&numlinha,&numconta,&contalim,&contasaldo,nome);
  423. printf("Numconta: %d",numconta);
  424. aux++;
  425. }
  426. if(numconta==conta){
  427. printf("%d ",numconta);
  428. rewind(arq);
  429. for(i=0;i<aux;i++)
  430. fscanf(arq,"%d|%f|%f|%f|%s",&numlinha,&numconta,&contalim,&contasaldo,nome);
  431. fprintf(arq,"999");
  432. ver=1;
  433.  
  434. //re
  435. }
  436. if(ver==0)
  437. printf("Conta não encontrada.\n");
  438. else
  439. printf("Exclusao concluida.\n");
  440. return 0;
  441.  
  442. fclose(arq);
  443. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement