Ir ao conteúdo
  • Cadastre-se

Ajuda!


rafaelphy

Posts recomendados

Alguem pode ajudar a criar uma função de pesquisa busca e aleração para este código?

desde já agradeço.


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct livro {

char* titulo[200]; // nome do livro com no maximo 199 caracteres.
char* autor[100];// nome do autor com no maximo 99 caracteres.
char* area_conhecimento[200]; //area do conhecimento abordada no livro.
int dispo; // status se disponivel indicará o numero de livros disponivel caso contrario indica ZERO.
int isbn;
int edicao;
int ano;
int num_exemplares;


struct livro *proximo; // proximo livro da lista.
} Clivro; //Clivro refere-se ao Conteudo das informações do livro

// funçoes para listar e inserir livros.

void inserir(Clivro **cabeca);
void listar (Clivro *cabeca);
void pesquisar(Clivro *cabeca);
void alterar (Clivro *no_atual);
void gravar (Clivro *no_atual);
void listargrav(Clivro *no_atual);


int main(int argc, char *argv[])
{
Clivro *cabeca = NULL; //ponteiro para a cabeca da lista.
Clivro *no_atual; //ponteiro usado para percorrer a lista no momento de deslocar os elementos.

char option; // variavel para receber a opcao do usuario.

do {
printf("\n opções: \n I -> Inserir novo livro. \n L ->Listar todos os livros. \n g -> Gavar \n n -> listar gravacoes \n S -> Sair. \n ");
scanf("%c", &option); //leitura da opcao do usuario.
switch(option)
{
case 'i': case 'I': inserir(&cabeca); break;
case 'l': case 'L': listar(cabeca); break;
case 'g': case 'G': gravar(cabeca); break;
case 'n': case 'N': listargrav(cabeca); break;
case 's': case 'S': break;

default: printf("\n Opcao nao valida");
}
fflush(stdin); //limpa o buffer de entrada.
}
while ((option!='s') && (option!='S'));


//desloca a memoria alocada para os elementos da lista.

no_atual = cabeca;
while (no_atual != NULL)
{
cabeca = no_atual->proximo;
free(no_atual);
no_atual = cabeca;
}
}

//lista todos os elementos presentes na lista.
void listar (Clivro *no_atual)
{
char* titulo[200]; // nome do livro com no maximo 199 caracteres.
char* autor[100];// nome do autor com no maximo 99 caracteres.
char* area_conhecimento[200]; //area do conhecimento abordada no livro.
int dispo; // status se disponivel indicará o numero de livros disponivel caso contrario indica ZERO.
int isbn;
int edicao;
int ano;
int num_exemplares;
int i=0;
while (no_atual != NULL) //enquanto a lista nao chega ao fim.
{
i++;
printf("\n Titulo do livro: %s \n",titulo, no_atual->titulo);
printf("\n Autor: %s\n",autor, no_atual->autor);
printf("\n Area do conhecimento/Assunto: %s\n",area_conhecimento, no_atual->area_conhecimento);
printf("\n ISBN: %d\n",isbn, no_atual->isbn);
printf("\n Edicao: %d\n",edicao, no_atual->edicao);
printf("\n Ano: %d\n",ano, no_atual->ano);
printf("\n Numero de exemplares: %d\n",num_exemplares, no_atual->num_exemplares);
printf("\n Livros disponiveis: %d\n",dispo, no_atual->dispo);

no_atual = no_atual->proximo; //faz no_atual apontar para o proximo no(proximo livro da lista).
}
}

//funcao para inserir um novo no(novo livro), ao final da lista.

void inserir(Clivro **cabeca)
{
Clivro *no_atual, *novo_livro;

char* titulo[200];
char* autor[100];
char* area_conhecimento[200];
int dispo;
int isbn, edicao, ano, num_exemplares;



printf("\n\n------------- Insira um novo livro -------------\n\n ");
printf("\n\n");

fflush(stdin);
printf("\n Nome do novo livro:\n\n ");
scanf("%s", &titulo);
printf("\n Nome do autor: \n");
scanf("%s", &autor);
printf("\n Area do conhecimento/Assunto: \n");
scanf("%s", &area_conhecimento);
printf("\n ISBN: \n");
scanf("%d", &isbn);
printf("\n Edicao: \n");
scanf("%d", &edicao);
printf("\n Ano: \n");
scanf("%d", &ano);
printf("\n Numero de exemplares: \n");
scanf("%d", &num_exemplares);

printf("\n\n------------- O novo livro foi adicionado -------------\n\n");


if(*cabeca == NULL) //se a lista estiver vazia.
{
//cria o no cabeca(primeiro livro da lista).
*cabeca = (Clivro *) malloc (sizeof(Clivro));

(*cabeca)-> titulo;
(*cabeca)-> autor;
(*cabeca)-> area_conhecimento;
(*cabeca)-> isbn;
(*cabeca)-> edicao;
(*cabeca)-> ano;
(*cabeca)-> num_exemplares;
(*cabeca)-> dispo;

(*cabeca)-> proximo = NULL;
}
else
{
// se a lista já possui livros, deve ser percorrida até o final e inserir um novo livro.

no_atual = *cabeca;
while (no_atual->proximo != NULL)
no_atual = no_atual->proximo;
//no fim do while, no_atual aponta para o ultimo livro.
novo_livro = (Clivro *) malloc(sizeof (Clivro));
//aloca memoria para o novo livro.

novo_livro -> titulo;
novo_livro -> autor;
novo_livro -> area_conhecimento;
novo_livro -> isbn;
novo_livro -> edicao;
novo_livro -> ano;
novo_livro -> num_exemplares;
novo_livro -> dispo;
novo_livro -> proximo = novo_livro;

}

void gravar (Clivro *no_atual)
{
FILE *fp;
fp = fopen ("lista_livros.bin", "w+b"); //abre arquivo para leitura e gravaçao binaria
if (fp == NULL) {
printf ("Erro ao abrir o arquivo.\n");
exit(1);
}
else {
if (fp != NULL) {}
printf ("Arquivo Binario criado com sucesso.\n");
fwrite(&no_atual, sizeof(no_atual), 1, fp);
fclose (fp);
}
}

void listargrav(Clivro *no_atual)
{
FILE * fp;
fp = fopen ("lista_livros.bin", "rb"); //abre o arquivo binario para leitura
if (fp == NULL) {
printf ("Erro ao abrir o arquivo.\n");
exit(1);
}
while(fread(&no_atual, sizeof(no_atual),1,fp)){

printf("\n Titulo do livro: %s \n",titulo, no_atual->titulo);
printf("\n Autor: %s\n",autor, no_atual->autor);
printf("\n Area do conhecimento/Assunto: %s\n",area_conhecimento, no_atual->area_conhecimento);
printf("\n ISBN: %d\n",isbn, no_atual->isbn);
printf("\n Edicao: %d\n",edicao, no_atual->edicao);
printf("\n Ano: %d\n",ano, no_atual->ano);
printf("\n Numero de exemplares: %d\n",num_exemplares, no_atual->num_exemplares);
printf("\n Livros disponiveis: %d\n",dispo, no_atual->dispo);

}
fclose(fp);

}

system("PAUSE");
}


Link para o comentário
Compartilhar em outros sites

Você está fazendo errado, se isso era pra ser uma lista encadeada.

Na estrutura, você está pondo todos os livros, em vez de apenas um. Mude para:

typedef struct livro {

char titulo[200]; // nome do livro com no maximo 199 caracteres.
char autor[100];// nome do autor com no maximo 99 caracteres.
char area_conhecimento[200]; //area do conhecimento abordada no livro.
int dispo; // status se disponivel indicará o numero de livros disponivel caso contrario indica ZERO.
int isbn;
int edicao;
int ano;
int num_exemplares;


struct livro *proximo; // proximo livro da lista.
} Clivro; //Clivro refere-se ao Conteudo das informações do livro

E então você aloca memória pra cada livro, com malloc. Caso não queira usar malloc, também não vai precisar de lista encadeada.

Link para o comentário
Compartilhar em outros sites

Rafael, nao entendi ou nao achei a modificaçao que você propos....

a minha intençao com esse programa é gravar todos os livros em um arquivo binario, e depois ser capaz de fazer a leitura desse arquivo,mostrando os livros salvos. depois criar uma ferramenta de pesquisa e por ultimo alteração dos dados de um livro.

estou precisando tb de entender como faço para implementar uma ferramenta de busca dentro do arquivo. por exemplo, como buscar livro pelo nome do autor ou assunto do livro. pensei em usar o comando strcmp para comparação de strings mas nao consegui fazer funcionar.

Qualquer ajuda é muito bem vinda!!!

obrigado a todos


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct livro {

char* titulo[200]; // nome do livro com no maximo 199 caracteres.
char* autor[100];// nome do autor com no maximo 99 caracteres.
char* area_conhecimento[200]; //area do conhecimento abordada no livro.
int dispo; // status se disponivel indicará o numero de livros disponivel caso contrario indica ZERO.
int isbn;
int edicao;
int ano;
int num_exemplares;


struct livro *proximo; // proximo livro da lista.
} Clivro; //Clivro refere-se ao Conteudo das informações do livro

// funçoes para listar e inserir livros.

void inserir(Clivro **cabeca);
void listar (Clivro *cabeca);
void pesquisar_autor(Clivro *cabeca);
void pesquisar_assunto(Clivro *cabeca);
void alterar (Clivro *cabeca);
void gravar (Clivro *no_atual);
void listargrav(Clivro *no_atual);


int main(int argc, char *argv[])
{
Clivro *cabeca = NULL; //ponteiro para a cabeca da lista.
Clivro *no_atual; //ponteiro usado para percorrer a lista no momento de deslocar os elementos.

char option; // variavel para receber a opcao do usuario.

do {
printf("\n opções: \n I -> Inserir novo livro. \n L ->Listar todos os livros. \n g -> Gavar \n n -> listar gravacoes \n");
printf("\n p -> Pesquisar por autor. \n a -> Pesquisar por assunto. \n S -> Sair. \n");
scanf("%c", &option); //leitura da opcao do usuario.
switch(option)
{
case 'i': case 'I': inserir(&cabeca); break;
case 'l': case 'L': listar(cabeca); break;
case 'g': case 'G': gravar(cabeca); break;
case 'n': case 'N': listargrav(cabeca); break;
case 'p': case 'P': pesquisar_autor(cabeca); break;
case 'a': case 'A': pesquisar_assunto(cabeca); break;
case 's': case 'S': break;

default: printf("\n Opcao nao valida");
}
fflush(stdin); //limpa o buffer de entrada.
}
while ((option!='s') && (option!='S'));


//desloca a memoria alocada para os elementos da lista.

no_atual = cabeca;
while (no_atual != NULL)
{
cabeca = no_atual->proximo;
free(no_atual);
no_atual = cabeca;
}
}

//lista todos os elementos presentes na lista.
void listar (Clivro *no_atual)
{
char* titulo[200]; // nome do livro com no maximo 199 caracteres.
char* autor[100];// nome do autor com no maximo 99 caracteres.
char* area_conhecimento[200]; //area do conhecimento abordada no livro.
int dispo; // status se disponivel indicará o numero de livros disponivel caso contrario indica ZERO.
int isbn;
int edicao;
int ano;
int num_exemplares;
int i=0;
while (no_atual != NULL) //enquanto a lista nao chega ao fim.
{
i++;
printf("\n Titulo do livro: %s \n",titulo, no_atual->titulo);
printf("\n Autor: %s\n",autor, no_atual->autor);
printf("\n Area do conhecimento/Assunto: %s\n",area_conhecimento, no_atual->area_conhecimento);
printf("\n ISBN: %d\n",isbn, no_atual->isbn);
printf("\n Edicao: %d\n",edicao, no_atual->edicao);
printf("\n Ano: %d\n",ano, no_atual->ano);
printf("\n Numero de exemplares: %d\n",num_exemplares, no_atual->num_exemplares);
printf("\n Livros disponiveis: %d\n",dispo, no_atual->dispo);

no_atual = no_atual->proximo; //faz no_atual apontar para o proximo no(proximo livro da lista).
}
}

//funcao para inserir um novo no(novo livro), ao final da lista.

void inserir(Clivro **cabeca)
{
Clivro *no_atual, *novo_livro;

char* titulo[200];
char* autor[100];
char* area_conhecimento[200];
int dispo;
int isbn, edicao, ano, num_exemplares;



printf("\n\n------------- Insira um novo livro -------------\n\n ");
printf("\n\n");

fflush(stdin);
printf("\n Nome do novo livro:\n\n ");
scanf("%s", &titulo);
printf("\n Nome do autor: \n");
scanf("%s", &autor);
printf("\n Area do conhecimento/Assunto: \n");
scanf("%s", &area_conhecimento);
printf("\n ISBN: \n");
scanf("%d", &isbn);
printf("\n Edicao: \n");
scanf("%d", &edicao);
printf("\n Ano: \n");
scanf("%d", &ano);
printf("\n Numero de exemplares: \n");
scanf("%d", &num_exemplares);

printf("\n\n------------- O novo livro foi adicionado -------------\n\n");


if(*cabeca == NULL) //se a lista estiver vazia.
{
//cria o no cabeca(primeiro livro da lista).
*cabeca = (Clivro *) malloc (sizeof(Clivro));

(*cabeca)-> titulo;
(*cabeca)-> autor;
(*cabeca)-> area_conhecimento;
(*cabeca)-> isbn;
(*cabeca)-> edicao;
(*cabeca)-> ano;
(*cabeca)-> num_exemplares;
(*cabeca)-> dispo;

(*cabeca)-> proximo = NULL;
}
else
{
// se a lista já possui livros, deve ser percorrida até o final e inserir um novo livro.

no_atual = *cabeca;
while (no_atual->proximo != NULL)
no_atual = no_atual->proximo;
//no fim do while, no_atual aponta para o ultimo livro.
novo_livro = (Clivro *) malloc(sizeof (Clivro));
//aloca memoria para o novo livro.

novo_livro -> titulo;
novo_livro -> autor;
novo_livro -> area_conhecimento;
novo_livro -> isbn;
novo_livro -> edicao;
novo_livro -> ano;
novo_livro -> num_exemplares;
novo_livro -> dispo;
novo_livro -> proximo = novo_livro;

}

//funcao para gravar os registros de livros

void gravar (Clivro *cabeca)
{
FILE *fp;
fp = fopen ("lista_livros.bin", "w+b"); //abre arquivo para leitura e gravaçao binaria
if (fp == NULL) {
printf ("Erro ao abrir o arquivo.\n");
exit(1);
}
else {
if (fp != NULL) {}
printf ("Arquivo Binario criado com sucesso.\n");
fwrite(&cabeca, sizeof(cabeca), 1, fp);
fclose (fp);
}
}

// funcao para mostrar os registros salvos em arquivo

void listargrav(Clivro *cabeca)
{
FILE * fp;
fp = fopen ("lista_livros.bin", "rb"); //abre o arquivo binario para leitura
if (fp == NULL) {
printf ("Erro ao abrir o arquivo.\n");
exit(1);
}
while(fread(&cabeca,sizeof(cabeca),1,fp)){

printf("\n Titulo do livro: %s \n",titulo, no_atual->titulo);
printf("\n Autor: %s\n",autor, no_atual->autor);
printf("\n Area do conhecimento/Assunto: %s\n",area_conhecimento, no_atual->area_conhecimento);
printf("\n ISBN: %d\n",isbn, no_atual->isbn);
printf("\n Edicao: %d\n",edicao, no_atual->edicao);
printf("\n Ano: %d\n",ano, no_atual->ano);
printf("\n Numero de exemplares: %d\n",num_exemplares, no_atual->num_exemplares);
printf("\n Livros disponiveis: %d\n",dispo, no_atual->dispo);

}
fclose(fp);

//Funcao para pesquisar um livro por autor.

void pesquisar_autor(Clivro *no_atual, char *busca_autor)
{
FILE * fp;
fp = fopen ("lista_livros.bin", "rb"); //abre o arquivo binario para leitura
if (fp == NULL) {
printf ("Erro ao abrir o arquivo.\n");
exit(1);
}

printf("\n Entre com o autor que deseja pesquisar. \n");
scanf("%", &busca_autor);

while (no_atual->proximo != NULL)
no_atual = no_atual->proximo;
{
[COLOR="red"]if (strcmp(busca_autor, no_atual->autor) == 0) {[/COLOR] printf("\n Titulo do livro: %s \n",titulo, no_atual->titulo);
printf("\n Autor: %s\n",autor, no_atual->autor);
printf("\n Area do conhecimento/Assunto: %s\n",area_conhecimento, no_atual->area_conhecimento);
printf("\n ISBN: %d\n",isbn, no_atual->isbn);
printf("\n Edicao: %d\n",edicao, no_atual->edicao);
printf("\n Ano: %d\n",ano, no_atual->ano);
printf("\n Numero de exemplares: %d\n",num_exemplares, no_atual->num_exemplares);
printf("\n Livros disponiveis: %d\n",dispo, no_atual->dispo);
}
}
}
fclose(fp);

// funcao para pesquisar um livro por assunto.

void pesquisar_assunto(Clivro *no_atual, char *busca_assunto)
{
FILE * fp;
fp = fopen ("lista_livros.bin", "rb"); //abre o arquivo binario para leitura
if (fp == NULL) {
printf ("Erro ao abrir o arquivo.\n");
exit(1);
}

printf("\n Entre com o assunto que deseja pesquisar. \n");
scanf("%", &busca_assunto);

while (no_atual->proximo != NULL)
no_atual = no_atual->proximo;
{
[COLOR="Red"]if (strcmp(busca_assunto, no_atual->area_conhecimento) == 0) {[/COLOR] printf("\n Titulo do livro: %s \n",titulo, no_atual->titulo);
printf("\n Autor: %s\n",autor, no_atual->autor);
printf("\n Area do conhecimento/Assunto: %s\n",area_conhecimento, no_atual->area_conhecimento);
printf("\n ISBN: %d\n",isbn, no_atual->isbn);
printf("\n Edicao: %d\n",edicao, no_atual->edicao);
printf("\n Ano: %d\n",ano, no_atual->ano);
printf("\n Numero de exemplares: %d\n",num_exemplares, no_atual->num_exemplares);
printf("\n Livros disponiveis: %d\n",dispo, no_atual->dispo);
}
}
}
fclose(fp);

}

system("PAUSE");
}


amigos tentei impleentar a pesquisa conforme havia dito e esta ocorrendo erro nas duas linhas que escrevi de vermelho.nao consegui arrumar....se puderem ajudar!

o erro é "passing arg2 of strcmp from imcompatible pointer type."

Link para o comentário
Compartilhar em outros sites

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

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

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!