Correção de Código C: Sistema de Gestão de Encargos

Design e engenharia13,89 KB

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, valorAno e contador, que estavam sem valor inicial.
  • Corrigido o laço do...while do menu principal, que usava op != 10; a opção de saída do menu é 0.
  • Substituído bool por int, pois bool exige stdbool.h.
  • Corrigido o formato %2.f para %.2f nas impressões de valores monetários.
  • Acrescentado o & em scanf que 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").

Baixar

PDF Word HTML