Last active
September 19, 2016 03:06
-
-
Save rbarros/3df91320038c6a87378619cc388c3c14 to your computer and use it in GitHub Desktop.
Trabalho de Grau A - Estrutura de Dados
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <stdio.h> | |
#include <stdlib.h> | |
#include <windows.h> | |
#include <conio.h> | |
#include <string.h> | |
#include <ctype.h> | |
#include <locale.h> | |
/** | |
Autor: Diego Ribeiro | |
Autor: Ramon Barros | |
Compilado: TDM-GCC 4.9.2 64-bit Release - Dev-C++ 5.11 | |
Data: 18/09/2016 | |
*/ | |
/** | |
* Inicializa a struct | |
*/ | |
typedef struct CADASTRO { | |
int conta; | |
char nome[40]; | |
float saldo; | |
float limite; | |
} CADASTRO; | |
/** | |
* Prototipação dos módulos | |
*/ | |
void opcoes(); | |
void inicializar(); | |
void menu(); | |
void cadastrar (CADASTRO cad); | |
void listagem(); | |
void depositar(); | |
void sacar(); | |
void relatorio(); | |
void fechar(); | |
/** | |
* Função principal | |
*/ | |
main(void) | |
{ | |
/** | |
* Seta o idioma para português | |
*/ | |
setlocale(LC_ALL, "Portuguese"); | |
menu(); | |
} | |
/** | |
* Imprime o menu de opções | |
*/ | |
void opcoes() | |
{ | |
system("cls"); | |
printf("\t\tBANCO \n\n"); | |
printf("(I)nicializa arquivo\n"); | |
printf("(A)bertura de conta\n"); | |
printf("(D)eposito\n"); | |
printf("(S)aque\n"); | |
printf("(L)istagem de Saldo por cliente\n"); | |
printf("(R)elatorio Geral\n"); | |
printf("(F)im\n"); | |
} | |
/** | |
* Escolher a opção | |
*/ | |
void menu() | |
{ | |
FILE *ARQ; | |
char menu; | |
CADASTRO cad; | |
opcoes(); | |
inicio: | |
menu = getch(); | |
menu=tolower(menu); | |
switch(menu){ | |
case 'i': | |
inicializar(); | |
break; | |
case 'a': | |
cadastrar(cad); | |
break; | |
case 'd': | |
depositar(); | |
break; | |
case 's': | |
sacar(); | |
break; | |
case 'l': | |
listagem(); | |
break; | |
case 'r': | |
relatorio(); | |
break; | |
case 'f': | |
fechar(); | |
break; | |
default: | |
goto inicio; | |
} | |
} | |
/** | |
* Cadastrar os clientes | |
* @param CADASTRO cad struct com os dados bancários | |
*/ | |
void cadastrar(CADASTRO cad) | |
{ | |
FILE *arq; | |
CADASTRO aux, | |
ultima; | |
int size = 0, | |
cconta = 0; | |
/** | |
* Abre o arquivo de clientes para escrita, leitura (a+) e aceita arquivo texto (t) | |
*/ | |
arq = fopen("Clientes.txt","a+t"); | |
// Posiciona no primeiro byte do último registro | |
fseek(arq, 0, SEEK_END); | |
// ftell retorna a posição em bytes desde o inicio do arquivo | |
size = ftell(arq); | |
// sizeof(CADASTRO) retorna o tamanho da struct | |
// retorna a posição do ultimo registro. | |
long pos = size / sizeof(CADASTRO); | |
if (size == 0) { | |
cconta = 1; | |
} else { | |
/** | |
* Indica a posição do ultimo registro | |
*/ | |
fseek(arq, (pos - 1) * sizeof(CADASTRO), SEEK_SET); | |
/** | |
* Lê o ultimo registro | |
*/ | |
fread(&ultima, sizeof(CADASTRO), 1, arq); | |
/** | |
* Numero da nova conta | |
*/ | |
cconta = ultima.conta + 1; | |
} | |
/** | |
* GOTO - Rótulo para o salto | |
*/ | |
cadastro: | |
system("cls"); | |
printf("\t\tCADASTRO DE CONTAS\n\n"); | |
printf("Numero da conta: %i\n", cconta); | |
cad.conta = cconta; | |
printf("Nome: "); | |
fflush(stdin); | |
gets(cad.nome); | |
printf("Saldo Inicial: "); | |
scanf("%f", &cad.saldo); | |
printf("Limite de Credito: "); | |
scanf("%f", &cad.limite); | |
// indica o inicio do arquivo | |
fseek(arq, 0, SEEK_SET); | |
/** | |
* Verifica se o cadastro já existe | |
*/ | |
do { | |
// Le registro atual | |
fread(&aux, sizeof(CADASTRO), 1, arq); | |
// verifica se o nome já existe | |
if (strncmp(aux.nome, cad.nome, 40) == 0) { | |
system("cls"); | |
printf("\n\n\t\tCADASTRO JA EXISTENTE! TENTE NOVAMENTE!\n\n"); | |
system("PAUSE"); | |
/** | |
* O goto realiza um salto para um local especifico | |
*/ | |
goto cadastro; | |
} | |
} while(!feof(arq)); // Percorre até o fim do arquivo | |
system("PAUSE"); | |
// indica o final do arquivo | |
fseek(arq, 0, SEEK_END); | |
// adiciona o novo cadastro no arquivo | |
fwrite(&cad, sizeof(cad), 1, arq); | |
// fecha arquivo aberto | |
fclose(arq); | |
printf("\n\n\t\tCADASTRO REALIZADO COM SUCESSO\n\n"); | |
system("PAUSE"); | |
menu(); | |
} | |
/** | |
* Inicializar os arquivos para gravação | |
* Zera os arquivos caso contenham dados | |
*/ | |
void inicializar() | |
{ | |
char resposta; | |
system("cls"); | |
printf("\t\tINICIALIZACAO DE ARQUIVOS\n\n"); | |
printf("CASO JA EXISTAM ARQUIVOS ELES SERAO ZERADOS!!\nDeseja criar os arquivos necessarios para o banco?(s/n)"); | |
/** | |
* GOTO - Rótulo para o salto | |
*/ | |
opcao: | |
resposta = getch(); // recupera o caracterer informado | |
resposta = tolower(resposta); // transforma em minusculo | |
// testa se a resposta foi s ou n caso contrário volta | |
while (resposta != 's' && resposta != 'n' ) { | |
/** | |
* O goto realiza um salto para um local especifico | |
*/ | |
goto opcao; | |
}; | |
// se resposta 's' inicializa arquivos | |
if (resposta == 's') | |
{ | |
int i = 0; | |
FILE *arq; | |
arq = fopen("Clientes.txt","w+t"); | |
if (arq == NULL) { | |
printf("Arquivo nao pode ser aberto!"); | |
system("pause"); | |
} | |
system("cls"); | |
printf("\n\t\tARQUIVO CRIADOS COM SUCESSO\n\n"); | |
fclose(arq); | |
system("pause"); | |
} | |
menu(); | |
} | |
/** | |
* Relatório dos clientes | |
* Imprime a conta informada | |
*/ | |
void listagem() | |
{ | |
FILE *arq; | |
CADASTRO dado; | |
int n = 0; | |
/** | |
* Abre o arquivo de clientes para leitura (r) e aceita arquivo texto (t) | |
*/ | |
arq=fopen("Clientes.txt","rt"); | |
/** | |
* GOTO - Rótulo para o salto | |
*/ | |
busca: | |
system("cls"); // limpa tela | |
printf("\t\tEXTRATO BANCARIO\n\n"); | |
printf("Digite o Numero da conta: "); | |
scanf("%i",&n); // armazena conta informada | |
/** | |
* Indica a posição da conta informada | |
*/ | |
fseek(arq, (n - 1) * sizeof(CADASTRO), SEEK_SET); | |
/** | |
* Busca os dados conta na posição atual | |
*/ | |
fread(&dado, sizeof(CADASTRO), 1, arq); | |
// se conta não existir | |
if(!dado.conta) | |
{ | |
system("cls"); // limpa tela | |
printf("\n\n\t\tCONTA INEXISTENTE!!\n\n"); | |
system("PAUSE"); | |
/** | |
* O goto realiza um salto para um local especifico | |
*/ | |
goto busca; // volta para busca caso o cadastro não exista | |
} else { | |
printf("\nConta:%d\nNome: %s\nSaldo atual: R$%.2f\nLimite: R$%.2f\n\n", dado.conta, dado.nome, dado.saldo, dado.limite); | |
} | |
// fecha arquivo aberto | |
fclose(arq); | |
system("PAUSE"); | |
menu(); | |
} | |
/** | |
* Depositar o valor na conta informada | |
*/ | |
void depositar() | |
{ | |
FILE *arq; | |
arq = fopen("Clientes.txt","r+t"); | |
CADASTRO dado; | |
float deposito; | |
int n = 0; | |
/** | |
* GOTO - Rótulo para o salto | |
*/ | |
conta: | |
system("cls"); | |
printf("\t\tDEPOSITOS\n\n"); | |
printf("Digite o Numero da conta: "); | |
scanf("%i",&n); | |
/** | |
* Indica a posição da conta informada | |
*/ | |
fseek(arq, (n - 1) * sizeof(CADASTRO), SEEK_SET); | |
/** | |
* Busca os dados conta na posição atual | |
*/ | |
fread(&dado, sizeof(CADASTRO), 1, arq); | |
// Se a conta não existir | |
if(!dado.conta) | |
{ | |
system("cls"); | |
printf("\n\n\t\tCONTA INEXISTENTE!!\n\n"); | |
system("PAUSE"); | |
/** | |
* O goto realiza um salto para um local especifico | |
*/ | |
goto conta; // volta para conta caso não encontrado | |
} else { | |
printf("\nConta:%d\nNome: %s\nSaldo atual: R$%.2f\nLimite: R$%.2f\n\n", dado.conta, dado.nome, dado.saldo, dado.limite); | |
printf("\nDigite o valor do deposito: "); | |
scanf("%f", &deposito); | |
dado.saldo = dado.saldo + deposito; | |
printf("\n\n\tDEPOSITO REALIZADO COM SUCESSO!!\n\n"); | |
/** | |
* Indica a posição do arquivo | |
*/ | |
fseek(arq, (n - 1) * sizeof(CADASTRO), SEEK_SET); | |
/** | |
* Grava dados no arquivo na posição atual | |
*/ | |
fwrite(&dado, sizeof(dado), 1, arq); | |
} | |
// fecha arquivo aberto | |
fclose(arq); | |
system("PAUSE"); | |
menu(); | |
} | |
/** | |
* Sacar o valor da conta informada | |
*/ | |
void sacar() | |
{ | |
FILE *arq; | |
arq = fopen("Clientes.txt","r+t"); | |
CADASTRO dado; | |
float saque; | |
int n = 0; | |
/** | |
* GOTO - Rótulo para o salto | |
*/ | |
conta: | |
system("cls"); | |
printf("\t\tSAQUE\n\n"); | |
printf("Digite o Numero da conta: "); | |
scanf("%i",&n); | |
/** | |
* Indica a posição da conta informada | |
*/ | |
fseek(arq, (n - 1) * sizeof(CADASTRO), SEEK_SET); | |
/** | |
* Busca os dados da conta na posição atual | |
*/ | |
fread(&dado, sizeof(CADASTRO), 1, arq); | |
if(!dado.conta) | |
{ | |
system("cls"); | |
printf("\n\n\t\tCONTA INEXISTENTE!!\n\n"); | |
system("PAUSE"); | |
/** | |
* O goto realiza um salto para um local especifico | |
*/ | |
goto conta; | |
} else { | |
printf("\nConta:%d\nNome: %s\nSaldo atual: R$%.2f\nLimite: R$%.2f\n\n", dado.conta, dado.nome, dado.saldo, dado.limite); | |
printf("\nDigite o valor do saque: "); | |
scanf("%f",&saque); | |
// o saque não pode ser maior que o saldo + limite | |
if(saque > (dado.saldo + dado.limite) ) { | |
printf("\n\n\tSALDO INDISPONIVEL\n\n"); | |
} else { | |
// Diminui o saldo da conta do cliente | |
dado.saldo = dado.saldo - saque; | |
printf("\n\tSAQUE EFETUADO COM SUCESSO!!!\n\nSALDO ATUAL: R$%.2f\n\n", dado.saldo); | |
/** | |
* Indica a posição do arquivo | |
*/ | |
fseek(arq, (n - 1) * sizeof(CADASTRO), SEEK_SET); | |
/** | |
* Grava os dados no arquivo na posição atual | |
*/ | |
fwrite(&dado, sizeof(dado), 1, arq); | |
} | |
} | |
// fecha arquivo aberto | |
fclose(arq); | |
system("PAUSE"); | |
menu(); | |
} | |
/** | |
* Relatório dos clientes | |
* Lista todos os clientes cadastros no banco | |
*/ | |
void relatorio() | |
{ | |
FILE *arq; | |
arq = fopen("Clientes.txt","rt"); | |
CADASTRO dado, | |
ultima; | |
int n = 0, | |
size = 0, | |
cconta = 0; | |
// Posiciona no primeiro byte do último registro | |
fseek(arq, 0, SEEK_END); | |
// ftell retorna a posição em bytes desde o inicio do arquivo | |
size = ftell(arq); | |
// sizeof(CADASTRO) retorna o tamanho da struct | |
// retorna a posição do ultimo registro. | |
long pos = size / sizeof(CADASTRO); | |
// se o size for maior então contem dados caso contrário não há registros cadastrados | |
if (size > 0) { | |
/** | |
* Indica a posição do ultimo registro | |
*/ | |
fseek(arq, (pos - 1) * sizeof(CADASTRO), SEEK_SET); | |
/** | |
* Lê o ultimo registro | |
*/ | |
fread(&ultima, sizeof(CADASTRO), 1, arq); | |
/** | |
* Recupera o numero da ultima conta cadastrada | |
* como é sequencial é o mesmo que o numero de contas cadastradas | |
*/ | |
cconta = ultima.conta; | |
system("cls"); | |
printf("\t\tRELATORIO GERAL DO BANCO!!!\n\nNumero de Cadastro totais: %i", cconta); | |
// percorre o arquivo para mostrar todas as contas | |
while(n < cconta) { | |
/** | |
* Indica a posição no arquivo de cada conta | |
*/ | |
fseek(arq, (sizeof(CADASTRO) * n), SEEK_SET); | |
/** | |
* Recupera os dados da conta | |
*/ | |
fread(&dado, sizeof(CADASTRO), 1, arq); | |
printf("\n-------------------------------------------------"); | |
printf("\nConta: %i\nNome: %s\nSaldo: %.2f\nCredito: R$%.2f", dado.conta, dado.nome, dado.saldo, dado.limite); | |
n++; | |
} | |
printf("\n-------------------------------------------------\n\n"); | |
} else { | |
printf("\t\tRELATORIO GERAL DO BANCO!!!\n\nNenhuma conta cadastrada!"); | |
} | |
// fecha arquivo | |
fclose(arq); | |
system("PAUSE"); | |
menu(); | |
} | |
/** | |
* Fechar o programa | |
*/ | |
void fechar() | |
{ | |
system("cls"); | |
printf("\n DESENVOLVIDO POR: Diego Ribeiro E Ramon Barros"); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment