Ir ao conteúdo
  • Cadastre-se

C Trabalho Faculdade elaborar um player de musica em C


Lucca99

Posts recomendados

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

int menu();
void inserirMusica(char musica[20], char autor[20], float duracao);
void ListarMusicas();

struct Player_musica {
	char musica[20];
	char autor[20];
	float duracao;
	Player_musica *proximo;
}

*Head;

int main()
{
	setlocale(LC_ALL, "portuguese");

	int opcao, c;

	char musica[20];
	char autor[20];
	float duracao;

	Head = NULL;

	while (1) {


		opcao = menu();
		switch (opcao)
		{

		case 1: //inserir uma nova música no player
			printf("Você escolheu inserir uma nova musica\n");
			printf("----------------------------------------------------\n");
			printf("Digite nome da musica a ser inserida\n");
			scanf_s("%s", musica,20);
			while ((c = getchar()) != '\n' && c != EOF) {}// limpar buffer teclado
			printf("----------------------------------------------------\n");
			printf("Digite o nome do cantor(A)/Banda\n");
			scanf_s("%s", autor,20 );
			
			void inserirMusica(char musica[20], char autor[20], float duracao);

			break;

		case 2: //Listar todas as musicas.
			printf("As músicas listadas são:\n");
			void ListarMusicas();


			system("pause");
			break;


		}
	}
	return 0;

}



int menu()
{
	int opcao;
	printf("1 Inserir uma nova musica no player.\n");
	printf("2 Realiazar uma listagem de todas musicas inseridas.\n");
	printf("3 Sair do player\n ");
	scanf_s("%d", &opcao);


	system("cls");
	return opcao;
}


void AdicionarMusica(char musica[20], char autor[20], float duracao)
{
	Player_musica *NovaMusica;
	NovaMusica = (struct Player_musica *)malloc(sizeof(struct Player_musica));
	strcpy_s(NovaMusica->musica, musica);
	strcpy_s(NovaMusica->autor, autor);
	NovaMusica->duracao = duracao;

	if (Head == NULL)
	{
		Head = NovaMusica;
		Head->proximo = NULL;
	}
	else
	{
		NovaMusica->proximo = Head;
		Head = NovaMusica;

	}



}
void ListarMusicas()
{

	Player_musica *ElementoVarredura;
	ElementoVarredura = Head;
	
	while (ElementoVarredura != NULL)
	{
		printf("Musica: %s", ElementoVarredura->musica);
		printf("Artista/Banda %s", ElementoVarredura->autor);
		printf("Duracao %f", ElementoVarredura->duracao);

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


	system("pause");
	return;


}

Pessoal boa noite, alguem consegue me ajudar meu code esta compilando mas quando digito a opção 2 que deveria listar as musicas ja contidas, elenao mostra nada e retorna para meu loop do menu.

se alguem souber alguma dica para terminar essa parte agradeceria muito.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Declarações como essas

void inserirMusica(char musica[20], char autor[20], float duracao);
void ListarMusicas();

são sempre problemáticas

 

E isso
 

image.png.e3cea2cf72bb2599395e87239729c75a.png

 

É um convite para um desastre.

 

Compare com essas possíveis declarações

 

Lista*  inserir(void* Musica, Lista* Playlist);
// claro, insere a musica tal na playlist tal
int     listar(Lista* Playlist);
// lista o que tem na playlist. Pode nem ser musica. E uma lista

Eis o que acontece

  • usar void para retornar de inserir() ou listar() é um desperdício. Em inserir() em geral se devolve o ponteiro atualizado da lista, o tal HEAD que você tentou usar. É mais esperto. 
    Assim você tem segurança do que está acontecendo. Já pensou se tivesse mais de uma lista? Tipo
            Player_musica*   lista;
            Player_musica*   Anos90;
            Player_musica   Jazz, Blues1;
    // um vetor de playlists e algo bem possivel 
            Player_musica   novas[10];

    É mais simples. Mais esperto e mais seguro. Há sempre opções claro.
     

  • inserir() poderia simplesmente inserir algo em alguma lista e retornar o novo endereço do início da lista, porque ele pode ter mudado. Então o simples é passar o endereço da lista e do novo item, e receber o novo HEAD porque pode ter mudado. Pode dar certo como você fez, mas o fato de não dado já mostra que eu devo ter razão
     
  • listar() é menos importante porque é uma operação passiva. Mas como sua lista não tem o número de itens ao você listar perde uma óbvia oportunidade: retornar o número de músicas que leu, para poder por no painel do player...
     
  • Você declarou logo no início um tal HEAD* que eu imagino que você queria que fosse um ponteriro para a lista. Como eu disse antes, devia usar um nome mais significativo. De todo modo está errado. Head* indica um ponteiro para algo do tipo Head. Mas que diabo é Head? E o nome da variável estaria onde?
    Talvez pretendesse declarar algo assim
    struct Player_musica*	Head;
    // Head e um ponteiro para uma struct dessas 
    Esse ponteiro é global. Em geral é uma ideia ruim. Não declare nada fora de main(). É sempre um problema. E como deu problema... devo ter razão. Use estruturas globais, não variáveis globais.
     
  • Quando você declara protótipos não use nomes de variáveis. Escreva apenas o protótipo, algo assim
    void inserirMusica(char musica[],char autor[],float);

    De todo modo não está bom também. Esse são os dados da struct que criou. Porque não passar simplesmente o endereço de uma Player_musica? Não foi pra isso que a escreveu? para juntar os dados todos? E se você resolver mudar um parâmetro na struct vai ter que mudar TODAS as declarações de insere()... Sério?
    E se tivesse duas listas? Ou 20? E se não fossem só de músicas? Faça o simples. Minha sugestão.

    Postei hoje um exemplo aqui de estrutura para uma playlist. E em março postei um programa inteiro eu acho. Talvez devesse dar uma olhada ver se ajuda.

    Tem aqui umas estruturas mais realistas:
     

    struct musica
    {
    	char faixa[50];
    	char artista[50];
    	int  minutos;
    	int  segundos;
    };
    typedef struct musica Musica;
    
    struct itemDaLista
    {
    	Musica* musica;
    	struct itemDaLista* proxima;
    	struct itemDaLista* anterior;
    };
    typedef struct itemDaLista Lista;
    
    struct umaPlaylist
    {
    	int     total;
    	char	nome[30];
    	Lista*	musicas;
    };
    typedef struct umaPlaylist Playlist;

    Compare.

Todo mundo sabe o que esperar de uma playlist. Não precisa inventar. E uma playlist que não volta é esquisito. E não tem nome. Você sabe o que tem no player: avança, volta, para, nome da playlist, quantas músicas tem... Veja um exemplo
 

image.png.a73ca86ff67cd4d73a5a77431d75c480.png


Usar a duração da música como float não é uma boa ideia. Sério que espera que alguém digite 3.234 segundos como duração da música por exemplo? E se o cara digitar vírgula ou ponto como separador e cancelar seu programa só por causa disso?

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

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