Ir ao conteúdo

Problema em programa de controle de estoque em C - Vetor de estruturas


Ir à solução Resolvido por Arm Outro,

Posts recomendados

Postado

Olá, pessoal.

 

Então, eu to fazendo um trabalho para faculdade, onde devo criar um programa em C que gerencie um estoque. O programa deve ter as seguintes funções:

 

1. Cadastrar produto;

2. Mostrar catalogo;

3. Mostrar estoque;

4. Aumentar estoque;

5. Diminuir estoque;

 

As 3 primeiras eu fiz de boa, o problema ta na função 4, pois eu consigo mudar o atributo de quantidade (qntd) dentro da função, mas não consigo mante-lo fora dela (no resto do código). Eu sei que tenho que usar ponteiro (como usei no catalogo), mas não consegui escrever o código pra isso (ponteiro de vetor de estrutura).

 

Segue o código:

 

PS: Deixei a função com parâmetros que não são ponteiros de propósito, já que não sei como declara.

 

#include <stdio.h>
#define MAX 100
 
typedef struct
{
    int codigo;
    char nome[50];
    float valor;
}Produto;
 
typedef struct
{
    Produto prod;
    int qntd;
}Item;
 
int menu(Produto catalogo[], int *tam_catalogo, Item estoque[]);
void cadastrar_produto(Produto catalogo[], int *tam_catalogo);
void mostrar_catalogo(Produto catalogo[], int *tam_catalogo);
void mostrar_estoque(Item estoque[], Produto catalogo[], int *tam_catalogo);
void aumentar_estoque(Item estoque[]);
 
int main()
{
    Produto catalogo[MAX];
    Item estoque[MAX];
 
    int i;
 
    for (i = 0; i < MAX; i++)
    {
        estoque.qntd = 0;
    }
 
    int tam_catalogo = 0;
    int *ptc = &tam_catalogo;
    int continuar;
 
    do
    {
        continuar = menu(catalogo, &ptc, estoque);
    }
    while (continuar);
 
    return 0;
}
 
int menu(Produto catalogo[], int *tam_catalogo, Item estoque[])
{
int opcao;
 
    printf ("\n-- MENU DE opções --\n");
    printf ("\n1. Cadastrar produto");
    printf ("\n2. Mostrar catalogo");
    printf ("\n3. Mostrar estoque");
    printf ("\n4. Aumentar estoque");
    printf ("\n5. Diminuir estoque");
    printf ("\n0. Sair\n");
 
    printf ("\nSelecione uma opcao: ");
    scanf ("%d", &opcao);
 
    switch (opcao)
    {
        case 1:
        {
            cadastrar_produto(catalogo, *tam_catalogo);
            break;
        }
 
        case 2:
        {
            mostrar_catalogo(catalogo, *tam_catalogo);
            break;
        }
 
        case 3:
        {
            mostrar_estoque(estoque, catalogo, *tam_catalogo);
            break;
        }
 
        case 4:
        {
            aumentar_estoque(estoque);
            break;
        }
 
        case 5:
        {
            //ainda vou fazer, pois preciso da função 4 pronta;
        }
 
        case 0:
        {
            system ("cls || clear");
            printf ("Obrigado por usar! Ate a proxima!\n");
            break;
        }
 
        default:
        {
            printf ("\nOpcao invalida!\n");
        }
    }
 
    return opcao;
}
 
void cadastrar_produto(Produto catalogo[], int *tam_catalogo)
{
    printf ("\nDigite o codigo do produto: ");
    scanf ("%d", &catalogo[*tam_catalogo].codigo);
    printf ("Digite o nome do produto: ");
    fflush(stdin);
    gets(catalogo[*tam_catalogo].nome);
    printf ("Digite o valor do produto: R$ ");
    scanf ("%f", &catalogo[*tam_catalogo].valor);
    *tam_catalogo = *tam_catalogo + 1;
}
 
void mostrar_catalogo(Produto catalogo[], int *tam_catalogo)
{
    int i;
 
    printf ("\n ---------- CATALOGO DE PRODUTOS ----------\n");
    printf ("\n COD -       NOME           -    VALOR\n");
 
    for (i = 0; i < *tam_catalogo; i++)
    {
        printf ("  %2d - %20s - R$ %6.2f\n", catalogo.codigo, catalogo.nome, catalogo.valor);
    }
}
 
void mostrar_estoque(Item estoque[], Produto catalogo[], int *tam_catalogo)
{
    int i;
 
    for (i = 0; i < *tam_catalogo; i++)
    {
        estoque.prod = catalogo;
    }
 
    printf ("\n ---------- ESTOQUE DE PRODUTOS ----------\n");
    printf ("\n COD -       NOME           -    VALOR  - ESTOQUE\n");
 
    for (i = 0; i < *tam_catalogo; i++)
    {
        printf ("  %2d - %20s - R$ %6.2f - %d\n", estoque.prod.codigo, estoque.prod.nome, estoque.prod.valor, estoque.qntd);
    }
}
 
void aumentar_estoque(Item estoque[])
{
    int escolha, quantidade;
 
    printf ("\nDe qual produto deseja adicionar estoque? ");
    scanf ("%d", &escolha);
 
    printf ("\nQuantos itens do produto deseja adicionar: ");
    scanf ("%d", &quantidade);
 
    estoque[escolha].qntd += quantidade;
 
    printf ("\n");
}
 
Desde já agradeço.
  • Solução
Postado

A função aumentar_estoque funciona corretamente, o erro está na function mostrar_estoque, nessa parte:

printf ("  %2d - %20s - R$ %6.2f - %d\n", estoque[i].prod.codigo, estoque[i].prod.nome, estoque[i].prod.valor, estoque[i].qntd);

Na parte ( estoque.qntd ) você está passando um índice incorreto, o que você tem que passar no índice é o código do produto, desse jeito:

estoque[catalogo[i].codigo].qntd
  • Curtir 1
Postado

Meu Deus! Passei 3 dias pensando e tentando resolver esse problema e não passou pela minha cabeça que seria isso.

Agora vou só colocar as restrições para não haver código repetido ou inválido e etc, e terminarei essa bagaça.

 

Muito obrigado!! <3

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...