Created
January 31, 2016 15:40
-
-
Save romanodesouza/f7ea0d3fafb3fa6bed41 to your computer and use it in GitHub Desktop.
This file contains hidden or 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
/* | |
* 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 | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Developed in 2007 for a graduate course. #archive