Skip to content

Instantly share code, notes, and snippets.

@romanodesouza
Created January 31, 2016 15:40
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save romanodesouza/f7ea0d3fafb3fa6bed41 to your computer and use it in GitHub Desktop.
Save romanodesouza/f7ea0d3fafb3fa6bed41 to your computer and use it in GitHub Desktop.
/*
* Programa que gerencia contas de um usuario
* Autores: - Romano Augusto M. de Souza - 407111432
* - Nome - Matricula
* - Nome - Matricula
*/
/* Inclusoes de bibliotecas */
#include <stdio.h> // Uso de 'printf' e 'scanf'
#include <stdlib.h> // Uso de chamadas ao sistema operacional
/* Definicoes de MACROS */
#define LINHAS 5 // Numero de linhas da matriz
#define COLUNAS 9 // Numero de colunas da matriz
/* Variaveis globais
*
* fixas: matriz que abrigara os id's, valores e datas das contas fixas
* finan: matriz que abrigara os id's, valores e datas das contas financeiras
* var: matriz que abrigara os id's, valores e datas das contas variadas
* flag[3]: vetor de 3 posicoes, 1 para cada nivel de menu, que controla a opcao digitada pelo usuario
* cont: variavel auxiliar contadora dos loop's
* i: variavel que controla o posicionamento de linhas de uma dada matriz
* j: variavel que controla o posicionamento de colunas de uma dada matriz
* *acao: vetor de 4 posicoes contendo em cada 1, um ponteiro para uma string, usada para a geracao de menus
* *tipo_conta[3][6]: Matriz de 3 linhas e 6 colunas, onde em cada celula possui um ponteiro para o nome do tipo da conta
*/
float fixas[LINHAS][COLUNAS], finan[LINHAS][COLUNAS], var[LINHAS][COLUNAS];
int flag[3], cont, i, j;
char *acao[4] = {"0", "Cadastrar", "Visualizar", "Somatorio de"};
char *tipo_conta[3][6] = {
"fixas", "luz", "agua", "telefone", "internet", "aluguel",
"financeiras", "cartao de credito", "cheque", "boleto", "emprestimo", "cpmf",
"variadas", "transporte", "supermercado", "vestuario", "lazer", "hospital"
};
/* Declaracoes de funcoes/procedimentos */
void inicializaValores (void); // Inicializa os valores de cada conta
void exibeTitulo (int nivelMenu); // Escreve o titulo do menu atual
void entradaFlag (int nivelMenu, int limite); // Pede uma dada opcao ao usuario no menu atual
void geraMenuNivel2 (int escolha); // Gera o menu de nivel 2
void geraMenuNivel3 (int escolha); // Gera o menu de nivel 3
void cadastra (int divisao, int tipo); // Cadastra um tipo de conta em uma dada divisao
void visualiza (int divisao, int tipo); // Visualiza um tipo de conta em ema dada divisao
void somatorio (int divisao, int tipo); // Calcula o somatorio de contas
int main (void)
{
inicializaValores(); // Inicializa os valores das matrizes
while (1) { // Loop infinito para o menu principal (1º nivel)
exibeTitulo(0); // Exibe o titulo deste menu
/* Opcoes do menu principal: */
printf("\n\n0. Sair\n1. Cadastrar contas\n2. Visualizar contas\n3. Somatorio de contas\n\n");
/* Entrada de dados referente à opcao escolhida: */
entradaFlag(0, 4);
if (!flag[0]) break; // Se o usuario digitar '0', sai do loop, e conseqüentemente do programa
geraMenuNivel2(flag[0]); // ... chama o procedimento que gera o menu de nivel 2
}
return (0); // Retorno de main ao shell
}
/* Definicoes de funcoes/procedimentos */
void inicializaValores (void)
/* Procedimento que inicializa os valores de cada matriz com '0', para nao ter problemas com o somatorio */
{
for (i = 0; i < LINHAS; i++)
for (j = 1; j < COLUNAS; j = j + 3) {
fixas[i][j] = 0;
finan[i][j] = 0;
var[i][j] = 0;
}
}
void exibeTitulo (int nivelMenu)
/* Procedimento que escreve o titulo do menu atual */
{
char *titulo[4] = {"Controle de contas do ano de 2007", "Cadastro de contas", "Visualizacao de contas", "Somatorio de contas"};
system("clear"); // Limpa a tela
printf("%s", titulo[nivelMenu]);
}
void entradaFlag (int nivelMenu, int limite)
/* Procedimento que interage com o usuario, pedindo uma opcao valida para o menu atual */
{
do {
printf("Opcao: ");
scanf("%d", &flag[nivelMenu]);
} while (flag[nivelMenu] < 0 || flag[nivelMenu] > limite - 1); // Politica de seguranca, para nao deixar entrar lixo
}
void geraMenuNivel2 (int escolha)
/* Procedimento que gera e apresenta o menu de nivel 2 */
{
while (1) { // Loop infinito para o menu de nivel 2
exibeTitulo(flag[0]); // Exibe titulo deste menu
/* Opcoes do menu de nivel 2: */
printf("\n\n0. Voltar\n1. %s contas fixas\n2. %s contas financeiras\n3. %s contas variadas", acao[escolha], acao[escolha], acao[escolha]);
if (flag[0] == 3) { // Se a opcao escolhida for 'Somatorio'...
printf("\n4. Somatorio total\n\n"); // ...acrescenta mais uma opcao: 'Somatorio total ...
entradaFlag(1, 5); // ...expande o limite para entrada de flag
}
else { // Senao...
printf("\n\n"); // ...salta dois espacos e...
entradaFlag(1, 4); // ...segue normalmente com o limite padrao
}
if (!flag[1]) break; // Se o usuario digitar '0', sai do loop, e volta para o menu de nivel 1 (principal)
geraMenuNivel3(flag[1]); // ... chama o procedimento que gera o menu de nivel 3
}
}
void geraMenuNivel3 (int escolha)
/* Procedimento que gera e apresenta o menu de nivel 3 */
{
while (1) { // Loop infinito para o menu de nivel 3
exibeTitulo(flag[0]); // Exibe titulo deste menu
if (escolha == 4) { // Se a escolha do usuario tiver sido '4'...
printf(" total"); // Complemento do titulo
somatorio(4, -1);
break; // ...sai do loop
}
else { // Senao, segue fluxo normalmente
printf(" %s", tipo_conta[escolha -1][0]); // Complemento do titulo
/* Opcoes do menu de nivel 3: */
printf("\n\n0. Voltar\n");
for (cont = 1; cont < 6; cont++)
printf("%d. %s contas de %s\n", cont, acao[flag[0]], tipo_conta[escolha - 1][cont]);
printf("\n");
/* Entrada de dados referente à opcao escolhida: */
entradaFlag(2, 6);
if (!flag[2]) break; // Se o usuario digitar '0', sai do loop, e volta para o menu de nivel 2
/* Gerenciamento de acoes segundo o primeiro flag: */
switch (flag[0]) {
case 1: // Caso 1...
cadastra(flag[1], flag[2]); // ...realiza o cadastro do tipo da conta em uma dada divisao
break;
case 2: // Caso 2...
visualiza(flag[1], flag[2]); // ...realiza a visualizacao do tipo da conta em uma dada divisao
break;
default: // Caso 3 (default)...
somatorio(flag[1], flag[2]); // ...realiza o somatorio do tipo da conta em uma dada divisao
break;
}
}
}
}
void cadastra (int divisao, int tipo)
/* Procedimento que realiza o cadastro de uma conta em uma dada divisao */
{
/* Variaveis locais
*
* temp[2]: vetor temporario que abriga o valor e a data de vencimento da conta
*/
float temp[2];
tipo--;
for (cont = 1, j = 0; j < COLUNAS; j++, cont++) {
printf("\n\tConta nº %d:\n", cont);
do {
printf("\tDigite o valor da conta: R$ ");
scanf("%f", &temp[0]);
} while (temp[0] < 0.0); // Nao pode ter valor negativo
do {
printf("\tDigite a data de vencimento da conta (ddmm): ");
scanf("%f", &temp[1]);
} while (temp[1] > 3112 || temp[1] < 0101); // Nao pode superar 31 de Dezembro, nem ser inferior 'a 01 de Janeiro. OBS.: Essa e' uma consistencia de entrada de dados fraca!!!
/* Realiza o cadastro */
switch (divisao) {
case 1:
fixas[tipo][j] = cont;
fixas[tipo][++j] = temp[0];
fixas[tipo][++j] = temp[1];
break;
case 2:
finan[tipo][j] = cont;
finan[tipo][++j] = temp[0];
finan[tipo][++j] = temp[1];
break;
default:
var[tipo][j] = cont;
var[tipo][++j] = temp[0];
var[tipo][++j] = temp[1];
break;
}
}
/* Mensagem de feedback */
system("clear && printf '\t\t\tCadastro efetuado com sucesso!' && sleep 3s && clear");
}
void visualiza (int divisao, int tipo)
/* Procedimento que visualiza as contas de um certo tipo em uma dada divisao */
{
tipo--; // Decremento de 1, porque as matrizes em C comecam a contar com "n - 1"
for (j = 0; j < COLUNAS; j = j + 3)
switch (divisao) {
case 1: // Visualiza uma conta fixa
if (fixas[tipo][0] == 0) {
system("printf '\n\tNAO EXISTE CONTA CADASTRADA' ");
j = 9;
}
else
printf("\n\tConta %d:\n\t\tValor: R$ %.2f\n\t\tData de vencimento: %d/%d/2007\n", (int) fixas[tipo][j], fixas[tipo][j + 1], ((int) fixas[tipo][j + 2]) / 100, ((int) fixas[tipo][j + 2]) % 100);
break;
case 2: // Visualiza uma conta financeira
if (finan[tipo][0] == 0) {
system("printf '\n\tNAO EXISTE CONTA CADASTRADA' ");
j = 9;
}
else
printf("\n\tConta %d:\n\t\tValor: R$ %.2f\n\t\tData de vencimento: %d/%d/2007\n", (int) finan[tipo][j], finan[tipo][j + 1], ((int) finan[tipo][j + 2]) / 100, ((int) finan[tipo][j + 2]) % 100);
break;
default: // Visualiza uma conta variada
if (var[tipo][0] == 0) {
system("printf '\n\tNAO EXISTE CONTA CADASTRADA' ");
j = 9;
}
else
printf("\n\tConta %d:\n\t\tValor: R$ %.2f\n\t\tData de vencimento: %d/%d/2007\n", (int) var[tipo][j], var[tipo][j + 1], ((int) var[tipo][j + 2]) / 100, ((int) var[tipo][j + 2]) % 100);
break;
}
system("sleep 10s"); // Tempo de 10s para o usuario efetuar a leitura
}
void somatorio (int divisao, int tipo)
/* Procedimento que realiza todos os tipos de soma do programa e exibe os requisitados pelo usuario */
{
/* Variaveis locais
*
* somaTotal: vetor que armazena as somas de todas as contas de cada divisao, e tambem a soma geral
* somaFixas: vetor que armazena as somas de cada tipo da divisao 'fixas'
* somaFinan: vetor que armazena as somas de cada tipo da divisao 'financeiras'
* somaVar: vetor que armazena as somas de cada tipo da divisao 'variadas'
*/
float somaTotal[4], somaFixas[5], somaFinan[5], somaVar[5];
tipo--; // Decremento para o manuseio de indices de matrizes
/* Inicializacao dos vetores acumuladores */
for (i = 0; i < 3; i++)
somaTotal[i] = 0;
for (i = 0; i < 5; i++) {
somaFixas[i] = 0;
somaFinan[i] = 0;
somaVar[i] = 0;
}
/* Calculo da soma de uma serie de contas de um certo tipo para uma dada divisao */
for (j = 1; j < COLUNAS; j = j + 3) {
somaFixas[tipo] += fixas[tipo][j];
somaFinan[tipo] += finan[tipo][j];
somaVar[tipo] += var[tipo][j];
}
/* Calculo da soma total para todas as divisoes */
for (i = 0; i < LINHAS; i++)
for (j = 1; j < COLUNAS; j = j + 3) {
somaTotal[0] += fixas[i][j];
somaTotal[1] += finan[i][j];
somaTotal[2] += var[i][j];
}
/* Calculo da soma geral */
somaTotal[3] = somaTotal[0] + somaTotal[1] + somaTotal[2];
if (divisao == 4) { // Exibe soma total
printf("\n\n\tSomatorio total:\n\t\tContas fixas: R$ %.2f\n\t\tContas financeiras: R$ %.2f\n\t\tContas variadas: R$ %.2f\n\n\tSoma geral:\n\n\tR$ %.2f\n", somaTotal[0], somaTotal[1], somaTotal[2], somaTotal[3]);
system("sleep 7s"); // Tempo de 5s para o usuario efetuar a leitura dos dados
return; // Sai do procedimento
}
/* Caso nao seja pra exibir soma total, exibe soma de um determinado tipo: */
printf("\n\tSomatorio das contas de %s:\n\n\t", tipo_conta[divisao - 1][tipo + 1]);
switch (divisao) {
case 1: // Alguma conta fixa
printf("R$ %.2f\n", somaFixas[tipo]);
break;
case 2: // Alguma conta financeira
printf("R$ %.2f\n", somaFinan[tipo]);
break;
default: // Alguma conta variada
printf("R$ %.2f\n", somaVar[tipo]);
break;
}
system("sleep 5s"); // Tempo de 5s para o usuario efetuar a leitura dos dados
}
@romanodesouza
Copy link
Author

Developed in 2007 for a graduate course. #archive

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment