Implemente um controle simples de mercadorias em uma despensa doméstica. Para cada produto armazene um código numérico, descrição e quantidade atual. O programa deve ter opções para entrada e retirada de produtos, bem como um relatório geral e um de produtos não disponíveis. Armazene os dados em arquivo binário.

Passo 1

Primeiro, vamos resumir o enunciado: queremos um programa em C que controle mercadorias de uma despensa doméstica, armazenando para cada produto um código numérico, descrição e quantidade atual. O sistema deve permitir entrada (aumentar quantidade ou cadastrar novo produto), retirada (diminuir quantidade), relatar todos os produtos e relatar apenas os não disponíveis (quantidade zero). Tudo deve ser persistido em arquivo binário.

Passo 2

Precisamos de uma estrutura que represente cada produto. Em C, definimos um struct com campos para código, descrição (string) e quantidade.
Para persistência, usaremos um arquivo binário (por exemplo, “estoque.dat”). Na inicialização, abrimos ou criamos esse arquivo. Em cada operação de entrada/retirada, lemos o arquivo record por record para encontrar o produto (comparando o código). Se encontrado, atualizamos a quantidade e reescrevemos naquele mesmo ponto do arquivo; se na entrada o produto não existir, acrescentamos um novo registro no final.

Passo 3

Para relatório geral e de produtos indisponíveis, basta ler sequencialmente todo o arquivo e imprimir os produtos conforme o critério.

Passo 4

Montamos uma função para cada operação (entrada, retirada, relatório geral, relatório de indisponíveis) e uma função que exiba o menu no loop principal. Ao sair, fechamos o arquivo.
No código abaixo, cuidamos de abrir o arquivo em modo “r+b” ou criá-lo em modo “w+b” se não existir, e reutilizamos o mesmo ponteiro FILE * para todas as operações. Fizemos verificação de erros de I/O para maior robustez.

Passo 5

Segue o código completo em C.

Resposta

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define ARQ_ESTOQUE “estoque.dat”
#define MAX_DESC 50
typedef struct {
int codigo;
char descricao[MAX_DESC];
int quantidade;
} Produto;
FILE *abre_arquivo() {
FILE *f = fopen(ARQ_ESTOQUE, “r+b”);
if (!f) {
// não existe ainda, cria novo
f = fopen(ARQ_ESTOQUE, “w+b”);
if (!f) {
perror(“Erro ao criar arquivo”);
exit(EXIT_FAILURE);
}
}
return f;
}
void entrada_produto(FILE *f) {
Produto p;
int cod;
printf("\nCódigo do produto para entrada: “);
scanf(”%d", &cod);
rewind(f);
int achou = 0;
while (fread(&p, sizeof(Produto), 1, f) == 1) {
if (p.codigo == cod) {
int q;
printf(“Já existe ‘%s’ com qtd atual %d. Quanto inserir? “, p.descricao, p.quantidade);
scanf(”%d”, &q);
p.quantidade += q;
fseek(f, -sizeof(Produto), SEEK_CUR);
fwrite(&p, sizeof(Produto), 1, f);
printf(“Quantidade atualizada para %d\n”, p.quantidade);
achou = 1;
break;
}
}
if (!achou) {
// cadastrar novo produto
p.codigo = cod;
printf("Descrição do novo produto: ");
getchar(); // limpar buffer
fgets(p.descricao, MAX_DESC, stdin);
p.descricao[strcspn(p.descricao, “\n”)] = ‘\0’;
printf(“Quantidade inicial: “);
scanf(”%d”, &p.quantidade);
fwrite(&p, sizeof(Produto), 1, f);
printf(“Produto cadastrado com sucesso.\n”);
}
}
void retirada_produto(FILE *f) {
Produto p;
int cod;
printf("\nCódigo do produto para retirada: “);
scanf(”%d", &cod);
rewind(f);
int achou = 0;
while (fread(&p, sizeof(Produto), 1, f) == 1) {
if (p.codigo == cod) {
int q;
printf("’%s’ tem quantidade %d. Quanto retirar? “, p.descricao, p.quantidade);
scanf(”%d", &q);
if (q > p.quantidade) {
printf(“Não há estoque suficiente. Operação cancelada.\n”);
} else {
p.quantidade -= q;
fseek(f, -sizeof(Produto), SEEK_CUR);
fwrite(&p, sizeof(Produto), 1, f);
printf(“Nova quantidade: %d\n”, p.quantidade);
}
achou = 1;
break;
}
}
if (!achou) printf(“Produto não encontrado.\n”);
}
void relatorio_geral(FILE *f) {
Produto p;
int i = 0;
printf("\n— Relatório Geral —\n");
rewind(f);
while (fread(&p, sizeof(Produto), 1, f) == 1) {
printf("%d) Código: %d | %-20s | Qtde: %d\n", ++i, p.codigo, p.descricao, p.quantidade);
}
if (i == 0) printf(“Estoque vazio.\n”);
}
void relatorio_indisponiveis(FILE *f) {
Produto p;
int i = 0;
printf("\n— Produtos Indisponíveis —\n");
rewind(f);
while (fread(&p, sizeof(Produto), 1, f) == 1) {
if (p.quantidade == 0) {
printf("%d) Código: %d | %-20s | Qtde: %d\n", ++i, p.codigo, p.descricao, p.quantidade);
}
}
if (i == 0) printf(“Não há produtos indisponíveis.\n”);
}
int main() {
FILE f = abre_arquivo();
int opc;
do {
printf("\n
** Controle de Despensa ***\n");
printf(“1. Entrada de produto\n”);
printf(“2. Retirada de produto\n”);
printf(“3. Relatório geral\n”);
printf(“4. Relatório de indisponíveis\n”);
printf(“0. Sair\n”);
printf(“Escolha uma opção: “);
scanf(”%d”, &opc);
switch (opc) {
case 1: entrada_produto(f); break;
case 2: retirada_produto(f); break;
case 3: relatorio_geral(f); break;
case 4: relatorio_indisponiveis(f); break;
case 0: printf(“Saindo…\n”); break;
default: printf(“Opção inválida. Tente novamente.\n”);
}
} while (opc != 0);
fclose(f);
return 0;
}

Exercícios relacionados