Ir ao conteúdo
  • Cadastre-se
lucas.suanderhus

C Cadastro de livros usando vetor em C

Posts recomendados

Fala galera to precisando de um help aqui, tenho que fazer um programa em C que leia dados de livros, e armazene num vetor de tamanho 25, o programa tambem deve exibir uma mensagem de tamanho maximo ao atingir o limite do vetor, deve tambem permitir ao usuario fazer uma busca por um livro utilizando o titulo do livro e caso encontrado exibir os dados do livro, livro que sera um struct como titulo tendo o maximo de 25 letras, autor no maximo 20 e o ano, deve-se tambem organizar um menu oferecendo as opções citadas, bem eu tentei fazer mas ele le o primeiro titulo e pula para o proximo titulo ignorando os campos de autor e ano, alguem pode me ajudar?

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

struct livro{
    char titulo[35];
    char autor[20];
    int ano;
};

struct livro livros[25];

void procura(char titulo[]){
    for(int i=0;i<25;i++){
        if(strcmp(livros[i].titulo,titulo)==0){
            printf("%s",livros[i].titulo);
            printf("%s",livros[i].autor);
            printf("%d",livros[i].ano);
        }else{
            printf("Livro não encontrado");
        }
    }
}

int main(){
    int op,i;
    char tit[35];
    printf("\n===== Livraria =====");
    printf("\n 1-Cadastrar livro ");
    printf("\n 2-procurar livro ");
    printf("\n 3-Sair \n");
    scanf("%d",&op);

    switch(op){
        case 1:
        for(i=0;i<25;i++){
            printf("Titulo: ");
            scanf("%s",&livros[i].titulo);
            printf("Autor: ");
            scanf("%s",&livros[i].autor);
            printf("Ano: ");
            scanf("%d",&livros[i].ano);
            if(i==25){
                printf("Tamanho do vetor atingido");
            }
        }
        break;
        case 2:
            printf("Qual o titulo do livro que deseja buscar: ");
            scanf("%s",&tit);
            procura(tit);
        break;
        case 3:
            exit(1);
    }
}


 

Compartilhar este post


Link para o post
Compartilhar em outros sites

@lucas.suanderhus Oi, você está usando qual compilador?

O erro foi em colocar o operador & em uma string que já e um ponteiro.

34 minutos atrás, lucas.suanderhus disse:

printf("Titulo: "); scanf("%s",&livros[i].titulo); printf("Autor: "); scanf("%s",&livros[i].autor);

Todo vetor já e um ponteiro, então não se faz o uso do &.

 

35 minutos atrás, lucas.suanderhus disse:

printf("Qual o titulo do livro que deseja buscar: "); scanf("%s",&tit);

Aqui também você cometeu o mesmo erro.

 

a logica do programa está boa só falta colocar tudo em loop para não parar de repente.

adicionado 0 minutos depois

Eu esqueci de mencionar que você usou a função strcmp e não colocou a biblioteca string.h

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@KXSY GCC to no Ubuntu 18.04

 

adicionado 0 minutos depois

@KXSY Ponteiro? eu ainda não tive ponteiros não sabia dessa

adicionado 3 minutos depois

Eu tentei alterar um pouco a logica usando o fgets no lugar do scanf e usando o getchar, mas ele ainda pula o ano

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

struct livro{
    char titulo[35];
    char autor[20];
    int ano;
};

struct livro livros[25];

void procura(char titulo[]){
    for(int i=0;i<25;i++){
        if(strcmp(livros[i].titulo,titulo)==0){
            printf("%s",livros[i].titulo);
            printf("%s",livros[i].autor);
            printf("%d",livros[i].ano);
        }else{
            printf("Livro não encontrado");
        }
    }
}

int main(){
    int op,i;
    char tit[35];
    printf("\n===== Livraria =====");
    printf("\n 1-Cadastrar livro ");
    printf("\n 2-procurar livro ");
    printf("\n 3-Sair \n");
    scanf("%d",&op);

    switch(op){
        case 1:
        for(i=0;i<25;i++){
            printf("\nTitulo: ");
            fgets(livros[i].titulo,35,stdin);
            getchar();
            printf("\nAutor: ");
            fgets(livros[i].autor,20,stdin);
            getchar();
            printf("\nAno: ");
            scanf("%d",&livros[i].ano);
            if(i==25){
                printf("Tamanho do vetor atingido");
            }
        }
        break;
        case 2:
            printf("Qual o titulo do livro que deseja buscar: ");
            scanf("%s",&tit);
            procura(tit);
        break;
        case 3:
            exit(1);
    }
}

 

Compartilhar este post


Link para o post
Compartilhar em outros sites
4 minutos atrás, lucas.suanderhus disse:

Ponteiro? eu ainda não tive ponteiros não sabia dessa

toda vez que você faz algo assim

scanf("%d",&n1);

você está na realidade passando o endereço da variável, recomendo ler o C completo e total na pagina 126 para entender melhor.

 

então quando você declara uma string o nome da própria string e um ponteiro para o endereço de memoria onde ela está não sendo necessário usar o operador de dereferência (sim o nome e esse mesmo).

54 minutos atrás, lucas.suanderhus disse:

struct livro livros[25];

Outra coisa e não utilize números mágicos, sempre defina uma constante

#define QUANTIDADE_LIVROS 25

Assim você pode usar a constante no lugar do numero 25 deixando bem mais fácil de modificar.

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@KXSY O que seria numeros magicos? o prof ainda não nos deu constantes, ele deu funçao, psedocodigo,laço, voltou para floxograma,struct e vetor e voltou a pseudocodigo/portugol o proximo assunto e ponteiro

adicionado 1 minuto depois

@KXSY Mas voltando a questão por que ainda não esta funcionando troquei o scanf pelo fgets que me recomendaram, mas agora ele le so titulo e autor e pula o ano

Compartilhar este post


Link para o post
Compartilhar em outros sites
agora, lucas.suanderhus disse:

O que seria numeros magicos?

Números mágicos e quando você tem o mesmo numero espalhado por todo o código, exemplo

/* Codigo que preenche um vetor com 10 numeros */
#include <stdio.h>
#include <stdlib.h>


int main(void)
{
  int cont,vetor[10];
  printf("\nPrograma que pega 10 numeros\n");
  for(cont=0; cont<10; cont++)
  {
    printf("\nDigite o %i numero:\t",cont+1);
    scanf("%i",&vetor[cont]);
    getchar();    /* Pega NewLine do buffer do teclado */
  }
  printf("\nResultado dos numeros pegos do usuario\n");
  for(cont=0; cont<10; cont++)
    printf("\n%i:%2i",cont+1,vetor[cont]);
  getchar();    /* Pausa o programa */
  return(0);
}

veja como o 10 se repete por todo o código, esse tipo de numero nos chamamos de constante. então declarar uma constante para o numero e melhor do que ficar repetindo-o por todo o código (que seria os números mágicos), exemplo

/* Codigo que preenche um vetor com TAMANHO_VETOR numeros */
#include <stdio.h>
#include <stdlib.h>

/* Constantes */
#define TAMANHO_VETOR 10

int main(void)
{
  int cont,vetor[TAMANHO_VETOR];
  printf("\nPrograma que pega %d numeros\n",TAMANHO_VETOR);
  for(cont=0; cont<TAMANHO_VETOR; cont++)
  {
    printf("\nDigite o %i numero:\t",cont+1);
    scanf("%i",&vetor[cont]);
    getchar();    /* Pega NewLine do buffer do teclado */
  }
  printf("\nResultado dos numeros pegos do usuario\n");
  for(cont=0; cont<TAMANHO_VETOR; cont++)
    printf("\n%i:%2i",cont+1,vetor[cont]);
  getchar();    /* Pausa o programa */
  return(0);
}

Agora o vetor pode ser de qualquer tamanho que você declare previamente, então se você retirar o 10 de TAMANHO_VETOR e colocar digamos 4 o programa não vai precisa de ser inteiramente modificado.

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Entendi esta

adicionado 39 minutos depois

@KXSY Mas ainda não consegui fazer funcionar, tentei trocar o getchar pelo __fpurge(), mas tambem não deu certo, alguma dica, do porque não esta funcionando, to no codigo com fgets

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
1 hora atrás, KXSY disse:

@lucas.suanderhus Oi, você está usando qual compilador?

O erro foi em colocar o operador & em uma string que já e um ponteiro.

Todo vetor já e um ponteiro, então não se faz o uso do &.

 

Aqui também você cometeu o mesmo erro.

 

a logica do programa está boa só falta colocar tudo em loop para não parar de repente.

adicionado 0 minutos depois

Eu esqueci de mencionar que você usou a função strcmp e não colocou a biblioteca string.h

Tirei os & não deu certo tambem, na verdade agora ele pulou o campo autor agora tambem lo le o titulo e pula os outros

Compartilhar este post


Link para o post
Compartilhar em outros sites
1 hora atrás, lucas.suanderhus disse:

Mas ainda não consegui fazer funcionar, tentei trocar o getchar pelo __fpurge(), mas tambem não deu certo, alguma dica, do porque não esta funcionando, to no codigo com fgets

tente fazer programas por hora só com o que você já sabe! e depois tente aprender como as outras funções funcionam.

 

Eu arrumei o seu programa, fiz vários coments então você pode apagar os comentários que eu fiz e testar para ver como funciona com outro comando.

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

struct livro{
    char titulo[35];
    char autor[20];
    int ano;
};

struct livro livros[25];

void procura(char titulo[]){
    for(int i=0;i<25;i++){
        if(strcmp(livros[i].titulo,titulo)==0){
            printf("%s",livros[i].titulo);
            printf("%s",livros[i].autor);
            printf("%d",livros[i].ano);
        }else{
            printf("Livro não encontrado");
        }
    }
}

int main(){
    int op,i;
    char tit[35];
    printf("\n===== Livraria =====");
    printf("\n 1-Cadastrar livro ");
    printf("\n 2-procurar livro ");
    printf("\n 3-Sair \n");
    scanf("%d",&op);
    getchar();
    switch(op){
        case 1:
        for(i=0;i<25;i++){
            printf("\nTitulo: ");
            fgets(livros[i].titulo,35,stdin);
            /* scanf("%s",livros[i].titulo); */
            /* getchar(); Quando usar fgets não precisa usar getchar */
            printf("\nAutor: ");
            fgets(livros[i].autor,20,stdin);
            /* scanf("%s",livros[i].autor); */
            /* getchar(); Quando usar fgets não precisa usar getchar */
            printf("\nAno: ");
            scanf("%d",&livros[i].ano);
            getchar();    /* Aqui precisa */
            if(i==25){
                printf("Tamanho do vetor atingido");
            }
        }
        break;
        case 2:
            printf("Qual o titulo do livro que deseja buscar: ");
            /* scanf("%s",&tit); */
            /* scanf("%s",tit);  */
            fgets(tit,35,stdin);
            procura(tit);
        break;
        case 3:
            /* exit(1); */
            return(0);  /* Estamos dentro da função main então você pode simplesmente fazer return() */
    }
  return(0);
}

 

  • Amei 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@KXSY Nossa, funcionou perfeitamente muito obrigado, agora se possivel voce poderia me explicar porque a limpeza de buffer não tava funcionando?

Compartilhar este post


Link para o post
Compartilhar em outros sites
18 minutos atrás, lucas.suanderhus disse:

agora se possivel voce poderia me explicar porque a limpeza de buffer não tava funcionando?

pelo o que eu entendi até hoje, e que quando você faz scanf() ele deixa para trás o CR-carriage return e o LF-Line field (nem todas as plataformas usam os dois caracteres), então você teria que instruir ao scanf para pegar o caractere de nova linha, eu mesmo nem me atrevo a aprender como se faz porque a sintaxe do scanf e quase macabra.

 

aqui vai um exemplo de como pegar strings da forma correta com scanf

#include <stdio.h>

/* Constantes */
#define T_NOME 20

int main(void)
{
  char nome[T_NOME];
  printf("\nDigite o seu nome:\t");
  scanf("%[^\n]%*c",nome);
  printf("\nOi %s\n",nome);
  return(0);
}

resultado

com.thumb.png.496d32b00201c137c5b88e13426dad8b.png

e o com o scanf("%s") ele vai ignorar todos os caracteres depois de um espaço

sem.thumb.png.56936b027767aef09d14d09fcbfc8990.png

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

geralmente quando eu quero um console decente eu uso SDL2, então eu acabo matando uma mosca com uma bazuca.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro 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 publicações 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...

GRÁTIS: minicurso “Como ganhar dinheiro montando computadores”

Gabriel TorresGabriel Torres, fundador e editor executivo do Clube do Hardware, acaba de lançar um minicurso totalmente gratuito: "Como ganhar dinheiro montando computadores".

Você aprenderá sobre o quanto pode ganhar, como cobrar, como lidar com a concorrência, como se tornar um profissional altamente qualificado e muito mais!

Inscreva-se agora!