Ir ao conteúdo

Posts recomendados

Postado

Como faço para esse programa conseguir consultar através do título, da autora ou editora e não apenas imprimir as informaçoes?? 

 

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

 
typedef struct Livro
{
    int edicao;
    char titulo[200];
    char autor[200];
    char editora[200];
    int opcao;
} Livro;

Livro Livro_biblioteca;
 
void menu();
void cadastrar();
void consultar();

int main()
{
    setlocale(LC_ALL,"portuguese");
    menu();
    return 0;
}
 
 void menu()
{
    int opcao;
    do
    {
        printf(" \n Opções: ");
        printf(" \n 1. Cadastrar" );
        printf(" \n 2. Consultar" );
        printf(" \n Digite a opção desejada: ");
        scanf("%d%*c", &opcao);
        switch(opcao)
        {
            case 1:
                Cadastrar();
            break;
            case 2:
                Consultar();
            break; 
             case 3:
                Sair();
            break; 
            default:
                 printf(" \n Opção não existente. ");
            break;
        }
    }
    while(opcao!=4);
}
 void cadastrar()
{
    printf(" Digite o título do livro: ");
    scanf("%s", &Livro_biblioteca.titulo);
    printf(" Digite o nome do autor: ");
    scanf("%s", &Livro_biblioteca.autor);
    printf(" Digite a editora do livro: ");
    scanf("%s", &Livro_biblioteca.editora);
    printf(" Digite o número da edição: ");
    scanf("%d", &Livro_biblioteca.edicao);
}
void consultar()
{
    printf(" \n O Título do livro é: %d ",Livro_biblioteca.titulo);
    printf(" \n O nome da autora é: %s ",Livro_biblioteca.autor);
    printf(" \n A editora é: %s ",Livro_biblioteca.editora);
    printf(" \n \n");
}


 

 

  • Obrigado 1
Postado

Define uma fonte de dados para onde direcionar a busca, pode ser um vetor, lista ou um arquivo. Pegue um a um dos livro na fonte e compare seus valores com os de interesse, ou seja, se iguais em pelo menos um dos critérios que citou então será impresso.

  • Curtir 3
  • Amei 1
Postado
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <locale.h>
#define max 2

 
typedef struct Livro
{
    char titulo[200];
    char autor[200];
    char editora[200];
    int edicao;
    
} Livro;

Livro Livro_biblioteca[max];
 
void menu();
void cadastrar();
void consultar();

int main()
{
    setlocale(LC_ALL,"portuguese");
    menu();
    return 0;
}
 
 void menu()
{
    int opcao;
    do
    {
        printf(" \n Opções: ");
        printf(" \n 1. Cadastrar" );
        printf(" \n 2. Consultar" );
         printf(" \n 3. Sair" );
        printf(" \n Digite a opção desejada: ");
        scanf("%d", &opcao);
        switch(opcao)
        {
            case 1:
                cadastrar();
            break;
            case 2:
                consultar();
            break; 
             case 3:
                exit(0);
            default:
                 printf(" \n Opção não existente. ");
            break;
        }
    }
    while(opcao!=3);
}
 void cadastrar()
{
	for(int i=0;i<max;i++){
	fflush(stdin);
    printf(" Digite o título do livro: ");
    gets( Livro_biblioteca[i].titulo);
    printf(" Digite o nome do autor: ");
    gets( Livro_biblioteca[i].autor);
    printf(" Digite a editora do livro: ");
    gets( Livro_biblioteca[i].editora);
    printf(" Digite o número da edição: ");
    scanf("%d", &Livro_biblioteca[i].edicao);
    }
}
void consultar()
{
	char aux[100];
	printf("Digite o título\n");
	fflush(stdin);
	gets(aux);
	for(int i=0;i<max;i++){
		if (strcmp(aux,Livro_biblioteca[i].titulo)==0){
    printf(" \n O Título do livro é: %s ",Livro_biblioteca[i].titulo);
    printf(" \n O nome da autora é: %s ",Livro_biblioteca[i].autor);
    printf(" \n A editora é: %s ",Livro_biblioteca[i].editora);
    printf("\n");
}
else{
	printf("Titulo nao encontrado");
	printf("\n");
}
}
}

 

  • Curtir 3
  • Obrigado 1
Postado

@Larissa Firmino o aux vai ler um char e depois o strcmp ele vai ir comparando durante o laço de repetição.

char titulo[200]; char autor[200]; char editora[200]; funcionaria com qualquer um desses.

para procurar por edição seria mais fácil ainda basta fazer a comparação numerica, implemente e teste se der qualquer erro é só postar que ajudo. não precisa também usar o else coloquei apenas para fazer um teste.

  • Obrigado 1
Postado
Em 15/06/2020 às 19:25, Larissa Firmino disse:

void cadastrar()

 

Sua função cadastrar() é um beco sem saída: não cadastra e não retorna nada.

 

Faça seu programa em torno dos dados. Todos os seus programas.

typedef struct Livro
{
    char titulo[200];
    char autor[200];
    char editora[200];
    int edicao;
   
} Livro;

Livro Livro_biblioteca[max];

Veja o exemplo de @herbertbahia como já faz sentido. 

 

Considere que uma biblioteca tem livros, um certo número deles. Provavelmente char[200] para cada item vai ser muito chato de usar e muito grande. Use uns 20 nos testes ou menos. Edição int pode ser mais problema do que solução: como regra use char a menos que vá operar com os valores, como somar preços.

 

Acrescente sempre um campo tipo int como ID para ajudar. Isso porque depois sempre aparece uma outra necessidade e é mais fácil comparar ID do que qualquer outro campo. E se o cara escolhe por titulo na tela e você tem a ID na struct é um passeio ir no cadastro e achar o cara e vincular com todos os títulos do mesmo autor, por exemplo. Entendeu? 

 

Veja esse conjunto por exemplo

typedef struct
{
    int  id;
  
    char autor[20];
    char edicao[5];
    char editora[20];
    char titulo[20];
}   Livro;

typedef struct
{
    int     id;
    char    nome[20];
    int     N; // o total de livros
    Livro*  Acervo; // O vetor de livros
}   Biblioteca;

Biblioteca* cadastrar( char* nome, char* arquivo );
int         mostrar(Biblioteca* bib);

 

E veja como começar pelos dados simplifica as coisas: uma biblioteca tem um acervo de N livros e tem um nome pra identificar. E só com essas funções já pode escrever

    Biblioteca* teste = cadastrar("Loja 1", "livros.txt");
    int n = mostrar(teste);

 

E aí no próprio IDE você edita um arquivo de teste com uns 3 livros e testa seu programa pra ver se mostra() mostra os 3 livros. E aí segue com as suas funções.

 

Exemplo:

12;Jhonny1;Edicao 1;O'Reilly;A Tour of C++
22;Jhonny2;Edicao 1;O'Reilly;A Tour of C++
3;Jhonny3;Edicao 1;O'Reilly;A Tour of C++
512;Jhonny4;Edicao 1;O'Reilly;A Tour of C++

Com os valores separados convenientemente por ';'. O total de linhas do arquivo vai ser claro o total de livros no acervo, o tal N. o nome da Biblioteca você passou como parâmetro e a vida segue. O nome do arquivo você sabe porque acabou de criar. E pode usar vários pra testar sem ter que digitar nada de novo...

 

cadastrar() devolve um endereço de uma struct do tipo Biblioteca, que contem N livros, que leu a partir do arquivo livros.txt. E mostrar() mostra na tela o conteúdo de uma biblioteca, e você confere o funcionamento. E aí continua com seu programa....

 

É só um exemplo

 

 

 

 

 

 

  • Curtir 1
  • Obrigado 1
Postado

@Larissa Firmino Acho que isso deve resolver:

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

typedef struct livro {
    int edicao;
    char titulo[255];
    char autor[255];
    char editora[255];
} Livro;

typedef struct no {
    Livro *livro;
    struct no *proximo;
} No;

typedef struct lista {
    int tamanho;
    No *primeiro;
} Lista;

int adicionar(Lista *lista, Livro *livro);

Livro *cadastrar();

Livro *consultarPorAutor(Lista *lista, char *autor);

Livro *consultarPorEditora(Lista *lista, char *editora);

Livro *consultarPorTitulo(Lista *lista, char *titulo);

Lista *criarLista();

char *getString(char *mensagem);

void imprimirLivro(Livro *livro);

void listar(Lista *lista);

int menu();

int main() {
    Lista *lista = criarLista();
    Livro *livro = NULL;

    int opcao = 0;
    char *entrada = (char *) malloc(255 * sizeof(char));

    do {
        opcao = menu();
        livro = NULL;
        strcpy(entrada, "");

        switch (opcao) {
            case 1:     // Cadastrar
                livro = cadastrar();
                adicionar(lista, livro);
                break;
            case 2:     // Listar
                listar(lista);
                getchar();
                break;
            case 3:     // Consultar titulo
                entrada = getString("Digite o titulo: ");
                livro = consultarPorTitulo(lista, entrada);
                imprimirLivro(livro);
                getchar();
                break;
            case 4:     // Consultar autor
                entrada = getString("Digite o autor: ");
                livro = consultarPorAutor(lista, entrada);
                imprimirLivro(livro);
                getchar();
                break;
            case 5:     // Consultar editora
                entrada = getString("Digite a editora: ");
                livro = consultarPorEditora(lista, entrada);
                imprimirLivro(livro);
                getchar();
                break;
            case 0:     // Sair
            default:    // Opcao invalida
                continue;
        }
    } while (opcao != 0);

    return EXIT_SUCCESS;
}

int adicionar(Lista *lista, Livro *livro) {
    if (lista == NULL || livro == NULL) {
        return -1;
    }

    No *novo = (No *) malloc(sizeof(No));
    novo->livro = livro;
    novo->proximo = NULL;

    if (lista->tamanho == 0) {
        lista->primeiro = novo;
    } else {
        No *no = lista->primeiro;

        while (no->proximo != NULL) {
            no = no->proximo;
        }

        no->proximo = novo;
    }

    lista->tamanho += 1;
    return lista->tamanho;
}

Livro *cadastrar() {
    Livro *livro = (Livro *) malloc(sizeof(Livro));
    strcpy(livro->titulo, getString("Digite o titulo: "));
    strcpy(livro->autor, getString("Digite o autor: "));
    strcpy(livro->editora, getString("Digite a editora: "));
    livro->edicao = (int) strtol(getString("Digite a edicao: "), NULL, 10);

    return livro;
}

Livro *consultarPorAutor(Lista *lista, char *autor) {
    if (lista == NULL || autor == NULL || lista->tamanho == 0) {
        return NULL;
    }

    No *no = lista->primeiro;

    while (no != NULL) {
        if (strcasecmp(no->livro->autor, autor) == 0) {
            return no->livro;
        }

        no = no->proximo;
    }

    return NULL;
}

Livro *consultarPorEditora(Lista *lista, char *editora) {
    if (lista == NULL || editora == NULL || lista->tamanho == 0) {
        return NULL;
    }

    No *no = lista->primeiro;

    while (no != NULL) {
        if (strcasecmp(no->livro->editora, editora) == 0) {
            return no->livro;
        }

        no = no->proximo;
    }

    return NULL;
}

Livro *consultarPorTitulo(Lista *lista, char *titulo) {
    if (lista == NULL || titulo == NULL || lista->tamanho == 0) {
        return NULL;
    }

    No *no = lista->primeiro;

    while (no != NULL) {
        if (strcasecmp(no->livro->titulo, titulo) == 0) {
            return no->livro;
        }

        no = no->proximo;
    }

    return NULL;
}

Lista *criarLista() {
    Lista *lista = (Lista *) malloc(sizeof(Lista));
    lista->tamanho = 0;
    lista->primeiro = NULL;

    return lista;
}

char *getString(char *mensagem) {
    char *string = (char *) malloc(255 * sizeof(char));

    printf("%s", mensagem);
    fgets(string, 255, stdin);
    string[strcspn(string, "\n")] = '\0';

    return string;
}

void imprimirLivro(Livro *livro) {
    if (livro == NULL) {
        return;
    }

    printf("----------------------------------- \n");
    printf(" Titulo: %s \n", livro->titulo);
    printf("  Autor: %s \n", livro->autor);
    printf("Editora: %s \n", livro->editora);
    printf(" Edicao: %i \n", livro->edicao);
    printf("----------------------------------- \n");
}

void listar(Lista *lista) {
    if (lista == NULL || lista->tamanho == 0) {
        return;
    }

    No *no = lista->primeiro;

    while (no != NULL) {
        imprimirLivro(no->livro);
        no = no->proximo;
    }
}

int menu() {
    int opcao = 0;

    printf(">> Menu \n"
           "[ 1 ] - Cadastrar \n"
           "[ 2 ] - Listar \n"
           "[ 3 ] - Consultar por titulo \n"
           "[ 4 ] - Consultar por autor \n"
           "[ 5 ] - Consultar por editora \n"
           "[ 0 ] - Sair \n");
    opcao = (int) strtol(getString("> "), NULL, 10);

    return opcao;
}

 

  • Curtir 2
  • Obrigado 1
Postado
8 horas atrás, Larissa Firmino disse:

sim, isso eu consegui entender, até vi os gafs que cometi 😅. Só a parte da consulta mesmo, mas vi que poderia usar o case para isso ou estrutura de if's e consegui resolver o problema

Poste o código como ficou e algum comentário de qual foi sua ideia ao escrever do modo como fez. Pode ajudar outros

  • Curtir 1
Postado
char *getString(char *mensagem) {
    char *string = (char *) malloc(255 * sizeof(char));

    printf("%s", mensagem);
    fgets(string, 255, stdin);
    string[strcspn(string, "\n")] = '\0';

    return string;
}

@AdrianoSiqueira fgets() retorna ao ler N-1 bytes, o segundo parâmetro, ou encontrar um '\0' no arquivo --- stream --- especificado pelo terceiro parâmetro.

Isso quer dizer que se leu até N-1 caracteres e não leu um '\0' a rotina vai colocar um lá no fim. E se Leu N-1 a rotina vai parar aí.
 

Ou seja: o último byte da string apontada pelo primeiro parâmetro é sempre NULL, 0, o tal '\0'.

 

Assim não faz sentido usar sprcspn() para um loop na string porque é claro que só vai achar o 0 na última posição. É a definição de string e o propósito de fgets() --- get string from file.

 

Faça o simples e use

string[ strlen(string)-1 ] = 0;

Mas o problema maior com essa função está em 

    char *string = (char *) malloc(255 * sizeof(char));

A cada vez que chama isso a partir da primeira desaparecem 255 bytes de memória. O leak clássico. O ponteiro se perde e não há como liberar essa memória.

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

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!