Ir ao conteúdo
  • Cadastre-se
Gabriel Hijazi

C Controle de Estoque problema na função imprime

Posts recomendados

Olá, estou fazendo este programa em C de controle de estoque apenas para hobby e aprendizado usando structs e funções mas estou com um problema.

na função imprimeProduto que é onde no menu eu irei listar os produtos adicionados está ocorrendo um loop infinito com caracteres estranhos, ja tentei fazer com if mudando o printf de lugar ou declarando outras variaveis mas sem sucesso.

se alguem puder me ajudar 

#include<stdio.h>
#include<stdlib.h>

typedef union {
    int peso;
    float volume;
}qtd;

typedef struct{
    int id;
    char nome[100];
    float preco;
    qtd quantidade;
    char op;
}produto;

int cadastraProduto(produto estoque[100]){
    int i;
    char op;

  for(i = 0;i < 100; i ++){
    if(estoque[i].id == 0){
        fflush(stdin);
        printf("Nome do Produto: ");
        scanf("%[^\n]",&estoque[i].nome);
        fflush(stdin);

        printf("Digite K para produtos com Kilos e L para produtos em volume Litros : ");
        scanf("%s",&op);
        fflush(stdin);

        if(op == 'k')
          scanf("%d",&estoque[i].quantidade.peso);
        else
          scanf("%f",&estoque[i].quantidade.volume);

          printf("Digite o preco");
          scanf("%f",&estoque[i].preco);
          fflush(stdin);
          printf("\n\n");
          estoque[i].id = i + 1;
          break;
    }
     if(i == 100) printf("Estoque Lotado.");
  }

   return menu();
}
void imprimeProduto(produto estoque[100]){
    int i;

    for(i = 0; i < 100; i++){
    printf("Nome : %s",estoque[i].nome);
    }

}

void menu(){

    int op;
    produto estoque[100];
    printf("1-Cadadastrar Novo Produto\n2-Listar Produtos\n3-Buscar Produto\n4-Deletar Produto\n5-Sair.\n");
    scanf("%d",&op);
   do{
    switch(op){
    case 1:
        cadastraProduto(estoque);
    break;
    case 2:
        imprimeProduto(estoque);
    break;
    }
   }while(op != 5);


}
int main (){
    menu();
}

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu dei uma olhada no seu código vê ai o que precisa implementar mais 

#include<stdio.h>
#include<stdlib.h>

typedef union {
    int peso;
    float volume;
}qtd;

typedef struct{
    int id;
    char nome[100];
    float preco;
    qtd quantidade;
    char op;
}produto;

/*****************************************
 * Deveria passar tudo como ponteiros    *
 * int cadastraProduto(produto *estoque) *
 ****************************************/
int cadastraProduto(produto estoque[100]){
    int i;
    char op;

  for(i = 0;i < 100; i ++){
    if(estoque[i].id == 0){
        printf("Nome do Produto: ");
        /* scanf("%[^\n]",&estoque[i].nome);    Assim complica coisas faceis */
        scanf("%s",&estoque[i].nome);
        getchar();    /* Esvasia o buffer do teclado */

        printf("Digite K para produtos com Kilos e L para produtos em volume Litros : ");
        /* scanf("%s",&op); Aqui deveria ser %c */
        scanf("%c",&op);
        getchar();    /* Esvasia o buffer do teclado */
        
        /* Falta um aviso aqui do que isso faz */
        if(op == 'k')
          scanf("%d",&estoque[i].quantidade.peso);
        else
          scanf("%f",&estoque[i].quantidade.volume);
          
          getchar();    /* Esvasia o buffer do teclado */

          printf("Digite o preco");
          scanf("%f",&estoque[i].preco);
          getchar();    /* Esvasia o buffer do teclado */
          printf("\n\n");
          estoque[i].id = i + 1;
          break;
    }
     if(i == 100) printf("Estoque Lotado.");
  }

   return menu();     /* ???? */
   /* isso vai causar uma recursividade infinita */
}
void imprimeProduto(produto estoque[100]){
    int i;

    for(i = 0; i < 100; i++){
    printf("Nome : %s",estoque[i].nome);
    }

}

void menu(){

    int op;
    produto estoque[100];
    printf("1-Cadadastrar Novo Produto\n2-Listar Produtos\n3-Buscar Produto\n4-Deletar Produto\n5-Sair.\n");
    /* scanf("%d",&op);  Evite usar %d você está pegando um numero inteiro e não um decimal qualquer */
    scanf("%i",&op);
    getchar();    /* Esvasia o buffer do teclado */
   do{
    switch(op){
    case 1:
        cadastraProduto(estoque);
    break;
    case 2:
        imprimeProduto(estoque);
    break;
    }
   }while(op != 5);


}
int main (){
    menu();
}

Agora eu te pergunto como você vai saber quantos cadastros foram feitos?

Compartilhar este post


Link para o post
Compartilhar em outros sites

@KXSY por enquanto não vou usar db seria somente pra salvar o primeiro produto que eu adicionei e lista-lo

  • Confuso 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
 

@KXSY por enquanto não vou usar db seria somente pra salvar o primeiro produto que eu adicionei e lista-lo

Hum... pensei que você queria fazer alguma coisa como isso aqui

/*    By Brinck   *
 *   03/06/2019   */

#include <stdio.h>
#include <stdlib.h>

/* Constantes */

/* Tipos */
typedef struct listas
{
  int valor;
  struct listas *proximo;
}TListas;

/* Procedimentos */

/* Apaga toda a lista de nós */
void ApagaLista(TListas *l);

void OrdenaNos(TListas *l);

/* Funções */

/* Cria nó */
TListas *CriaNo(int valor);

/* Apaga nó */
TListas *ApagaNo(TListas *l, int valor);

/* Busca e devolve um nó especifico */
TListas *BuscaNo(TListas *l, int valor);

/* Menu da aplicação */
int menu();

/* Pega numeros inteiros */
int PegaNumero(void);

/* Função principal */
int main()
{
  TListas *inicio=NULL,*ponteiro=NULL;
  int numero,opcao;
  char tecla;
  do
  {
    opcao=menu();
    switch(opcao)
    {
      /* Cadastra novos numeros na lista */
      case 1:
        do
        {
          if(!inicio)
          {
            inicio=CriaNo(PegaNumero());
            ponteiro=inicio;
          }
          else
          {
            ponteiro=inicio;
            while(ponteiro->proximo)
              ponteiro=ponteiro->proximo;
            ponteiro=ponteiro->proximo=CriaNo(PegaNumero());
          }
          printf("\nDeseja ir novamente S ou N\n\t");
          scanf("%c",&tecla);
          getchar();
        }while(tecla=='s');
      break;
      /* Apaga numeros na lista, em qualquer posição */
      case 2:
        if(inicio)
        {
          printf("\nApaga numero.");
          numero=PegaNumero();
          ponteiro=BuscaNo(inicio,numero);
          if(ponteiro)
          {
            ponteiro=ApagaNo(inicio,numero);
            if(ponteiro)
              inicio=ponteiro;
            printf("\nNumero apagado\n");
          }
          else
            printf("\nNumero não encontrado.\n");
        }
        else
          printf("\nNão há lista.\n");
      break;
      case 3:
        printf("\nBusca numeros.");
        numero=PegaNumero();
        ponteiro=BuscaNo(inicio,numero);
        if(ponteiro)
        {
          if(numero==ponteiro->valor)
            printf("\n%i existe",numero);
        }
        else
          printf("\nO numero não existe.");
      break;
      /* Apaga toda a lista de numeros */
      case 4:
        if(inicio)
        {
          ApagaLista(inicio);
          printf("\nA lista foi apagada.");
          inicio=NULL;
        }
        else
          printf("\nA lista já está vazia.");
      break;
      /* Mostra a lista de numeros */
      case 5:
        if(inicio)
        {
          ponteiro=inicio;
          numero=0;
          printf("\nNumeros Cadastrados.");
          while(ponteiro)
          {
            printf("\n%i:%i",numero,ponteiro->valor);
            ponteiro=ponteiro->proximo;
            numero++;
          }
          puts("");
        }
        else
          printf("\nNão há dados cadastrados.\n");
      break;
      /* Ordena numero na lista */
      case 6:
        if(inicio)
        {
          OrdenaNos(inicio);
          printf("\nOrdena lista.\n");
        }
        if(inicio)
        {
          ponteiro=inicio;
          numero=0;
          printf("\nNumeros Cadastrados.");
          while(ponteiro)
          {
            printf("\n%i:%i",numero,ponteiro->valor);
            ponteiro=ponteiro->proximo;
            numero++;
          }
          puts("");
        }
        else
          printf("\nNão há dados cadastrados.\n");
      break;
    }
  }while(opcao!=7);
  if(inicio)    /* Faz um teste para verifica se há numeros na lista */
    ApagaLista(inicio);
  return(0);
}

/* Implementações */
void ApagaLista(TListas *l)
{
  TListas *temp;
  while(l)
  {
    temp=l->proximo;
    free(l);
    l=temp;
  }
}

void OrdenaNos(TListas *l)
{
  TListas *temp,*inicio=l;
  unsigned char troca=1;
  while(troca)
  {
    troca=0;
    l=inicio;
    while(l->proximo)
    {
      temp=l->proximo;
      if(l->valor>temp->valor)
      {
        int n1=temp->valor;
        temp->valor=l->valor;
        l->valor=n1;
        troca=1;
      }
      l=l->proximo;
    }
  }
}

TListas *ApagaNo(TListas *l, int valor)
{
  TListas *temp=NULL,*ponteiro=l;
  /* Procura nó, sequenciamente */
  while(l&&(valor!=l->valor))
  {
    temp=l;
    l=l->proximo;
  }
  /* Teste se não é NULL */
  if(l)
    if(l->valor==valor)   /* Teste de segurança */
    {
      /* Apaga o final da lista */
      if(!l->proximo)
      {
        l=ponteiro;
        /* procura o final da lista */
        while(l->proximo)
        {
          ponteiro=l;
          l=l->proximo;
        }
        /* De fine o nó anterior como NULL */
        ponteiro->proximo=NULL;
        free(l);
        return(NULL);
      }
      /* Apaga o começo da lista */
      else if(!temp)
      {
        temp=l->proximo;
        free(l);
        return(temp);
      }
      else
      /* Apaga entre nós */
      {
        temp->proximo=l->proximo;
        free(l);
        return(NULL);
      }
    }
  return(NULL);
}

TListas *CriaNo(int valor)
{
  TListas *temp=malloc(sizeof(TListas));
  if(!temp)
    exit(EXIT_FAILURE);
  temp->valor=valor;
  temp->proximo=NULL;
  return(temp);
}

TListas *BuscaNo(TListas *l, int valor)
{
  while(l&&(valor!=l->valor))
    l=l->proximo;
  if(l)
    if(l->valor==valor)
      return(l);
  return(NULL);
}

int menu()
{
  int numero;
  do
  {
    printf("\nBem vindo aos numeros.");
    printf("\n1:Cadastra novos numeros");
    printf("\n2:Apagar numeros.");
    printf("\n3:Buscar numeros cadastrados.");
    printf("\n4:Apagar tudo.");
    printf("\n5:Mostra numeros cadastrados.");
    printf("\n6:Ordena lista.");
    printf("\n7:Sair.\n\n\t");
    scanf("%i",&numero);
    getchar();
    if(numero<1||numero>7)
    {
      printf("\nO numero digitado e invalido.");
      printf("\nTente novamente.\n");
    }
  }while(numero<1||numero>7);
  return(numero);
}

int PegaNumero(void)
{
  int numero;
  printf("\nDigite um numero\n\t");
  scanf("%i",&numero);
  getchar();
  return(numero);
}

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

@KXSY nao nao hahaha por enquanto é o basico mesmo só para treino etc... meu problema ta na imprimeProduto ainda persiste o loop infinito e não imprime o produto recem adicionado :(

Compartilhar este post


Link para o post
Compartilhar em outros sites
 

@KXSY nao nao hahaha por enquanto é o basico mesmo só para treino etc... meu problema ta na imprimeProduto ainda persiste o loop infinito e não imprime o produto recem adicionado :(

Kkk e o meu dever de casa isso ai, semana que vem tem mais ponteiros.

Eu acho que tá na hora de você reescrever o código, esse meu ai que eu postei já reescrevi 27 vezes e ainda tem muitos bugs (talvez um dia eu reescreva 28° vez)

 

getchar(); /* Esvasia o buffer do teclado */ printf("\n\n"); estoque[i].id = i + 1; break;

Esse break aqui no for está me incomodando, porque toda vez que eu fiz isso e passei para outro for ficava em loop infinito, mas isso tudo e só achismo.

eu já programei por muito tempo em pascal então break e continue pra mim nem existe.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações 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...

GRÁTIS: minicurso “Como ganhar dinheiro montando computadores”

Gabriel TorresGabriel Torres, fundador e editor executivo do Clube do Hardware, acaba de lançar um minicurso totalmente gratuito: "Como ganhar dinheiro montando computadores".

Você aprenderá sobre o quanto pode ganhar, como cobrar, como lidar com a concorrência, como se tornar um profissional altamente qualificado e muito mais!

Inscreva-se agora!