Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Jefers0n

controle em C

Recommended Posts

Boa noite,

 

Estou tentando auxiliar uma amiga minha com um programa em C, o programa é um cadastro básico, usa struct e armazena dez produtos com codigo, preço, quantidade, e o nome dos mesmos.

 

O programa esta funcionando, fazendo as consultas por nome, preço, quantidade...tudo ok desde que cadastrados a quantidade de produtos igual ao numero que ela estipulou no define, que durante o programa ela usa este define para fazer os loops para cadastro, consulta... Daí o programa da erro se for cadastrado um numero de produtos menos que o define dela (que no caso era 10) se eu mandar imprimir e foi cadastrado um produto, imprime o produto mais um monte de lixo...

 

Até pensei em criar um conte na função cadastro e passar por referência este cont pra todas as outras funções, de pesquisa impressão...daí se foi cadastrado 5 produtos(o cont será 5), e o loop para imprimir por exemplo só iria até menor que cont, e não até menor que o que ela definiu no Define...

Só que tentei fazer isso e não deu certo...

 

Alguem pode me dar um exemplo de como fazer isso?

 

[]'

Jeferson Neves

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ajudaria se você postasse o código, porque são 10 pra 1 que é erro besta.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ajudaria se você postasse o código, porque são 10 pra 1 que é erro besta.

Obrigado,

 

Segue o código dela, apenas diminui o define para 2 para não ter que cadastrar 10 coisas caso queira testar cadastrando a quant. definida pra ver que funciona, mesmo com o warning na linha 28(acho que é essa)...

 

*** Não sei se tem algo haver, mas eu na faculdade aprendo C em Linux e na dela é em Windows, sei que alguimas coisas mudam, eu tentei criar um parâmetro na função carregar (int &cont), assim: carregar (struct produto tabela[cont], int &cont) , e ir passando este cont onde ela pôs n entre os colchetes de tabela(este cont é para saber quantos produtos ela cadastrou, daí na hora de imprimir por exemplo o loop dela vai ir até o numero de produtos cadastrados, e não até o numero definido no inicio), assim (tabela[cont]) mas não ta dando, otra coisa, ela não ta colocando os protótipos das funções, isso vai interferir em algo, pois ta funcionando... Outra coisa que vi é que ela não ta colocando tipo nas funções...Era isso...

 

# include <stdio.h>
# define n 2

struct produto {
	   int cod;
	   char nome[6];
	   int quant;
	   float preco;
	   };
	   
carregar (struct produto tabela[n]) {
		 int i = 0, op=1;
		 while (op != 2) {
			   puts ("entre com o codigo produto");
			   scanf ("%d", &tabela[i].cod);
			   puts ("entre com o nome do produto");
			   scanf ("%s", &tabela[i].nome);		 
			   puts ("entre com a quantidade de produto");
			   scanf ("%d", &tabela[i].quant);
			   puts ("entre com o preco do produto");
			   scanf ("%f", &tabela[i].preco);
			   i++;
			   puts ("Deseja Continuar?");
			   puts ("Sim = 1");
			   puts ("Nao = 2");
			   scanf ("%d", &op);
			   if (op==2) {
					return (tabela);
			   }   
		 }
}
consultar (struct produto tabela[n]) {
		  int op;
		  do {
			  puts("1. Por codigo");
			  puts("2. Por nome");
			  puts("3. Por quantidade");
			  puts("4. Para voltar ao menu principal");
			  puts("Entre com a opcao: ");			
			  scanf("%d",&op);
			  switch (op) {
					 case 1:
						  consulta_cod (tabela);
					 break;
					 case 2:
						  consulta_nome (tabela);
					 break;
					 case 3:
						  consulta_quant (tabela);
					 break;
					 case 4:
						  return;
					 break;
					 default:
							 puts ("Consulta Invalida");
					 //break;
			  }	 
		  } while (op!=4);
}
consulta_cod (struct produto tabela[n]) {
			  int i = 0, cod, cont = 0;
			  puts ("Digite o codigo que deseja consultar:");
			  scanf ("%d", &cod);
			  for (i = 0; i < n; i++) {
				  if (tabela[i].cod == cod) {
					 imprimir_consulta(tabela, i);
					 cont++;
				  }  
			  }
			  if (cont==0) {
						   puts ("Codigo Invalido");
			  }
}
consulta_nome (struct produto tabela[n]) {
			  int i = 0, cont = 0;
			  char nome[6];
			  puts ("Digite o nome que deseja consultar:");
			  scanf ("%s", &nome);
			  for (i = 0; i < n; i++) {
					   if (strcmp (tabela[i].nome, nome) == 0) {
						  imprimir_consulta(tabela, i);
						  cont++;
					   }
			  }
			  if (cont==0) {
						   puts ("Nome Invalido");
			  }
}
consulta_quant (struct produto tabela[n]) {
			   int quant, i = 0, cont = 0;
			   puts ("Digite a quantidade que deseja consultar:");
			   scanf ("%d", &quant);
			   for (i = 0; i < n; i++) {
						if (tabela[i].quant == quant){
										   imprimir_consulta(tabela, i);
										   cont++;
						}	 
			   }
			   if (cont==0) {
							puts ("Quantidade Invalida");
			   }
}
imprimir_consulta (struct produto tabela[n], int i) {
				  printf("\n");
				  printf ("codigo:	 %d\n", tabela[i].cod);   
				  printf ("nome:	   %s\n", tabela[i].nome);
				  printf ("quantidade: %d\n", tabela[i].quant);
				  printf ("preco:	  R$ %.2f\n", tabela[i].preco);
				  printf("\n");						
}
imprime (struct produto tabela[n]) {
		int i;
		for (i = 0; i < n; i++) {
			printf ("codigo:	 %d\n", tabela[i].cod);   
			printf ("nome:	   %s\n", tabela[i].nome);
			printf ("quantidade: %d\n", tabela[i].quant);
			printf ("preco:	  R$ %.2f\n", tabela[i].preco);
			printf("\n");
		}
		system("pause");	
}
menu () {
	 int op;
	 system ("cls");   
	 puts ("1. carregar tabela");
	 puts ("2. imprimir tabela");
	 puts ("3. consultar tabela");
	 puts ("4. sair");
	 puts ("entre com a opcao");
	 scanf ("%d", &op);
	 return (op);
}
main () {
	 int op;
	 struct produto tabela[n]; 
	 do {
		 op = menu ();
		 switch (op) {
				case 1:
					 carregar (tabela);
				break;	 
				case 2:
					 imprime (tabela);
				break;	 
				case 3:
					 consultar (tabela);
				break;	 
				case 4:
					 system ("pause");
				break;
				default:
						puts("Opcao Invalida!");
				break;	 
		 }
	 } while (op!=4);
	 getch ();
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Usando esse codigo ai o error é besta mesmo ^^

 

 

Procure :

imprime (struct produto tabela[n]) {
		int i;
		for (i = 0; i < n; i++) {
			printf ("codigo:	 %d\n", tabela[i].cod);  
			printf ("nome:	   %s\n", tabela[i].nome);
			printf ("quantidade: %d\n", tabela[i].quant);
			printf ("preco:	  R$ %.2f\n", tabela[i].preco);
			printf("\n");
		}
		system("pause");	
}

Substitua por

 

imprime (struct produto tabela[n]) {
		int i;
		for (i = 0; i < n; ++i) {
			printf ("codigo:	 %d\n", tabela[i].cod);
			printf ("nome:	   %s\n", tabela[i].nome);
			printf ("quantidade: %d\n", tabela[i].quant);
			printf ("preco:	  R$ %.2f\n", tabela[i].preco);
			printf("\n");
		}
		system("pause");
}

;]

 

O loop do for no caso de pós incremento ai parece estar sendo executado 2 vezes , substitua pelo pré incremento que resolve.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sil.Miranda.... no loop for não faz a menor diferença ser pré ou pós incremento.

Inclusive, a saída em assembly do código é exatamente a mesma com "++i" e "i++"

 

Jeferson,

Teu código tem muita coisa errada.

Pra começar, as funções devem especificar o tipo de retorno!!!

main()
é diferente de

int main()

 

Outra coisa:

carregar (struct produto tabela[n])

Nota que você passa como parametro um array de tamanho "n", que no caso é dois (e eu notei isso em TODAS as funções),

Se você cadastrar 3 itens, levará um segmentation fault, se cadastrar só um, o array ficará incompleto e leverá um sigegv em outras funções que tenten acessar a posição 1 do array (note que um array d tamanho dois conta com as posiçõa 0 e 1).

Como é o caso dessa função:

for (i = 0; i < n; i++) {
			printf ("codigo:	 %d\n", tabela[i].cod);  
			printf ("nome:	   %s\n", tabela[i].nome);
			printf ("quantidade: %d\n", tabela[i].quant);
			printf ("preco:	  R$ %.2f\n", tabela[i].preco);
			printf("\n");
		}

Você quer rodar aquele loop 2 vezes, mas e se não tiver dois itens no array....

Estude ponteiros e alocação dinâmica.

Dê uma estudada em conceitos básicos como declaração de funções.... não dá pra construir um prédio alto sem ter os alicerces fortes!

De uma procurada no fórum de códigos fontes, vais encontrar um tópico falando sobre "system("qualquer_coisa")"

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.