Ir para conteúdo

POWERED BY:

Arquivado

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

rkd

C (Criação cadastro)

Recommended Posts

Pessoal o seguinte codigo abaixo está apresentando erro "Não Enviar, programa sera fechado" quando tento adicionar outro campo para registro de endereço, logo tipo char.

 

Codigo funcional somente com inteiros:

 

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

#define BUFFER 64

/* Estrutura da lista declarada para armazenar nossos dados. */
typedef struct lista {
       char *nome;
       int idade;
       int cpf;
       int rg;
       int tel;
       //char *end;
       struct lista *proximo;
} Dados;

/* Prototipo das funcoes de manuseio dos dados. */
Dados *inicia_dados(char *nome, int idade, int cpf, int rg, int tel);
Dados *insere_dados(Dados *dados, char *nome, int idade, int cpf, int rg, int tel);
void exibe_dados(Dados *dados);
void busca_dados(Dados *dados, char *chave);
Dados *deleta_dados(Dados *dados);
int checa_vazio(Dados *dados);

/* Prototipo das funcoes do menu.*/
void insere(void);
void exibe(void);
void busca(void);
void deleta(void);

/* Inicializa a estrutura de dados principal. */
Dados *principal = NULL;

/* Cria a nova lista apontando o proximo nó para NULL. */
Dados *inicia_dados(char *nome, int idade, int cpf, int rg, int tel) {

       Dados *novo;

       novo = (Dados *)malloc(sizeof(Dados));
       novo->nome = (char *)malloc(strlen(nome)+1);
       strncpy(novo->nome, nome, strlen(nome)+1);
       novo->idade = idade;
       novo->cpf = cpf;
       novo->rg = rg;
       novo->tel = tel;
       novo->proximo = NULL;

       return novo;
}

/* Como a lista nao esta mais vazia, apontamos o proximo no para lista anterior. */
Dados *insere_dados(Dados *dados, char *nome, int idade, int cpf, int rg, int tel) {

       Dados *novo;

       novo = (Dados *)malloc(sizeof(Dados));
       novo->nome = (char *)malloc(strlen(nome)+1);
       strncpy(novo->nome, nome, strlen(nome)+1);
       novo->idade = idade;
       novo->proximo = dados;
       novo->cpf = cpf;
       novo->rg = rg;
       novo->tel = tel;

       return novo;
}

/* Percorre todos os campos da lista e imprime ate o ponteiro proximo chegar em NULL. */
void exibe_dados(Dados *dados) {

       printf("Cadastro:\n\n");

       printf("------------------------\n");

       for (; dados != NULL; dados = dados->proximo) {
               printf("Nome: %s\n", dados->nome);
               printf("Idade: %d\n", dados->idade);
               printf("Cpf: %d\n", dados->cpf);
               printf("Rg: %d\n", dados->rg);
               printf("Tel: %d\n", dados->tel);
               printf("------------------------\n");
       }

       getchar();
}

/* Percorre cada ponta comparando o nome com a chave. */
void busca_dados(Dados *dados, char *chave) {

       int achou = 0;

       printf("Cadastro:\n\n");
       for ( ; dados != NULL; dados = dados->proximo) {
               if (strcmp(chave, dados->nome) == 0) {

                       printf("------------------------\\n");
                       printf("Nome: %s\\n", dados->nome);
                       printf("Idade: %d\\n", dados->idade);
                       printf("Cpf: %d\n", dados->cpf);
                       printf("Rg: %d\n", dados->rg);
                       printf("Tel: %d\n", dados->tel);
                       printf("------------------------\\n");
                       achou++;
               }
       }

       if (achou == 0)
               printf("Nenhum resultado encontrado.\\n");
       else
               printf("Foram encontrados %d registros.\\n", achou);

       sleep(1);
}

/* Deleta o ultimo registro inserido. */
Dados *deleta_dados(Dados *dados) {

       Dados *novo;

       novo = dados->proximo;

       free(dados->nome);
       free(dados);

       printf("O ultimo registro inserido foi deletado com sucesso.\\n");
       sleep(1);

       return novo;
}

/* Apena checa se a lista e NULL ou nao. */
int checa_vazio(Dados *dados) {

       if (dados == NULL) {
               printf("Lista vazia!\\n");
               sleep(1);
               return 1;
       } else
               return 0;
}

/* Obtem os dados necessarios para chamar as funcoes de manuseio de dados. */
void insere(void) {

       char *nome;
       int idade;
       int cpf;
       int rg;
       int tel;
       //char *end;

       nome = (char *)malloc(BUFFER);

       printf("Digite o Nome: ");
       scanf("%s", nome);
       printf("\n");

       printf("Digite a Idade: ");
       scanf("%d", &idade);
       printf("\n");

       printf("Digite a Cpf: ");
       scanf("%d", &cpf);
       printf("\\n");

       printf("Digite a Rg: ");
       scanf("%d", &rg);
       printf("\n");

       printf("Digite a tel: ");
       scanf("%d", &tel);
       printf("\n");

      // printf("Digite o Endereco: ");
       //scanf("%s", end);
       //printf("\n");

       if (principal == NULL)
               principal = inicia_dados(nome, idade, cpf, rg, tel);
       else
               principal = insere_dados(principal, nome, idade, cpf, rg, tel);
}

void exibe(void) {

       if (!checa_vazio(principal))
               exibe_dados(principal);
}

void busca(void) {

       char *chave;

       if (!checa_vazio(principal)) {

               chave = (char *)malloc(BUFFER);

               printf("Digite o nome para buscar: ");
               scanf("%s", chave);

               busca_dados(principal, chave);
       }
}

void deleta(void) {

       if (!checa_vazio(principal))
               principal = deleta_dados(principal);
}

int main(void) {

       char escolha;

       do {
               system("cls");
               printf("\n\t\tCadastro de Pessoas\n\n");
               printf("Escolha uma opcao: \n");
               printf("1 - Insere Dados\n");
               printf("2 - Exibe Dados\n");
               printf("3 - Busca Dados\n");
               printf("4 - Deleta Dados\n");
               printf("5 - Sair\n\n");

               scanf("%c", &escolha);

               switch(escolha) {
                       case '1':
                               insere();
                               break;

                       case '2':
                               exibe();
                               break;

                       case '3':
                               busca();
                               break;

                       case '4':
                               deleta();
                               break;

                       case '5':
                               exit(0);
                               break;

                       default:
                               printf("Digite uma opcao valida!\n");
                               sleep(1);
                               break;
               }

               getchar(); /* E para impedir sujeira na entrada da escolha. Nao lembro de nada melhor tambem.   */
       }

       while (escolha > 0); /* Loop Principal. */

       return 0;
}

 

Codigo onde apresenta erro ao tentar capturar endereço

 

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

#define BUFFER 64

/* Estrutura da lista declarada para armazenar nossos dados. */
typedef struct lista {
       char *nome;
       int idade;
       int cpf;
       int rg;
       int tel;
       char *end;
       struct lista *proximo;
} Dados;

/* Prototipo das funcoes de manuseio dos dados. */
Dados *inicia_dados(char *nome, int idade, int cpf, int rg, int tel, char *end);
Dados *insere_dados(Dados *dados, char *nome, int idade, int cpf, int rg, int tel, char *end);
void exibe_dados(Dados *dados);
void busca_dados(Dados *dados, char *chave);
Dados *deleta_dados(Dados *dados);
int checa_vazio(Dados *dados);

/* Prototipo das funcoes do menu.*/
void insere(void);
void exibe(void);
void busca(void);
void deleta(void);

/* Inicializa a estrutura de dados principal. */
Dados *principal = NULL;

/* Cria a nova lista apontando o proximo nó para NULL. */
Dados *inicia_dados(char *nome, int idade, int cpf, int rg, int tel, char *end) {

       Dados *novo;

       novo = (Dados *)malloc(sizeof(Dados));
       novo->nome = (char *)malloc(strlen(nome)+1);
       strncpy(novo->nome, nome, strlen(nome)+1);
       novo->idade = idade;
       novo->cpf = cpf;
       novo->rg = rg;
       novo->tel = tel;
       novo->proximo = NULL;

       return novo;
}

/* Como a lista nao esta mais vazia, apontamos o proximo no para lista anterior. */
Dados *insere_dados(Dados *dados, char *nome, int idade, int cpf, int rg, int tel, char *end) {

       Dados *novo;

       novo = (Dados *)malloc(sizeof(Dados));
       novo->nome = (char *)malloc(strlen(nome)+1);
       strncpy(novo->nome, nome, strlen(nome)+1);
       novo->idade = idade;
       novo->proximo = dados;
       novo->cpf = cpf;
       novo->rg = rg;
       novo->tel = tel;

       return novo;
}

/* Percorre todos os campos da lista e imprime ate o ponteiro proximo chegar em NULL. */
void exibe_dados(Dados *dados) {

       printf("Cadastro:\n\n");

       printf("------------------------\n");

       for (; dados != NULL; dados = dados->proximo) {
               printf("Nome: %s\n", dados->nome);
               printf("Idade: %d\n", dados->idade);
               printf("Cpf: %d\n", dados->cpf);
               printf("Rg: %d\n", dados->rg);
               printf("Tel: %d\n", dados->tel);
               printf("end: %s\n", dados->end);
               printf("------------------------\n");
       }

       getchar();
}

/* Percorre cada ponta comparando o nome com a chave. */
void busca_dados(Dados *dados, char *chave) {

       int achou = 0;

       printf("Cadastro:\n\n");
       for ( ; dados != NULL; dados = dados->proximo) {
               if (strcmp(chave, dados->nome) == 0) {

                       printf("------------------------\\n");
                       printf("Nome: %s\\n", dados->nome);
                       printf("Idade: %d\\n", dados->idade);
                       printf("Cpf: %d\n", dados->cpf);
                       printf("Rg: %d\n", dados->rg);
                       printf("Tel: %d\n", dados->tel);
                       printf("End: %s\n", dados->end);
                       printf("------------------------\\n");
                       achou++;
               }
       }

       if (achou == 0)
               printf("Nenhum resultado encontrado.\\n");
       else
               printf("Foram encontrados %d registros.\\n", achou);

       sleep(1);
}

/* Deleta o ultimo registro inserido. */
Dados *deleta_dados(Dados *dados) {

       Dados *novo;

       novo = dados->proximo;

       free(dados->nome);
       free(dados);

       printf("O ultimo registro inserido foi deletado com sucesso.\\n");
       sleep(1);

       return novo;
}

/* Apena checa se a lista e NULL ou nao. */
int checa_vazio(Dados *dados) {

       if (dados == NULL) {
               printf("Lista vazia!\\n");
               sleep(1);
               return 1;
       } else
               return 0;
}

/* Obtem os dados necessarios para chamar as funcoes de manuseio de dados. */
void insere(void) {

       char *nome;
       int idade;
       int cpf;
       int rg;
       int tel;
       char *end;

       nome = (char *)malloc(BUFFER);

       printf("Digite o Nome: ");
       scanf("%s", nome);
       printf("\n");

       printf("Digite a Idade: ");
       scanf("%d", &idade);
       printf("\n");

       printf("Digite a Cpf: ");
       scanf("%d", &cpf);
       printf("\\n");

       printf("Digite a Rg: ");
       scanf("%d", &rg);
       printf("\n");

       printf("Digite a tel: ");
       scanf("%d", &tel);
       printf("\n");

      printf("Digite o Endereco: ");
      scanf("%s", end);
      printf("\n");

       if (principal == NULL)
               principal = inicia_dados(nome, idade, cpf, rg, tel, end);
       else
               principal = insere_dados(principal, nome, idade, cpf, rg, tel, end);
}

void exibe(void) {

       if (!checa_vazio(principal))
               exibe_dados(principal);
}

void busca(void) {

       char *chave;

       if (!checa_vazio(principal)) {

               chave = (char *)malloc(BUFFER);

               printf("Digite o nome para buscar: ");
               scanf("%s", chave);

               busca_dados(principal, chave);
       }
}

void deleta(void) {

       if (!checa_vazio(principal))
               principal = deleta_dados(principal);
}

int main(void) {

       char escolha;

       do {
               system("cls");
               printf("\n\t\tCadastro de Pessoas\n\n");
               printf("Escolha uma opcao: \n");
               printf("1 - Insere Dados\n");
               printf("2 - Exibe Dados\n");
               printf("3 - Busca Dados\n");
               printf("4 - Deleta Dados\n");
               printf("5 - Sair\n\n");

               scanf("%c", &escolha);

               switch(escolha) {
                       case '1':
                               insere();
                               break;

                       case '2':
                               exibe();
                               break;

                       case '3':
                               busca();
                               break;

                       case '4':
                               deleta();
                               break;

                       case '5':
                               exit(0);
                               break;

                       default:
                               printf("Digite uma opcao valida!\n");
                               sleep(1);
                               break;
               }

               getchar(); /* E para impedir sujeira na entrada da escolha. Nao lembro de nada melhor tambem.   */
       }

       while (escolha > 0); /* Loop Principal. */

       return 0;
}

 

Grato

Compartilhar este post


Link para o post
Compartilhar em outros sites

É meio complicado você jogar um código com várias linhas, sem dar nenhuma dica do código e esperar que resolvamos o problema para você.

 

 

Já tentou entender programas de outras pessoas? Tente, não vai ser muito animador.

 

 

Tente fazer você mesmo, e poste a parte que você não conseguiu, pois fica meio complicado achar um problema no meio de tantas linhas.

 

Já usou um debugger?

 

 

Abraços :D

Compartilhar este post


Link para o post
Compartilhar em outros sites

Quando um programa só funciona "às vezes", ele está quebrado.

 

Sugiro que você divida seu código em alguns arquivos, agregando as funcionalidades relacionadas e isolando (fisicamente) código que realiza operações que, logicamente, não se relacionam.

 

Depois disso, sugiro que tente isolar o erro. Qual a sua teoria sobre a origem do erro? Às vezes ajuda testar suas rotinas isoladamente (teste unitário).

 

Quando conseguir encontrar a fonte do erro, escreva um programa pequeno que o reproduza. Quando tiver um programa pequeno exibindo o erro original, poste-o aqui e lhe ajudaremos.

 

Não me leve a mal. Não tenho tempo para debugar seu código. Posso tirar as suas dúvidas sobre C.

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.