Jump to content
Hedson

Algoritmo de Cadastro e Busca

Recommended Posts

Hedson

Pessoal, saudações.... estou estudando C++ na faculdade e estou com muitos problemas pra conseguir executar um exercício que o professor me passou e que vale 20 % da minha nota...

me ajudem, vejam só... eu tenho esse código que desenvolvi na aula e ele me falou que tenho que adaptar ele pra fazer funcionar como um emulador de player de música... desde já agradeço a atenção e dedicação de cada um que me ajudar

 

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

/*Com base no seu algoritmo em linguagem C, desenvolva um código que emule as características de um player de músicas sendo executado em modo texto, via prompt de comando.
1. Deve-se criar uma playlist das músicas utilizando uma lista encadeada. A lista encadeada poderá ser simples ou dupla, circular ou não circular. Fica a critério do aluno decidir.
2. Deve-se armazenar o nome de cada música, do artista/banda e a duração da faixa. Para o armazenamento utilize uma estrutura heterogênea de dados.
3. Para inserção dos dados, você pode criar uma leitura dos dados através de um menu na tela ou já deixá-los armazenados em um arquivo texto no seu computador e só carregar este arquivo ao executar o programa. Ou ambas soluções. Decida também como você irá implementar a inserção (no início, no fim ou no meio da lista encadeada);
4. Deve existir um menu na tela. Este menu deve permitir a inserção de novas músicas (caso optado pela inserção manual de dados), deve ter a opção de listar todas as músicas da playlist (listagem de uma lista encadeada) na tela e encerrar o programa;
*/


int menu();
void InserirInicio(int num);
void InserirFim(int num);
void InserirMeio(int num, int posicao);
int Remover(int num);
void Listar();

struct ElementoDaLista_Simples {
	int dado;
	struct ElementoDaLista_Simples *prox;
} *Head;

int  main() {
	int op, num, pos, c;
	Head = NULL;

	while (1) {
		op = menu();
		switch (op) {
		case 1:
			printf("Digite o numero desejado: ");
			scanf_s("%d", &num);
			while ((c = getchar()) != '\n' && c != EOF) {} // sempre limpe o buffer do teclado.
			InserirInicio(num);
			break;
		case 2:
			printf("Digite o numero desejado: ");
			scanf_s("%d", &num);
			while ((c = getchar()) != '\n' && c != EOF) {} // sempre limpe o buffer do teclado.
			InserirFim(num);
			break;
		case 3:
			printf("Digite o numero desejado: ");
			scanf_s("%d", &num);
			while ((c = getchar()) != '\n' && c != EOF) {} // sempre limpe o buffer do teclado.
			printf("Digite a posicao que deseja inserir: ");
			scanf_s("%d", &pos);
			while ((c = getchar()) != '\n' && c != EOF) {} // sempre limpe o buffer do teclado.
			InserirMeio(num, pos);
			break;
		case 4:
			int res;
			printf("Digite o numero a ser removido: ");
			scanf_s("%d", &num);
			while ((c = getchar()) != '\n' && c != EOF) {} // sempre limpe o buffer do teclado.
			res = Remover(num);
			if (res == 1)
				printf("Numero removido.");
			else
				printf("Numero nao encontrado.");
			break;
		case 5:
			Listar();
			break;
		case 6:
			return 0;
		default:
			printf("Invalido\n");
		}
	}
	return 0;
}

int menu() {
	int op, c;
	system("Cls");

	printf("1.Inserir no inicio da lista encadeada simples\n");
	printf("2.Inserir no fim da lista encadeada simples\n");
	printf("3.Inserir no meio da lista encadeada simples\n");
	printf("4.Remover da lista encadeada simples\n");
	printf("5.Listar a lista encadeada simples\n");
	printf("6.Sair\n");
	printf("Digite sua escolha: ");

	scanf_s("%d", &op);
	while ((c = getchar()) != '\n' && c != EOF) {} // sempre limpe o buffer do teclado.
	
	system("Cls");
	return op;
}

void InserirInicio(int num)
{
	ElementoDaLista_Simples *NovoElemento;
	NovoElemento = (struct ElementoDaLista_Simples *)malloc(sizeof(struct ElementoDaLista_Simples));
	NovoElemento->dado = num;

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

void InserirFim(int num)
{
	ElementoDaLista_Simples *NovoElemento;
	NovoElemento = (struct ElementoDaLista_Simples *)malloc(sizeof(struct ElementoDaLista_Simples));
	ElementoDaLista_Simples *ElementoVarredura;
	ElementoVarredura = (struct ElementoDaLista_Simples *)malloc(sizeof(struct ElementoDaLista_Simples));

	NovoElemento->dado = num;

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

		ElementoVarredura->prox = NovoElemento;
		NovoElemento->prox = NULL;
	}
}

void InserirMeio(int num, int posicao)
{
	ElementoDaLista_Simples *NovoElemento;
	NovoElemento = (struct ElementoDaLista_Simples *)malloc(sizeof(struct ElementoDaLista_Simples));
	ElementoDaLista_Simples *ElementoVarredura;
	ElementoVarredura = (struct ElementoDaLista_Simples *)malloc(sizeof(struct ElementoDaLista_Simples));
	ElementoDaLista_Simples *ElementoAuxiliar;
	ElementoAuxiliar = (struct ElementoDaLista_Simples *)malloc(sizeof(struct ElementoDaLista_Simples));

	NovoElemento->dado = num;

	if (posicao == 0)
	{
		Head = NovoElemento;
		Head->prox = NULL;
	}
	else
	{
		ElementoVarredura = Head;
		for (int i = 0; i < posicao - 1; i++)
			ElementoVarredura = ElementoVarredura->prox;

		ElementoAuxiliar = ElementoVarredura->prox;
		ElementoVarredura->prox = NovoElemento;
		NovoElemento->prox = ElementoAuxiliar;
	}
}

int Remover(int num)
{
	ElementoDaLista_Simples *ElementoVarredura;
	ElementoVarredura = (struct ElementoDaLista_Simples *)malloc(sizeof(struct ElementoDaLista_Simples));
	ElementoDaLista_Simples *Anterior;
	Anterior = (struct ElementoDaLista_Simples *)malloc(sizeof(struct ElementoDaLista_Simples));

	ElementoVarredura = Head;
	while (ElementoVarredura != NULL) {
		if (ElementoVarredura->dado == num) {
			if (ElementoVarredura == Head) {
				Head = ElementoVarredura->prox;
				free(ElementoVarredura);
				return 1;
			}
			else {
				Anterior->prox = ElementoVarredura->prox ;
				free(ElementoVarredura);
				return 1;
			}
		}
		else {
			Anterior = ElementoVarredura;
			ElementoVarredura = ElementoVarredura->prox;
		}
	}
	return 0;
}

void Listar()
{
	ElementoDaLista_Simples *ElementoVarredura;
	ElementoVarredura = (struct ElementoDaLista_Simples *)malloc(sizeof(struct ElementoDaLista_Simples));

	ElementoVarredura = Head;
	if (ElementoVarredura == NULL) {
		return;
	}
	while (ElementoVarredura != NULL) {
		printf("%d ", ElementoVarredura->dado);
		ElementoVarredura = ElementoVarredura->prox;
	}
	printf("\n");

	system("pause");
	return;
}

 

 

Share this post


Link to post
Share on other sites
Hedson

eu preciso transformar ele em um emulador de player de musica.... e não sei como fazer

 

Share this post


Link to post
Share on other sites
M6
9 hours ago, Hedson said:

eu preciso transformar ele em um emulador de player de musica.... e não sei como fazer

 

Tens de colocar as dúvidas de forma clara e concreta.

Se necessitas de ajuda mais profunda sem saber o que tens de fazer, vais ter de as esclarecer com o teu professor.


10 REM Generation 48K!
20 INPUT "URL:", A$
30 IF A$(1 TO 4) = "HTTP" THEN PRINT "400 Bad Request": GOTO 50
40 PRINT "404 Not Found"
50 PRINT "./M6 @ Portugal a Programar."

 

Share this post


Link to post
Share on other sites
antseq

Viva,

Se "entendeu" na aula o exercício que está acima, o segundo trabalho é bastante mais fácil.

* na aula, guarda na "estrutura" apenas "int dado" => no segundo trabalho terá de uma estrutura algo como: nome, artista/banda e duração de cada música

* na aula, implementou 3 tipos de inserção (início, meio, fim) => no segundo trabalho fica ao seu critério

* na aula, implementou a leitura de dados (inserção) de um "número" => no segundo trabalho terá de pedir nome, artista/banda e duração de cada (estrutura) música

* na aula, implementou as opções de eliminar e listar => no segundo trabalho são idênticas

* não sei se o fez na aula, mas no segundo trabalho diz que pode ler/armazenar a lista (músicas) em disco

* neste ponto já terá seu "player" com músicas e todas as opções de manutenção da lista implementadas (armazenar, listar, inserir no inicio/meio/fim, eliminar)

* só lhe fica a faltar simular o "PLAY" e outras opções comuns num "player" (aleatório, repetir, etc). 
sugestão : como tem a duração da música, enquanto faz "play" mostre os dados da música "nome, banda, duração" e uns "pontos......." a cada X segundos para "simular" que algo está a tocar baseado na tal duração ou qualquer outra animação "básica" que consiga fazer só para dar ideia (simulada) de que algo está a acontecer (barra de progresso).

boa programação
 

Share this post


Link to post
Share on other sites
Hedson
Em 10/04/2019 às 13:12, antseq disse:

Viva,

Se "entendeu" na aula o exercício que está acima, o segundo trabalho é bastante mais fácil.

* na aula, guarda na "estrutura" apenas "int dado" => no segundo trabalho terá de uma estrutura algo como: nome, artista/banda e duração de cada música

* na aula, implementou 3 tipos de inserção (início, meio, fim) => no segundo trabalho fica ao seu critério

* na aula, implementou a leitura de dados (inserção) de um "número" => no segundo trabalho terá de pedir nome, artista/banda e duração de cada (estrutura) música

* na aula, implementou as opções de eliminar e listar => no segundo trabalho são idênticas

* não sei se o fez na aula, mas no segundo trabalho diz que pode ler/armazenar a lista (músicas) em disco

* neste ponto já terá seu "player" com músicas e todas as opções de manutenção da lista implementadas (armazenar, listar, inserir no inicio/meio/fim, eliminar)

* só lhe fica a faltar simular o "PLAY" e outras opções comuns num "player" (aleatório, repetir, etc). 
sugestão : como tem a duração da música, enquanto faz "play" mostre os dados da música "nome, banda, duração" e uns "pontos......." a cada X segundos para "simular" que algo está a tocar baseado na tal duração ou qualquer outra animação "básica" que consiga fazer só para dar ideia (simulada) de que algo está a acontecer (barra de progresso).

boa programação
 

meu amigo... veja como estou desenvolvendo, se puder me ajudar eu agradeço

 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct Play_list
{
	char musica[30];
	char Artista[30];
	float duracao;
	struct Play_list *proximo;
};
struct Play_list * cria(void)
{
	return NULL;
}
struct Play_list * insere(struct Play_list * l, char * musica, char * Artista, float duracao)
{
	struct Play_list * novo = (struct Play_list *) malloc(sizeof(struct Play_list));
	strcpy(novo->musica, musica);
	strcpy(novo->Artista, Artista);
	novo->duracao = duracao;
	novo->proximo = l;
	return novo;
}
void imprime(struct Play_list * l)
{
	struct Play_list * p;
	for(p = l; p != NULL; p = p->proximo)
	{
		printf("Musica : %s \n", p->musica);
		printf("ARTISTA : %s \n", p->Artista);
		printf("Duracao : %.2f \n", p->duracao);
	}
}
int busca(struct Play_list * l, char * musica)
{
	struct Play_list * p;
	int i = 1;
	for(p = l; p != NULL; p = p->proximo)
	{
		if(strcmp(musica, p->musica) == 0)
		{
			printf("Musica: %s %s %s \n", p->musica);
			return i;
		}
		i++;
	}
	return 0;
}
main()
{
	char grupo[30], artista[30];
	float duracao;
	struct Play_list * l;
	char resp = 's';
	char procura[30];

	printf(" ************************ \n");
	printf("|    PLAYER              |\n");
	printf("|          DE            |\n");
	printf("|             MUSICAS    |\n");
	printf("|                        |\n");
	printf(" ************************ \n");
	printf("\n\n");


	l = cria();
	while(resp != 'n')
	{
		printf("Qual eh a Musica? \n");
		scanf("%[^\n]", grupo);
		fflush(stdin);
		printf("De quem eh a musica? \n");
		scanf("%[^\n]", artista);
		fflush(stdin);
		printf("Qual eh o duracao? \n");
		scanf("%f", &duracao);
		fflush(stdin);
		l = insere(l, grupo, artista, duracao);
		printf("Continua? s/n \n");
		scanf("%c", &resp);
		fflush(stdin);
	}
	imprime(l);
	printf("Qual musica quer ouvir? \n");
	scanf("%s", procura);
	printf("Esta musica esta na posicao %d da play list\n", busca(l, procura));
	system("pause");
}

 

Share this post


Link to post
Share on other sites
antseq
21 horas atrás, Hedson disse:

meu amigo... veja como estou desenvolvendo, se puder me ajudar eu agradeço

Assim a primeira vista, parece ir no bom caminho :) continue e desenvolver!

sugestões:
1- não afecta o programa em termos de funcionamento: em termos de "convenções", não sei se o seu professor vai AVALIAR mesma, devia seguir sempre o mesmo critério (da linguagem C/C++) OU usar o mesmo indicado/exemplificado pelo professor nas aulas:

na aula: 
estrutura: ElementoDaLista_Simples: CamelCase, Snake_Underscore?
funções: InserirFim: CamelCase
variáveis: int dado: lowercase

no novo exercício:
estrutura: Play_list: ?  => Sugestão PlayList
funções: imprime : lowercase => OK ou fazer como na "aula" Imprime()
variáveis: char musica : lowercase => OK
variáveis: char Artista : CamelCase => artista
variáveis: float duracao : lowercase => OK

2- no "main" é necessário elaborar um pouco mais o "menu de opções"
2.1 : separar o "menu" para uma função própria "menu()"
2.2 : no "menu" : como na "aula" fazer "CLS"
2.3 : no "menu" : como na "aula" mostrar as opções de menu "1. ", "2. ", ...
2.4 : no "menu" : devolver ao "main" a opção seleccionada

cps,
 

Share this post


Link to post
Share on other sites
Hedson

meu  amigo antseq .... estou com um problema na busca da musica ... tipo depois de inserir as musicas pelo case 1 do menu, quando eu vou utilizar o 2 ele não funciona e já no 3 ele lista normal... pode me ajudar e ver o que poderia ser???

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


/*Faça um algoritmo em linguagem C que emule as características de um player de músicas sendo executado em modo texto, via prompt de comando.
1. Deve-se criar uma playlist das músicas utilizando uma lista encadeada. A lista encadeada poderá ser simples ou dupla, circular ou não circular. Fica a critério do aluno decidir.
2. Deve-se armazenar o nome de cada música, do artista/banda e a duração da faixa. Para o armazenamento utilize uma estrutura heterogênea de dados.
3. Para inserção dos dados, você pode criar uma leitura dos dados através de um menu na tela ou já deixá-los armazenados em um arquivo texto no seu computador e só carregar este arquivo ao executar o programa. Ou ambas soluções.
Decida também como você irá implementar a inserção (no início, no fim ou no meio da lista encadeada);
4. Deve existir um menu na tela. Este menu deve permitir a inserção de novas músicas (caso optado pela inserção manual de dados), deve ter a opção de listar todas as músicas da playlist (listagem de uma lista encadeada) na tela e encerrar o*/


struct Lista
{
	char musica[40], cantor[40];
	float duracao;
	Lista* prox;
};

Lista* inicio, * fim, * aux;

void inserirMusica()
{
	int c;

	Lista* novo = (struct Lista*)malloc(sizeof(struct Lista));
	printf("\nQual é a musica? ");
	fgets(novo->musica, 39, stdin);


	printf("De quem é a musica? ");
	fgets(novo->cantor, 39, stdin);

	printf("qual a duração da musica? ");
	scanf_s("%f", &novo->duracao);

	while ((c = getchar()) != '\n' && c != EOF) {}   // Limpar buffer do teclado

	novo->prox = NULL;

	if (inicio == NULL)  		//A Fila esta vazia e iremos inserir o primeiro elemento
	{
		inicio = fim = novo;
	}
	else
	{
		fim->prox = novo;
		fim = novo;
	}
}

void esvaziarLista()
{
	char ch;
	if (inicio == NULL)
	{
		printf("\nA fila esta vazia!\n\n");
	}
	else
	{
		printf("\nTem certeza que deseja esvaziar toda a lista?(s/n): ");
		ch = getchar();
		if (ch == 's' || ch == 'S')
		{
			while (inicio != NULL)
			{
				aux = inicio;
				inicio = inicio->prox;
				free(aux); // Libera o espaco na memoria
			}
			printf("\nA lista foi esvaziada com sucesso!!\n\n");
		}
		else
		{
			printf("\nA lista nao foi esvaziada!!\n\n");
		}
	}
}

void mostrarLista()
{
	aux = inicio;
	if (inicio == NULL)
	{
		printf("\nA lista esta vazia!");
	}
	else
	{
		while (aux != NULL)
		{
			printf("musica: %s", aux->musica);
			printf("cantor: %s", aux->cantor);
			printf("duração: %.2f\n\n", aux->duracao);
			aux = aux->prox;
		}
	}
	printf("\n\n");
}

void localizarMusica()
{
	aux = inicio;
	if (inicio == NULL)
	{
		printf("\nA lista está vazia!!!! :(");
	}
	else
	{
		char musica[40];
		printf("Digite a musica que procura: ");
		fgets(aux->musica,39, stdin);

		while (aux != NULL)
		{
			if (musica == aux->musica)
			{
				printf("\nMúsica  %40s localizada!\n\n", aux->musica);
				printf("música %40s", aux->musica);
				printf("cantor: %s\n\n", aux->cantor);
				printf("duração: %.2f\n\n", aux->duracao);
				return;
			}
			else
			{
				aux = aux->prox;
			}
		}

		if (aux == NULL)
		{
			printf("\nMusica  %s nao localizada!\n", musica);
		}
	}
	printf("\n\n");
}


int main()
{
	setlocale(LC_ALL, "portuguese");
	system("color 0E");
	int opt, c;

	do
	{
		printf("*==================================*\n");
		printf("| Simulador de Player de Música    |\n");
		printf("*==================================*\n\n\n\n");
		printf("*===========================*\n");
		printf("| 1. Inserir Música         |\n");
		printf("| 2. Pesquisar Músicas      |\n");
		printf("| 3. listar  Músicas        |\n");
		printf("| 4. Limpar Lista do Player |\n");
		printf("| 5. Sair                   |\n");
		printf("*===========================*\n");

		printf("Digite sua escolha: ");
		scanf_s("%d", &opt);
		while ((c = getchar()) != '\n' && c != EOF) {}   // Limpar buffer

		switch (opt)
		{
		case 1:
			inserirMusica();
			printf("\nMusica inserida com sucesso!!\n\n");
			system("pause");
			break;
		case 2:
			localizarMusica();
			system("pause");
			break;
		case 3:
			mostrarLista();
			system("pause");
			break;
		case 4:
			esvaziarLista();
			system("pause");
			break;
		case 5:
			printf("\nO programa foi encerrado com sucesso!!\n\n");
			system("pause");
			break;
		default:
			printf("\nEscolha Invalida!!\n\n");
			system("pause");
			break;
		}
		system("cls");
	} while (opt != 5);

	return 0;
}

 

Share this post


Link to post
Share on other sites
antseq
Em 18/04/2019 às 23:53, Hedson disse:

meu  amigo antseq .... estou com um problema na busca da musica ... tipo depois de inserir as musicas pelo case 1 do menu, quando eu vou utilizar o 2 ele não funciona e já no 3 ele lista normal... pode me ajudar e ver o que poderia ser???

Viva,

Penso que o problema no caso "2" está nesta linha:

fgets(aux->musica,39, stdin);

Aqui queres ler o "input" (stdin) do utilizador para sua variável local "musica" (char musica[40]) e não para "aux->musica".
Depois sim, vais comparar a "musica" (lida) em toda a sua lista "aux-musica".

cps,

Share this post


Link to post
Share on other sites
Hedson
8 horas atrás, antseq disse:

Viva,

Penso que o problema no caso "2" está nesta linha:

fgets(aux->musica,39, stdin);

Aqui queres ler o "input" (stdin) do utilizador para sua variável local "musica" (char musica[40]) e não para "aux->musica".
Depois sim, vais comparar a "musica" (lida) em toda a sua lista "aux-musica".

cps,

Não entendi amigo, desculpe a ignorância... e ficaria como a expressão??? fgets(musica, 39, stdin);??? não funcionou apareceu "música  (null) não localizada!"

 

Share this post


Link to post
Share on other sites
antseq
18 horas atrás, Hedson disse:

Não entendi amigo, desculpe a ignorância... e ficaria como a expressão??? fgets(musica, 39, stdin);??? não funcionou apareceu "música  (null) não localizada!"

Sim é isso, primeiro tem de ler a música que quer procurar para uma variável "musica" e só depois é que vai procurar a mesma na lista.
Não entendo como está a fazer o fgets da "musica" e no fim mostra "null" !?

Veja este exemplo abaixo. Se o fgets ler a "musica" correctamente, depois mais tarde o printf mostra a "musica" correctamente e NÃO "(null)":

int main()
{
    char musica[40];
    printf("Digite a musica que procura: ");
    fgets(musica, 39, stdin);
    printf("Musica a procurar: %s\n", musica);
    return 0;
}

Output:
Digite a musica que procura: xpto                                                                           
Musica a procurar: xpto

P/f verifique o seu código na leitura (fgets) da "musica"... se necessário coloque um "printf" logo a seguir para ter a certeza que está a ler bem o "input" para a variável "musica".

cps,

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.