Ir ao conteúdo
  • Cadastre-se
Lori15

C Problema com comando e variável

Posts recomendados

Boa tarde galera,

 

Estou fazendo um trabalho para a faculdade sobre um programa de supermercado. Estou rodando o programa e está funcionando porém ao adicionar o nome do segundo produto ele está pulando a etapa. Já tentei de todas as formas resolver mas até o momento não consegui. 

 


 

#include <stdio.h>
#include <stdlib.h>
#define ARQ "produtos.txt"

typedef struct produto
{
int codigo;
char nome[30];
float limite;
}Produtos;


void print_menu()
{
printf("****************\n");
printf ("Sejam Bem Vindos - Mercado Anhanguera: \n");
printf("Digite o que deseja fazer:\n");
printf("0 - Sair do programa.\n");
printf("1 - Incluir  produto(s).\n");
printf("****************\n");
}


int main()
{
Produtos code,name,limit,dados[100]={{0}};

int opcao,i,q;
char resp;
FILE *arquivo,*arq;


if((arquivo = fopen(ARQ,"a+")) == NULL)
{
printf("Erro ao abrir arquivo!!!\n");
exit(1);
}
do{
print_menu();
scanf("%d",&opcao);
switch(opcao)
{
case 1:
printf("Digite a quantidade de produtos que deseja inserir:\n");
scanf("%d",&q);
for(i=0;i<q;i++){
code.codigo = i+1;
printf("Digite o nome do produto que deseja incluir:\n");
scanf("%s",name.nome);
printf("Digite o setor do produto:\n");
scanf("%d",&limit.limite);
printf("\n");
printf("%d %s %.2f\n",code.codigo,name.nome,limit.limite);
fprintf(arquivo,"%d %s %.2f\n",code.codigo,name.nome,limit.limite);
}
break;


}
}while(opcao != 0);


fclose(arquivo);
system("pause");
}

 

Já olhei e reli várias vezes porém não consigo identificar

WhatsApp Image 2019-06-04 at 13.10.35.jpeg

WhatsApp Image 2019-06-04 at 13.08.46.jpeg

WhatsApp Image 2019-06-04 at 13.08.31.jpeg

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Lori15 Coloque um getchar() depois de cada scanf.

Compartilhar este post


Link para o post
Compartilhar em outros sites

@KXSY desculpe a ignorância mas ficaria assim? scanf, getchar() ("%d",&opcao);

Compartilhar este post


Link para o post
Compartilhar em outros sites

Espaço antes do %s na string de especificadores, e getchar depois do scanf:

scanf(" %s",name.nome);
getchar();


scanf("%d",&limit.limite);
getchar();

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

@isrnick boa tarde amigo, obrigado pelo seu tempo.

 

Coloquei aqui porém está com o mesmo erro. 

 

Após eu adicionar o nome e a categoria do produto ele está pulando a etapa, não deixando eu colocar o nome e a categoria do segundo produto.

 

image.thumb.png.deffa2a6d882259f581564076f20fe2f.png

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Lori15 Mas ele simplesmente pula?

Compartilhar este post


Link para o post
Compartilhar em outros sites

No printf a string pede pro usuário digitar o setor do produto, mas no scanf tenta ler um número inteiro para o limite... Então acaba que você está digitando uma palavra mas o scanf espera um número.

Compartilhar este post


Link para o post
Compartilhar em outros sites

@KXSY Sim, não deixa eu adicionar o nome e a categoria do produto. Eu adicionei o comando que vocês me sugeriram porém continua. 

 

 

adicionado 1 minuto depois

@isrnick Como ficaria então? 

 

 

adicionado 3 minutos depois

@isrnick Putz é verdade, se ao invés de eu colocar Fruta por exemplo e digitar 1, ele faz o passo normalmente

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Lori15 Aqui está funcionando.

#include <stdio.h>
#include <stdlib.h>
#define ARQ "produtos.txt"

typedef struct produto
{
  int codigo;
  char nome[30];
  float limite;
} Produtos;


void
print_menu ()
{
  printf ("****************\n");
  printf ("Sejam Bem Vindos - Mercado Anhanguera: \n");
  printf ("Digite o que deseja fazer:\n");
  printf ("0 - Sair do programa.\n");
  printf ("1 - Incluir  produto(s).\n");
  printf ("****************\n");
}


int
main ()
{
  Produtos code, name, limit, dados[100] = { {0} };

  int opcao, i, q;
  char resp;
  FILE *arquivo, *arq;


  if ((arquivo = fopen (ARQ, "a+")) == NULL)
    {
      printf ("Erro ao abrir arquivo!!!\n");
      exit (1);
    }
  do
    {
      print_menu ();
      scanf ("%d", &opcao);
      getchar();
      switch (opcao)
	{
	case 1:
	  printf ("Digite a quantidade de produtos que deseja inserir:\n");
	  scanf ("%d", &q);
	  getchar();
	  for (i = 0; i < q; i++)
	    {
	      code.codigo = i + 1;
	      printf ("Digite o nome do produto que deseja incluir:\n");
	      scanf ("%s", name.nome);
	      getchar();
	      printf ("Digite o setor do produto:\n");
	      scanf ("%f", &limit.limite);		/* Aqui tem que ser %f, porque está lendo um ponto flutuante */
	      getchar();
	      printf ("\n");
	      printf ("%d %s %.2f\n", code.codigo, name.nome, limit.limite);
	      fprintf (arquivo, "%d %s %.2f\n", code.codigo, name.nome,
		       limit.limite);
	    }
	  break;


	}
    }
  while (opcao != 0);


  fclose (arquivo);
  getchar();
}

Eu coloquei um comentário no código cheque-o.

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Outro problema é que na struct limite foi definido como float (%f) mas o scanf está com o especificador de tipo de int (%d).

 

14 minutos atrás, Lori15 disse:

@isrnick Como ficaria então?

 

Muda a pergunta para pedir o limite ao invés de um setor, e digite um número durante a execução do programa.

 

Ou então teria que mudar o scanf para ler uma string para guardar o nome do setor.

Compartilhar este post


Link para o post
Compartilhar em outros sites

@KXSY Então na verdade na parte do setor ele está lendo como número e eu preciso que ele leia "Fruta" por exemplo. Se você colocar 1 por exemplo, ele vai e segue normal

adicionado 3 minutos depois

@isrnick Então mas o problema é que no enunciado do trabalho tem que ser exatamente nessa etapa, sendo nome e categoria. Eu pensei em deixar pré-definido os setores e ali colocaria apenas o número do setor selecionado mas não posso. Isso que está me pegando.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então declare-o como string

 char fruta[TAMANHO_MAXIMO_FRUTA];

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

@KXSY trocaria o  

char nome[30]; por char fruta[TAMANHO_MAXIMO_FRUTA];

? é isso? Mas e se eu tivesse que adicionar um outro tipo de alimento? Carne por exemplo

adicionado 18 minutos depois

@isrnick Amigo, obrigado pela ajuda, consegui aqui! foi exatamente o que você e o outro amigo me colocou.

 

Agora não abusando mas existe algum programa que converta C++ em C?

 

Obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Lori15 Seria mais ou menos assim

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

/* Constantes */
#define TAMANHO_NOME 10


/* Tipos */
typedef struct
{
  int id;		/* Identificação do produto */
  char nome[TAMANHO_NOME];		/* Nome do produto */
  float preco;		/* Preço */
}TProduto;


int main()
{
  FILE *arq;
  char nome[TAMANHO_NOME],tecla;
  TProduto produto;
  printf("\nDigite o nome do arquivo.\n\t");
  scanf("%s",nome);
  /* Abre o aquivo */
  arq=fopen(nome,"wb+");
  if(!arq)	/* Testa se o arquivo foi aberto */
  {
    printf("\nNão foi possivel abrir o arquivo.\n");
    getchar();
    return(0); /* Fim do programa */
  }
  /* Cadastra os produtos */
  srand(time(NULL));
  do
  {
    printf("\nCadastro de produtos.\n");
    printf("\nDigite o nome do produto:\t");
    scanf("%s",produto.nome);
    getchar();
    printf("\nDigite o preço do produto:\t");
    scanf("%f",&produto.preco);
    getchar();
    /* Gera o id aleatoriamente */
    produto.id=rand()%1000;
    /* Mostra os produtos */
    printf("\nNome do produto:\t%s",produto.nome);
    printf("\npreço do produto:\t%2.2f",produto.preco);
    printf("\nidentificação do produto:\t%i",produto.id);
    printf("\n\nDeseja salvar o cadastro do produto.\n\tS ou N\n\t");
    scanf("%c",&tecla);
    getchar();
    /* Salva o mesmo */
    if(tecla=='s')
      fprintf(arq,"\n%i\n%s\n%2.2f",produto.id,produto.nome,produto.preco);
    else
      printf("\nCadastro descartado.\n");
    printf("\nDeseja fazer outro cadastro?\n\tS ou N\t");
    scanf("%c",&tecla);
  }while(tecla=='s');
  fclose(arq);		/* Fecha o arquivo */
  return(0);
}

Eu fiz aqui meio com pressa então pode conter erros no meu código.

 

36 minutos atrás, KXSY disse:

Produtos code, name, limit, dados[100] = { {0} };

Eu não entendi o que você pretendia com isso de declarar esse tanto de variáveis, porque no final você está usando um de cada onde você poderia está usando apenas um.

Compartilhar este post


Link para o post
Compartilhar em outros sites
27 minutos atrás, Lori15 disse:

Agora não abusando mas existe algum programa que converta C++ em C?

Não.

 

 

Baseado nas suas dúvidas percebi que não está entendendo muito do C, e fazendo buscas notei que seu código é basicamente o código deste post de 2008 de outro forum, modificado:

 

https://forum.scriptbrasil.com.br/topic/127654-programa-em-c-venda/

 

Além de não ser simples de alterar um código feito por outra pessoa para algo que sirva para seu propósito, fazer o programa do zero criaria muito menos erros, e você aprenderia muito mais.

Compartilhar este post


Link para o post
Compartilhar em outros sites
2 minutos atrás, isrnick disse:

Baseado nas suas dúvidas percebi que não está entendendo muito do C, e fazendo buscas notei que seu código é basicamente o código deste post de 2008 de outro forum, modificado:

realmente, como você achou isso?@isrnick

Compartilhar este post


Link para o post
Compartilhar em outros sites

@isrnick Sim, estou no primeiro semestre ainda, esse código quem nos forneceu foi o próprio professor, e no caso teríamos que ajustar ele

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Lori15 Mas você tá aprendendo o que C ou C++?

1 minuto atrás, Lori15 disse:

Sim, estou no primeiro semestre ainda, esse código quem nos forneceu foi o próprio professor, e no caso teríamos que ajustar ele

Quem diria, sempre vi outros fóruns da gringa com os mesmos códigos que aqui e eu sempre pensei que poderiam ser os professores copiando e colando.

No geral quem copia e cola não aprende nada, agora vamos ver se os alunos vão aprender alguma coisa.

Compartilhar este post


Link para o post
Compartilhar em outros sites

@KXSY to aprendendo os dois. Ta difícil amigo, estou em pleno trabalho lutando pra resolver isso pra entregar hoje a noite kkk.

 

Na verdade esse código ele pegou de um site, que inclusive tem vários outros porém agora esqueci o nome.

 

Sobre o exercício o código errado foi o próprio professor que fez com o intuito de nós mesmos identificarmos.

 

pra você ter uma ideia estou desde manhã tentando resolver isso....estou ferrado! 

 

Sobre o que você mandou continua com o mesmo problema ainda ;( ele continua pulando a etapa pra adicionar o outro produto.

Compartilhar este post


Link para o post
Compartilhar em outros sites
25 minutos atrás, KXSY disse:

realmente, como você achou isso?@isrnick

 

Só selecionei alguns pequenos trechos do código aqui do fórum, cliquei com o botão direito e mandei buscar o texto selecionado no google, apareceu resultados na terceiro trecho de código que marquei.

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Lori15 por que você não falou que era só para consertar?

Ai tá fácil agora e só retirar as outras variáveis e usar apenas a variável dados.

Compartilhar este post


Link para o post
Compartilhar em outros sites

@KXSY putz nem me liguei cara, como faço isso então?  Esse que você mandou rodou direitinho porém não posso trocar, tem que ser esse mesmo. 

adicionado 4 minutos depois
1 minuto atrás, Lori15 disse:

@KXSY putz nem me liguei cara, como faço isso então?  Esse que você mandou rodou direitinho porém não posso trocar, tem que ser esse mesmo. 

 

Eu preciso arrumar isso, que ele me de a oportunidade para adicionar outro produto, no momento ele está pulando a pergunta do nome1.thumb.png.fd86faec3e30f82f91d185f7ff72ebbe.png

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Lori15 não, você vai usar aquele seu que eu consertei e apagar essas variáveis aqui

1 hora atrás, KXSY disse:

code, name, limit,

e depois substituir onde elas aparecerem por dados

Compartilhar este post


Link para o post
Compartilhar em outros sites

@KXSY eu apago a linha inteira? outra coisa quando rodo ele, ele pergunta pra eu digitar o nome do arquivo, o que seria isso? desculpe mas não entendi 

  • Haha 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
7 minutos atrás, Lori15 disse:

@KXSY putz nem me liguei cara, como faço isso então?  Esse que você mandou rodou direitinho porém não posso trocar, tem que ser esse mesmo. 

adicionado 4 minutos depois

 

Eu preciso arrumar isso, que ele me de a oportunidade para adicionar outro produto, no momento ele está pulando a pergunta do nome1.thumb.png.fd86faec3e30f82f91d185f7ff72ebbe.png

 

tem sempre que usar getchar() depois de cada scanf(), porque o getchar() pega o new line do buffer de teclado.

 

1 hora atrás, KXSY disse:

@Lori15 Aqui está funcionando.


#include <stdio.h>
#include <stdlib.h>
#define ARQ "produtos.txt"

typedef struct produto
{
  int codigo;
  char nome[30];
  float limite;
} Produtos;


void
print_menu ()
{
  printf ("****************\n");
  printf ("Sejam Bem Vindos - Mercado Anhanguera: \n");
  printf ("Digite o que deseja fazer:\n");
  printf ("0 - Sair do programa.\n");
  printf ("1 - Incluir  produto(s).\n");
  printf ("****************\n");
}


int
main ()
{
  Produtos code, name, limit, dados[100] = { {0} };

  int opcao, i, q;
  char resp;
  FILE *arquivo, *arq;


  if ((arquivo = fopen (ARQ, "a+")) == NULL)
    {
      printf ("Erro ao abrir arquivo!!!\n");
      exit (1);
    }
  do
    {
      print_menu ();
      scanf ("%d", &opcao);
      getchar();
      switch (opcao)
	{
	case 1:
	  printf ("Digite a quantidade de produtos que deseja inserir:\n");
	  scanf ("%d", &q);
	  getchar();
	  for (i = 0; i < q; i++)
	    {
	      code.codigo = i + 1;
	      printf ("Digite o nome do produto que deseja incluir:\n");
	      scanf ("%s", name.nome);
	      getchar();
	      printf ("Digite o setor do produto:\n");
	      scanf ("%f", &limit.limite);		/* Aqui tem que ser %f, porque está lendo um ponto flutuante */
	      getchar();
	      printf ("\n");
	      printf ("%d %s %.2f\n", code.codigo, name.nome, limit.limite);
	      fprintf (arquivo, "%d %s %.2f\n", code.codigo, name.nome,
		       limit.limite);
	    }
	  break;


	}
    }
  while (opcao != 0);


  fclose (arquivo);
  getchar();
}

Eu coloquei um comentário no código cheque-o.

utilize esse aqui que eu dei uma arrumada que já e meio caminho andado.

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!