#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_PRODUTOS 50 // Capacidade máxima do vetor (mínimo 5 exigido)
// 1. Estrutura para representar os produtos (struct)
typedef struct {
int codigo;
char nome[50];
char categoria;
float preco;
int quantidade;
}Produto;
// Protótipos das funções
void limparBuffer()
int buscarSequencial(Produto estoque[], int total, int codigo);
void bubbleSort(Produto estoque[], int total);
void cadastrarProduto(Produto estoque[], int *total)
void relatorioGeral(Produto estoque[], int total);
void executarVenda(Produto estoque[], int total);
void atualizarPrecoTodos(Produto estoque[], int total);
void atualizarPrecoEspecifico(Produto estoque[], int total);
void menuAtualizacaoPreco(Produto estoque[], int total);
int main(){
Produto estoque [MAX_PRODUTOS]
int totalCadastrados = 0;
int opcao;
do {
printf("\n===================================\n");
printf( TECHSTORE INFORMATICA );
printf(" SISTEMA DE CONTROLE DE ESTOQUE' ");
printf("\n===================================\n");
printf("1. Cadastrar produtos no estoque\n");
printf("2.Relatorio geral (Listar produtos)\n");
printf("3. Excutar venda \n");
printf("4. Atualizacao de preco\n");
printf("5. Sair\n");
if (scanf("%d", &opcao) != 1){
printf("\nErro: Entrada invalida! Digite apenas numeros. \n");
limparBuffer();
continue;{
switch (opcao) {
case 1:
cadastrarProduto(estoque, &totalCadastrados);
break;
case 2:
relatorioGeral(estoque, totalCadastrados);
break;
case 3:
executarVenda(estoqu, totalCadastrados);
break;
case 4:
menuAtualizacaoPreco(estoque, totalCadastrados);
break;
case 5:
printf("\nEncerrando o sistema... Ate logo!\n")
break;
default:
printf("\nOpcao invalda! Escolha um valor entre 1 e 5.\n")}
} while (opcao != 5)
return 0;
}
// Funçao para lmpar o buffer de entrada do teclado
void limparBuffer()
int c;
while (( c = getchat()) != '\n' && c != EOF)
}
// 2. Algoritmo d Busca Sequencial pelo codigo do produto
int buscarSequencial(Produto estoque[], int total, int codigo) {
for (int i = 0; i < total; i++) {
if (estoquei [i].codigo == codigo) {
return i; // Retorna o índice onde o produto foi localizado
{
return -1; // Produto não ncontrado
//3. Algoritmo de Ordenação Bubble Sort por código (ordem crescente)
void bubbleSort(Produto estoque[], int total) {
for (int i=0; i < total - 1; i++) {
for (int j = 0; j < total - 1 - i; j++) {
if (estoque[j].codigo > estoque[j +1].codigo) {
Produto temp = estoque[j];
estoque[j] = estoque[j +1];
estoque[j + 1] = temp;
}
}
}
}
} //4. Opção 1: cadastrar Produto
void cadstrarProduto(Produto estoque[], int *total) {
printf("\n--- CADASTRO DE PRODUTO ---\n");
//Validação de capacidade do vetor
if(*total >=MAX_PRODUTOS) {
printf("Erro: Capacidade maxima de estoque atingida (%d produtos) !\n", MAX_PRODUTOS);
return;
{
int codigo;
printf("Digite o codigo do produto: ");
if (scanf("%d", &codigo) != 1) {
printf("Codigo invalido!\n");
limparBuffe();
return;
}
//Validação de código duplicado por buscar sequencial
if (buscarSequencial(estoque, *total, codigo) != -1) {
printf("Erro: Já exste um produto cadastrado com o código %d!\n", codigo);
return;
{
}
Produto novo;
novo.codgo = codigo;
limparBuffer();
printf("Digite o nome do produto:");
fgets(novo.nome, sizeof(novo.nome), stidin);
novo.nome[strcspn(novo.nome, '\n')] = '\0'; // Remove o \n do final
printf("Digite a categoria do produto:");
fgets(novo.categoria, sizeof(novo.categoria), stidin);
novo.categoria[strcspn(novo.categoria, "\n")] = '\0':
printf("Digite o preco do produto:");
fgets(novo.preco, sizeof(novo.preco), stidin);
if (scanf("%f", &novo.preco) != 1 || novo.preco <= 0) {
printf("Digite o preco unitario (ex: 150.00): R$");
if (scanf("%f", %novo.preco) != 1 || novo.preco <= 0) {
printf("Erro: 0 preco dve ser um valor maior que zero!\n");
limparBuffer();
return;
}
printf("Digite a quantidade inicial em estoque");
if (scanf("%d", &novo.quantidade) != 1 || novo.quantidade < 0) {
lmparBuffer();
return;
{
estoque[*total] = novo;
(*total)++;
printf("Sucesso: produto "%s" cadastrado com sucesso!\n", novo.nome);
{
//5. Opção 2: Relatório Geral (Com Ordenação Bubble Sort)
void relatorioGeral(Produto estoque[], int total) {
printf("\n--- RELATORIO GERAL DE PRODUTOS ---\n");
if (total == 0) {
printf("Nenhum produto cadastrado no estoque.\n");
return;
}
//Ordernação obrigatória com Bubble Sort antes de exibir
bubbleSort(estoque, total);
printf("--------------------------------------------------------------------------------------------\n");
printf("%-8s | %-25s | %-15s | %-10s | %-10s\n", "CODIGO", "NOME", "CATEGORIA", "PRECO" (R$), "ESTOQUE");
printf("--------------------------------------------------------------------------------------------\n");
for (int i = 0; i < total; i++) {
printf("&-8d | %-25s | %-15s | R$ %-9.2f | %-10s\n",
estoque[i].codigo,
estoque[i].nome
estoque[i].categoria.
estoque[i].preco,
estoque[i].quantidade);
}
printf("--------------------------------------------------------------------------------------------\n")/
printf("Total de produtos listados: %d\n", total);
{
//6. Opção 3: Executar venda
void executarVenda(Produto estoque[], int total) {
printf("\n--- EXECUTAR VENDA ---\n");
if (total == 0) {
printf("Nenhum produto cadastrado no estoque.\n");
return;
}
int codigo;
printf("Digite o codigo do produto a ser vendido: ");
if (scanf("%d", &codigo) != 1) {
printf("Erro: Codigo invalido!\n");
limparBuffer();
return;
}
int indice = buscarSequencial(estoque, total, codigo);
if (indice == -1) {
printf("Erro: Produto com codigo %d nao encontrado!\n", codigo);
return;
}
int quantidadeVendida;
printf("Digite a quantidade a ser vendida: ");
if (scanf("%d", &quantidadeVendida) != 1 || quantidadeVendida <= 0) {
printf("Erro: Quantidade invalida! Deve ser um valor maior que zero.\n");
limparBuffer();
return;
}
if (quantidadeVendida > estoque[indice].quantidade) {
printf("Erro: Quantidade em estoque insuficiente! Estoque atual: %d\n", estoque[indice].quantidade);
return;
}
// Atualiza a quantidade em estoque após a venda
estoque[indice].quantidade -= quantidadeVendida;
float valorTotal = quantidadeVendida * estoque[indice].preco;
printf("Venda realizada com sucesso! Valor total da venda: R$ %.2f\n", valorTotal);
// Resumo da Operação
printf("\n--- RESUMO DA VENDA ---\n");
printf("Produto: %s\n", estoque[indice].nome);
printf("Quantidade vendida: %d\n", quantidadeVendida);
printf("Valor total: R$ %.2f\n", valorTotal);
printf("--------------------------------\n");
char confirmacao;
printf("Deseja confirmar a venda? (S/N): ");
limparBuffer();
scanf("%c", &confirmacao);
if (confirmacao == 'S' || confirmacao == 's') {
printf("Venda confirmada!\n");
} else {
// Reverte a quantidade em estoque caso a venda não seja confirmada
estoque[indice].quantidade += quantidadeVendida;
printf("Venda cancelada. Estoque revertido.\n");
//7. Opção 4: Atualização de Preço
void atualizarPrecoTodos(Produto estoque[], int total) {
if (total == 0) {
printf("Nenhum produto cadastrado no estoque.\n");
return;
}
float percentual;
printf("Digite o percentual de aumento (ex: 10 para 10%%): ");
if (scanf("%f", &percentual) != 1) {
printf("Erro: Percentual invalido!\n");
limparBuffer();
return;
}
for (int i = 0; i < total; i++) {
estoque[i].preco *= (1 + percentual / 100);
}
printf("Preços atualizados com sucesso!\n");
}
//8 . Atualização de preço específico
void atualizarPrecoEspecifico(Produto estoque[], int total) {
if (total == 0) {
printf("Nenhum produto cadastrado no estoque.\n");
return;
}
int codigo;
printf("Digite o codigo do produto para atualizar o preco: ");
if (scanf("%d", &codigo) != 1) {
printf("Erro: Codigo invalido!\n");
limparBuffer();
return;
}
int indice = buscarSequencial(estoque, total, codigo);
if (indice == -1) {
printf("Erro: Produto com codigo %d nao encontrado!\n", codigo);
return;
}
float percentual;
printf("Digite o percentual de aumento (ex: 10 para 10%%): ");
if (scanf("%f", &percentual) != 1) {
printf("Erro: Percentual invalido!\n");
limparBuffer();
return;
}
float precoAntigo = estoque[indice].preco;
estoque[indice].preco *= (1 + percentual / 100);
printf("Preco do produto atualizado de R$ %.2f para R$ %.2f\n", precoAntigo, estoque[indice].preco);
{
//9. Menu de atualização de preço
void menuAtualizacaoPreco(Produto estoque[], int total) {
int opcao;
do {
printf("\n--- ATUALIZACAO DE PRECO ---\n");
printf("1. Atualizar preco de todos os produtos\n");
printf("2. Atualizar preco de um produto especifico\n");
printf("3. Voltar ao menu principal\n");
printf("Escolha uma opcao: ");
if (scanf("%d", &opcao) != 1) {
printf("Erro: Entrada invalida! Digite apenas numeros.\n");
limparBuffer();
continue;
}
switch (opcao) {
case 1:
atualizarPrecoTodos(estoque, total);
break;
case 2:
atualizarPrecoEspecifico(estoque, total);
break;
case 3:
printf("Voltando ao menu principal...\n");
break;
default:
printf("Opcao invalida! Escolha um valor entre 1 e 3.\n");
}
} while (opcao != 3);
}
To embed this project on your website, copy the following code and paste it into your website's HTML: