Ir ao conteúdo

C++ O Código apresenta erro em uma declaração e não compila


Ir à solução Resolvido por devair1010,

Posts recomendados

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

int menu(); //função do menu
void inserir(); //função inserir
void listar(); //função listar

struct Lista {
	char musica[50], artista[50];
	float duracao;
	struct Lista* prox;
}; *Head; //estrutura heterogênea de dados

int main()
{
	int continuar = 1;

	Head = NULL;


	do
	{
		printf("1.Inserir no inicio da lista \n");
		printf("2.Listar\n");
		printf("0.Sair\n");

		scanf_s("%d", &continuar);
		system("cls || clear"); //sempre limpar

		switch (continuar)
		{
		case 1:
			inserir();
			break;

		case 2:
			listar();
			break;

		case 0:
			return 0;
			break;

		default:
			printf("Digite uma opção valida \n");
		}
	} while (continuar);
}

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

	printf("1.Inserir no inicio da lista \n");
	printf("2. Listar\n");
	printf("0.Sair\n");

	printf("Digite Sua Escolha: ");

	scanf_s("%d", &op);
	while ((c = getchar()) != '\n' && c != EOF) {} //limpar o buffer do teclado

	system("Cls");
	return op;
}

void inserir()
{
	Lista* NovoElemento;
	NovoElemento = (struct Lista*)malloc(sizeof(struct Lista)); // aloca espaço para um bloco

	printf("\nInserir nome da musica:");
	scanf_s("%s", NovoElemento->musica);
	system("Cls");

	printf("\nInserir nome do artista:");
	scanf_s("%s", NovoElemento->artista);
	system("Cls");


	printf("inserir duração da musica?");
	scanf_s("%f", &NovoElemento->duracao);
	system("Cls");

	if (Head == NULL) //se nulo insere na primeira posição
	{
		Head = NovoElemento;
		Head->prox = NULL;
	}
	else
	{//move o head para o proximo e inserir o novo na primeira posição
		NovoElemento->prox = Head;
		Head = NovoElemento;
	}
}

void listar() //listar
{
	Lista* ElementoVarredura;
	ElementoVarredura = (struct Lista*)malloc(sizeof(struct Lista));

	ElementoVarredura = Head;
	if (ElementoVarredura == NULL) {
		printf("\n Lista Vazia!");
		return;
	}
	while (ElementoVarredura != NULL) {

		while (ElementoVarredura != NULL) {
			printf("musica: %s\n", ElementoVarredura->musica);
			printf("artista: %s\n", ElementoVarredura->artista);
			printf("duração: %f\n", ElementoVarredura->duracao);
			ElementoVarredura = ElementoVarredura->prox;
		}

	}

	printf("\n");

	system("pause");
	system("cls || clear");
	return;
}

To com problema pra fazer o codigo funcionar, e não consigo resolver. ;_;

 

 

 

cod.docx

  • Obrigado 1
  • Solução
Postado

@Nozdog    para compilar no visual studio ,  delete essa vírgula depois da chave da struct 

struct Lista 
{
    char   musica[50], 
           artista[50];
    float  duracao;
    struct Lista* prox;
}; *Head;      // essa virGula  antes do Head

ficaria assim:

struct Lista 
{
    char   musica[50], 
           artista[50];
    float  duracao;
    struct Lista* prox;
} *Head;       // estrutura heterogênea de dados

 

  • Curtir 1
  • Obrigado 1
  • 2 semanas depois...
Postado
int  menu();     // função do menu
void inserir();  // função inserir
void listar();   // função listar

struct Lista
{
    char          musica[50], artista[50];
    float         duracao;
    struct Lista* prox;
};
*Head;  // estrutura heterogênea de dados

int main()
{

 

Como @devair1010 te disse, tem erros em seu programa e em especial o ';' perdido.

 

Mas o programa tem muitos outros problemas. Mesmo que acabe funcionando assim é uma maneira ruim. Vai dar um trabalho do inferno para rodar. É frágil e ruim de testar e tem muitos dos "erros" que sempre aparecem aqui nos programas de iniciantes. Isso provavelmente porque os autores livros e instrutores não são assim uma beleza e rezam por uma cartilha problemática.

 

Eis alguns problemas, que estou copiando de uma lista de tão comuns

  • NUNCA declare coisas soltas fora de main(). Isso se torna global e válido no programa todinho. Isso é um desastre. Proibido em toda parte, escolas (sérias) empresas e guias de boas práticas em toda empresa.
  • Não use acentos em comentários. Pouco acrescenta e pode não sair em qualquer tela.
  • Ao declarar uma coisa entenda que declara um NOME e associa a um TIPO. No caso aqui declara Head.
    • E qual o tipo de Head? Seu compilador te diria rapidinho: é struct Lista*. E é óbvio que se Head é struct Lista* então
    • *Head é struct Lista porque é C. O simples.
  •  Não use system() para nada. Não estará fazendo nada. Não há praticamente nada que possa fazer com system() que não possa fazer em C ou C++. system() foi escrita em C e o sistema quase todo também. E em geral é proibido em empresas e escolas afinal: é um risco grande de segurança. E se tem algo que você não possa inicialmente fazer em C ou C++ talvez não deva mesmo fazer
  • evite retornar void de funções: em geral é um desperdício. Muitas vezes um erro. Use argumentos nas funções, e retorne algo delas

  • Nunca leia valores do teclado para alimentar seu programa antes dele estar rodando. Só vai te atrasar e não acrescenta absolutamente nada. Use constantes, use funções que retornam a estrutura preenchida. Ao terminar os  testes aí sim incorpore a leitura. Um programa interativo é chato para testar. Durante o desenvolvimento ninguém quer interagir com o programa

  • scanf() foi escrita para ler entrada formatada. Não use para ler do teclado, que claramente não é entrada formatada. Só vai dar mais trabalho. Muito mais trabalho

  • Nunca escreva um programa interativo. Não vai aprender nada. Não vai ganhar nada. Escreva e teste todas as funções. DEPOIS de tudo testado coloque a parte interativa. isso inclui claro o eventual menu

  • Um printf() de 6 linhas é muito, mas muito melhor que 6 printf() de 1 linha. E se só vai mostrar o texto puts() é ainda melhor e dezenas de vezes mais rápido que uma série de printf()

  • Ao usar uma estrutura de dados como uma lista, uma pilha ou fila entenda que ela é um container e nada tem a ver com os dados. Não misture NUNCA os dados com a estrutura porque só via complicar tudo. Em especial vai ficar muito mais difícil aproveitar a estrutura em outros programas, e essa é toda a razão de escrever isso
     

O seu código e esses "problemas"
 

        scanf_s("%d", &continuar);

 

Teste o retorno. Qual o propósito de seguir sem testar já que é a própria opção do menu?

 

E se tem uma função menu porque duplicou o código aqui?

 

        printf("1.Inserir no inicio da lista \n");
        printf("2.Listar\n");
        printf("0.Sair\n");

 

Claro, use um printf() só.

 

        system("cls || clear");  // sempre limpar

 

Não use system(). De nada serve.

 

void inserir();  // função inserir
void listar();   // função listar


Não use void e sem argumentos. Isso é um desastre. Você vai inserir numa lista, listar uma lista. Cade a lista?
 

struct Lista
{
    char          musica[50], artista[50];
    float         duracao;
    struct Lista* prox;
};
*Head;  // estrutura heterogênea de dados

 

Não misture dados com a estrutura. Nada tem a ver. Só vai perder tempo. E não vai poder usar no próximo programa de lista e nem no próximo depois desse.

 

A lista é um container

 

Entenda: uma lista é uma lista. Ela não é de músicas. é de nós, nodes, elementos. Esses elementos é que são os dados. Tem o programa da playlist, o programa da biblioteca, o programa do estacionamento, tudo igualzinho: listas.

 

Considere também que uma lista que só tem ponteiro pra um lado é muito mais difícil de programar do que a que tem ponteiros para frente e para trás. O autor que chama essas listas de simples está só mentindo. Simples são as outras que tem os dois ponteiros. Porque? porque se tem ponteiro só pra um lado não dá pra navegar. Toda hora tem que se reposicionar. Basta imaginar um player de música que só tenha o botão >>> .

 

Exemplo

 

Considere sua lista

 

Escreva em torno dos dados
 

typedef struct
{
    char  nome[50];
    char  artista[50];
    float duracao;

}   Musica;

 

Seu dado é uma lista de músicas e Música é isso aí em cima. Se mudar de ideia e quiser incluir o nome do álbum, o ano, a gravadora ou o produtor só vai precisar mudar aí DENTRO. Essa é a noção de encapsulamento, mas nem precisa de um nome fashion. Só é esperto.

 

E a lista é de nós, nodes. Compare

 

typedef struct st_node
{
    Dado*           info;
    struct st_node* ant;
    struct st_node* prox;

}   Node;

 

Cada Node tem um info que é o dado. Pode ser qualquer coisa inclusive a sua música, Só que não precisa e não deve estar aí. Se fizer isso vai ter que mudar para todo programa ou mudar toda vez que inserir um campo na música. Pense nisso.

 

E a lista?

 

typedef struct
{
    Node*  ini;
    Node*  fim;
    size_t size;

}   Lista;

 

Pois é. A lista tem nodes. Não tem música. Nem p. nenhuma. Nem livro nem vaga nem nota fiscal nem cliente. Só Node.

Tem um ponteiro para o primeiro, um ponteiro para o último e o tamanho. Tudo DENTRO da lista. é muito mais simples. 

 

E onde entra a Musica?

 

    typedef Musica Dado;

 

Só isso. Então a conta fecha. A lista é sempre a mesma. Apenas inclui o dado para ESSE programa e a definição do dado e o programa continua funcionando ou dando erro.

 

Algo assim

 

#include <stdio.h>

typedef struct
{
    char  nome[50];
    char  artista[50];
    float duracao;

} Musica;

typedef Musica Dado;

typedef struct st_node
{
    Dado*           info;
    struct st_node* ant;
    struct st_node* prox;

} Node;

typedef struct
{
    Node*  ini;
    Node*  fim;
    size_t size;

} Lista;

 

Seria o começo de seu programa, antes de escrever qualquer linha de código. É muito mais simples.

 

	int listar(Lista*,const char*);
	int inserir(Musica*, Lista*);

 

listar() recebe dois parâmetros: a Lista, óbvio, e um título, porque é muito conveniente para testar.

 

inserir() insere uma música numa lista. O óbvio. E seu programa fica muito mais simples e seguro.

 

Sugiro considerar

 

 

 

 

  • Obrigado 2

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