Ir ao conteúdo
  • Cadastre-se

C Problema com comando e variável


Lori15

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

Link para o comentário
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

Link para o comentário
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
Link para o comentário
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.

Link para o comentário
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.

Link para o comentário
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

Link para o comentário
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.

Link para o comentário
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.

Link para o comentário
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.

Link para o comentário
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.

Link para o comentário
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

 

Link para o comentário
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.

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário 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 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...