Ir para conteúdo

POWERED BY:

Arquivado

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

sidneimarques

em código, cadastro de clientes

Recommended Posts

Olá amigos, preciso de ajudinha nesse código, escrevi ele baseado no exemplo de um livro de c, porém não compila... se alguém puder ajudar

 

obrigado

 

#include<stdio.h>#include<stdlib.h>#define MAX 100struct cliente	{   char nome[30];   char telefone[15];   char rua[40];   char cidade[20];   char estado[3];   unsigned long int cep;	} cliente_info[MAX];void init_list(void), enter(void);void delete(void), list(void);void menu_select(void), busca_livre(void);main(){	char opcao;   	init_list();/*inicializa a matriz de estruturas*/   	for(;;)   {	   opcao = menu_select();	   switch(opcao)	  {		  case 1: enter();		  break;		  case 2: delete();		  break;		  case 3: list();		  break;		  case 4: exit(0);	  }   }}      /* Inicializa a lista */void init_list(void)	{   register int t;      for(t=0;t<MAX; ++t) cliente_info[t].nome=0 = '\0';/* obtem a selecao */menu_select(void)	{   char s[80];   int c;      printf("1. Inserir um cliente\n");   printf("2. Excluir um cliente\n");   printf("3. Listar clientes\n");   printf("4. Sair\n");      do	   {	  printf("\nDigite sua escolha: ");	  gets(s);	  c=atoi(s);	   }   while(c<0 || c>4);   return c;	}      /* Insere  os clientes na lista */void enter(void)	{   int slot;   char s[80];      slot = busca_livre();   if (slot == -1)	   {	  printf("Lista cheia!");	  return;	   }      printf("Digite o nome: ");   gets(cliente_info[slot].nome);					    printf("Digite o telefone: ");   gets(cliente_info[slot].telefone);      printf("Digite o endereco: ");   gets(cliente_info[slot].rua);      printf("Digite a cidade: ");   gets(cliente_info[slot].cidade);      printf("Digite o estado: ");   gets(cliente_info[slot].estado);      printf("Digite o CEP: ");   cliente_info[slot].cep = strtoul(s, '\0', 10);   	}   /* Encontra uma estrutura nao usada */busca_livre(void)	{   register int t;      for (t=0; cliente_info[t].nome[0] && t<MAX; ++t);   if(t==MAX) return -1; /* nenhum elemento livre */   return t;	}   /* Apaga um cliente */void delete(void)	{   register int slot;   char s[80];      printf("Digite o registro #: ");   gets(s);   slot=atoi(s);   if(slot>=0 && slot < MAX)	   cliente_info[slot].nome[0]='\0';	}   /* Mostra lista*/void list(void)	{   register int t;      for(t=0; t<MAX; ++t)	   {	  if(cliente_info[t].nome[0])		  printf("%s\n", cliente_info[t].nome);		  printf("%s\n", cliente_info[t].telefone);		  printf("%s\n", cliente_info[t].rua);		  printf("%s\n", cliente_info[t].cidade);		  printf("%s\n", cliente_info[t].estado);		  printf("%s\n", cliente_info[t].cep);	   )	  	 }

Compartilhar este post


Link para o post
Compartilhar em outros sites

Correções e comentários no código abaixo.

 

#include<stdio.h>#include<stdlib.h>#define MAX 100struct cliente{   char nome[30];   char telefone[15];   char rua[40];   char cidade[20];   char estado[3];   unsigned long int cep;} cliente_info[MAX];/* Não sei se é permitido colocar mais que uma assinatura de função na mesma linha, portanto separei-asentre várias linhas. Além disso, é melhor para leitura */void init_list(void);void enter(void);void delete(void);void list(void);int menu_select(void);int busca_livre(void);int main( void ) //Main DEVE retornar um int{	int opcao;  	init_list();/*inicializa a matriz de estruturas*/  	for(;;)   {	   opcao = menu_select();	   switch(opcao)	  {		  case 1: enter();		  break;		  case 2: delete();		  break;		  case 3: list();		  break;		  case 4: exit(0);	  }   }   return 0;}    /* Inicializa a lista */void init_list(void){   register int t;     for(t=0;t<MAX; ++t) cliente_info[t].nome=0 = '\0';} //Faltava o } aqui/* obtem a selecao */int menu_select(void) // você retorna uma variavel int, portanto a função tem que retornar um int{   //char s[80]; Você não precisa dessa string   int c;     printf("1. Inserir um cliente\n");   printf("2. Excluir um cliente\n");   printf("3. Listar clientes\n");   printf("4. Sair\n");     do   {	  printf("\nDigite sua escolha: ");	  	  /*Nem das duas linhas abaixo*/	  //gets(s);	  //c=atoi(s);	  scanf("%d", &c); // Use essa linha no lugar   } while(c<0 || c>4);   return c;}    /* Insere  os clientes na lista */void enter(void){   int slot;   char s[80];     slot = busca_livre();   if (slot == -1)   {	  printf("Lista cheia!");	  return;   }     printf("Digite o nome: ");   gets(cliente_info[slot].nome);					   printf("Digite o telefone: ");   gets(cliente_info[slot].telefone);     printf("Digite o endereco: ");   gets(cliente_info[slot].rua);     printf("Digite a cidade: ");   gets(cliente_info[slot].cidade);     printf("Digite o estado: ");   gets(cliente_info[slot].estado);     printf("Digite o CEP: ");   gets(s); // Você esqueceu de ler S...   cliente_info[slot].cep = strtoul(s, '\0', 10);}  /* Encontra uma estrutura nao usada */int busca_livre(void) // você retorna uma variavel int, portanto a função tem que retornar um int{   register int t;     for (t=0; cliente_info[t].nome[0] && t<MAX; ++t);   if(t==MAX) return -1; /* nenhum elemento livre */   return t;}  /* Apaga um cliente */void delete(void){   int n; // Pra quê ler uma string e depois converter pra int? leia um int direto, oras!     printf("Digite o registro #: ");   scanf("%d", &n);   if(n>=0 && n < MAX)	   cliente_info[n].nome[0]='\0';}  /* Mostra lista*/void list(void){   register int t;     for(t=0; t<MAX; ++t)   {	  if(cliente_info[t].nome[0]) { //Faltou o { aqui		  printf("%s\n", cliente_info[t].nome);		  printf("%s\n", cliente_info[t].telefone);		  printf("%s\n", cliente_info[t].rua);		  printf("%s\n", cliente_info[t].cidade);		  printf("%s\n", cliente_info[t].estado);		  printf("%s\n", cliente_info[t].cep);	  } // você tinha colocado um ) aqui...	  	}} //Faltou o } aqui

Compartilhar este post


Link para o post
Compartilhar em outros sites

Linha errada:

 

for(t=0;t<MAX; ++t) cliente_info[t].nome=0 = '\0';

Correção:

for(t=0;t<MAX; ++t) cliente_info[t].nome[0] = 0;

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

gets(cliente_info[slot].nome);

Olá buffer overflow. Tire esses gets daí e use fgets.

 

 

if(t==MAX) return -1;

Vou ser chata aqui. Números mágicos não são uma boa prática. Ou vc coloca comentários como foi feito (normalmente essas informações sobre retorno da função/método ficam num comentário geral acima da declaração da função) ou define uma macro (#define NO_POSITION_LEFT -1).

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.