Ir ao conteúdo

Posts recomendados

Postado

O nomes digitados no pelo usuário estão sendo listados na tela de maneira incorreta, depois de escolher a opção para listar...como devo proceder?

 

Código:

void Playlist()
{

	Playlist_Musica *ElementoVarredura;
	ElementoVarredura = (struct Playlist_Musica *)malloc(sizeof(struct Playlist_Musica));

    ElementoVarredura = Head;
	if (ElementoVarredura == NULL) {
		return;
	}
	while (ElementoVarredura != NULL) {
		printf("Musica: %s\n", ElementoVarredura->nm);
		printf("Artista/Banda: %s\n", ElementoVarredura->ab);
		printf("Duracao: %.2f", ElementoVarredura->duracao);

		ElementoVarredura = ElementoVarredura->prox;
		printf("\n");
	}

Ao listar os nomes digitados:

 

530234887_ErroImprimirnomes.PNG.4b2244390131494a68b8459fa20fb746.PNG

  • Curtir 1
Postado

O que você está tentando fazer nessa linha?

ElementoVarredura = Head;

 

Você acabou de fazer o ponteiro ElementoVarredura apontar para um endereço de um espaço da memória reservado com malloc na linha anterior, mas imediatamente em seguida faz ele apontar para outra coisa?

 

Não entendi...

  • Curtir 2
Postado

@isrnick Boa noite! É para implementar o código com a base da lista encadeada...retirei esse parte, mas acontece erro nessa parte: printf("Musica: %s\n", ElementoVarredura->nm);

Postado

A struct Playlist_Musica está definida como?

 

Não tem nada que pareça estar errado nesse printf, O mais provável é que ElementoVarredura esteja apontando para algo errado ou então esses dados não estejam sendo guardados corretamente na lista.

  • Curtir 1
Postado

@isrnickEssa parte está imprimindo corretamente: printf("Duracao: %.2f", ElementoVarredura->duracao); agora os outros do tipo string...será alguma parte do elemento de varredura?

 

 A Struct :

 

struct Playlist_Musica {
    char nm[20];
    char ab[20];
    float duracao;
    Playlist_Musica *prox;
} *Head;
 

Função para inserir:

void AdicionarMusica(char nm[20], char ab[20], float duracao)
    {
        Playlist_Musica *NovoElemento;
        NovoElemento = (struct Playlist_Musica *)malloc(sizeof(struct Playlist_Musica));
        NovoElemento->nm[20] = nm[20];
        NovoElemento->nm[20] = ab[20];
        NovoElemento->duracao = duracao;

        if (Head == NULL)
        {
            Head = NovoElemento;
            Head->prox = NULL;
        }
        else
        {
            NovoElemento->prox = Head;
            Head = NovoElemento;
        }
    }

Postado
2 horas atrás, PauloC19 disse:

        NovoElemento->nm[20] = nm[20];
        NovoElemento->nm[20] = ab[20];

 

Aí está o problema, essas atribuições não fazem o que você deseja (na verdade nem existe índice 20 nesses vetores, os índices nesse caso vão de 0 a 19, e na segunda linha também está errado, deveria guardar em NovoElemento->ab).

 

Em C não dá para copiar um vetor inteiro fazendo uma atribuição com =, é necessário copiar o valor de cada posição do vetor, um por um.

 

Mas no caso de vetores de caracteres contendo strings já existe a funções para copiar, no caso strcmp() e strncmp() que faz parte da biblioteca string.h então para usar deve incluir essa biblioteca.

 

Nesse caso ficaria assim:

 

#include <string.h>
  
.
.
.

//Copia a string do vetor nm para o vetor NovoElemento->nm:
strcmp(NovoElemento->nm, nm); 
//Copia a string do vetor ab para o vetor NovoElemento->ab:
strcmp(NovoElemento->ab, ab);

 

Postado

@isrnick A biblioteca string.h estava adicionada, fiz a seguintes alterações, mas continua a imprimir de forma embaralhada.

 

void AdicionarMusica(char nm[20], char ab[20], float duracao)
{
    Playlist_Musica *NovoElemento;
    NovoElemento = (struct Playlist_Musica *)malloc(sizeof(struct Playlist_Musica));
    strcmp(NovoElemento->nm, nm);
    strcmp(NovoElemento->ab, ab);
    NovoElemento->duracao = duracao;

    if (Head == NULL)
    {
        Head = NovoElemento;
        Head->prox = NULL;
    }
    else
    {
        NovoElemento->prox = Head;
        Head = NovoElemento;
    }
}

void Playlist()
{

    Playlist_Musica *ElementoVarredura;
    ElementoVarredura = (struct Playlist_Musica *)malloc(sizeof(struct Playlist_Musica));

 

    ElementoVarredura = Head;  //Retirei essa instrução porém não fez diferença.
    
    if (ElementoVarredura == NULL) {
        return;
    }
    while (ElementoVarredura != NULL) {
        printf("Musica: %s", ElementoVarredura->nm);
        printf("Artista/Banda: %s", ElementoVarredura->ab); 
        printf("Duracao %f", ElementoVarredura->duracao); //Essa parte como eu disse, imprime normal, as intruções acima estão da mesma forma, porém da esse problema, será algo com os caracteres, string?

        ElementoVarredura = ElementoVarredura->prox;
        printf("\n");
    }
 

Postado

Desculpa indiquei a função errada... strcmp é para comparar strings... 🤦‍♂️

 

strcpy e strncpy são as funções para copiar strings. Então na verdade seria assim:

 

//Copia a string do vetor nm para o vetor NovoElemento->nm:
strcpy(NovoElemento->nm, nm); 
//Copia a string do vetor ab para o vetor NovoElemento->ab:
strcpy(NovoElemento->ab, ab);

 

  • Curtir 1
Postado

@isrnick Boa noite! Muito Obrigado! Com essa função imprimiu na tela o nomes de forma correta...Estou alterando a base de outro código de uma estrutura de dados, fiz algumas alterações, consegui executar o código, realizar a função de busca por um determinado número que quando digitado pelo usuário, caso estiver cadastrado retorna outras informações na tela, como, nome e email referente aquele número, porém, tem a função de listar na tela os dados que foram cadastrados, mas no momento só consigo imprimir os números, o nome, e o email do cadastro não...pretendo tentar listar os cadastros da esquerda para a direita, em ordem crescente pelos números cadastrados.

 

Função para inserir os dados (cadastrar):

void Inserir(BuscaDados ** ElementoVarredura, int num, char nome, char email)
{

	if (*ElementoVarredura == NULL)
	{
		BuscaDados *NovoElemento = NULL;
		NovoElemento = (BuscaDados *)malloc(sizeof(BuscaDados));
		NovoElemento->esquerda = NULL;
		NovoElemento->direita = NULL;

		NovoElemento->num = num;
		strcpy(NovoElemento->nome, nome);
		strcpy(NovoElemento->email, email);
		*ElementoVarredura = NovoElemento;
		return;
	}

	if (num < (*ElementoVarredura)->num)
	{
		Inserir(&(*ElementoVarredura)->esquerda, num, nome, email);
	}
	else
	{
		if (num > (*ElementoVarredura)->num)
		{
			Inserir(&(*ElementoVarredura)->direita, num, nome, email);
		}
	}
}

Nessa função acima, essa parte está apresentando erros: 

strcpy(NovoElemento->nome, nome);

strcpy(NovoElemento->email, email);

 

 

Função para listar os dados:

void ListarOrdem(BuscaDados *ElementoVarredura, int num)
{
	if (ElementoVarredura)
	{
		ListarOrdem(ElementoVarredura->esquerda);
		printf("%d\t", ElementoVarredura->num);
		ListarOrdem(ElementoVarredura->direita);
	}
}

No caso com essa base só lista na tela os números que foram cadastrados, seus respectivos nomes e emails, não.

Será triplicar essas instruções dentro do if?
 

Pode me orientar?

Postado
1 hora atrás, PauloC19 disse:

void Inserir(BuscaDados ** ElementoVarredura, int num, char nome, char email)

{

 

Nos parâmetros da função nome e email são ambos um único caractere cada, para armazenar string é necessário usar um vetor de caracteres. Então nesse caso esses parâmetros nome e email deveriam ser vetores de caracteres ou então ponteiros.

 

void Inserir(BuscaDados ** ElementoVarredura, int num, char nome[], char email[])

//ou

void Inserir(BuscaDados ** ElementoVarredura, int num, char *nome, char *email)

 

  • Curtir 1
Postado

 

 

@isrnick Boa noite, Deu certo certo com essas alterações, com isso, modifiquei a função de listar, acrescentei mais dois printf entre outros, com o nome e email...falta só um detalhe, ao utilizar a função código percebi o seguinte problema: A função buscar ela está pegando sempre as últimas informações digitadas, e utilizando em todas as numerações buscada no código. Por ex.: Digita a numeração: 1111, nome: aaaa, email: aaaaa, depois cadastra outros dados, numeração: 2222, nome, bbbb, email: bbbbb, quando faz a busca pela numeração: 1111, retorna o nome: bbbb e email: bbbbb, invés de mostrar nome: aaaa, email: aaaaa.

 

Função Buscar:

BuscaDados* Buscar(BuscaDados ** ElementoVarredura, int num)
{
	if (*ElementoVarredura == NULL)
		return NULL;

	if (num < (*ElementoVarredura)->num)
	{
		Buscar(&((*ElementoVarredura)->esquerda), num); //Tentei adicionar depois do num: num, nome, email, e assim nas demais, porém, não altera nada.
		
	}
	else
	{
		if (num > (*ElementoVarredura)->num)
		{
			Buscar(&((*ElementoVarredura)->direita), num); 
		}
		else
		{
			if (num == (*ElementoVarredura)->num) 
				return *ElementoVarredura;
		}
	}
}

 

Chamada da função buscar:

case 2:
			printf("Digite o numero a ser buscado: ");
			scanf_s("%d", &num);
			printf("\n");
			system("cls");
			while ((c = getchar()) != '\n' && c != EOF) {}
			ElementoBusca = Buscar(&root, num); //Tentei depois de num, chamar as variáveis: nome[], email[], e não altera nada também
			if (ElementoBusca != 0) {
				printf("Cadastro localizado.\n\n");
				printf("Numero: %d\n", num); 
				printf("Nome: %s\n", nome);
				printf("Email: %s\n\n", email);
			}
			else {
				printf("Cadastro nao localizado.\n");
			}
			system("pause");
			break;

 

Postado
14 horas atrás, PauloC19 disse:

			if (ElementoBusca != 0) {
				printf("Cadastro localizado.\n\n");
				printf("Numero: %d\n", num); 
				printf("Nome: %s\n", nome);
				printf("Email: %s\n\n", email);
			}

 

 

Nessa parte do código estão sendo impressas as variáveis erradas (num, nome e email), deveria imprimir os dados contidos no ElementoBusca (ElementoBusca->num, ElementoBusca->nome e ElementoBusca->email).

  • Curtir 1
Postado

@isrnick Boa noite! Muito Obrigado! Com essas modificações o erro foi solucionado e o código rodou perfeitamente. No momento, estou aprendendo sobre estrutura de dados heterogêneas, alocação dinâmica etc.🙏🙌🙏. Até então, não conhecia as funções: "strcpy e strncpy", "strcmp e strncmp". Cada detalhe que você apresentou me ajudou bastante. Obrigado! 

 

  

  • Curtir 1

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...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!