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()ecalloc()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
#include
#include
#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.






