Ir ao conteúdo

C Dificuldade com struct em C


Ir à solução Resolvido por Davi Silva Santos,

Posts recomendados

Postado

Olá, pessoal! Estou fazendo um exercício em C envolvendo struct e é pedido para fazer uma biblioteca contendo as informações de 5 livros (Titulo, Autor e Ano) e o usuário terá de pesquisar no programa o título do livro para obter tais informações.Acontece que eu preciso determinar no código os 5 livros e suas informações e não estou conseguindo atribuir tais valores. Eu deixei meu código assim mas dá erro (Aquele printf é apenas para testar):

 

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

struct estante{

    char titulo [30];
    char autor[15];
    int ano;
}

struct estante livros[5];

livros[0].titulo = 'Homo Deus';
livros[0].autor = 'Yuval Harari';
livros[0].ano = 2015;

int main(){

printf("%s %s %i", livros[0].titulo, livros[0].autor, livros[0].ano);
}

Alguém poderia me ajudar a atribuir informações para os livros?

  • Amei 1
  • Solução
Postado

Você pode inicializar a `struct` com os recursos do C99 (inicialização designada):

 

struct teste {
	char a[32];
	int b;
};

struct teste itens[] = {
	{
		.a = "abc",
		.b = 1,
	},
  	{
		.a = "def",
		.b = 2,
	},
  	{
		.a = "ghi",
		.b = 3,
	}
};

Deste modo a inicialização é mais rápida, não é necessário inicializar na ordem e os membros não inicializados são normalmente zerados se a `struct` está sendo alocada estaticamente. Fique atento para o fato de que uma `struct` sem elementos inicializados é inválida no C. Uma maneira alternativa é o uso dos literais compostos, mas eles são mais úteis em funções que retornam estruturas. Há também a inicialização clássica, que deve ser feita com os membros na ordem da declaração.

O seu código também está usando aspas simples, que em C denotam caracteres únicos e não strings.

  • Obrigado 1
  • Amei 1
Postado

 

Você tem um livro? Seu curso adota um livro? Se não tem recomendo muito usar algum.

 

Escreva seu programa em torno dos dados: essa não é uma estante:
 

struct estante{

    char titulo [30];
    char autor[15];
    int ano;
}

 

Sua estante teria livros dentro. E ficaria tudo mais fácil. Se deixar isso de fora vai ter que controlar no programa e isso vai deixar pontas soltas. Imagine se tiver 30 estantes...

 

O que representaria melhor o seu caso? Talvez uma estante onde cabem M livros, no momento com N livros, e cada livro teria um titulo, um autor e um ano. . . 
 

typedef struct
{
    char titulo [30];
    char autor[15];
    int ano;

}   Livro;

typedef struct
{
    unsigned  N;
    Livro     L[5];

}   Estante;

 

E aí pode declarar 
 

    Estante    estA;
    estA.N = 0; // sem livros no inicio

 

E se tiver um Livro de teste...

 

    Livro um = { "Titulo", "Autor", 2000 };

 

Ou pode usar coisas como sprintf()  para carregar a estante. Bem mais fácil que ficar preenchendo ou digitando a cada teste os 3 campos para cada livro...

 

Exemplo

 

Saida

 

Estante com 7 livros
 1:                       titulo 1           autor 1998
 2:                       Titulo10           autor 1998
 3:                       Titulo11           autor 1998
 4:                       Titulo12           autor 1998
 5:                       Titulo13           autor 1998
 6:                       Titulo14           autor 1998
 7:                       Titulo15           autor 1998

 

Desse programa

#include <stdio.h>

typedef struct
{
    char titulo[30];
    char autor[15];
    int ano;

}   Livro;

typedef struct
{
    unsigned  N;
    Livro     L[15];

}   Estante;

int main(void)
{
    Estante E;
    E.N = 0;
    // um livro de teste
    Livro um = { "titulo 1", "autor", 1998 };
    // poe na estanteA
    E.L[E.N] = um;
    E.N += 1; // guarda o livro
// poe outros livros usando sprintf() 
    for (int i = 10; i <= 15; i += 1)
    {
        sprintf(um.titulo, "Titulo%02d", i);
        E.L[E.N] = um;
        E.N += 1; // guarda o livro
    };
    // mostra quantos tem na estante E
    printf("Estante com %d livros\n", E.N);

    // mostra os livros
    for (unsigned i = 0; i < E.N; i += 1)
    {
        printf("%2d: %30s %15s %4d\n",
            1+i,
            E.L[i].titulo,
            E.L[i].autor,
            E.L[i].ano);
    };
    return 0;
};

 

Considere isso. Logo vai precisar alocar um certo número de livros, adicionar e remover, tratar uma coleção de estantes ou livros então é bom se acostumar com esses critérios. Coisas como deixar o controle dentro de estruturas porque aí eles andam sempre juntos. Veja o caso da estante: ela pode ter uma capacidade e um total atual de livros. Se precisar mudar um campo não precisa mexer nas rotinas porque elas só tratam estante. 

Se no próximo exercício precisa gravar em disco grava estante e os livros vão dentro. Se precisar aumentar um campo no livro não mexe na estante. Coisas assim. Acho que deu pra entender. Isso se chama encapsulamento na literatura.

  • Curtir 2
  • Obrigado 2
Postado

@arfneto Muito obrigado pela aula! Não tinha pensado dessa maneira, assim é bem mais eficaz para um ordem N de livros, agradeço mesmo pela imensa ajuda. No meu curso usamos como base o livro "C completo e Total. 3.ed". Tenho de admitir que não dei a atenção que queria para programação pois tive de dar prioridade para matérias mais "complicadas" (Física III, Circuitos Elétricos e Cálculo III). Pretendo estudar mais a fundo programação ao finalizar esse semestre, se tiveres uma boa recomendação de livro eu agradeceria bastante.

Abraços!

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

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!