Ir ao conteúdo
  • Cadastre-se
ricardo.informatica

Sistema de cadastro em c com alocação dinâmica de memória

Recommended Posts

Olá boa tarde pessoal, estou com um problema meio grave, tenho um sistema feito em C com alocação dinamica de memoria para apresentar na faculdade ainda essa semana, porém como sou iniciante na linguagem ainda não consegui aprender bem para poder implementar no sistema. Andei pegando alguns exemplos na internet para poder desenvolver e ficou faltando somente o método de editar, ele está pronto porém não está funcionando por algum motivo que eu não consigo encontrar para resolver. Pessoal se vocês puderem me ajudar eu ficarei imensamente grato pois sei que aqui no fórum tem muitos programadores excelentes em C/C++...., não estou conseguindo terminar pessoal e o sistema sem o método de editar o professor irá descontar bastante nota do trabalho interdisciplinar. Quem puder me ajudar ficarei grato demais, bom por hora é só pessoal, estarei mandando o código para vocês analisarem ok. Obrigado. 

codigo sistema.txt

Compartilhar este post


Link para o post
Compartilhar em outros sites

A função que você está tendo problemas é essa:?

/* Percorre todos os campos da lista e imprime ate o ponteiro proximo chegar em NULL. */
void edita_dados(Dados *dados, int item, char *nome, int idade) {

		int i = 0;
        while(dados != NULL && i <= item) {
        	dados = dados->proximo;
        }
        
        if(dados != NULL && i == item)
        {
        	strcpy(dados->nome,nome);
            dados->idade = idade;
		}
		
        printf("Editado com sucesso.\n");
        printf("Pressione uma tecla para continuar.\n");
        getch();
}

 

Veja bem, você permanece no while enquanto dados for diferente de NULL e enquanto i for menor que ou igual a item, mas você não muda i dentro do while. Não vejo como isso pode estar certo, então tente incrementar a variável i dentro do while. Além disso, você só para o while quando dados for igual a NULL, ou seja, você não consegue nada com esse loop. Tente assim:

while(dados->proximo != NULL && i < item) {
	dados = dados->proximo;
	++i;
}

Dessa forma, dados apontará para um elemento válido (e não NULL), e a variável i indicará o número do elemento da lista para o qual dados aponta, e no if seguinte você estará comparando esse número com item, e esse teste deverá dizer se você encontrou o item desejado. Se você encontrou o item desejado, o nome e a idade serão copiados para dados.

 

Além disso, na função editar, você atribui o retorno de edita_dados a principal, sendo que edita_dados é definido como tendo void como tipo de retorno. Isso não está certo, não faz sentido atribuir nada a uma variável. Nos protótipos no topo do arquivo, você tem o seguinte:

 

Dados *edita_dados(Dados *dados, char *nome, int idade);

 

mas você define a função assim:

 

void edita_dados(Dados *dados, int item, char *nome, int idade) { ...

 

Isso tem que ser regularizado. Se você adotar void como tipo de retorno (essa é minha sugestão), então na função editar, substitua isso:

principal = edita_dados(principal, item, nome, idade);

por isso:

edita_dados(principal, item, nome, idade);

Essas mudanças são apenas coisas que eu percebi, não testei essas mudanças e não sei se vão resolver o seu problema, mas tente aplicar essas mudanças e vê se ajuda.

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
1 hora atrás, danieltm64 disse:

A função que você está tendo problemas é essa:?


/* Percorre todos os campos da lista e imprime ate o ponteiro proximo chegar em NULL. */
void edita_dados(Dados *dados, int item, char *nome, int idade) {

		int i = 0;
        while(dados != NULL && i <= item) {
        	dados = dados->proximo;
        }
        
        if(dados != NULL && i == item)
        {
        	strcpy(dados->nome,nome);
            dados->idade = idade;
		}
		
        printf("Editado com sucesso.\n");
        printf("Pressione uma tecla para continuar.\n");
        getch();
}

 

Veja bem, você permanece no while enquanto dados for diferente de NULL e enquanto i for menor que ou igual a item, mas você não muda i dentro do while. Não vejo como isso pode estar certo, então tente incrementar a variável i dentro do while. Além disso, você só para o while quando dados for igual a NULL, ou seja, você não consegue nada com esse loop. Tente assim:


while(dados->proximo != NULL && i < item) {
	dados = dados->proximo;
	++i;
}

Dessa forma, dados apontará para um elemento válido (e não NULL), e a variável i indicará o número do elemento da lista para o qual dados aponta, e no if seguinte você estará comparando esse número com item, e esse teste deverá dizer se você encontrou o item desejado. Se você encontrou o item desejado, o nome e a idade serão copiados para dados.

 

Além disso, na função editar, você atribui o retorno de edita_dados a principal, sendo que edita_dados é definido como tendo void como tipo de retorno. Isso não está certo, não faz sentido atribuir nada a uma variável. Nos protótipos no topo do arquivo, você tem o seguinte:

 

Dados *edita_dados(Dados *dados, char *nome, int idade);

 

mas você define a função assim:

 

void edita_dados(Dados *dados, int item, char *nome, int idade) { ...

 

Isso tem que ser regularizado. Se você adotar void como tipo de retorno (essa é minha sugestão), então na função editar, substitua isso:


principal = edita_dados(principal, item, nome, idade);

por isso:


edita_dados(principal, item, nome, idade);

Essas mudanças são apenas coisas que eu percebi, não testei essas mudanças e não sei se vão resolver o seu problema, mas tente aplicar essas mudanças e vê se ajuda.

 

Muito obrigado Daniel, eu fiz as alterações que você me disse e também alterei algumas outras mais ainda não está editando, vou te passar o codigo novamente, se você puder dar uma olhada pra mim pois já revisei ele todo e ainda não está editando, não consigo achar o problema, ficaria grato se você puder me ajudar. Obrigado.

codigo sistema em C revisado.txt

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

×