Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <ctype.h>
- /*
- * Tamanho dos vetores de estruturas
- */
- #define DEPOSITOS_TAM 500
- #define SAQUES_TAM 500
- #define ENTRADAS_TAM 500
- #define SAIDAS_TAM 500
- #define PAGAMENTOS_TAM 500
- #define CLIENTES_TAM 500
- #define CONTAS_TAM 500
- /*
- * Macros para definições de valores referente as funcionalidades
- */
- #define QUANT_LETRAS_NOME_NUMERO_CONTA 3 /* Quantidade de letras para formação do número da conta */
- #define MIN_TAMANHO_NOME 3
- #define MAX_TAMANHO_NOME 255
- #define MIN_VALOR_DEPOSITO 1.0
- #define MAX_VALOR_DEPOSITO 5000.0
- #define MIN_VALOR_SAQUE 2.0
- #define MAX_VALOR_SAQUE 5000.0
- #define MIN_VALOR_TRANSFERENCIA 1.0
- #define MAX_VALOR_TRANSFERENCIA 5000.0
- typedef struct cliente_t Cliente;
- typedef struct banco_t Banco;
- typedef struct deposito_t Deposito;
- typedef struct saque_t Saque;
- typedef struct transferencia_t Transferencia;
- typedef struct pagamento_t Pagamento;
- typedef struct conta_t Conta;
- /* ------------------------------------------------------------------------------- */
- /* Cliente */
- /* ------------------------------------------------------------------------------- */
- struct cliente_t
- {
- char* cpf;
- char* rg;
- char* nome_completo; /* nome e sobrenome */
- };
- /** Cria e retorna um Cliente */
- Cliente* cria_cliente(const char* cpf, const char* rg, const char* nome_completo);
- /** Deleta um Cliente */
- Cliente* deleta_cliente(Cliente* cliente);
- /** Retorna o cpf de um Cliente */
- const char* cliente_pega_cpf(Cliente* cliente);
- /** Retorna o nome de um Cliente */
- const char* cliente_pega_nome(Cliente* cliente);
- /* ------------------------------------------------------------------------------- */
- /* ------------------------------------------------------------------------------- */
- /* Banco */
- /* ------------------------------------------------------------------------------- */
- struct banco_t
- {
- Cliente* clientes[CLIENTES_TAM];
- Conta* contas[CONTAS_TAM];
- size_t clientes_quant;
- size_t contas_quant;
- };
- /** Cria e retorna um Banco */
- Banco* cria_banco();
- /** Deleta um Banco */
- Banco* deleta_banco(Banco* banco);
- /**
- * Busca por um Cliente com base no cpf no Banco. Retorna NULL
- * se nenhum Cliente for encontrado.
- */
- Cliente* banco_busca_cliente(Banco* banco, const char* cpf);
- /** Verifica com base no nome e cpf se um Cliente está cadastrado no banco */
- int banco_cliente_existe(Banco* banco, Cliente* cliente);
- /** Adiciona um Cliente ao Banco */
- void banco_adiciona_cliente(Banco* banco, Cliente* cliente);
- /**
- * Remove um Cliente do Banco com base no cpf. Retorna 1 para uma
- * exclusão bem sucedida.
- */
- int banco_remove_cliente(Banco* banco, const char* cpf);
- /**
- * Busca por uma Conta com base no numero no Banco. Retorna NULL
- * se nenhuma Conta for encontrada.
- */
- Conta* banco_busca_conta(Banco* banco, const char* numero);
- /** Verifica com base no número se uma Conta está cadastrada no banco */
- int banco_conta_existe(Banco* banco, Conta* conta);
- /** Adiciona uma Conta ao Banco */
- void banco_adiciona_conta(Banco* banco, Conta* conta);
- /**
- * Remove uma Conta do Banco com base no numero. Retorna 1 para uma
- * exclusão bem sucedida.
- */
- int banco_remove_conta(Banco* banco, const char* numero);
- /* ------------------------------------------------------------------------------- */
- /* ------------------------------------------------------------------------------- */
- /* Deposito */
- /* ------------------------------------------------------------------------------- */
- struct deposito_t
- {
- double valor;
- };
- /** Cria e retorna um Deposito */
- Deposito* cria_deposito(const double valor);
- /** Deleta um Deposito */
- void deleta_deposito(Deposito* deposito);
- /** Imprime os membros de um Deposito */
- void imprime_deposito(Deposito* deposito);
- /* ------------------------------------------------------------------------------- */
- /* ------------------------------------------------------------------------------- */
- /* Saque */
- /* ------------------------------------------------------------------------------- */
- struct saque_t
- {
- double valor;
- };
- /** Cria e retorna um Saque */
- Saque* cria_saque(const double valor);
- /** Deleta um Saque */
- void deleta_saque(Saque* saque);
- /** Imprime os membros de um Saque */
- void imprime_saque(Saque* saque);
- /* ------------------------------------------------------------------------------- */
- /* ------------------------------------------------------------------------------- */
- /* Transferencia */
- /* ------------------------------------------------------------------------------- */
- struct transferencia_t
- {
- double valor;
- };
- /** Cria e retorna uma Transferencia */
- Transferencia* cria_transferencia(const double valor);
- /** Deleta uma Transferencia */
- void deleta_transferencia(Transferencia* transferencia);
- void imprime_transferencia(Transferencia* transferencia);
- /* ------------------------------------------------------------------------------- */
- /* ------------------------------------------------------------------------------- */
- /* Pagamento */
- /* ------------------------------------------------------------------------------- */
- struct pagamento_t
- {
- char* codigo_barra;
- double valor;
- };
- /** Cria e retorna um Pagamento */
- Pagamento* cria_pagamento(const char* codigo_barra, const double valor);
- /** Deleta um Pagamento */
- void deleta_pagamento(Pagamento* pagamento);
- /** Imprime os membros de um Pagamento */
- void imprime_pagamento(Pagamento* pagamento);
- /* ------------------------------------------------------------------------------- */
- /* ------------------------------------------------------------------------------- */
- /* Conta */
- /* ------------------------------------------------------------------------------- */
- struct conta_t
- {
- char* numero;
- Cliente* cliente;
- Deposito* depositos[DEPOSITOS_TAM];
- Saque* saques[SAQUES_TAM];
- Transferencia* entradas[ENTRADAS_TAM];
- Transferencia* saidas[SAIDAS_TAM];
- Pagamento* pagamentos[PAGAMENTOS_TAM];
- size_t depositos_quant; /* quantidade de Depositos alocados */
- size_t saques_quant; /* quantidade de Saques alocados */
- size_t entradas_quant; /* quantidade de Transferencias (entradas) alocadas */
- size_t saidas_quant; /* quantidade de Transferencias (saidas) alocadas */
- size_t pagamentos_quant; /* quantidade de Pagamentos alocados */
- double saldo;
- };
- /** Cria e retorna uma Conta para um Cliente existente */
- Conta *cria_conta(Cliente* cliente);
- /** Deleta uma Conta */
- Conta *deleta_conta(Conta* conta);
- /** Registra um Deposito em uma Conta */
- void conta_adiciona_deposito(Conta* conta, Deposito* deposito);
- /** Registra um Saque em uma Conta */
- void conta_adiciona_saque(Conta* conta, Saque* saque);
- /** Registra uma entrada (Transferencia) em uma Conta */
- void conta_adiciona_entrada(Conta* conta, Transferencia* entrada);
- /** Registra uma saida (Transferencia) em uma Conta */
- void conta_adiciona_saida(Conta* conta, Transferencia* saida);
- /** Registra uma Pagamento em uma Conta */
- void conta_adiciona_pagamento(Conta* conta, Pagamento* pagamento);
- /** Altera o saldo de uma Conta */
- void conta_altera_saldo(Conta* conta, const double saldo);
- /** Retorna o numero de uma Conta */
- const char* conta_pega_numero(Conta* conta);
- /** Retorna o saldo de uma Conta */
- const double conta_pega_saldo(Conta* conta);
- /** Imprime os registros de uma Conta */
- void conta_imprime_registros(Conta* conta);
- /* ------------------------------------------------------------------------------- */
- /* ------------------------------------------------------------------------------- */
- /* Lógica das operações */
- /* ------------------------------------------------------------------------------- */
- /*
- * Validação
- */
- /** Validação SIMPLES para CPF. Retorna 1 se for válido e 0 para inválido */
- int valida_cpf(const char* cpf);
- /** Validação SIMPLES para RG. Retorna 1 se for válido e 0 para inválido */
- int valida_rg(const char* rg);
- /** Verifica se um nome completo é válido sem case-sensitive. Retorna 1 se for válido e 0 para inválido */
- int valida_nome_completo(const char* nome_completo);
- /** Verifica se um depósito é válido. Retorna 1 se for válido e 0 para inválido */
- int valida_deposito(const double valor);
- /** Verifica se um saque é válido para uma Conta. Retorna 1 se for válido e 0 para inválido */
- int valida_saque(Conta* conta, const double valor);
- /** Verifica se uma transferência é válida para uma Conta. Retorna 1 se for válido e 0 para inválido */
- int valida_transferencia(Conta* conta_origem, const double valor);
- /** Verifica se um pagamento é válido para uma Conta. Retorna 1 se for válido e 0 para inválido */
- int valida_pagamento(Conta* conta, const double valor);
- /*
- * Operações
- */
- /** Cadastra um Cliente no Banco */
- int cadastra_cliente(Banco* banco, const char* cpf, const char* rg, const char* nome_completo);
- /** Abre uma Conta no Banco */
- int abre_conta(Banco* banco, const char* cpf);
- /** Realiza um Deposito para uma conta */
- int realiza_deposito(Banco* banco, const char* numero_conta, const double valor);
- /** Realiza um Saque para uma conta */
- int realiza_saque(Banco* banco, const char* numero_conta, const double valor);
- /** Realiza uma Transferencia entre duas contas */
- int realiza_transferencia(Banco* banco, const char* numero_origem, const char* numero_destino, const double valor);
- /** Realiza um Pagamento para uma conta */
- int realiza_pagamento(Banco* banco, const char* numero_conta, const char* codigo_barra, const double valor);
- /** Imprime o saldo de uma conta */
- int imprime_saldo(Banco* banco, const char* numero_conta);
- /** Imprime o extrato de uma conta */
- int imprime_extrato(Banco* banco, const char* numero_conta);
- /* ------------------------------------------------------------------------------- */
- /* ------------------------------------------------------------------------------- */
- /* Assinatura de funções para I/O */
- /* ------------------------------------------------------------------------------- */
- /*
- * Menus baseados no Banco
- */
- void menu_principal(Banco* banco);
- /* ------------------------------------------------------------------------------- */
- int main(void)
- {
- Banco *banco = cria_banco();
- menu_principal(banco);
- banco = deleta_banco(banco);
- return 0;
- }
- /* ------------------------------------------------------------------------------------- */
- /* Funções de Cliente */
- /* ------------------------------------------------------------------------------------- */
- Cliente* cria_cliente(const char* cpf, const char* rg, const char* nome_completo)
- {
- Cliente* cliente = malloc(sizeof *cliente);
- /* Alocando espaço para o comprimento exato da string + o caractere terminador ('\0') */
- cliente->cpf = malloc((strlen(cpf) + 1) * sizeof(char));
- cliente->rg = malloc((strlen(rg) + 1) * sizeof(char));
- cliente->nome_completo = malloc((strlen(nome_completo) + 1) * sizeof(char));
- /* Copiando as strings dos parâmetros para as da struct */
- strcpy(cliente->cpf, cpf);
- strcpy(cliente->rg, rg);
- strcpy(cliente->nome_completo, nome_completo);
- return cliente;
- }
- Cliente* deleta_cliente(Cliente* cliente)
- {
- /* Desalocando a memória dos membros para não ocorrer vazamento de memória */
- free(cliente->cpf);
- free(cliente->rg);
- free(cliente->nome_completo);
- /* Por fim deletamos o Cliente */
- free(cliente);
- return NULL;
- }
- const char* cliente_pega_cpf(Cliente* cliente)
- {
- return cliente->cpf;
- }
- const char* cliente_pega_nome(Cliente* cliente)
- {
- return cliente->nome_completo;
- }
- /* ------------------------------------------------------------------------------------- */
- /* ------------------------------------------------------------------------------------- */
- /* Funções de Banco */
- /* ------------------------------------------------------------------------------------- */
- Banco* cria_banco()
- {
- Banco* banco = malloc(sizeof *banco);
- banco->clientes_quant = 0;
- banco->contas_quant = 0;
- return banco;
- }
- Banco* deleta_banco(Banco* banco)
- {
- /* Exclusão em cascata */
- int i;
- for(i = 0; i < banco->clientes_quant; i++)
- {
- deleta_cliente(banco->clientes[i]);
- }
- for(i = 0; i < banco->contas_quant; i++)
- {
- deleta_conta(banco->contas[i]);
- }
- free(banco);
- return NULL;
- }
- Cliente* banco_busca_cliente(Banco* banco, const char* cpf)
- {
- Cliente* cliente = NULL;
- int i;
- for(i = 0; i < banco->clientes_quant; i++)
- {
- if(strcasecmp(cliente_pega_cpf(banco->clientes[i]), cpf) == 0)
- {
- cliente = banco->clientes[i];
- break;
- }
- }
- return cliente;
- }
- int banco_cliente_existe(Banco* banco, Cliente* cliente)
- {
- int i;
- for(i = 0; i < banco->clientes_quant; i++)
- {
- /* busca baseada no cpf e no nome */
- if(strcasecmp(cliente_pega_cpf(banco->clientes[i]), cliente_pega_cpf(cliente)) == 0 ||
- strcasecmp(cliente_pega_nome(banco->clientes[i]), cliente_pega_nome(cliente)) == 0)
- {
- return 1;
- }
- }
- return 0;
- }
- void banco_adiciona_cliente(Banco* banco, Cliente* cliente)
- {
- banco->clientes[banco->clientes_quant] = cliente;
- banco->clientes_quant++;
- }
- int banco_remove_cliente(Banco* banco, const char* cpf)
- {
- int i;
- size_t size = banco->clientes_quant;
- for(i = 0; i < size; i++)
- {
- if(strcasecmp(cliente_pega_cpf(banco->clientes[i]), cpf) == 0)
- {
- /* Deleta o Cliente para não ocorrer vazamento de memória */
- deleta_cliente(banco->clientes[i]);
- /* Reorganiza o vetor de Clientes */
- int j;
- for(j = i; j < size - 1; j++)
- {
- banco->clientes[j] = banco->clientes[j + 1];
- }
- /* Decrementa em 1 o tamanho total do vetor */
- banco->clientes_quant = banco->clientes_quant - 1;
- /* Retorna uma exclusão bem sucedida */
- return 1;
- }
- }
- return 0;
- }
- Conta* banco_busca_conta(Banco* banco, const char* numero)
- {
- Conta* conta = NULL;
- int i;
- for(i = 0; i < banco->contas_quant; i++)
- {
- if(strcasecmp(conta_pega_numero(banco->contas[i]), numero) == 0)
- {
- conta = banco->contas[i];
- break;
- }
- }
- return conta;
- }
- int banco_conta_existe(Banco* banco, Conta* conta)
- {
- if(banco_busca_conta(banco, conta_pega_numero(conta)) == NULL)
- {
- return 0;
- }
- return 1;
- }
- void banco_adiciona_conta(Banco* banco, Conta* conta)
- {
- banco->contas[banco->contas_quant] = conta;
- banco->contas_quant++;
- }
- int banco_remove_conta(Banco* banco, const char* numero)
- {
- int i;
- size_t size = banco->contas_quant;
- for(i = 0; i < size; i++)
- {
- if(strcasecmp(conta_pega_numero(banco->contas[i]), numero) == 0)
- {
- /* Deleta a Conta para não ocorrer vazamento de memória */
- deleta_conta(banco->contas[i]);
- /* Reorganiza o vetor de Contas */
- int j;
- for(j = i; j < size - 1; j++)
- {
- banco->contas[j] = banco->contas[j + 1];
- }
- /* Decrementa em 1 o tamanho total do vetor */
- banco->contas_quant = banco->contas_quant - 1;
- /* Retorna uma exclusão bem sucedida */
- return 1;
- }
- }
- return 0;
- }
- /* ------------------------------------------------------------------------------------- */
- /* ------------------------------------------------------------------------------------- */
- /* Funções de Deposito */
- /* ------------------------------------------------------------------------------------- */
- Deposito* cria_deposito(const double valor)
- {
- Deposito* deposito = malloc(sizeof *deposito);
- deposito->valor = valor;
- return deposito;
- }
- void deleta_deposito(Deposito* deposito)
- {
- free(deposito);
- }
- void imprime_deposito(Deposito* deposito)
- {
- printf("Valor: %f\n", deposito->valor);
- }
- /* ------------------------------------------------------------------------------------- */
- /* ------------------------------------------------------------------------------------- */
- /* Funções de Saque */
- /* ------------------------------------------------------------------------------------- */
- Saque* cria_saque(const double valor)
- {
- Saque* saque = malloc(sizeof *saque);
- saque->valor = valor;
- return saque;
- }
- void deleta_saque(Saque* saque)
- {
- free(saque);
- }
- void imprime_saque(Saque* saque)
- {
- printf("Valor: %f\n", saque->valor);
- }
- /* ------------------------------------------------------------------------------------- */
- /* ------------------------------------------------------------------------------------- */
- /* Funções de Transferencia */
- /* ------------------------------------------------------------------------------------- */
- Transferencia* cria_transferencia(const double valor)
- {
- Transferencia* transferencia = malloc(sizeof *transferencia);
- transferencia->valor = valor;
- return transferencia;
- }
- void deleta_transferencia(Transferencia* transferencia)
- {
- free(transferencia);
- }
- void imprime_transferencia(Transferencia* transferencia)
- {
- printf("Valor: %f\n", transferencia->valor);
- }
- /* ------------------------------------------------------------------------------------- */
- /* ------------------------------------------------------------------------------------- */
- /* Funções de Pagamento */
- /* ------------------------------------------------------------------------------------- */
- Pagamento* cria_pagamento(const char* codigo_barra, const double valor)
- {
- Pagamento* pagamento = malloc(sizeof *pagamento);
- pagamento->codigo_barra = malloc((strlen(codigo_barra) + 1) * sizeof(char));
- strcpy(pagamento->codigo_barra, codigo_barra);
- pagamento->valor = valor;
- return pagamento;
- }
- void deleta_pagamento(Pagamento* pagamento)
- {
- free(pagamento);
- }
- void imprime_pagamento(Pagamento* pagamento)
- {
- printf("Codigo de barra: %s, Valor: %f\n", pagamento->codigo_barra, pagamento->valor);
- }
- /* ------------------------------------------------------------------------------------- */
- /* ------------------------------------------------------------------------------------- */
- /* Funções de Conta */
- /* ------------------------------------------------------------------------------------- */
- Conta *cria_conta(Cliente* cliente)
- {
- Conta* conta = malloc(sizeof *conta);
- /* Aloca espaço suficiente para os digitos do CPF e as letras do nome */
- conta->numero = malloc((strlen(cliente->cpf) + QUANT_LETRAS_NOME_NUMERO_CONTA + 1) * sizeof(char));
- /* Atribui o cliente a nova conta */
- conta->cliente = cliente;
- /*
- * Inicializa os membros da struct
- */
- /* gerando o número da conta */
- char letras[QUANT_LETRAS_NOME_NUMERO_CONTA + 1];
- strncpy(letras, cliente->nome_completo, QUANT_LETRAS_NOME_NUMERO_CONTA);
- letras[QUANT_LETRAS_NOME_NUMERO_CONTA] = '\0'; /* adicionando caractere terminador a string */
- strcpy(conta->numero, cliente->cpf);
- strcat(conta->numero, letras);
- conta->depositos_quant = 0;
- conta->saques_quant = 0;
- conta->entradas_quant = 0;
- conta->saidas_quant = 0;
- conta->pagamentos_quant = 0;
- conta->saldo = 0.0;
- return conta;
- }
- Conta *deleta_conta(Conta* conta)
- {
- /* Exclusão em cascata das entidades fracas */
- int i;
- for(i = 0; i < conta->depositos_quant; i++)
- {
- deleta_deposito(conta->depositos[i]);
- }
- for(i = 0; i < conta->saques_quant; i++)
- {
- deleta_saque(conta->saques[i]);
- }
- for(i = 0; i < conta->entradas_quant; i++)
- {
- deleta_transferencia(conta->entradas[i]);
- }
- for(i = 0; i < conta->saidas_quant; i++)
- {
- deleta_transferencia(conta->saidas[i]);
- }
- for(i = 0; i < conta->pagamentos_quant; i++)
- {
- deleta_pagamento(conta->pagamentos[i]);
- }
- /* Por fim desalocamos a Conta */
- free(conta);
- return NULL;
- }
- void conta_adiciona_deposito(Conta* conta, Deposito* deposito)
- {
- conta->depositos[conta->depositos_quant] = deposito;
- conta->depositos_quant++;
- }
- void conta_adiciona_saque(Conta* conta, Saque* saque)
- {
- conta->saques[conta->saques_quant] = saque;
- conta->saques_quant++;
- }
- void conta_adiciona_entrada(Conta* conta, Transferencia* entrada)
- {
- conta->entradas[conta->entradas_quant] = entrada;
- conta->entradas_quant++;
- }
- void conta_adiciona_saida(Conta* conta, Transferencia* saida)
- {
- conta->saidas[conta->saidas_quant] = saida;
- conta->saidas_quant++;
- }
- void conta_adiciona_pagamento(Conta* conta, Pagamento* pagamento)
- {
- conta->pagamentos[conta->pagamentos_quant] = pagamento;
- conta->pagamentos_quant++;
- }
- void conta_imprime_registros(Conta* conta)
- {
- int i;
- printf("Saques:\n");
- for(i = 0; i < conta->saques_quant; i++)
- {
- imprime_saque(conta->saques[i]);
- }
- printf("---------------\n");
- printf("Depositos:\n");
- for(i = 0; i < conta->depositos_quant; i++)
- {
- imprime_deposito(conta->depositos[i]);
- }
- printf("---------------\n");
- printf("Transferencias (entradas):\n");
- for(i = 0; i < conta->entradas_quant; i++)
- {
- imprime_transferencia(conta->entradas[i]);
- }
- printf("---------------\n");
- printf("Transferencias (saidas):\n");
- for(i = 0; i < conta->saidas_quant; i++)
- {
- imprime_transferencia(conta->saidas[i]);
- }
- printf("---------------\n");
- printf("Pagamentos:\n");
- for(i = 0; i < conta->pagamentos_quant; i++)
- {
- imprime_pagamento(conta->pagamentos[i]);
- }
- printf("---------------\n");
- }
- void conta_altera_saldo(Conta* conta, const double saldo)
- {
- conta->saldo = saldo;
- }
- const char* conta_pega_numero(Conta* conta)
- {
- return conta->numero;
- }
- const double conta_pega_saldo(Conta* conta)
- {
- return conta->saldo;
- }
- /* ------------------------------------------------------------------------------------- */
- /* ------------------------------------------------------------------------------------- */
- /* Funções para a lógica das operações */
- /* ------------------------------------------------------------------------------------- */
- /*
- * Validação
- */
- int valida_cpf(const char* cpf)
- {
- /*
- * Validação SIMPLES, apenas checa se possui uma quantidade
- * mínima de caracteres e se todos os caracteres são numéricos.
- */
- size_t size = strlen(cpf);
- if(size < 11)
- {
- return 0;
- }
- int i;
- for(i = 0; i < size; i++)
- {
- if(!isdigit(cpf[i]))
- {
- return 0;
- }
- }
- return 1;
- }
- int valida_rg(const char* rg)
- {
- /*
- * Validação SIMPLES, apenas checa se possui uma quantidade
- * mínima de caracteres e se todos os caracteres são numéricos.
- */
- size_t size = strlen(rg);
- if(size < 1)
- {
- return 0;
- }
- int i;
- for(i = 0; i < size; i++)
- {
- if(!isdigit(rg[i]))
- {
- return 0;
- }
- }
- return 1;
- }
- int valida_nome_completo(const char* nome_completo)
- {
- size_t size = strlen(nome_completo);
- if(size < MIN_TAMANHO_NOME)
- {
- return 0; /* Não pode possuir menos que MIN_TAMANHO_NOME caracteres */
- }
- if(size > MAX_TAMANHO_NOME)
- {
- return 0; /* Não pode possuir menos que MAX_TAMANHO_NOME caracteres */
- }
- if(isspace(nome_completo[0]))
- {
- return 0; /* Espaço no começo do nome */
- }
- if(isspace(nome_completo[size - 1]))
- {
- return 0; /* Espaço no final do nome */
- }
- /*
- * Checando caracteres especiais e verificando se possui um sobrenome
- */
- int valid = 0;
- int i;
- for(i = 0; i < size; i++)
- {
- if(!isalpha(nome_completo[i]))
- {
- if(isspace(nome_completo[i]))
- {
- if(isspace(nome_completo[i + 1]))
- {
- return 0; /* Nome inválido, mais de um espaço seguido! */
- }
- valid = 1; /* Marca que encontrou um sobrenome válido */
- }
- else
- {
- /* Se o caractere for um símbolo, verifica se é um símbolo válido. */
- if(!(nome_completo[i] == '-'))
- {
- return 0;
- }
- }
- }
- }
- return valid;
- }
- int valida_deposito(const double valor)
- {
- if(valor < MIN_VALOR_DEPOSITO)
- {
- return 0;
- }
- if(valor > MAX_VALOR_DEPOSITO)
- {
- return 0;
- }
- return 1;
- }
- int valida_saque(Conta* conta, const double valor)
- {
- if(valor > conta_pega_saldo(conta))
- {
- return 0;
- }
- if(valor < MIN_VALOR_SAQUE)
- {
- return 0;
- }
- if(valor > MAX_VALOR_SAQUE)
- {
- return 0;
- }
- return 1;
- }
- int valida_transferencia(Conta* conta_origem, const double valor)
- {
- if(valor > conta_pega_saldo(conta_origem))
- {
- return 0;
- }
- if(valor < MIN_VALOR_TRANSFERENCIA)
- {
- return 0;
- }
- if(valor > MAX_VALOR_TRANSFERENCIA)
- {
- return 0;
- }
- return 1;
- }
- int valida_pagamento(Conta* conta, const double valor)
- {
- if(valor > conta_pega_saldo(conta))
- {
- return 0;
- }
- if(valor <= 0.0)
- {
- return 0;
- }
- return 1;
- }
- /*
- * Operações
- */
- int cadastra_cliente(Banco* banco, const char* cpf, const char* rg, const char* nome_completo)
- {
- Cliente* cliente = cria_cliente(cpf, rg, nome_completo);
- /* Verificamos se já existe um Cliente criado com esses dados */
- if(banco_cliente_existe(banco, cliente))
- {
- deleta_cliente(cliente); /* deletamos para não ocorrer vazamento de memória */
- return 0;
- }
- banco_adiciona_cliente(banco, cliente);
- return 1;
- }
- int abre_conta(Banco* banco, const char* cpf)
- {
- Cliente *cliente = banco_busca_cliente(banco, cpf);
- /* Se a busca retornou NULL, não existe um Cliente cadastrado com base nesse cpf */
- if(cliente == NULL)
- {
- return 0;
- }
- Conta* conta = cria_conta(cliente);
- /* Verificamos se já existe uma conta cadastrada */
- if(banco_conta_existe(banco, conta))
- {
- deleta_conta(conta); /* deletamos para não ocorrer vazamento de memória */
- return 0;
- }
- banco_adiciona_conta(banco, conta);
- return 1;
- }
- int realiza_deposito(Banco* banco, const char* numero_conta, const double valor)
- {
- if(!valida_deposito(valor))
- {
- return 0;
- }
- Conta* conta = banco_busca_conta(banco, numero_conta);
- /* Se a busca retornar NULL, a conta é inexistente! */
- if(conta == NULL)
- {
- return 0;
- }
- /* Adicionamos o valor do deposito ao saldo */
- conta_altera_saldo(conta, conta_pega_saldo(conta) + valor);
- /* Registramos o deposito na conta */
- conta_adiciona_deposito(conta, cria_deposito(valor));
- return 1;
- }
- int realiza_saque(Banco* banco, const char* numero_conta, const double valor)
- {
- Conta* conta = banco_busca_conta(banco, numero_conta);
- /* Se a busca retornar NULL, a conta é inexistente! */
- if(conta == NULL)
- {
- return 0;
- }
- if(!valida_saque(conta, valor))
- {
- return 0;
- }
- /* Descontamos o valor do saque no saldo */
- conta_altera_saldo(conta, conta_pega_saldo(conta) - valor);
- /* Registramos o saque na conta */
- conta_adiciona_saque(conta, cria_saque(valor));
- return 1;
- }
- int realiza_transferencia(Banco* banco, const char* numero_origem, const char* numero_destino, const double valor)
- {
- Conta* origem = banco_busca_conta(banco, numero_origem);
- Conta* destino = banco_busca_conta(banco, numero_destino);
- /* Se origem ou destino não existir, não é possível realizar uma transferência */
- if(origem == NULL || destino == NULL)
- {
- return 0;
- }
- /* Não permitir transferir para si mesmo */
- if(origem == destino)
- {
- return 0;
- }
- if(!valida_transferencia(origem, valor))
- {
- return 0;
- }
- /* Alteramos o saldo das contas origem e destino */
- conta_altera_saldo(origem, conta_pega_saldo(origem) - valor);
- conta_altera_saldo(destino, conta_pega_saldo(destino) + valor);
- /* Registramos as transferências nas contas origem e destino */
- conta_adiciona_saida(origem, cria_transferencia(valor));
- conta_adiciona_entrada(destino, cria_transferencia(valor));
- return 1;
- }
- int realiza_pagamento(Banco* banco, const char* numero_conta, const char* codigo_barra, const double valor)
- {
- Conta* conta = banco_busca_conta(banco, numero_conta);
- /* Se a busca retornar NULL, a conta é inexistente! */
- if(conta == NULL)
- {
- return 0;
- }
- if(!valida_pagamento(conta, valor))
- {
- return 0;
- }
- /* Descontamos o valor do pagamento no saldo */
- conta_altera_saldo(conta, conta_pega_saldo(conta) - valor);
- /* Registramos o pagamento na conta */
- conta_adiciona_pagamento(conta, cria_pagamento(codigo_barra, valor));
- return 1;
- }
- int imprime_saldo(Banco* banco, const char* numero_conta)
- {
- Conta* conta = banco_busca_conta(banco, numero_conta);
- /* Verificamos se a conta é inexistente */
- if(conta == NULL)
- {
- return 0;
- }
- printf("Saldo: %f\n", conta_pega_saldo(conta));
- return 1;
- }
- int imprime_extrato(Banco* banco, const char* numero_conta)
- {
- Conta* conta = banco_busca_conta(banco, numero_conta);
- /* Verificamos se a conta é inexistente */
- if(conta == NULL)
- {
- return 0;
- }
- printf("=================================\n");
- printf("Numero da conta: %s\n", numero_conta);
- printf("--------------------\n");
- conta_imprime_registros(conta);
- printf("=================================\n");
- return 1;
- }
- /* ------------------------------------------------------------------------------------- */
- /* ------------------------------------------------------------------------------- */
- /* Funções para I/O */
- /* ------------------------------------------------------------------------------- */
- /*
- * Menus
- */
- void menu_principal(Banco* banco)
- {
- int opcao;
- do{
- printf("------\n");
- printf("Operacoes\n");
- printf("------\n");
- printf("1. Cadastro de Cliente\n");
- printf("2. Cadastro de Conta\n");
- printf("3. Depositos\n");
- printf("4. Saque\n");
- printf("5. Transferencia\n");
- printf("6. Saldo\n");
- printf("7. Extrato\n");
- printf("8. Pagamento de Boleto\n");
- printf("0. Sair\n");
- setbuf(stdin, NULL);
- scanf("%d", &opcao);
- char cpf[32], rg[32], nome[256], conta_origem[32], conta_destino[32], codigo_barra[128];
- double valor;
- switch(opcao) {
- /*
- * 1. Cadastro de Cliente
- */
- case 1:
- do {
- printf("CPF: ");
- setbuf(stdin, NULL);
- scanf("%s", cpf);
- }while(!valida_cpf(cpf));
- do {
- printf("RG: ");
- setbuf(stdin, NULL);
- scanf("%s", rg);
- }while(!valida_rg(rg));
- do {
- printf("Nome completo: ");
- setbuf(stdin, NULL);
- scanf("%[^\n]", nome);
- }while(!valida_nome_completo(nome));
- if(cadastra_cliente(banco, cpf, rg, nome))
- {
- printf("Cliente cadastrado com sucesso!\n");
- }
- else
- {
- printf("Nao foi possivel concluir o cadastro.\n");
- }
- break;
- /*
- * 2. Cadastro de Conta
- */
- case 2:
- printf("CPF do Cliente: ");
- setbuf(stdin, NULL);
- scanf("%s", cpf);
- if(abre_conta(banco, cpf))
- {
- printf("Conta criada com sucesso!\n");
- }
- else
- {
- printf("Nao foi possivel concluir o cadastro.\n");
- }
- break;
- /*
- * 3. Deposito
- */
- case 3:
- printf("Conta: ");
- setbuf(stdin, NULL);
- scanf("%[^\n]", conta_origem);
- printf("Valor: ");
- setbuf(stdin, NULL);
- scanf("%lf", &valor);
- if(realiza_deposito(banco, conta_origem, valor))
- {
- printf("Operacao realizada com sucesso!\n");
- }
- else
- {
- printf("Nao foi possivel realizar essa operacao. Certifique-se que as informacoes sao validas.\n");
- printf("Valores permitidos: MIN: %f, MAX: %f\n", MIN_VALOR_DEPOSITO, MAX_VALOR_DEPOSITO);
- }
- break;
- /*
- * 4. Saque
- */
- case 4:
- printf("Conta: ");
- setbuf(stdin, NULL);
- scanf("%[^\n]", conta_origem);
- printf("Valor: ");
- setbuf(stdin, NULL);
- scanf("%lf", &valor);
- if(realiza_saque(banco, conta_origem, valor))
- {
- printf("Operacao realizada com sucesso!\n");
- }
- else
- {
- printf("Nao foi possivel realizar essa operacao. Certifique-se que as informacoes sao validas.\n");
- printf("Valores permitidos: MIN: %f, MAX: %f\n", MIN_VALOR_SAQUE, MAX_VALOR_SAQUE);
- }
- break;
- /*
- * 5. Transferencia
- */
- case 5:
- printf("Origem: ");
- setbuf(stdin, NULL);
- scanf("%[^\n]", conta_origem);
- printf("Destino: ");
- setbuf(stdin, NULL);
- scanf("%[^\n]", conta_destino);
- printf("Valor: ");
- setbuf(stdin, NULL);
- scanf("%lf", &valor);
- if(realiza_transferencia(banco, conta_origem, conta_destino, valor))
- {
- printf("Operacao realizada com sucesso!\n");
- }
- else
- {
- printf("Nao foi possivel realizar essa operacao. Certifique-se que as informacoes sao validas.\n");
- printf("Valores permitidos: MIN: %f, MAX: %f\n", MIN_VALOR_TRANSFERENCIA, MAX_VALOR_TRANSFERENCIA);
- }
- break;
- /*
- * 6. Saldo
- */
- case 6:
- printf("Conta: ");
- setbuf(stdin, NULL);
- scanf("%[^\n]", conta_origem);
- if(!imprime_saldo(banco, conta_origem))
- {
- printf("Nao foi possivel realizar essa operacao.\n");
- }
- break;
- /*
- * 7. Extrato
- */
- case 7:
- printf("Conta: ");
- setbuf(stdin, NULL);
- scanf("%[^\n]", conta_origem);
- if(!imprime_extrato(banco, conta_origem))
- {
- printf("Nao foi possivel realizar essa operacao.\n");
- }
- break;
- /*
- * 8. Pagamento de Boleto
- */
- case 8:
- printf("Conta: ");
- setbuf(stdin, NULL);
- scanf("%[^\n]", conta_origem);
- printf("Codigo de barra: ");
- setbuf(stdin, NULL);
- scanf("%s", codigo_barra);
- printf("Valor: ");
- setbuf(stdin, NULL);
- scanf("%lf", &valor);
- if(realiza_pagamento(banco, conta_origem, codigo_barra, valor))
- {
- printf("Operacao realizada com sucesso!\n");
- }
- else
- {
- printf("Nao foi possivel realizar essa operacao. Certifique-se que as informacoes sao validas.\n");
- }
- break;
- /*
- * 0. Sair
- */
- case 0:
- printf("Saindo do menu...\n");
- break;
- default:
- printf("Opcao invalida, tente novamente!\n");
- }
- }while(opcao != 0);
- }
- /* ------------------------------------------------------------------------------- */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement