Ir ao conteúdo
  • Cadastre-se

C Emulador de player de músicas em modo texto


Soratari

Posts recomendados

Pessoal estou com um problema no meu código podem me ajudar com esse erro ?

 

/*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*/

 

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


struct playlist_musical {
	char musica[50], cantor[50];
	float tempo;
	struct playlist_musical* prox;
}; struct playlist_musical* inicio, * meio, * fim, * aux;

	
void inserirmusica()
{
	int c;
	playlist_musical *novo = (struct playlist_musical*) malloc(sizeof(struct playlist_musical));
	
		printf("Selecione a musica\n");
		fgets(novo->musica, 49, stdin);

		printf("Selecione o artista");
		fgets(novo->cantor, 49, stdin);

		printf("Duracao da musica");
		scanf_s("%f", &novo->tempo);

		while ((c = getchar()) != 'n' && c != EOF){}
		novo->prox = NULL;
		if (inicio == NULL)
		{
			inicio = fim = novo;
		}
		else
		{
			fim->prox = novo;
			fim = novo;
		}
}
void limpar_lista()
{
	char ch;
	if (inicio == NULL) 
	{
		printf("\nLista");
	}
	else
	{
		printf("s\n");
		ch = getchar();
		if (ch == 's');
		while (inicio != NULL)
		{
			aux = inicio;
			inicio = inicio->prox;
			free(aux); // limpar memoria
		}
		printf("\n Lista vazia");
	}

}

void visualizar_lista() 
{
	aux = inicio;
	if (inicio == NULL)
	{
		printf("\n Lista Vazia");
	}
	else
	{
		while (aux != NULL)
		{
			printf("musica:%s", aux->musica);
			printf("cantor:%s", aux->cantor);
			printf("duracao: %f\n", aux->tempo);
			aux = aux->prox;
		}
	}
	
}
	
void procurar_musica()
{
	aux = inicio;
	if (inicio == NULL)
	{
		printf("\n Lista vazia");
	}
	else
	{
		char musica[50];
		printf("Digiete a faixa:");
		scanf_s("%s", &aux);

		while (aux != NULL)
		{
			if (musica == aux->musica) 
			{
				printf("\n Musica %s encontrada\n", aux->musica);
				printf("musica: %s", aux->musica);
				printf("cantor:%s\n", aux->cantor);
				return;
			}
			else
			{
				aux = aux->prox;
			}
		}
		if (aux == NULL)
		{
			printf("\n Musica %s nao encontrada", musica);
		}
	} printf("\n");
}

int main()
{
	setlocale(LC_ALL, "");
	int opc, c;

	do
	{
		printf("1 Inserir Musica\n");
		printf("2 Procurar Musica\n");
		printf("3 Ver Lista\n");
		printf("4 Limpar Lista\n");
		printf("5 Sair\n");

		printf("Escolha uma opcao");
		scanf_s("%d", &opc);
		while ((c = getchar()) != '\n' && c != EOF); {}

		switch (opc)
		{
		case 1:
		{
			inserirmusica();
			system("pause");
			break;
		}
		case 2:
		{
			procurar_musica();
			system("pause");
			break;
		}
		case 3:
		{
			visualizar_lista();
			system("pause");
			break;
		}
		case 4:
		{
			limpar_lista();
			system("pause");
			break;
		}
		default:
			printf("Opcao nao existe");
			break;
		}
		system("cls");

	} while (opc != 5);

	return 0;
}

 

Capturar22.PNG

Link para o comentário
Compartilhar em outros sites

10 minutos atrás, Soratari disse:

 

Capturar22.PNG

Wtf... porque as pessoas ainda insistem em usar o visual studio para C?

 

Seguinte o seu problema maior e na implementação da lista ligada, recomendo você fazer uma lista simples primeiro e só depois reimplementar com as funções para você compreender como funciona.

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

41 minutos atrás, LuisOPsum disse:

Olá!

É muito simples: onde tem scanf_s, deve tirar o "_s" e deixar "scanf".

 

Espero ter ajudado.

olha fiz como você disse e não funcionou aqui.

adicionado 8 minutos depois

tá vou fazer uma outra pergunta relacionada a essa atividade 

digamos que eu queira colocar a lista feita em um arquivo (.txt) como eu faço esse procedimento para implantar no algorítimo atual.

Link para o comentário
Compartilhar em outros sites

3 horas atrás, LuisOPsum disse:

Olá!

É muito simples: onde tem scanf_s, deve tirar o "_s" e deixar "scanf".

 

Espero ter ajudado.

scanf_s está correto faz parte do C11, é e portável. mas a implementação da microsoft não é.

 

3 horas atrás, Soratari disse:

tá vou fazer uma outra pergunta relacionada a essa atividade 

digamos que eu queira colocar a lista feita em um arquivo (.txt) como eu faço esse procedimento para implantar no algorítimo atual.

tem que trabalhar com arquivos

#include <stdio.h>

int main(void)
{
  FILE *arq=fopen("Nome_qualquer.txt","w+");
  if(arq==NULL)
  {
    printf("\nErro.\n");
    return(-1);
  }
  fprintf(arq,"Abra o arquivo!");
  fclose(arq);
  return(0);
}

um tutorial um pouco mais completo http://www.ufjf.br/jairo_souza/files/2009/12/3-Arquivos-Manipulação-de-arquivos-em-C.pdf

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

Olá!

O teste que eu tinha feito usando o "scanf" foi pelo DevC++, que funcionou sem problema, e claro que você esta usando o Visual Studio, pensei que também e a funcionar sem problema. Outra que eu tava sem esse programa, ai eu tive que instalar na minha maquina e resolver de forma transparente. O que eu fiz foi só usar o"using namespace std;", e um pouco abaixo das bibliotecas, lá em "inte main" bem lá abaixo, eu adicionei "int argc, char* argv[]", e bem no fim, adicionei o " system("PAUSE");
    return EXIT_SUCCESS;", e o executável é gerado sem problema.

Quanto a outra dúvida, o conteúdo do @KXSY é bem mais produtivo!

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

using namespace std;

struct playlist_musical {
	char musica[50], cantor[50];
	float tempo;
	struct playlist_musical* prox;
}; struct playlist_musical* inicio, * meio, * fim, * aux;


void inserirmusica()
{
	int c;
	playlist_musical* novo = (struct playlist_musical*) malloc(sizeof(struct playlist_musical));

	printf("Selecione a musica\n");
	fgets(novo->musica, 49, stdin);

	printf("Selecione o artista");
	fgets(novo->cantor, 49, stdin);

	printf("Duracao da musica");
	scanf_s("%f", &novo->tempo);

	while ((c = getchar()) != 'n' && c != EOF) {}
	novo->prox = NULL;
	if (inicio == NULL)
	{
		inicio = fim = novo;
	}
	else
	{
		fim->prox = novo;
		fim = novo;
	}
}
void limpar_lista()
{
	char ch;
	if (inicio == NULL)
	{
		printf("\nLista");
	}
	else
	{
		printf("s\n");
		ch = getchar();
		if (ch == 's');
		while (inicio != NULL)
		{
			aux = inicio;
			inicio = inicio->prox;
			free(aux); // limpar memoria
		}
		printf("\n Lista vazia");
	}

}

void visualizar_lista()
{
	aux = inicio;
	if (inicio == NULL)
	{
		printf("\n Lista Vazia");
	}
	else
	{
		while (aux != NULL)
		{
			printf("musica:%s", aux->musica);
			printf("cantor:%s", aux->cantor);
			printf("duracao: %f\n", aux->tempo);
			aux = aux->prox;
		}
	}

}

void procurar_musica()
{
	aux = inicio;
	if (inicio == NULL)
	{
		printf("\n Lista vazia");
	}
	else
	{
		char musica[50];
		printf("Digiete a faixa:");
		scanf_s("%s", &aux);

		while (aux != NULL)
		{
			if (musica == aux->musica)
			{
				printf("\n Musica %s encontrada\n", aux->musica);
				printf("musica: %s", aux->musica);
				printf("cantor:%s\n", aux->cantor);
				return;
			}
			else
			{
				aux = aux->prox;
			}
		}
		if (aux == NULL)
		{
			printf("\n Musica %s nao encontrada", musica);
		}
	} printf("\n");
}

int main(int argc, char* argv[])
{
	setlocale(LC_ALL, "");
	int opc, c;

	do
	{
		printf("1 Inserir Musica\n");
		printf("2 Procurar Musica\n");
		printf("3 Ver Lista\n");
		printf("4 Limpar Lista\n");
		printf("5 Sair\n");

		printf("Escolha uma opcao");
		scanf_s("%d", &opc);
		while ((c = getchar()) != '\n' && c != EOF); {}

		switch (opc)
		{
		case 1:
		{
			inserirmusica();
			system("pause");
			break;
		}
		case 2:
		{
			procurar_musica();
			system("pause");
			break;
		}
		case 3:
		{
			visualizar_lista();
			system("pause");
			break;
		}
		case 4:
		{
			limpar_lista();
			system("pause");
			break;
		}
		default:
			printf("Opcao nao existe");
			break;
		}
		system("cls");

	} while (opc != 5);

	return 0;
	system("PAUSE");
	return EXIT_SUCCESS;
}

Espero ter ajudado.

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

28 minutos atrás, LuisOPsum disse:

Olá!

O teste que eu tinha feito usando o "scanf" foi pelo DevC++, que funcionou sem problema, e claro que você esta usando o Visual Studio, pensei que também e a funcionar sem problema. Outra que eu tava sem esse programa, ai eu tive que instalar na minha maquina e resolver de forma transparente. O que eu fiz foi só usar o"using namespace std;", e um pouco abaixo das bibliotecas, lá em "inte main" bem lá abaixo, eu adicionei "int argc, char* argv[]", e bem no fim, adicionei o " system("PAUSE");
    return EXIT_SUCCESS;", e o executável é gerado sem problema.

Quanto a outra dúvida, o conteúdo do @KXSY é bem mais produtivo!


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

using namespace std;

struct playlist_musical {
	char musica[50], cantor[50];
	float tempo;
	struct playlist_musical* prox;
}; struct playlist_musical* inicio, * meio, * fim, * aux;


void inserirmusica()
{
	int c;
	playlist_musical* novo = (struct playlist_musical*) malloc(sizeof(struct playlist_musical));

	printf("Selecione a musica\n");
	fgets(novo->musica, 49, stdin);

	printf("Selecione o artista");
	fgets(novo->cantor, 49, stdin);

	printf("Duracao da musica");
	scanf_s("%f", &novo->tempo);

	while ((c = getchar()) != 'n' && c != EOF) {}
	novo->prox = NULL;
	if (inicio == NULL)
	{
		inicio = fim = novo;
	}
	else
	{
		fim->prox = novo;
		fim = novo;
	}
}
void limpar_lista()
{
	char ch;
	if (inicio == NULL)
	{
		printf("\nLista");
	}
	else
	{
		printf("s\n");
		ch = getchar();
		if (ch == 's');
		while (inicio != NULL)
		{
			aux = inicio;
			inicio = inicio->prox;
			free(aux); // limpar memoria
		}
		printf("\n Lista vazia");
	}

}

void visualizar_lista()
{
	aux = inicio;
	if (inicio == NULL)
	{
		printf("\n Lista Vazia");
	}
	else
	{
		while (aux != NULL)
		{
			printf("musica:%s", aux->musica);
			printf("cantor:%s", aux->cantor);
			printf("duracao: %f\n", aux->tempo);
			aux = aux->prox;
		}
	}

}

void procurar_musica()
{
	aux = inicio;
	if (inicio == NULL)
	{
		printf("\n Lista vazia");
	}
	else
	{
		char musica[50];
		printf("Digiete a faixa:");
		scanf_s("%s", &aux);

		while (aux != NULL)
		{
			if (musica == aux->musica)
			{
				printf("\n Musica %s encontrada\n", aux->musica);
				printf("musica: %s", aux->musica);
				printf("cantor:%s\n", aux->cantor);
				return;
			}
			else
			{
				aux = aux->prox;
			}
		}
		if (aux == NULL)
		{
			printf("\n Musica %s nao encontrada", musica);
		}
	} printf("\n");
}

int main(int argc, char* argv[])
{
	setlocale(LC_ALL, "");
	int opc, c;

	do
	{
		printf("1 Inserir Musica\n");
		printf("2 Procurar Musica\n");
		printf("3 Ver Lista\n");
		printf("4 Limpar Lista\n");
		printf("5 Sair\n");

		printf("Escolha uma opcao");
		scanf_s("%d", &opc);
		while ((c = getchar()) != '\n' && c != EOF); {}

		switch (opc)
		{
		case 1:
		{
			inserirmusica();
			system("pause");
			break;
		}
		case 2:
		{
			procurar_musica();
			system("pause");
			break;
		}
		case 3:
		{
			visualizar_lista();
			system("pause");
			break;
		}
		case 4:
		{
			limpar_lista();
			system("pause");
			break;
		}
		default:
			printf("Opcao nao existe");
			break;
		}
		system("cls");

	} while (opc != 5);

	return 0;
	system("PAUSE");
	return EXIT_SUCCESS;
}

Espero ter ajudado.

é o executável está funcional mas ainda sim apresenta o mesmo erro.
a unica opção que não funciona de maneira alguma é a Primeira para adicionar a musica.

Link para o comentário
Compartilhar em outros sites

Em 02/04/2020 às 14:53, Soratari disse:

é o executável está funcional mas ainda sim apresenta o mesmo erro.
a unica opção que não funciona de maneira alguma é a Primeira para adicionar a musica.

Aqui não compilou.

485603303_Erro_compilao.thumb.png.15da642451a0dea065e5d3ca0bdaa286.png

 

Programas muito complexos não são criados de uma vez só, você deve dividi-lo em pedaços menores é entender como o programa deve funcionar antes de implementar.

 

Você precisa aprender corretamente como funciona ponteiros para implementar a lista. De uma olhada no canal MeSalva! no youtube para entender melhor.

Aqui vai um exemplo de lista ligada.

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

/* Constantes */
#define T_N_ARTISTA 20
#define T_N_BANDA 10
#define T_N_MUSICA 10

/* Tipos */
typedef struct
{
  char n_artista[T_N_ARTISTA];
  char n_banda[T_N_BANDA];
  char n_musica[T_N_MUSICA];
  unsigned char minutos,segundos;
}musica_t;

typedef struct Lista
{
  musica_t musica;
  struct Lista *proximo;
}lista_t;

int main(void)
{
  lista_t *inicio=NULL,*fim=NULL;
  inicio=malloc(sizeof(lista_t));   /* Cria o primeiro nó na lista */
  /* Pega as informações da musica */
  printf("\nDigite o nome da banda:\t");
  fgets(inicio->musica.n_banda,T_N_BANDA,stdin);
  printf("\nDigite o nome do cantor:\t");
  fgets(inicio->musica.n_artista,T_N_ARTISTA,stdin);
  printf("\nDigite o nome da musica:\t");
  fgets(inicio->musica.n_musica,T_N_MUSICA,stdin);
  printf("\nDigite o total de minutos da musica:\t");
  scanf("%hhu%*c",&inicio->musica.minutos);
  printf("\nDigite o total de segundos da musica:\t");
  scanf("%hhu%*c",&inicio->musica.segundos);
  fim=inicio;   /* Pega o endereço do ponteiro */
  fim->proximo=malloc(sizeof(lista_t));   /* Cria o proximo nó na lista */
  fim=fim->proximo;
  /* Pega as informações da musica */
  printf("\nDigite o nome da banda:\t");
  fgets(fim->musica.n_banda,T_N_BANDA,stdin);
  printf("\nDigite o nome do cantor:\t");
  fgets(fim->musica.n_artista,T_N_ARTISTA,stdin);
  printf("\nDigite o nome da musica:\t");
  fgets(fim->musica.n_musica,T_N_MUSICA,stdin);
  printf("\nDigite o total de minutos da musica:\t");
  scanf("%hhu%*c",&fim->musica.minutos);
  printf("\nDigite o total de segundos da musica:\t");
  scanf("%hhu%*c",&fim->musica.segundos);
  fim->proximo=NULL;    /* Define o final da lista */
  /* Pega o inicio da lista */
  fim=inicio;
  while(fim!=NULL)    /* Faz enquanto fim é diferente de NULL */
  {
    lista_t *temp;
    temp=fim->proximo;
    printf("\nNome da band;\n%s",fim->musica.n_banda);
    printf("\nNome do cantor\n%s",fim->musica.n_artista);
    printf("\nNome da musica\n%s",fim->musica.n_musica);
    printf("\nDuração total\n%hhu:%hhu",fim->musica.minutos,fim->musica.segundos);
    free(fim);    /* Apaga o nó */
    fim=temp;     /* Pega o proxímo nó */
  }
  getchar();    /* Pausa o programa */
  return(0);
}

Material de apoio

unicamp lista encadeada.

usp aulas de algorítimo.

 

Outros tópicos parecidos no fórum. (Eu acho que eles são seus colegas de classe)

Trabalho Faculdade elaborar um player de musica em C

Emulador de um player em linguagem C

 

 

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

Em 31/03/2020 às 20:15, KXSY disse:

Wtf... porque as pessoas ainda insistem em usar o visual studio para C?

 

Não vejo porque não.

  • As empresas usam fortemente isso. É praticamente o padrão da indústria.
  • É muito popular nas universidades
  • É rápido e sólido
  • Pode usar de graça
  • Integrado com tudo que importa. Em especial com git, ainda mais agora que a Microsoft comprou o github
  • Fácil transição para escrever em outras linguagens ou trabalhar em projetos multi-linguagem
  • Live share permite fazer trabalho em grupo revendo os fontes pela internet ao  mesmo tempo até 30 caras. Ou mesmo o programa do autor aqui do tópico. E de graça. Antes essas coisas de time só rodavam nas versões muito caras. Agora é de graça.
  • Inteligência Artificial sugere os parâmetros e completa. Muito esperto
  • O debugger é muito bom. Tem tudo.
  • Fácil de ver o código gerado
  • Refactoring é fácil
  • Navegar por projetos grandes é um passeio
  • O ambiente é claro autalizado constantemente. Uma versão nova saiu ontem eu acho. É integrado com provavelmente tudo que é importante, de bancos de dados a servidores a git. 
  • Documentação gigante 


    image.png.dbd19c84d94d69f3a8e7a2e014a9217f.png
    @Soratari  Essas '_s()' são chamadas versões seguras, safe, dessas rotinas tradicionais. Você não é obrigado a usar isso. Se vai usar, apenas posicione o cursor no parenteses depois no nome da função, tipo scanf_s() e espere para ver a lista de parâmetros na tela, e preencha como está escrito aí na mensagem...

    E aí está escrito que falta o argumento inteiro 2. Olha ele no exemplo da documentação, até com um botão para copiar para a área de trasferência, em https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/scanf-s-scanf-s-l-wscanf-s-wscanf-s-l?view=vs-2019

image.png.d162cfde513a5558968e6b6cbf4fd802.png

 

Mas se você quer usar as rotinas de sempre basta incluir esse define

#define _CRT_SECURE_NO_WARNINGS

no início de seu programa ou configurar nas opções do Visual Studio.  

Na verdade você poderia ter copiado esse nome direto da mensagem de erro que aparece toda vez que você tenta usar scanf() por exemplo. Apareceu na tela...... Veja

image.thumb.png.b430f9a3687d7e7a65950dcec6856d58.png
 

Em 31/03/2020 às 20:15, KXSY disse:

Seguinte o seu problema maior e na implementação da lista ligada, recomendo você fazer uma lista simples primeiro e só depois reimplementar com as funções para você compreender como funciona

 

Tem toda razão. É o mais rápido e seguro. O melhor que pode fazer.

  • E separe os dados da estrutura. Uma lista é uma lista. Não é uma playlist. Uma playlist é que é uma lista
     
  • Use os parâmetros de retorno. Cada vez que declara uma função dessas como void() está perdendo uma oportunidade. 
     
  •  Use os argumentos. E apenas endereços, ponteiros. E de estruturas.
     
  • Não misture comandos de leitura nas rotinas que manipulam a lista. Só vai atrasar você. Faça o simples.

    Imagine que você tivesse declarado inserir() como: 
     
            Lista*  inserir_na_playlist(Musica*, Lista*);

    E aí você cria uma struct Musica de teste e testa sua lista simplesmente passando o endereço da lista e o da música nova. E pegando de volta o endereço de início da lista, que pode ter mudado.

Um programa  de teste, inteiro
 

Eu postei um programa de teste em C, não é muito bom mas tem o tal menu, lê e grava no disco e tem essas funções básicas de lista. Postei em outro tópico aqui e pode ver em https://github.com/ARFNeto-CH/chc-200402play e baixar com um click no botão verde. Graças a eu usar o visual studio ou eu não teria tempo de fazer uploads ;) 

Veja o código abaixo por exemplo: tem uma função de teste chamada fabrica() --- nome pobre eu sei --- e cada vez que você chama essa rotina ela devolve uma música. Todinha preenchida. Sem digitar p#$$a nenhuma. Então você pode por num loop e gerar 500 músicas ou 5. Entende a diferença? Ou você pode ficar na frente da tela digitando no menu a cada vez que vai testar sua lista ligada...

    // agora cria umas musicas e grava na saida
    for (int i = 0; i < 10; i = i + 1)
        playlist = inserir((void*)fabrica(1), playlist);
    n = listar(playlist);

 

image.png

image.png

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

45 minutos atrás, vangodp disse:

você arranca isso num computador meio velho e trava tudo shuehsue

 

Entendo :D 

 

@Soratari Estava sem sono e fui ver o código do seu programa...

 

Nem compilava, como sabe. 

 

Mas só vou comentar duas coisas além das 200 que falei

 

Sobre procurar_musica()

void procurar_musica()
{
	aux = inicio;
	if (inicio == NULL)
	{
		printf("\n Lista vazia");
	}
	else
	{
		char musica[50];
		printf("Digite a faixa:");
		scanf_s("%s", &aux);

		while (aux != NULL)
		{

Tem o problema lá com scanf_s() porque você não leu a mensagem e nem viu a documentação falando sobre o tal parâmetro 2. Mas o problema é muito maior.

  • Como assim?

        aux = inicio;

    Isso porque aux e inicio (e tambem meio e fim) são ponteiros declarados lá no início do seu programa.
    Acho que 4 ponteiros GLOBAIS com esse nome para uma única lista são sinal de problema. E acho que eu tenho razão porque num programa pequeno você já zoou com um deles numa rotina e vai destruir justo o inicio de sua lista...
     

    Citação

    Não use variáveis globais a menos de alguém com dinheiro te pagando ou uma arma de fogo te obrigando. Isso só dá problema. E uma variável global ponteiro de uma estrutra de dados chamada aux? :(

     

 E aí você não passa o parâmetro de comprimento da string, que é justamente a diferença entre essa rotina e a scanf(): Para evitar coisas como a injeção de códigos por hackers em strings mal-formadas (como essa sua que corrompe um ponteiro global) essas rotinas safe exigem que você passe para cada valor o tamanho. E aí seria o suficiente para ler o número da faixa na tela... Exemplo

    n = scanf_s(""%s", &aux, 4); // por exemplo


Se acha muito chato, como eu acho, e fora de contexto num programa que não é de produção, use o define que expliquei e que aparece na tela do seu compilador toda vez que você usa sanf() ou strcpy() ou sei lá
 

#define _CRT_SECURE_NO_WARNINGS

e como eu sempre escrevo isso, vou repetir: teste o valor de retorno de scanf(). É bom para voce



Sobre inserirmusica()
 

    while ((c = getchar()) != 'n' && c != EOF) {};

    if (inicio == NULL)
	{
		inicio = fim = novo;
	}
	else
	{
		fim->prox = novo;
		fim = novo;
	}

Como te disse antes, é um tiro no pé ler valores do usuário em rotinas que manipulam a sua estrutura de dados. Nunca dá certo. E eu devo ter razão porque aqui não deu também. Só atrasa os testes do seu programa.

 

E porque deu erro?

 

Onde você inicializou seus importantes 4 ponteiros globais para sua única lista? Os tais inicio, fim, meio, aux? Em lugar algum. E assim esse teste  if ( inicio == NULL ) não vai rolar.

 

E é só isso? Não

 

Como você está lendo os dados na própria rotina de inserção, um erro na entrada de dados quebrou sua rotina de inserção. Claro, ela já estava errada por essa outra razão.

 

Não sei porque resolveu colocar esse loop bem aí:

   

 while ((c = getchar()) != 'n' && c != EOF) {};

Mas aposto que pretendia escrever '\n' e não 'n'. E aí o programa fica lá parado até você teclar um 'n' ou um control-Z

 

Como nenhum dos dois provavelmente te ocorreu achou que tinha erro com a lista. E tinha na verdade.

 

 

Sugiro ler o exemplo que eu postei. Não é um bom programa, mas vai ajudar. E a estrutura que eu postei acima é melhor.

 

Link para o comentário
Compartilhar em outros sites

8 horas atrás, arfneto disse:

Não vejo porque não.

Eu poderia colocar varias coisas há mais nessa lista, como ele suportado em vários sistemas.

Mas tem uma coisa que me incomoda nele, Ele tem um compilador de C medíocre (Eu sei que dá para usar outro).

Outro fator bacana dele é

8 horas atrás, vangodp disse:

@arfneto vou adicionar mais uma coisa nessa lista sua.... "Pesado pra *******" 🤣

 

você arranca isso num computador meio velho e trava tudo shuehsue.

fora que aquele autocomplete mais atrapalha do que ajuda pra quem está começando a programar.

Link para o comentário
Compartilhar em outros sites

1 hora atrás, KXSY disse:

Eu poderia colocar varias coisas há mais nessa lista, como ele suportado em vários sistemas.

Mas tem uma coisa que me incomoda nele, Ele tem um compilador de C medíocre (Eu sei que dá para usar outro).

 

É um argumento curioso mas que eu respeito. Deve imaginar que o compilador da C da Microsoft foi usado para escrever projetos mais ou menos grandes nos últimos tempos, como o Office, o Windows, grandes sistemas financeiros de missão crítica, ferramentas de desenvolvimento e tal. E não se sairam assim tão mal.

"medíocre" em negrito é sua opinião pessoal ou alguma grande empresa que desenvolve em Windows teria abandonado esse compilador em favor de outro compilador C desde os 80?

 

1 hora atrás, KXSY disse:

Outro fator bacana dele é

10 horas atrás, vangodp disse:

@arfneto vou adicionar mais uma coisa nessa lista sua.... "Pesado pra *******" 🤣

 

você arranca isso num computador meio velho e trava tudo shuehsue.

 

Bem, eis o que posso dizer: quando eu escrevo para esse forum eu me prometi usar um tempo e uma máquina só. Para  evitar sair de meu ambiente, instalar outroas coisas e tal.
Confesso que instalei o Code::blocks e o gcc porque fiquei curioso por algum tema. E o Visual Studio Code para testar algum programa do forum no linux via WSL2 sem sair da mesa ou conectar a outras máquinas e acabar atrapalhando minhas coisas.

Essa tal máquina fica no canto do escritório. O processador por exemplo é um Intel Q9550. De 2008. Roda Windows 10 e tem esse Visual Studio e muitas outras coisas instaladas. Muitas mesmo. E o desempenho não ganharia nenhuma medalha mas é bem razoável. Especialmente depois que o ambiente está carregado. Raramente leva mais que uns 2 ou 3 segundos para compilar o tipo de programa que um estudante escreve aqui. 

 

1 hora atrás, KXSY disse:

fora que aquele autocomplete mais atrapalha do que ajuda pra quem está começando a programar

 

Essa é outra opinião curiosa, que também respeito. Imagino que deva ter um argumento para justificar. No entanto veja aqui, mesmo nesse tópico ou em algum que você leia, que hoje em dia no BR os alunos aparentemente sequer cogitam de ter um livvro texto ou acessar um manual. E aqui mesmo o autor do tópico não conseguiu se acertar com os argumentos de uma função de biblioteca, scanf().

Isso sugere que autocomplete, acesso online à documentação e acesso aos parâmetros das funções na tela sejam algo positivo para os alunos.

Para os profissionais é claro que ler a documentação é uma rotina.

 

E escolher o ambiente de desenvolvimento geralmente não.

Se sua empresa ou cliente usa Visual Studio, Visual Studio será. Se usa Eclipse, então Eclipse. Se sua universidade usa os compiladores da Intel (e há boas razões para isso) então você vai usar. NetBeans em C e C++ porque você está em uma empresa centrada em java? É a vida. Code::blocks? ok, se achar alguma que usa você vai ter que usar. LLVM? Que seja.

Nem mesmo a linguagem a gente consegue escolher. . . Tente entrar em uma reunião com um cliente e aventar a ideia de começar a escrever o projeto do zero em Go ou Rust porque é mais adequado e moderno...

 

E como escrever um programa? As chaves vão embaixo do if ou na mesma linha? as empresas em geral (e mesmo escolas) tem regras rígidas até de formatação e de uso de editores de texto. Atom, Sublime, vi, NotePad? Editor+2020? OK OK

 

Usar Visual Studio, Eclipe e NetBeans ao menos de um modo iniciante é bom para qualquer um. Nunca se sabe em que porta a gente vai bater. E para poder bater em mais portas Visual Studio é uma boa ajuda. IMHO

 

:( off-topic, é verdade. Só pra passar o tempo em tempos de quarentena

Link para o comentário
Compartilhar em outros sites

1 hora atrás, arfneto disse:

É um argumento curioso mas que eu respeito. Deve imaginar que o compilador da C da Microsoft foi usado para escrever projetos mais ou menos grandes nos últimos tempos, como o Office, o Windows, grandes sistemas financeiros de missão crítica, ferramentas de desenvolvimento e tal. E não se sairam assim tão mal.

Em C mesmo? nunca vi, mas ele tem um ótimo compilador de C++

mas em resumo. eu posso está engando neste momento.

Vs-roadmap

Eu utilizei o visual studio ano passado, é esse ano ao que aparenta ele tem (ou vai ter) um suporte mais adequado ao C11. então foi mal pelo erro aí.

2 horas atrás, arfneto disse:

Essa é outra opinião curiosa, que também respeito. Imagino que deva ter um argumento para justificar.

Sim, imagine se você é um fotografo que nunca tira fotos ou um atirador que nunca atira.

tudo na vida requer treino, é o autocomplete retira metade do esforço que a pessoa precisa para compreender o que ela está fazendo e o por que de fazê-lo.

 

Eu não estou de modo algum demonizando as IDEs, eu mesmo já usei muitas como Genny, lazarus e delphi esse ultimo tem ficado cada vez melhor de uns anos pra cá.

Mas eventualmente você vai cair em um problema que a IDE não vai ajudar ou pior vai é atrapalhar, então aprender a trabalhar com o compilador e suas ferramentas diretamente e o melhor para quem está aprendendo.

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

 

7 horas atrás, arfneto disse:

Raramente leva mais que uns 2 ou 3 segundos para compilar o tipo de programa que um estudante escreve aqui. 

Eu sei que é bom, mas tenta abrir varias ferramentas em um soquete 775 de 32bits junto com o visual studio instalada. Tenta abrir o firefox, com youtube(não abra muitas pestanas shuesheu), e logo tente gravar a tela com tudo isso e me conte se consegue. Não vai dizer que estou pedindo muito sheushuehse.

Certamente você n tem esses problema mas eu ja passei por isso. Realmente não da!

 

adicionado 1 minuto depois
8 horas atrás, arfneto disse:

O processador por exemplo é um Intel Q9550

eu tinha um parecido a esse e por isso to falando

 

8 horas atrás, arfneto disse:

tem esse Visual Studio e muitas outras coisas instaladas

ter instalado é uma coisa ter tudo rodando é outra... prova o que eu te falei.

adicionado 2 minutos depois

você vai se frustrar se acha que pode trabalhar com isso.

Link para o comentário
Compartilhar em outros sites

42 minutos atrás, vangodp disse:

ter instalado é uma coisa ter tudo rodando é outra... prova o que eu te falei.

adicionado 2 minutos depois

você vai se frustrar se acha que pode trabalhar com isso.

 

Bem, não sei o que dizer. Essa é a máquina que eu procuro usar para várias coisas porque basicamente é a maquina do canto e fica mais confortável quando eu tenho tempo. E não é estranho ter dezenas de janelas de documentação e Youtube e sei lá o que. Muitas vezes tem mais de uma sessão de Visual Studio e as vezes VScode rodando javascipt/React. E isso implica em um servidor web rodando na mesma máquina. Não é incomum estar acessando mais uma ou outra máquina externa via TeamViewer ou VNC ou ssh. Quase sempre tem uma janela aberta com uma sessão no meu servidor VOIP. E essa máquina tem mais de 1 milhão de arquivos nos discos.

 

Assim é. Provavelmente não sou um usuário comum em termos de usar os sistemas ou configurar a máquina, mas não tenho problemas com esse ambiente. 

 

Há muito não rodo sistemas de 32 bits nela exceto alguma máquina virtual. Roda Windows 10 64 e tem 8GB de ram. Mas o Windows e as aplicações rodam num SSD. Isso deve ser a diferença

Link para o comentário
Compartilhar em outros sites

agora, arfneto disse:

E não é estranho ter dezenas de janelas de documentação e Youtube e sei lá o que

tá mas diz ai qual é a configuração completa do equipo?

adicionado 11 minutos depois

era 64 bits? tem 4 gigas de ram. esse processador seu é de mais de 3 gigas e é 4 núcleos certo? o meu só tinha 2 se n me lembro bem.

adicionado 12 minutos depois

E era de 2,6 gigas

adicionado 12 minutos depois

ddr2 ou ddr3? bom disco duro? tipo sata 2 ou 3?

adicionado 13 minutos depois

muitas variantes que influenciam. essa maquina sua é boa comparada com a minha.

adicionado 13 minutos depois

minha "antinga". porque agora tenho um 3950x hsuehusheu

Link para o comentário
Compartilhar em outros sites

2 horas atrás, vangodp disse:

tá mas diz ai qual é a configuração completa do equipo?

adicionado 11 minutos depois

era 64 bits? tem 4 gigas de ram. esse processador seu é de mais de 3 gigas e é 4 núcleos certo? o meu só tinha 2 se n me lembro bem.

adicionado 12 minutos depois

E era de 2,6 gigas

adicionado 12 minutos depois

ddr2 ou ddr3? bom disco duro? tipo sata 2 ou 3?

adicionado 13 minutos depois

muitas variantes que influenciam. essa maquina sua é boa comparada com a minha.

adicionado 13 minutos depois

minha "antinga". porque agora tenho um 3950x hsuehusheu

 

É como eu disse, uma máquina de uns 10 anos atrás. Roda Windows 10 64 em um Q9550 a 2.83 Ghz. Roda em 8GB de DDR3 as vezes 12 ou 16 quando uso rendering. Mas tem um SSD de 500GB onde roda o sistema e as aplicações e um HD 7200 de 3TB com milhões de coisas. Tem WSL2 e VirtualBox com umas outras máquinas, mas não uso ao mesmo tempo.

E não tem dados de clientes ou servidores importantes ou bancos de dados e tal. Assim uso essa para acessar foruns e testar coisas. E fica no canto num lugar bom :) 

Só citei isso porque é uma máquina bem antiga e roda até bem essas coisas. Tem umas mais novas aqui mas não daria  pra usar sem comprometer outras coisas ou gastar um tempo

Link para o comentário
Compartilhar em outros sites

Só por você ter 4 núcleos e mais de 4 gigas de ram ddr3 nem vou falar mais nada... é como comparar vinho e agua. O meu tinha 2 núcleos a 2,6 gigas, 4 gigas de ram ddr2, no qual o sistema era de 32bits e só reconhecia 3,4. Na pagina do fabricante da placa-mãe falava que sem chances de atualizar. era um buraco sem fundo atualizar isso. tinha que trocar placa, processador, memória ram, disco duro... praticamente tudo, e o rendimento n seria tão bestial assim. É muita diferença.

Sem falar que dependendo do que você instalar no vs pode ocupar até 70 gigas shuesueuh.

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

  • 2 meses depois...

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