Skip to content

Instantly share code, notes, and snippets.

@rbarros
Last active September 19, 2016 03:06
Show Gist options
  • Save rbarros/3df91320038c6a87378619cc388c3c14 to your computer and use it in GitHub Desktop.
Save rbarros/3df91320038c6a87378619cc388c3c14 to your computer and use it in GitHub Desktop.
Trabalho de Grau A - Estrutura de Dados
#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