|

Sistema de compras de supermercado em C

Situação problema de compras de supermercado

Um pequeno supermercado deseja substituir o registo manual das compras por um sistema informatizado. Atualmente, os produtos são anotados manualmente, o que pode provocar erros no cálculo do total, perda de informações e dificuldade para emitir um comprovativo organizado para o cliente.

O sistema deverá permitir adicionar produtos ao carrinho, consultar os itens registados, remover produtos e finalizar a compra. Ao concluir a operação, o programa deverá gerar uma nota fiscal como um documento de texto, chamada: nota_fiscal.txt

Requisitos do programa de compras de supermercado

O programa deverá:

  • programa deve ser desenvolvido em C;
  • pedir a capacidade máxima do carrinho;
  • utilizar malloc() e calloc() para reservar memória;
  • utilizar um array de ponteiros para armazenar os nomes;
  • calcular o subtotal de cada produto;
  • calcular o valor total da compra;
  • permitir a escolha da forma de pagamento;
  • aplicar desconto para pagamento em dinheiro ou PIX;
  • emitir a nota fiscal no arquivo nota_fiscal.txt;
  • libertar toda a memória com free().

RESULTADO

				
					========================================
     SISTEMA DE COMPRAS DO SUPERMERCADO
========================================

Digite o nome do cliente: Mariana Silva

Digite a quantidade maxima de produtos diferentes: 5


========================================
     SISTEMA DE COMPRAS DO SUPERMERCADO
========================================

1 - Adicionar produto
2 - Mostrar carrinho
3 - Remover produto
4 - Finalizar compra
5 - Cancelar compra

Escolha uma opcao: 1


ADICIONAR PRODUTO

Digite o nome do produto: Arroz Branco

Digite o preco unitario: R$ 7.50

Digite a quantidade: 2

Produto adicionado ao carrinho com sucesso.


========================================
     SISTEMA DE COMPRAS DO SUPERMERCADO
========================================

1 - Adicionar produto
2 - Mostrar carrinho
3 - Remover produto
4 - Finalizar compra
5 - Cancelar compra

Escolha uma opcao: 1


ADICIONAR PRODUTO

Digite o nome do produto: Feijao Carioca

Digite o preco unitario: R$ 8.90

Digite a quantidade: 3

Produto adicionado ao carrinho com sucesso.


========================================
     SISTEMA DE COMPRAS DO SUPERMERCADO
========================================

1 - Adicionar produto
2 - Mostrar carrinho
3 - Remover produto
4 - Finalizar compra
5 - Cancelar compra

Escolha uma opcao: 1


ADICIONAR PRODUTO

Digite o nome do produto: Leite Integral

Digite o preco unitario: R$ 5.60

Digite a quantidade: 4

Produto adicionado ao carrinho com sucesso.


========================================
     SISTEMA DE COMPRAS DO SUPERMERCADO
========================================

1 - Adicionar produto
2 - Mostrar carrinho
3 - Remover produto
4 - Finalizar compra
5 - Cancelar compra

Escolha uma opcao: 1


ADICIONAR PRODUTO

Digite o nome do produto: Cafe Tradicional

Digite o preco unitario: R$ 14.50

Digite a quantidade: 1

Produto adicionado ao carrinho com sucesso.


========================================
     SISTEMA DE COMPRAS DO SUPERMERCADO
========================================

1 - Adicionar produto
2 - Mostrar carrinho
3 - Remover produto
4 - Finalizar compra
5 - Cancelar compra

Escolha uma opcao: 2


========================================
               CARRINHO
========================================

Item 1
Produto: Arroz Branco
Preco unitario: R$ 7.50
Quantidade: 2
Subtotal: R$ 15.00
----------------------------------------

Item 2
Produto: Feijao Carioca
Preco unitario: R$ 8.90
Quantidade: 3
Subtotal: R$ 26.70
----------------------------------------

Item 3
Produto: Leite Integral
Preco unitario: R$ 5.60
Quantidade: 4
Subtotal: R$ 22.40
----------------------------------------

Item 4
Produto: Cafe Tradicional
Preco unitario: R$ 14.50
Quantidade: 1
Subtotal: R$ 14.50
----------------------------------------

Total atual do carrinho: R$ 78.60


========================================
     SISTEMA DE COMPRAS DO SUPERMERCADO
========================================

1 - Adicionar produto
2 - Mostrar carrinho
3 - Remover produto
4 - Finalizar compra
5 - Cancelar compra

Escolha uma opcao: 3


========================================
               CARRINHO
========================================

Item 1
Produto: Arroz Branco
Preco unitario: R$ 7.50
Quantidade: 2
Subtotal: R$ 15.00
----------------------------------------

Item 2
Produto: Feijao Carioca
Preco unitario: R$ 8.90
Quantidade: 3
Subtotal: R$ 26.70
----------------------------------------

Item 3
Produto: Leite Integral
Preco unitario: R$ 5.60
Quantidade: 4
Subtotal: R$ 22.40
----------------------------------------

Item 4
Produto: Cafe Tradicional
Preco unitario: R$ 14.50
Quantidade: 1
Subtotal: R$ 14.50
----------------------------------------

Total atual do carrinho: R$ 78.60

Digite o numero do item que deseja remover: 4

Produto removido com sucesso.


========================================
     SISTEMA DE COMPRAS DO SUPERMERCADO
========================================

1 - Adicionar produto
2 - Mostrar carrinho
3 - Remover produto
4 - Finalizar compra
5 - Cancelar compra

Escolha uma opcao: 2


========================================
               CARRINHO
========================================

Item 1
Produto: Arroz Branco
Preco unitario: R$ 7.50
Quantidade: 2
Subtotal: R$ 15.00
----------------------------------------

Item 2
Produto: Feijao Carioca
Preco unitario: R$ 8.90
Quantidade: 3
Subtotal: R$ 26.70
----------------------------------------

Item 3
Produto: Leite Integral
Preco unitario: R$ 5.60
Quantidade: 4
Subtotal: R$ 22.40
----------------------------------------

Total atual do carrinho: R$ 64.10


========================================
     SISTEMA DE COMPRAS DO SUPERMERCADO
========================================

1 - Adicionar produto
2 - Mostrar carrinho
3 - Remover produto
4 - Finalizar compra
5 - Cancelar compra

Escolha uma opcao: 1


ADICIONAR PRODUTO

Digite o nome do produto: Acucar Refinado

Digite o preco unitario: R$ 4.80

Digite a quantidade: 2

Produto adicionado ao carrinho com sucesso.


========================================
     SISTEMA DE COMPRAS DO SUPERMERCADO
========================================

1 - Adicionar produto
2 - Mostrar carrinho
3 - Remover produto
4 - Finalizar compra
5 - Cancelar compra

Escolha uma opcao: 2


========================================
               CARRINHO
========================================

Item 1
Produto: Arroz Branco
Preco unitario: R$ 7.50
Quantidade: 2
Subtotal: R$ 15.00
----------------------------------------

Item 2
Produto: Feijao Carioca
Preco unitario: R$ 8.90
Quantidade: 3
Subtotal: R$ 26.70
----------------------------------------

Item 3
Produto: Leite Integral
Preco unitario: R$ 5.60
Quantidade: 4
Subtotal: R$ 22.40
----------------------------------------

Item 4
Produto: Acucar Refinado
Preco unitario: R$ 4.80
Quantidade: 2
Subtotal: R$ 9.60
----------------------------------------

Total atual do carrinho: R$ 73.70


========================================
     SISTEMA DE COMPRAS DO SUPERMERCADO
========================================

1 - Adicionar produto
2 - Mostrar carrinho
3 - Remover produto
4 - Finalizar compra
5 - Cancelar compra

Escolha uma opcao: 4


========================================
               CARRINHO
========================================

Item 1
Produto: Arroz Branco
Preco unitario: R$ 7.50
Quantidade: 2
Subtotal: R$ 15.00
----------------------------------------

Item 2
Produto: Feijao Carioca
Preco unitario: R$ 8.90
Quantidade: 3
Subtotal: R$ 26.70
----------------------------------------

Item 3
Produto: Leite Integral
Preco unitario: R$ 5.60
Quantidade: 4
Subtotal: R$ 22.40
----------------------------------------

Item 4
Produto: Acucar Refinado
Preco unitario: R$ 4.80
Quantidade: 2
Subtotal: R$ 9.60
----------------------------------------

Total atual do carrinho: R$ 73.70


FORMAS DE PAGAMENTO

1 - Dinheiro - 5% de desconto
2 - PIX - 5% de desconto
3 - Cartao de debito
4 - Cartao de credito

Escolha a forma de pagamento: 2


RESUMO DA COMPRA

Cliente: Mariana Silva
Forma de pagamento: PIX
Total bruto: R$ 73.70
Desconto: R$ 3.69
Total final: R$ 70.01

Compra finalizada com sucesso.

A nota fiscal foi criada no documento "nota_fiscal.txt".

Memoria libertada corretamente.

Encerrando o sistema.
				
			
				
					#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define TAM_NOME 100

/* Protótipos das funções */

void mostrarMenu();

void adicionarProduto(
    char **nomes,
    float *precos,
    int *quantidades,
    int *totalProdutos,
    int capacidade
);

void mostrarCarrinho(
    char **nomes,
    float *precos,
    int *quantidades,
    int totalProdutos
);

void removerProduto(
    char **nomes,
    float *precos,
    int *quantidades,
    int *totalProdutos
);

float calcularTotal(
    float *precos,
    int *quantidades,
    int totalProdutos
);

const char *obterFormaPagamento(int opcao);

float calcularDesconto(float total, int formaPagamento);

int emitirNotaFiscal(
    char *nomeCliente,
    char **nomes,
    float *precos,
    int *quantidades,
    int totalProdutos,
    float totalBruto,
    float desconto,
    float totalFinal,
    int formaPagamento
);

void libertarMemoria(
    char **nomes,
    float *precos,
    int *quantidades,
    int capacidade
);


/* Função principal */

int main() {

    char nomeCliente[TAM_NOME];

    int capacidade;
    int totalProdutos = 0;
    int opcao;
    int formaPagamento;
    int compraFinalizada = 0;

    char **nomes;
    float *precos;
    int *quantidades;

    float totalBruto;
    float desconto;
    float totalFinal;

    printf("========================================\n");
    printf("     SISTEMA DE COMPRAS DO SUPERMERCADO\n");
    printf("========================================\n\n");

    printf("Digite o nome do cliente: ");
    scanf(" %99[^\n]", nomeCliente);

    printf("Digite a quantidade maxima de produtos diferentes: ");
    scanf("%d", &capacidade);

    if (capacidade <= 0) {
        printf("\nCapacidade invalida.\n");
        return 1;
    }

    /*
        Cria dinamicamente um array de ponteiros.

        Cada posição de nomes será um ponteiro
        para uma string.
    */

    nomes = malloc(capacidade * sizeof(char *));

    /*
        Cria dinamicamente o array de preços.
    */

    precos = malloc(capacidade * sizeof(float));

    /*
        Cria dinamicamente o array de quantidades.

        calloc inicia todas as posições com zero.
    */

    quantidades = calloc(capacidade, sizeof(int));

    /*
        Verifica se a reserva de memória funcionou.
    */

    if (
        nomes == NULL ||
        precos == NULL ||
        quantidades == NULL
    ) {

        printf("\nErro ao reservar memoria.\n");

        free(nomes);
        free(precos);
        free(quantidades);

        return 1;
    }

    /*
        Reserva espaço para o nome de cada produto.
    */

    for (int i = 0; i < capacidade; i++) {

        nomes[i] = malloc(TAM_NOME * sizeof(char));

        if (nomes[i] == NULL) {

            printf("\nErro ao reservar memoria para os nomes.\n");

            /*
                Liberta apenas os nomes que já
                foram criados.
            */

            for (int j = 0; j < i; j++) {
                free(nomes[j]);
            }

            free(nomes);
            free(precos);
            free(quantidades);

            return 1;
        }
    }

    /*
        O menu continuará aparecendo até a compra
        ser finalizada ou cancelada.
    */

    do {

        mostrarMenu();

        printf("Escolha uma opcao: ");
        scanf("%d", &opcao);

        switch (opcao) {

            case 1:

                adicionarProduto(
                    nomes,
                    precos,
                    quantidades,
                    &totalProdutos,
                    capacidade
                );

                break;

            case 2:

                mostrarCarrinho(
                    nomes,
                    precos,
                    quantidades,
                    totalProdutos
                );

                break;

            case 3:

                removerProduto(
                    nomes,
                    precos,
                    quantidades,
                    &totalProdutos
                );

                break;

            case 4:

                if (totalProdutos == 0) {

                    printf("\nO carrinho esta vazio.\n");
                    printf("Adicione produtos antes de finalizar.\n");

                    break;
                }

                mostrarCarrinho(
                    nomes,
                    precos,
                    quantidades,
                    totalProdutos
                );

                totalBruto = calcularTotal(
                    precos,
                    quantidades,
                    totalProdutos
                );

                printf("\nFORMAS DE PAGAMENTO\n\n");

                printf("1 - Dinheiro - 5%% de desconto\n");
                printf("2 - PIX - 5%% de desconto\n");
                printf("3 - Cartao de debito\n");
                printf("4 - Cartao de credito\n");

                printf("\nEscolha a forma de pagamento: ");
                scanf("%d", &formaPagamento);

                if (
                    formaPagamento < 1 ||
                    formaPagamento > 4
                ) {

                    printf("\nForma de pagamento invalida.\n");
                    break;
                }

                desconto = calcularDesconto(
                    totalBruto,
                    formaPagamento
                );

                totalFinal = totalBruto - desconto;

                printf("\nRESUMO DA COMPRA\n\n");

                printf("Cliente: %s\n", nomeCliente);
                printf(
                    "Forma de pagamento: %s\n",
                    obterFormaPagamento(formaPagamento)
                );

                printf("Total bruto: R$ %.2f\n", totalBruto);
                printf("Desconto: R$ %.2f\n", desconto);
                printf("Total final: R$ %.2f\n", totalFinal);

                /*
                    Cria o documento da nota fiscal.
                */

                if (
                    emitirNotaFiscal(
                        nomeCliente,
                        nomes,
                        precos,
                        quantidades,
                        totalProdutos,
                        totalBruto,
                        desconto,
                        totalFinal,
                        formaPagamento
                    )
                ) {

                    printf("\nCompra finalizada com sucesso.\n");
                    printf(
                        "A nota fiscal foi criada no documento "
                        "\"nota_fiscal.txt\".\n"
                    );

                    compraFinalizada = 1;

                } else {

                    printf("\nNao foi possivel emitir a nota fiscal.\n");
                }

                break;

            case 5:

                printf("\nCompra cancelada.\n");
                compraFinalizada = 1;

                break;

            default:

                printf("\nOpcao invalida.\n");
                printf("Escolha uma opcao entre 1 e 5.\n");
        }

    } while (compraFinalizada == 0);

    /*
        Liberta toda a memória dinâmica.
    */

    libertarMemoria(
        nomes,
        precos,
        quantidades,
        capacidade
    );

    printf("\nMemoria libertada corretamente.\n");
    printf("Encerrando o sistema.\n");

    return 0;
}


/* Exibe o menu principal */

void mostrarMenu() {

    printf("\n========================================\n");
    printf("     SISTEMA DE COMPRAS DO SUPERMERCADO\n");
    printf("========================================\n\n");

    printf("1 - Adicionar produto\n");
    printf("2 - Mostrar carrinho\n");
    printf("3 - Remover produto\n");
    printf("4 - Finalizar compra\n");
    printf("5 - Cancelar compra\n\n");
}


/* Adiciona um produto ao carrinho */

void adicionarProduto(
    char **nomes,
    float *precos,
    int *quantidades,
    int *totalProdutos,
    int capacidade
) {

    if (*totalProdutos >= capacidade) {

        printf("\nO carrinho atingiu a capacidade maxima.\n");
        return;
    }

    printf("\nADICIONAR PRODUTO\n\n");

    printf("Digite o nome do produto: ");
    scanf(
        " %99[^\n]",
        nomes[*totalProdutos]
    );

    printf("Digite o preco unitario: R$ ");
    scanf(
        "%f",
        &precos[*totalProdutos]
    );

    if (precos[*totalProdutos] <= 0) {

        printf("\nPreco invalido.\n");
        return;
    }

    printf("Digite a quantidade: ");
    scanf(
        "%d",
        &quantidades[*totalProdutos]
    );

    if (quantidades[*totalProdutos] <= 0) {

        printf("\nQuantidade invalida.\n");
        quantidades[*totalProdutos] = 0;

        return;
    }

    (*totalProdutos)++;

    printf("\nProduto adicionado ao carrinho com sucesso.\n");
}


/* Mostra todos os produtos do carrinho */

void mostrarCarrinho(
    char **nomes,
    float *precos,
    int *quantidades,
    int totalProdutos
) {

    float subtotal;
    float total = 0;

    if (totalProdutos == 0) {

        printf("\nO carrinho esta vazio.\n");
        return;
    }

    printf("\n========================================\n");
    printf("               CARRINHO\n");
    printf("========================================\n");

    for (int i = 0; i < totalProdutos; i++) {

        subtotal = precos[i] * quantidades[i];
        total = total + subtotal;

        printf("\nItem %d\n", i + 1);
        printf("Produto: %s\n", nomes[i]);
        printf("Preco unitario: R$ %.2f\n", precos[i]);
        printf("Quantidade: %d\n", quantidades[i]);
        printf("Subtotal: R$ %.2f\n", subtotal);
        printf("----------------------------------------\n");
    }

    printf("\nTotal atual do carrinho: R$ %.2f\n", total);
}


/* Remove um produto do carrinho */

void removerProduto(
    char **nomes,
    float *precos,
    int *quantidades,
    int *totalProdutos
) {

    int posicao;

    if (*totalProdutos == 0) {

        printf("\nO carrinho esta vazio.\n");
        return;
    }

    mostrarCarrinho(
        nomes,
        precos,
        quantidades,
        *totalProdutos
    );

    printf("\nDigite o numero do item que deseja remover: ");
    scanf("%d", &posicao);

    posicao--;

    if (
        posicao < 0 ||
        posicao >= *totalProdutos
    ) {

        printf("\nProduto invalido.\n");
        return;
    }

    /*
        Move os produtos posteriores uma posição
        para trás.
    */

    for (int i = posicao; i < *totalProdutos - 1; i++) {

        strcpy(nomes[i], nomes[i + 1]);

        precos[i] = precos[i + 1];

        quantidades[i] = quantidades[i + 1];
    }

    (*totalProdutos)--;

    /*
        Limpa os dados da última posição utilizada.
    */

    nomes[*totalProdutos][0] = '\0';
    precos[*totalProdutos] = 0;
    quantidades[*totalProdutos] = 0;

    printf("\nProduto removido com sucesso.\n");
}


/* Calcula o valor total da compra */

float calcularTotal(
    float *precos,
    int *quantidades,
    int totalProdutos
) {

    float total = 0;

    for (int i = 0; i < totalProdutos; i++) {

        total = total + (
            precos[i] * quantidades[i]
        );
    }

    return total;
}


/* Retorna o nome da forma de pagamento */

const char *obterFormaPagamento(int opcao) {

    switch (opcao) {

        case 1:
            return "Dinheiro";

        case 2:
            return "PIX";

        case 3:
            return "Cartao de debito";

        case 4:
            return "Cartao de credito";

        default:
            return "Nao informado";
    }
}


/* Calcula o desconto da compra */

float calcularDesconto(
    float total,
    int formaPagamento
) {

    if (
        formaPagamento == 1 ||
        formaPagamento == 2
    ) {

        return total * 0.05f;
    }

    return 0;
}


/* Cria o documento da nota fiscal */

int emitirNotaFiscal(
    char *nomeCliente,
    char **nomes,
    float *precos,
    int *quantidades,
    int totalProdutos,
    float totalBruto,
    float desconto,
    float totalFinal,
    int formaPagamento
) {

    FILE *arquivo;
    float subtotal;

    arquivo = fopen(
        "nota_fiscal.txt",
        "w"
    );

    if (arquivo == NULL) {

        printf("\nErro ao criar o arquivo da nota fiscal.\n");
        return 0;
    }

    fprintf(
        arquivo,
        "============================================================\n"
    );

    fprintf(
        arquivo,
        "                    SUPERMERCADO ALGORITHMICS\n"
    );

    fprintf(
        arquivo,
        "                         NOTA FISCAL\n"
    );

    fprintf(
        arquivo,
        "============================================================\n\n"
    );

    fprintf(
        arquivo,
        "Cliente: %s\n",
        nomeCliente
    );

    fprintf(
        arquivo,
        "Forma de pagamento: %s\n\n",
        obterFormaPagamento(formaPagamento)
    );

    fprintf(
        arquivo,
        "------------------------------------------------------------\n"
    );

    fprintf(
        arquivo,
        "%-4s %-22s %-8s %-8s %-10s\n",
        "N.",
        "Produto",
        "Preco",
        "Qtd.",
        "Subtotal"
    );

    fprintf(
        arquivo,
        "------------------------------------------------------------\n"
    );

    for (int i = 0; i < totalProdutos; i++) {

        subtotal = precos[i] * quantidades[i];

        fprintf(
            arquivo,
            "%-4d %-22.22s R$%-6.2f %-8d R$%-8.2f\n",
            i + 1,
            nomes[i],
            precos[i],
            quantidades[i],
            subtotal
        );
    }

    fprintf(
        arquivo,
        "------------------------------------------------------------\n"
    );

    fprintf(
        arquivo,
        "Quantidade de produtos diferentes: %d\n",
        totalProdutos
    );

    fprintf(
        arquivo,
        "Total bruto:                         R$ %.2f\n",
        totalBruto
    );

    fprintf(
        arquivo,
        "Desconto:                            R$ %.2f\n",
        desconto
    );

    fprintf(
        arquivo,
        "TOTAL DA COMPRA:                     R$ %.2f\n",
        totalFinal
    );

    fprintf(
        arquivo,
        "============================================================\n\n"
    );

    fprintf(
        arquivo,
        "Obrigado pela preferencia!\n"
    );

    fprintf(
        arquivo,
        "Volte sempre.\n"
    );

    /*
        Fecha o arquivo e verifica se ocorreu erro.
    */

    if (fclose(arquivo) != 0) {

        printf("\nErro ao fechar o arquivo da nota fiscal.\n");
        return 0;
    }

    return 1;
}


/* Liberta toda a memória dinâmica */

void libertarMemoria(
    char **nomes,
    float *precos,
    int *quantidades,
    int capacidade
) {

    /*
        Cada nome recebeu um malloc separado.
        Por isso, cada posição precisa de free().
    */

    for (int i = 0; i < capacidade; i++) {

        free(nomes[i]);
        nomes[i] = NULL;
    }

    /*
        Depois libertamos o array de ponteiros.
    */

    free(nomes);
    nomes = NULL;

    /*
        Liberta os outros arrays.
    */

    free(precos);
    precos = NULL;

    free(quantidades);
    quantidades = NULL;
}
				
			

Caso o C ainda não esteja instalado em seu dispositivo, clique no botão abaixo para realizar a instalação.

Posts Similares

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *