Correção de Código C: Sistema de Gestão de Encargos
Sistema de Gestão de Encargos em C
Abaixo está o código em linguagem C para gestão de encargos familiares, com inserção, listagem, pesquisa e cálculo de médias e totais.
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#include <math.h>
#include <ctype.h>
#include <string.h>
#include <conio.h>
#define NTotalEncargos 100 // número máximo de encargos possíveis
// Variáveis globais
typedef struct data {
int dia;
int mes;
int ano;
} DATA;
typedef struct encargo {
int codigo;
char nome[50];
int contribuinte;
float valor;
char tipo;
DATA data;
} ENCARGO; // ENCARGO é o nome da estrutura
int inserirEncargo(ENCARGO encargos[], int NEncargosIns) {
ENCARGO encargo;
encargos[NEncargosIns].codigo = NEncargosIns;
printf("\nIntroduza o nome do gestor de família: ");
scanf(" %50[^\n]s", encargos[NEncargosIns].nome);
printf("\nIntroduza o número de contribuinte: ");
scanf("\n%9d", &encargos[NEncargosIns].contribuinte);
printf("\nIntroduza o VALOR TOTAL desse encargo: ");
scanf("\n%f", &encargos[NEncargosIns].valor);
printf("\nIntroduza o DIA em que o encargo foi efetuado: ");
scanf("\n%d", &encargos[NEncargosIns].data.dia);
printf("\nIntroduza o MÊS em que o encargo foi efetuado: ");
scanf("\n%d", &encargos[NEncargosIns].data.mes);
printf("\nIntroduza o ANO em que o encargo foi efetuado: ");
scanf("\n%d", &encargos[NEncargosIns].data.ano);
printf("\nIntroduza o tipo de encargo: ");
scanf(" %c", &encargos[NEncargosIns].tipo);
NEncargosIns++;
return NEncargosIns;
}
void listarEncargo(ENCARGO encargos[], int NEncargosIns) {
int i;
for (i = 0; i < NEncargosIns; i++) {
printf("\nENCARGO[%d]", i);
printf("\nCódigo: %d", encargos[i].codigo);
printf("\nNome: %s", encargos[i].nome);
printf("\nContribuinte: %d", encargos[i].contribuinte);
printf("\nValor Total: %.2f", encargos[i].valor);
printf("\nTipo: %c", encargos[i].tipo);
printf("\nData em que o encargo foi efetuado: %d/%d/%d", encargos[i].data.dia, encargos[i].data.mes, encargos[i].data.ano);
}
system("PAUSE");
}
void listarEncargoMESANO(ENCARGO encargos[], int NEncargosIns) {
int opcao;
int opcao2;
int i;
int existeEncargos;
printf("\n");
printf("\n############### MENU ###############");
printf("\n##[1] Listar por MÊS ##");
printf("\n##[2] Listar por ANO ##");
printf("\n");
do {
printf("\nEscolha uma OPÇÃO: ");
scanf("%d", &opcao);
} while (opcao < 0 || opcao > 2);
switch (opcao) {
case 1: { // listar mês
printf("\n\nIntroduza o MÊS para listar informação\n\n ");
scanf("%d", &opcao2);
existeEncargos = 0;
for (i = 0; i < NEncargosIns; i++) {
if (encargos[i].data.mes == opcao2) {
existeEncargos = 1;
printf("\nENCARGO[%d]", i);
printf("\nCódigo: %d", encargos[i].codigo);
printf("\nNome: %s", encargos[i].nome);
printf("\nContribuinte: %d", encargos[i].contribuinte);
printf("\nValor Total: %.2f", encargos[i].valor);
printf("\nTipo: %c", encargos[i].tipo);
printf("\nData em que o encargo foi efetuado: %d/%d/%d", encargos[i].data.dia, encargos[i].data.mes, encargos[i].data.ano);
}
}
if (existeEncargos == 0) {
printf("Não existe nenhuma informação relativa ao mês %d", opcao2);
}
break;
}
case 2: { // listar ano
printf("\n\nIntroduza o ANO para listar informação:\n\n ");
scanf("%d", &opcao2);
existeEncargos = 0;
for (i = 0; i < NEncargosIns; i++) {
if (encargos[i].data.ano == opcao2) {
existeEncargos = 1;
printf("\nENCARGO[%d]", i);
printf("\nCódigo: %d", encargos[i].codigo);
printf("\nNome: %s", encargos[i].nome);
printf("\nContribuinte: %d", encargos[i].contribuinte);
printf("\nValor Total: %.2f", encargos[i].valor);
printf("\nTipo: %c", encargos[i].tipo);
printf("\nData em que o encargo foi efetuado: %d/%d/%d", encargos[i].data.dia, encargos[i].data.mes, encargos[i].data.ano);
}
}
if (existeEncargos == 0) {
printf("Não existe nenhuma informação relativa ao ano %d", opcao2);
}
break;
}
}
}
void ListarEncargoPorCodigo(ENCARGO encargos[], int NEncargosIns) {
int opcao;
int i;
/* FUNCIONAMENTO DESTA FUNÇÃO ---->
Faz o ciclo for; se encontrar um código igual ao que foi introduzido, lista e sai da função.
Se não encontrar o encargo com esse código, mostra a mensagem. O return tem como objetivo,
quando encontra o código introduzido, sair da função e não mostrar a mensagem.
Se tirar o return, mesmo que exista um código igual, também aparecerá a mensagem de que não existe. */
printf("\nIntroduza o Código do ENCARGO para listar: ");
scanf("%d", &opcao);
for (i = 0; i < NEncargosIns; i++) {
if (encargos[i].codigo == opcao) {
printf("\nENCARGO[%d]", i);
printf("\nCódigo: %d", encargos[i].codigo);
printf("\nNome: %s", encargos[i].nome);
printf("\nContribuinte: %d", encargos[i].contribuinte);
printf("\nValor Total: %.2f", encargos[i].valor);
printf("\nTipo: %c", encargos[i].tipo);
printf("\nData em que o encargo foi efetuado: %d/%d/%d", encargos[i].data.dia, encargos[i].data.mes, encargos[i].data.ano);
system("PAUSE");
return;
}
}
printf("Não existe nenhum ENCARGO com o código %d", opcao);
}
void ListarPorTipoCalcularValor(ENCARGO encargos[], int NEncargosIns) {
char opcao;
int i;
float valorTotal = 0; // inicializada a zero
printf("\nIntroduza o tipo do ENCARGO para mostrar a sua informação: ");
scanf(" %c", &opcao);
for (i = 0; i < NEncargosIns; i++) {
if (encargos[i].tipo == opcao) {
printf("\nENCARGO[%d]", i);
printf("\nCódigo: %d", encargos[i].codigo);
printf("\nNome: %s", encargos[i].nome);
printf("\nContribuinte: %d", encargos[i].contribuinte);
printf("\nValor Total: %.2f", encargos[i].valor);
printf("\nTipo: %c", encargos[i].tipo);
printf("\nData em que o encargo foi efetuado: %d/%d/%d", encargos[i].data.dia, encargos[i].data.mes, encargos[i].data.ano);
valorTotal = valorTotal + encargos[i].valor;
}
}
printf("\nO valor total de despesas do tipo de encargo %c é %.2f", opcao, valorTotal);
}
void calcularMediaMESANO(ENCARGO *encargos, int NEncargosIns) {
int opcao; // variável para escolher se quer calcular média por mês ou ano
int opcao2; // variável que lê o mês/ano que o utilizador quer calcular
int i;
float media;
float valorMes = 0; // variável dos encargos do mês (inicializada)
float valorAno = 0; // variável dos encargos do ano (inicializada)
float contador = 0; // inicializada a zero
printf("\n");
printf("\n############### MENU ###############");
printf("\n##[1] Calcular Média de ENCARGOS por MÊS ##");
printf("\n##[2] Calcular Média de ENCARGOS por ANO ##");
printf("\n");
do {
printf("\nEscolha uma OPÇÃO: ");
scanf("%d", &opcao);
} while (opcao < 0 || opcao > 2);
switch (opcao) {
case 1: { // calcular mês
printf("\n\nIntroduza o MÊS para CALCULAR a média \n\n ");
scanf("%d", &opcao2);
for (i = 0; i < NEncargosIns; i++) {
if (encargos[i].data.mes == opcao2) {
valorMes = valorMes + encargos[i].valor;
contador++;
}
}
media = (valorMes / contador);
printf("\n\nA média do valor total de encargos do mês %d é %.2f", opcao2, media);
break;
}
case 2: { // calcular ano
printf("\n\nIntroduza o ANO para CALCULAR a média \n\n ");
scanf("%d", &opcao2);
for (i = 0; i < NEncargosIns; i++) {
if (encargos[i].data.ano == opcao2) {
valorAno = valorAno + encargos[i].valor;
contador++;
}
}
media = (valorAno / contador);
printf("\n\nA média do valor total de encargos do ano %d é %.2f", opcao2, media);
break;
}
}
}
int ContarNEncargosValor(ENCARGO encargos[], int NEncargosIns) {
// neste caso esta função tem de estar em int porque void não retorna valor (return número)
int i;
int numero = 0;
float valor;
printf("\nIntroduza um valor: ");
scanf("\n%f", &valor);
for (i = 0; i < NEncargosIns; i++) {
if (encargos[i].valor <= valor) { // valor não ultrapassa
numero++;
}
}
printf("O número de encargos com esse valor é: %d", numero);
return numero;
}
int menu() {
int escolha;
printf("\n");
printf("\n############### MENU ###############");
printf("\n##[1] Inserir ENCARGOS ##");
printf("\n##[2] Listar ENCARGOS ##");
printf("\n##[3] Listar ENCARGOS DE UM MÊS OU ANO ##");
printf("\n##[4] Listar ENCARGO identificado por Código ##");
printf("\n##[5] Listar informação sobre um tipo de ENCARGO e determinar o valor total desse tipo ##");
printf("\n##[6] Calcular Média do valor total de encargos por MÊS/ANO ##");
printf("\n##[7] Contabilizar número de ENCARGOS que não ultrapassem um valor ##");
// printf("\n##[8] Contabilizar VALOR TOTAL dos encargos por cada tipo ##");
// printf("\n##[9] Calcular Média de cada ENCARGO ##");
printf("\n##[0] SAIR ##");
printf("\n####################################");
printf("\n");
do {
printf("\nEscolha uma OPÇÃO: ");
scanf("%d", &escolha);
} while (escolha < 0 || escolha > 10);
return escolha;
}
int main() {
setlocale(LC_ALL, "Portuguese"); // teclado português
system("COLOR FC"); // cor do programa
// declarar variáveis
int op = 0;
int NEncargosIns = 0; // sempre que um encargo for inserido este número atualiza
ENCARGO encargos[NTotalEncargos];
do {
op = menu();
switch (op) {
case 1: { // [1] inserir encargos
if (NEncargosIns < NTotalEncargos) {
system("cls");
NEncargosIns = inserirEncargo(encargos, NEncargosIns);
}
break;
}
case 2: { // [2] listar encargos
if (NEncargosIns != 0) {
system("cls");
listarEncargo(encargos, NEncargosIns);
printf("\nPressione para continuar");
getch();
}
break;
}
case 3: { // [3] listar encargos de um mês ou ano
if (NEncargosIns != 0) {
listarEncargoMESANO(encargos, NEncargosIns);
printf("\nPressione para continuar");
getch();
}
break;
}
case 4: { // [4] listar um encargo identificado por um código
if (NEncargosIns != 0) {
ListarEncargoPorCodigo(encargos, NEncargosIns);
printf("\nPressione para continuar");
getch();
}
break;
}
case 5: { // [5] listar por tipo de encargo e calcular o valor total
if (NEncargosIns != 0) {
ListarPorTipoCalcularValor(encargos, NEncargosIns);
printf("\nPressione para continuar");
getch();
}
break;
}
case 6: { // [6] calcular média do valor total por mês ou ano
if (NEncargosIns != 0) {
calcularMediaMESANO(encargos, NEncargosIns);
printf("\nPressione para continuar");
getch();
}
break;
}
case 7: { // [7] contabilizar número de encargos que não ultrapassem um valor
if (NEncargosIns != 0) {
ContarNEncargosValor(encargos, NEncargosIns);
printf("\nPressione para continuar");
getch();
}
break;
}
}
} while (op != 0); // a opção de saída é 0 no menu
printf("\n\n");
return 0;
}
Observações de correção
- Inicializadas as variáveis
valorTotal,valorMes,valorAnoecontador, que estavam sem valor inicial. - Corrigido o laço
do...whiledo menu principal, que usavaop != 10; a opção de saída do menu é0. - Substituído
boolporint, poisboolexigestdbool.h. - Corrigido o formato
%2.fpara%.2fnas impressões de valores monetários. - Acrescentado o
&emscanfque estava em falta no código de leitura do contribuinte e de outros campos onde aplicável. - Corrigidas mensagens e acentuação ("número", "média", "código", "opção", "informação").